34
@maxmaxmaxmax МАКСИМ КЛИМИШИН CTO GVMachines Inc. I/O в приложениях , логи со смыслом

KharkovPy #12: I/O in Python apps and smart logging (russian)

Embed Size (px)

Citation preview

Page 1: KharkovPy #12: I/O in Python apps and smart logging (russian)

@maxmaxmaxmaxМАКСИМ КЛИМИШИНCTO GVMachines Inc.

I/O в приложениях, логи со смыслом

Page 2: KharkovPy #12: I/O in Python apps and smart logging (russian)

I/O?

Page 3: KharkovPy #12: I/O in Python apps and smart logging (russian)

Состояние?

Page 4: KharkovPy #12: I/O in Python apps and smart logging (russian)

Логи?

Page 5: KharkovPy #12: I/O in Python apps and smart logging (russian)

Проблема роста

Проблема

С ростом пользовательской базы возникают проблемы с редкими событиями.

Page 6: KharkovPy #12: I/O in Python apps and smart logging (russian)

Проблема

Баги в коде или в бизнес логике, возникающие при очень редком стечении обстоятельств превращаются во вполне конкретное время

команды поддержки и/или разработки, потраченные на анализ

Page 7: KharkovPy #12: I/O in Python apps and smart logging (russian)

Причины

Проблема

Поскольку количество вариантов произвольных данных на входе и выходе требуют слишком

много времени для тестирования, невозможно их исчерпывающе протестировать.

Page 8: KharkovPy #12: I/O in Python apps and smart logging (russian)

Решения

Page 9: KharkovPy #12: I/O in Python apps and smart logging (russian)

Первая мысль

Решения

‣ Больше тестов

‣ Больше QA

‣ Итеративно исправлять

Page 10: KharkovPy #12: I/O in Python apps and smart logging (russian)

Ну да…

Решения

Page 11: KharkovPy #12: I/O in Python apps and smart logging (russian)

Подходы

Решения

‣ Хранение состояния, gdb, pdb, strace

‣ текстовые логи

‣ логи цепочек, логи изменений объектов

Page 12: KharkovPy #12: I/O in Python apps and smart logging (russian)

Состояние

Page 13: KharkovPy #12: I/O in Python apps and smart logging (russian)

Состояние

Вся информация в оперативной памяти, к которой приложение имеет доступ в данный

конкретный момент времени.

Page 14: KharkovPy #12: I/O in Python apps and smart logging (russian)

Состояние

1. Мы можем хранить слепки состояния

2. Мы можем хранить вывод утилит типа strace, tcpdump

3. Мы можем хранить лог всех изменений внутри приложения (CREATE-UPDATE-DELETE)

Page 15: KharkovPy #12: I/O in Python apps and smart logging (russian)

Состояние

Общий недостаток таких подходов является то, что на большом объеме это невозможно сделать,

используя разумное количество ресурсов

Page 16: KharkovPy #12: I/O in Python apps and smart logging (russian)

Когда уместен анализ

Состояние

1. Когда мы знаем, в чем проблема

2. Когда мы знаем где проблема

3. Когда мы можем частично ограничить выполнение приложения для исследования

Page 17: KharkovPy #12: I/O in Python apps and smart logging (russian)

Пример pdb

Состояние

# test.py from remote_pdb import RemotePdb RemotePdb('127.0.0.1', 4444).set_trace()

# client shell $ socat readline tcp:127.0.0.1:4444

Page 18: KharkovPy #12: I/O in Python apps and smart logging (russian)

Пример straceСостояние

# shell strace -f python simple_numbers.py

# output:

read(3, "n = input(\"n=\")\na = range(n+1)\na"..., 264) = 264 read(3, "\n i += 1\nprint lst\n", 4096) = 22 close(3) = 0 munmap(0x7fe4f39ec000, 4096) = 0 stat("simple_numbers.py", {st_mode=S_IFREG|0644, st_size=286, ...}) = 0 open("simple_numbers.py", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=286, ...}) = 0 ioctl(3, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, 0x7ffea1fa1e60) = -1 ENOTTY (Inappropriate ioctl for device)

