se2016 java dmitriy kouperman "working with legacy systems. stabilization, monitoring,...

24
Работа с легаси системами Стабилизация, мониторинг, менеджмент Докладчики: Дмитрий Куперман, Егор Волков Дата: 3.09.2016

Upload: inhacking

Post on 11-Apr-2017

46 views

Category:

Software


3 download

TRANSCRIPT

Работа с легаси системамиСтабилизация, мониторинг, менеджмент

Докладчики: Дмитрий Куперман, Егор ВолковДата: 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

Вопросы

23

Спасибо за внимание!

24