Skip to content

Repository files navigation

Coverage StatusBuild StatusLicense

StatsdHandler

Logging handler для представлення параметрів, які передаються в extra повідомлення логування у вигляді певних метрик

Установка:

pip install statsdhandler

Типи метрик

StatsdHandler параметри в лог записі може представляти у вигляді наступних метрик

  • Gauge - аплікація відправляє metric_name:value|g де value десяткове/дробове число, statsd повертає останнє значення. Також аплікація може інкрементувати або декрементувати попереднє значення якщо перед ним першим символом буде + або -
  • Counters/Лічильники - аплікація відправляє metric_name:value|c, де value додатнє або від'ємне ціле число подій що відбулись statsd повертає суму значень
  • Timers/Histograms - аплікація віправляє metric_name:value|ms або metric_name:value|h, де value є будь-яке дробове число, statsd повертає min, max, average, average of 95 percentile, median і standart deviation
  • Sets - аплікація відправляє metric_name:value|s, де value будь-що (число або текст, пробіли на початку і в кінці стрічки видаляються) statsd повертає к-ть унікальних значень серед відправлених.

Налаштування

Безпосередньо в коді

importloggingfromstatsdhandler.statsdhandlerimportStatsdHandlerimporttimelogger=logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
sdh=StatsdHandler(config_path='path/to/config.yaml')
sdh.setLevel(logging.DEBUG)
logger.addHandler(sdh)

Використовуючи конфігураційний файл вашої аплікації

main:
host: localhostport: 1234my_app_other_param: some_value_3formatters:
simple:
format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"handlers:
console:
class: logging.StreamHandlerlevel: INFOformatter: simplestream: ext://sys.stdoutstatsd:
class: statsdhandler.statsdhandler.StatsdHandlerlevel: DEBUGconfig_path: path/to/handler/config.yamlloggers:
mylogger:
handlers: [console, statsd]propagate: nolevel: DEBUGmylogger_2:
handlers: [console, statsd]propagate: nolevel: DEBUG"":
handlers: [console, statsd]level: DEBUG

Лістінг конфігураційного файлу хендлера:

main:
app_key: app_keyhost: localhostport: 8125publish_templates:
all_levels:
- '%(logger)s;%(attr)s;%(metric_name)s'
- '%(attr)s;%(metric_name)s'
- '%(metric_name)s'full_path:
- '%(logger)s;%(attr)s;%(metric_name)s'counters:
MESSAGE_ID:
value_type: keyREQUEST_METHOD:
value_equals: [POST, PUT]value_type: keypublish_template: all_levelsREQUESTS:
value_type: valuepublish_template: full_pathtimers:
- start_attr_name: JOURNAL_REQUEST_START_1end_attr_name: JOURNAL_REQUEST_END_1publish_template: full_pathname: timer_name
- value_attr_name: JOURNAL_REQUEST_DUR_TIMEpublish_template: full_pathname: timer_name_3gauges:
JOURNAL_GAUGE_ATTR:
publish_template: full_pathJOURNAL_GAUGE_ATTR_DECR: {}histograms:
HISTOGRAM_ARG:
publish_template: full_pathsets:
SET_ARG: {}SET_ARG:
publish_template: full_path

В конфігураційному файлі хендлера ключові значення:

  • секція main

    • app_key - префікс для метрик
    • host - ІР на якому 'крутиться' statsd
    • port - порт на якому крутиться statsd
  • секція publish_templates: all_levels i full_path - це шаблони форматів метрик, які хендлер буде відсилати в statsd наприклад для шаблону all_levels і лічильника REQUEST_METHOD одна і таж метрика буде відсилатись тричі

    app_key.mylogger;REQUEST_METHOD;POST:1|c
    app_key.REQUEST_METHOD;POST:1|c
    app_key.POST:1|c
    

    такий спосіб надсилання потрібний для того щоб агрегувати одні і тіж метрики на кілької рівнях аплікації, у варіанті з логером ми отримаємо на виході к-ть POST опрацьованих певним модулем, у варіанті без логера ми отримаєм к-ть POST із заданим атрибутом по всіх логерах, і у варіанті де лише app_key i POST ми отримаємо к-ть POST по всій аплікації зі всіх модулів із різних атрибутів що відслідковуються.

  • секція counters: MESSAGE_ID, REQUEST_METHOD, REQUESTS - перелік атрибутів log_recod об'єкту які будуть надсилатись в statsd як лічильники, кожен з них це словник, який може бути пустим або мати наступні ключі:

    • value_type - це строка яка може приймати значення key або value яка вказує як інтерпретувати значення атрибуту, як ключ чи як значення, у випаду key значення атрибуту додасться в кінці назви метрики, а значенням лічильника буде 1
    logger.info('Upload file', extra={'MESSAGE_ID': 'upload_file'})

    в statsd відправиться наступне:

    app_key.mylogger;MESSAGE_ID;upload_file:1|c
    

    в іншому випадку атрибут буде закінченням назви метрики а значення атрибута буде значенням метрики

    logger.info('New requests', extra={'REQUESTS': 5})

    в statsd відправиться:

    app_key.mylogger;REQUESTS;REQUESTS:5|c
    
    • value_equals - це масив який містить значення які потрібно надсилати у statsd, тобто якщо атрибут REQUEST_METHOD матиме значення відмінне від POST i PUT, то в statsd нічого не відправиться
    • publish_template - строка яка містить назву шаблону, якщо її не передати, то використовуватиметься шаблон по замовчуванню такий же як full_path, якщо передати невірну назву шаблону, то також буде використовуватись шаблон по замовчуванню.
  • секція timers: Це масив словників які описують параметри таймерів:

    • start_attr_name - назва атрибуту, значення якого сприймати за початок відліку
    • end_attr_name - назва атрибуту, значення якого сприймати як кінець відліку
    • value_attr_name - назва атрибуту, значення якого сприймати як результат (час) виконання певного процесу
    • name - назва яка буде використовуватись для таймера для шаблонів це змінна %(metric_name)s
  • секції gauges, histograms i sets: Це словники в яких ключем виступає назва атрибуту який буде представлятись як метрики gauges, histograms або sets в залежності від секції в якій буде розміщенний, а значенням словник який може бути пустим або містити ключ publish_template який вказує на шаблон форматування метрики.

About

StatsdHandler

Resources

Stars

1 star

Watchers

9 watching

Forks

Releases

Packages

Used by

Contributors

Languages