Page 19: KharkovPy #12: I/O in Python apps and smart logging (russian)

Умные логи

Page 20: KharkovPy #12: I/O in Python apps and smart logging (russian)

Простые логи

Умные логи

1. Во время разработки возникает желание писать текстовые логи

2. В зависимости от задачи и домена подробность логов варьирует

3. Зачастую пишутся количественные показатели (количество элементов, размеры тп)

Page 21: KharkovPy #12: I/O in Python apps and smart logging (russian)

Умные логи

Основной принцип – разработчик пишет логи, которые важны и уместны для него в процессе разработки и тестирования, а не в процессе

эксплуатации

Page 22: KharkovPy #12: I/O in Python apps and smart logging (russian)

Умные логи

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

время эксплуатации приложения

Page 23: KharkovPy #12: I/O in Python apps and smart logging (russian)

Умные логи

‣ Важно знать когда произошли изменения состояния

‣ Надо писать что изменилось и когда

‣ Возможно, дампить данные, которые были удалены

Page 24: KharkovPy #12: I/O in Python apps and smart logging (russian)

Умные логи

obj X CREATE X

LOGAPP

…TIM

E

obj X UPDATE X

Page 25: KharkovPy #12: I/O in Python apps and smart logging (russian)

Пример логаУмные логи

# bad one INFO 2016-02-13 02:32:30,901 invalidator 3351 Changed 1 ids within User, start invalidation... INFO 2016-02-13 02:32:30,916 invalidator 3351 Invalidation of User finished within 0.0149869918823 seconds

# better one INFO 2016-02-13 02:32:30 invalidator User 123123 created INFO 2016-02-13 02:40:04 invalidator User 123123 updated

# best one INFO 2016-02-13 02:32:30 invalidator User 123123 created INFO 2016-02-13 02:40:04 invalidator User 123123 updated, fields: name=Jo => John, phone= “” => 8572043434

Page 26: KharkovPy #12: I/O in Python apps and smart logging (russian)

Умные логи

‣ Можно построить хронологию событий

‣ Можно пользоваться простым grep-ом

‣ Может разобраться пользователь, без досконального понимания архитектуры приложения

В чем разница?

Page 27: KharkovPy #12: I/O in Python apps and smart logging (russian)

Умные логи

‣ Сделать логи с контекстом – добавлять кусочек JSON

‣ Дополнительно писать домен-специфичные данные – результаты вычислений, время выполнения и т.п.

‣ Агрегировать разные типы лога и создавать цепочки событий

А что еще можно?

Page 28: KharkovPy #12: I/O in Python apps and smart logging (russian)

Умные логи

‣ Splunk – Because ninjas are too busy

‣ Logstash – Process Any Data, From Any Source

‣ Graylog – Open source log management that actually works

Что уже есть

Page 29: KharkovPy #12: I/O in Python apps and smart logging (russian)

Этого недостаточно

Умные логи

1. В первый день использования Splunk мы превысили 5GB/день текстовых логов

2. Это было 3.5 года назад!

Page 30: KharkovPy #12: I/O in Python apps and smart logging (russian)

Проблемы с логами

Умные логи

1. Объем – нужно аккуратно добавлять в инструменты новые логи, следить за объемом за единицу времени

2. Межнодовый трафик – ноды анализаторов лучше держать в одном датацентре с приложениями

Page 31: KharkovPy #12: I/O in Python apps and smart logging (russian)

Возможные решения

Умные логи

1. Ротировать с какой-то гранулярностью, архивировать и заливать

2. Держать все в одном ДЦ

3. Уменьшать размер log payload

Page 32: KharkovPy #12: I/O in Python apps and smart logging (russian)

Выводы

Page 33: KharkovPy #12: I/O in Python apps and smart logging (russian)

Зачем это надо программисту?

Выводы

‣ Писать поддерживаемые системы это круто и ценно

‣ Думать на шаг больше вперед – это отличает хороших от лучших

Page 34: KharkovPy #12: I/O in Python apps and smart logging (russian)

Спасибо.

Thanks!

@maxmaxmaxmax