About half of the developers, one way or another, faced with the legacy-projects. Not everyone can (and want) work with them. But with the right approach, such projects can be carried out with pleasure and even enthusiasm. We suggest that such a legacy of understanding, what are these project management techniques, practices, and explore the developers consider useful decisions: • Examples of optimization - it's worth a try; • Monitoring applications - JavaMelody; • Monitoring applications - logs and ELK (ELasticSearch + Logstash + Kibana); • Monitoring applications - Java Mission Control and Heap Dump Memory Analyzer Tool.
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
Dmitriy Kouperman Working with legacy systems. stabilization, monitoring, management
1. Работа с легаси системами
Стабилизация, мониторинг, менеджмент
Докладчики: Дмитрий Куперман, Егор Волков
Дата: 3.09.2016
2. План
1. Что такое легаси - осмысление
2. Что с этим всем делать - подходы
3. А руками - девелоперские практики
4. Как это менеджить - приёмы управления легаси проектами
5. Да ладно, не всё так плохо - примеры весёлого кода
6. Примеры оптимизации - что стоит попробовать
7. Мониторинг приложений - JavaMelody
8. Мониторинг приложений - логи и ELK (ElasticSearch + Logstash + Kibana)
9. Мониторинг приложений - мониторинг и менеджмент JVM
2
3. Как работать с легаси и сохранить
психическое здоровье
Подходы, техники, примеры
4. Что такое легаси Дано:
1. Исто(е)рический код
2. Старые технологии
3. Неконсистентная архитектура
4. Недостаток или отсутствие документации
НО
5. ПРОДАКШН
a. Деньги
b. Надёжность (блажен кто верует)
c. Риски
Надо:
1. Разработка нового функционала
2. Багфиксинг
3. Стабилизация
4
5. Что с этим всем делать
1. Читать код (понять ход мыслей автора)
2. И смежный тоже
3. Докапываться до самой глубины (Call Hierarchy, Type
Hierarchy)
4. Дебажить, в том числе и либы, в том числе и
опенсорсные, которые потом, возможно, пересобирать
5. Искать старую докуметацию и носителей знаний
6. Документировать результаты своего reverse engineering-а
(flow diagrams, sequence diagrams)
a. Отдельные документы для технарей и бизнеса
b. Не забывать этой документацией пользоваться
5
6. А руками?
1. НЕ ПЕРЕПИСЫВАТЬ!
2. Реализовывать новый функционал. Писать консистентно с
существующим кодом
3. Отталкиваться от business value при оптимизации и
стабилизации.
4. Тестировать (manual + unit + automation)
5. Рефакторить, когда уже невмоготу или очень понемногу (тот
же business value)
6. Наладить взаимодействие с девопсами: релизная
процедура, outage alerting, отдельные environment-ы для
всего
7. Branching strategy
8. Code review and tools
6
7. Как это менеджить
1. Не всем девелоперам подходит
2. Тщательно подбирать команду по личностным
качествам - без чувства юмора и самоиронии
загнётесь. Без терпения - тоже.
3. Напоминать о всех вышеупомянутых техниках
4. Задавать дурные вопросы людям
5. Терпеливо объяснять новому менеджменту, что
“здесь так принято”
6. Выстроить процесс и следовать ему во избежание
увеличения энтропии
7. Оверэстимейтить - закладывать буферы на
сюрпризы (неочевидные зависимости - пример с
css)
8. Противостоять потоку бизнес-требований (баланс
бизнеса и стабилизации)
9. Вести technical debt
10. Отдельные маленькие проекты по стабилизации
11. Иметь SWAT-группу
7
8. Да ладно, не всё так плохо...
/**
* This is so wrong. This method, getInt, is
returning a long.
* This is required by some configuration
somewhere that uses autowire properties.
* Attempts to change this to an int return
value cause the application
* to fail on startup.
*/
public final long getInt(String str, int def)
generateItemList((DateTime) null,(DateTime) null);
Calendar.continuation_for_the_fucking_khtml_browser
= function() { ….. }
// (calendar.js from http://dynarch.com/jscal/)
8
9. Да ладно, не всё так плохо...
documentRow = new Chunk("Total:", new Font(bfVerdana, 8, Font.BOLD, COLOR_BLACK));
cell = new Cell(documentRow);
cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
cell.setBorder(Rectangle.NO_BORDER);
cell.setLeading(8); // wysokosc
documentTable.addCell(cell);
documentRow = new Chunk("Remaining:", new Font(bfVerdana, 8, Font.BOLD, COLOR_BLACK));
cell = new Cell(documentRow);
cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
cell.setBorder(Rectangle.NO_BORDER);
cell.setLeading(8); // wysokosc
documentTable.addCell(cell);
и так 95 раз…
9
10. Really? This can happen?
} catch(CustomValidationException cve) {
try {
servletResponse.sendError(HttpServletResponse.SC_BAD_REQUEST,
cve.getMessage());
} catch(IOException ioe) {
// really? this can happen? wtf am i supposed to do now? my whole server is
crashing.
LOGGER.warn("Unable to send error response!", ioe);
}
10
11. Примеры оптимизации
1. Уход от ежедневных рестартов
2. Добавление скриптов,
перезапускающих Эйры - антипаттерн
3. Уход от Зукипера
4. Переход на sessionless BFM
5. Переход на Sabre Orchestrated API
6. Slow SQL queries
7. Проход по всем логам и составление
prodLogExceptions эпика
8. Фикс багов заменой библиотек на новые
a. Spring -
org.springframework.http.MediaType
b. Jackson JSON DeSerializer в Java 7
9. Третьесторонние зависимости (frontend
(TWRS, CY, GTM, ATM), backend, dead links
scanning)
10. Cтабилизационный проект, внедрение
мониторинга JVM и аггрегации логов, о
чём ниже
11
13. Мониторинг приложения: JavaMelody
Что это?
JavaMelody - это инструмент для мониторинга Java-
приложений (спасибо, Кэп!).
Интегрируется либо в application server, либо в ваш
application.
В реальном времени собирает метрики:
1. CPU usage, RAM usage (Heap/Perm gen), Thread
count, HTTP activity;
2. MySQL connections, transactions per minute, running
queries, min/max query time, статистика самых
популярных и самых медленных запросов
(проксирование JDBC драйвера);
3. Thread info in details: какие потоки, что делают,
какой код их вызвал;
4. Hibernate L2 cache: посмотреть какой кеш, где, что
в нём и (при необходимости) грохнуть его;
5. Логи: самые популярные entry, сортировка по типу;
6. System load, disc usage, free disc space, etc.
13
14. Мониторинг приложения: JavaMelody
1. Real-time application health monitoring (is it dead yet?);
2. Возможность быстро реагировать на outage’ы и решать
сиюминутные проблемы;
3. Логи не всегда показывают всю картину произошедшего,
можно посмотреть что было с приложением в
определённый момент времени;
4. Возможность предусмотреть многие проблемы ещё до
того, как сработает dev-ops alerting (он же у вас есть,
правда?);
5. Графики более наглядны для менеджеров и прочих
бизнесов;
6. Легче ответить на вопросы клиента а-ля “почему мы
потеряли много килобаксов денег?”;
7. Дев-опсы скажут вам спасибо!
Зачем мне всё это?
14
15. Мониторинг приложения: JavaMelody
Threads
Memory
1. Видна нагрузка на сервер
2. Пики (очевидно) в вечернее время.
1. “Пила” показывает как приложение ест
память, можно копать глубже
2. Кореллирует по времени с GC-graph’
ом
3. Проседания справа - деплойменты
15
17. Что это и зачем мне это?
Elasticsearch + Logstash + Kibana - стек
технологий для аггрегации, анализа и
визуализации данных из логов.
1. Статистические данные в реальном
времени из логов приложения;
2. Настраиваемые выборки под
конкретные условия и ситуации;
3. Ещё больше цветастых графиков,
понятных даже вашему менеджеру;
4. Полезно не только с технической
стороны, но и со стороны бизнеса;
5. Лишний повод привести в порядок
логгирование в вашем приложении;
Мониторинг приложения: Логи и ELK
17
20. Мониторинг приложения: JMC, MAT, VisualVM...
Кто все эти люди?
1. Java Mission Control (Starting with the release of
Oracle JDK 7 Update 40 (7u40), Java Mission
Control is bundled with the HotSpot JVM),Flight
Recorder requires commercial license;
2. Heap Dump Memory Analyzer Tool и
-XX:+HeapDumpOnOutOfMemoryError, для
случаев, когда “Что упало - то пропало” нас не
устраивает;
3. VisualVM (since JDK version 6, update 7);
4. Solaris Studio Performance Analyzer (linux
and solaris only);
20
21. Time for an update!
А давайте обновим фреймворки!
1. Обновление JDBC-драйвера, Tomcat
threadpool’а и прочих штук - полезно;
2. Неочевидные изменения под капотом
фреймворков могут привести к конфликтам
библиотек;
3. “Работает - не трогай!” не всегда
справедливо;
4. Отдельная история с application server’ами и
версией Java - ВНИМАТЕЛЬНО читать
change-log’и;
21
22. Полезные ссылки
Victor Polischuk. Legacy Projects. How To Win The Race.
http://jeeconf.com/archive/materials-2014/legacy-projects/
Michael Feathers. Working Effectively with Legacy Code
http://www.slideshare.net/nashjain/working-effectively-with-legacy-code-presentation
22