Работа с легаси системамиСтабилизация, мониторинг, менеджмент
Докладчики: Дмитрий Куперман, Егор ВолковДата: 3.09.2016
План1. Что такое легаси - осмысление2. Что с этим всем делать - подходы3. А руками - девелоперские практики4. Как это менеджить - приёмы управления легаси проектами5. Да ладно, не всё так плохо - примеры весёлого кода6. Примеры оптимизации - что стоит попробовать7. Мониторинг приложений - JavaMelody8. Мониторинг приложений - логи и ELK (ElasticSearch + Logstash + Kibana)9. Мониторинг приложений - мониторинг и менеджмент JVM
2
Как работать с легаси и сохранить психическое здоровьеПодходы, техники, примеры
Что такое легаси Дано:
1. Исто(е)рический код2. Старые технологии3. Неконсистентная архитектура4. Недостаток или отсутствие документации
НО
5. ПРОДАКШНa. Деньгиb. Надёжность (блажен кто верует)c. Риски
Надо:
1. Разработка нового функционала2. Багфиксинг3. Стабилизация
4
Что с этим всем делать1. Читать код (понять ход мыслей автора)2. И смежный тоже3. Докапываться до самой глубины (Call Hierarchy, Type
Hierarchy)4. Дебажить, в том числе и либы, в том числе и
опенсорсные, которые потом, возможно, пересобирать5. Искать старую докуметацию и носителей знаний6. Документировать результаты своего reverse engineering-а
(flow diagrams, sequence diagrams)a. Отдельные документы для технарей и бизнесаb. Не забывать этой документацией пользоваться
5
А руками?1. НЕ ПЕРЕПИСЫВАТЬ!2. Реализовывать новый функционал. Писать консистентно с
существующим кодом3. Отталкиваться от business value при оптимизации и
стабилизации. 4. Тестировать (manual + unit + automation)5. Рефакторить, когда уже невмоготу или очень понемногу (тот
же business value)6. Наладить взаимодействие с девопсами: релизная
процедура, outage alerting, отдельные environment-ы для всего
7. Branching strategy8. Code review and tools
6
Как это менеджить1. Не всем девелоперам подходит2. Тщательно подбирать команду по личностным
качествам - без чувства юмора и самоиронии загнётесь. Без терпения - тоже.
3. Напоминать о всех вышеупомянутых техниках4. Задавать дурные вопросы людям5. Терпеливо объяснять новому менеджменту, что
“здесь так принято”6. Выстроить процесс и следовать ему во избежание
увеличения энтропии7. Оверэстимейтить - закладывать буферы на
сюрпризы (неочевидные зависимости - пример с css)
8. Противостоять потоку бизнес-требований (баланс бизнеса и стабилизации)
9. Вести technical debt10. Отдельные маленькие проекты по стабилизации11. Иметь SWAT-группу
7
Да ладно, не всё так плохо.../**
* 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
Да ладно, не всё так плохо...
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
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
Примеры оптимизации1. Уход от ежедневных рестартов2. Добавление скриптов,
перезапускающих Эйры - антипаттерн3. Уход от Зукипера4. Переход на sessionless BFM5. Переход на Sabre Orchestrated API6. Slow SQL queries7. Проход по всем логам и составление
prodLogExceptions эпика
8. Фикс багов заменой библиотек на новыеa. Spring -
org.springframework.http.MediaTypeb. Jackson JSON De\Serializer в Java 7
9. Третьесторонние зависимости (frontend (TWRS, CY, GTM, ATM), backend, dead links scanning)
10. Cтабилизационный проект, внедрение мониторинга JVM и аггрегации логов, о чём ниже
11
Мониторинг Java-приложенийJavaMelody, ELK, etc.
Мониторинг приложения: 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
Мониторинг приложения: JavaMelody
1. Real-time application health monitoring (is it dead yet?);2. Возможность быстро реагировать на outage’ы и решать
сиюминутные проблемы;3. Логи не всегда показывают всю картину произошедшего,
можно посмотреть что было с приложением в определённый момент времени;
4. Возможность предусмотреть многие проблемы ещё до того, как сработает dev-ops alerting (он же у вас есть, правда?);
5. Графики более наглядны для менеджеров и прочих бизнесов;
6. Легче ответить на вопросы клиента а-ля “почему мы потеряли много килобаксов денег?”;
7. Дев-опсы скажут вам спасибо!
Зачем мне всё это?
14
Мониторинг приложения: JavaMelodyThreads
Memory
1. Видна нагрузка на сервер2. Пики (очевидно) в вечернее время.
1. “Пила” показывает как приложение ест память, можно копать глубже
2. Кореллирует по времени с GC-graph’ом
3. Проседания справа - деплойменты
15
Мониторинг приложения: JavaMelody
Web Server Administration Server
16
Что это и зачем мне это?
Elasticsearch + Logstash + Kibana - стек технологий для аггрегации, анализа и визуализации данных из логов.
1. Статистические данные в реальном времени из логов приложения;
2. Настраиваемые выборки под конкретные условия и ситуации;
3. Ещё больше цветастых графиков, понятных даже вашему менеджеру;
4. Полезно не только с технической стороны, но и со стороны бизнеса;
5. Лишний повод привести в порядок логгирование в вашем приложении;
Мониторинг приложения: Логи и ELK
17
Мониторинг приложения: Логи и ELK - бизнес
18
Мониторинг приложения: Логи и ELK - девелопер
19
Мониторинг приложения: 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
Time for an update!А давайте обновим фреймворки!
1. Обновление JDBC-драйвера, Tomcat threadpool’а и прочих штук - полезно;
2. Неочевидные изменения под капотом фреймворков могут привести к конфликтам библиотек;
3. “Работает - не трогай!” не всегда справедливо;
4. Отдельная история с application server’ами и версией Java - ВНИМАТЕЛЬНО читать change-log’и;
21
Полезные ссылки
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
Вопросы
23
Спасибо за внимание!
24