@maxmaxmaxmaxМАКСИМ КЛИМИШИН
CTO GVMachines Inc.
I/O в приложениях,
логи со смыслом
I/O?
Состояние?
Логи?
Проблемароста
Проблема
Сростомпользовательскойбазывозникают
проблемысредкимисобытиями.
Проблема
Багив кодеиливбизнеслогике,возникающие
при оченьредкомстеченииобстоятельств
превращаютсявовполнеконкретное время
командыподдержкии/илиразработки,
потраченныенаанализ
Причины
Проблема
Посколькуколичествовариантовпроизвольных
данныхнавходеивыходе требуютслишком
многовремени длятестирования,невозможно
ихисчерпывающепротестировать.
Решения
Перваямысль
Решения
‣ Больше тестов
‣ Больше QA
‣ Итеративноисправлять
Нуда…
Решения
Подходы
Решения
‣ Хранениесостояния,gdb,pdb,strace
‣ текстовыелоги
‣ логицепочек,логиизмененийобъектов
Состояние
Состояние
Всяинформациявоперативнойпамяти,к
которойприложениеимеетдоступвданный
конкретный моментвремени.
Состояние
1. Мыможемхранитьслепкисостояния
2. Мыможемхранитьвыводутилиттипаstrace,
tcpdump
3. Мыможемхранитьлогвсехизменений
внутриприложения(CREATE-UPDATE-
DELETE)
Состояние
Общийнедостатоктакихподходовявляетсято,
чтонабольшомобъемеэтоневозможносделать,
используя разумноеколичестворесурсов
Когдауместенанализ
Состояние
1. Когдамызнаем,вчемпроблема
2. Когдамызнаемгдепроблема
3. Когдамыможемчастичноограничить
выполнениеприложениядляисследования
Пример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
Пример 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 += 1nprint lstn", 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)
Умныелоги
Простыелоги
Умные логи
1. Вовремяразработкивозникаетжелание
писатьтекстовыелоги
2. Взависимостиотзадачиидомена
подробностьлоговварьирует
3. Зачастую пишутсяколичественныепоказатели
(количествоэлементов,размерытп)
Умные логи
Основной принцип– разработчикпишетлоги,
которыеважныиуместныдлянеговпроцессе
разработкиитестирования,анев процессе
эксплуатации
Умные логи
Проблемав том,чтопрограммистпишетлоги,
которыепредположительнобудутполезныво
времяэксплуатацииприложения
Умные логи
‣ Важнознать когдапроизошлиизменения
состояния
‣ Надописать чтоизменилосьикогда
‣ Возможно,дампитьданные,которыебыли
удалены
Умные логи
obj X CREATE X
LOGAPP
…
…
TIME
obj X UPDATE X
Примерлога
Умные логи
# 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
Умные логи
‣ Можнопостроитьхронологию событий
‣ Можнопользоватьсяпростым grep-ом
‣ Можетразобратьсяпользователь,без
доскональногопонимания архитектуры
приложения
Вчемразница?
Умные логи
‣ Сделатьлоги сконтекстом – добавлятькусочек
JSON
‣ Дополнительнописатьдомен-специфичные
данные– результатывычислений,время
выполненияи т.п.
‣ Агрегироватьразныетипылогаисоздавать
цепочкисобытий
Ачтоещеможно?
Умные логи
‣ Splunk–Becauseninjasaretoobusy
‣ Logstash– ProcessAnyData,FromAnySource
‣ Graylog–Opensourcelogmanagementthat
actuallyworks
Чтоужеесть
Этогонедостаточно
Умные логи
1. Впервый деньиспользования Splunkмы
превысили5GB/деньтекстовыхлогов
2. Это было3.5годаназад!
Проблемыслогами
Умные логи
1. Объем– нужноаккуратнодобавлятьв
инструментыновыелоги,следитьзаобъемом
заединицу времени
2. Межнодовый трафик– нодыанализаторов
лучшедержатьводномдатацентрес
приложениями
Возможные решения
Умные логи
1. Ротировать скакой-тогранулярностью,
архивироватьи заливать
2. Держать всеводномДЦ
3. Уменьшать размерlogpayload
Выводы
Зачемэтонадопрограммисту?
Выводы
‣ Писатьподдерживаемыесистемыэтокрутои
ценно
‣ Думатьнашагбольшевперед –этоотличает
хорошихотлучших
Спасибо.
Thanks!
@maxmaxmaxmax

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