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

SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

Apr 11, 2017

Download

Software

Inhacking
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

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

Докладчики: Дмитрий Куперман, Егор ВолковДата: 3.09.2016

Page 2: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

План1. Что такое легаси - осмысление2. Что с этим всем делать - подходы3. А руками - девелоперские практики4. Как это менеджить - приёмы управления легаси проектами5. Да ладно, не всё так плохо - примеры весёлого кода6. Примеры оптимизации - что стоит попробовать7. Мониторинг приложений - JavaMelody8. Мониторинг приложений - логи и ELK (ElasticSearch + Logstash + Kibana)9. Мониторинг приложений - мониторинг и менеджмент JVM

2

Page 3: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

Как работать с легаси и сохранить психическое здоровьеПодходы, техники, примеры

Page 4: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

Что такое легаси Дано:

1. Исто(е)рический код2. Старые технологии3. Неконсистентная архитектура4. Недостаток или отсутствие документации

НО

5. ПРОДАКШНa. Деньгиb. Надёжность (блажен кто верует)c. Риски

Надо:

1. Разработка нового функционала2. Багфиксинг3. Стабилизация

4

Page 5: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

Что с этим всем делать1. Читать код (понять ход мыслей автора)2. И смежный тоже3. Докапываться до самой глубины (Call Hierarchy, Type

Hierarchy)4. Дебажить, в том числе и либы, в том числе и

опенсорсные, которые потом, возможно, пересобирать5. Искать старую докуметацию и носителей знаний6. Документировать результаты своего reverse engineering-а

(flow diagrams, sequence diagrams)a. Отдельные документы для технарей и бизнесаb. Не забывать этой документацией пользоваться

5

Page 6: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

А руками?1. НЕ ПЕРЕПИСЫВАТЬ!2. Реализовывать новый функционал. Писать консистентно с

существующим кодом3. Отталкиваться от business value при оптимизации и

стабилизации. 4. Тестировать (manual + unit + automation)5. Рефакторить, когда уже невмоготу или очень понемногу (тот

же business value)6. Наладить взаимодействие с девопсами: релизная

процедура, outage alerting, отдельные environment-ы для всего

7. Branching strategy8. Code review and tools

6

Page 7: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

Как это менеджить1. Не всем девелоперам подходит2. Тщательно подбирать команду по личностным

качествам - без чувства юмора и самоиронии загнётесь. Без терпения - тоже.

3. Напоминать о всех вышеупомянутых техниках4. Задавать дурные вопросы людям5. Терпеливо объяснять новому менеджменту, что

“здесь так принято”6. Выстроить процесс и следовать ему во избежание

увеличения энтропии7. Оверэстимейтить - закладывать буферы на

сюрпризы (неочевидные зависимости - пример с css)

8. Противостоять потоку бизнес-требований (баланс бизнеса и стабилизации)

9. Вести technical debt10. Отдельные маленькие проекты по стабилизации11. Иметь SWAT-группу

7

Page 8: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

Да ладно, не всё так плохо.../**

* 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

Page 9: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

Да ладно, не всё так плохо...

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

Page 10: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

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

Page 11: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

Примеры оптимизации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

Page 12: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

Мониторинг Java-приложенийJavaMelody, ELK, etc.

Page 13: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

Мониторинг приложения: 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

Page 14: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

Мониторинг приложения: JavaMelody

1. Real-time application health monitoring (is it dead yet?);2. Возможность быстро реагировать на outage’ы и решать

сиюминутные проблемы;3. Логи не всегда показывают всю картину произошедшего,

можно посмотреть что было с приложением в определённый момент времени;

4. Возможность предусмотреть многие проблемы ещё до того, как сработает dev-ops alerting (он же у вас есть, правда?);

5. Графики более наглядны для менеджеров и прочих бизнесов;

6. Легче ответить на вопросы клиента а-ля “почему мы потеряли много килобаксов денег?”;

7. Дев-опсы скажут вам спасибо!

Зачем мне всё это?

14

Page 15: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

Мониторинг приложения: JavaMelodyThreads

Memory

1. Видна нагрузка на сервер2. Пики (очевидно) в вечернее время.

1. “Пила” показывает как приложение ест память, можно копать глубже

2. Кореллирует по времени с GC-graph’ом

3. Проседания справа - деплойменты

15

Page 16: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

Мониторинг приложения: JavaMelody

Web Server Administration Server

16

Page 17: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

Что это и зачем мне это?

Elasticsearch + Logstash + Kibana - стек технологий для аггрегации, анализа и визуализации данных из логов.

1. Статистические данные в реальном времени из логов приложения;

2. Настраиваемые выборки под конкретные условия и ситуации;

3. Ещё больше цветастых графиков, понятных даже вашему менеджеру;

4. Полезно не только с технической стороны, но и со стороны бизнеса;

5. Лишний повод привести в порядок логгирование в вашем приложении;

Мониторинг приложения: Логи и ELK

17

Page 18: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

Мониторинг приложения: Логи и ELK - бизнес

18

Page 19: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

Мониторинг приложения: Логи и ELK - девелопер

19

Page 20: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

Мониторинг приложения: 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

Page 21: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

Time for an update!А давайте обновим фреймворки!

1. Обновление JDBC-драйвера, Tomcat threadpool’а и прочих штук - полезно;

2. Неочевидные изменения под капотом фреймворков могут привести к конфликтам библиотек;

3. “Работает - не трогай!” не всегда справедливо;

4. Отдельная история с application server’ами и версией Java - ВНИМАТЕЛЬНО читать change-log’и;

21

Page 23: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

Вопросы

23

Page 24: SE2016 Java Dmitriy Kouperman "Working with legacy systems. Stabilization, monitoring, management"

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

24