Оперирование высоко нагруженными проектами. Или "Клановые войны" каждый день
Grpahite&grafana
1. Использование Graphite и Grafana
Левон Авакян / WoT Server
Reliability /
l_avakyan@wargaming.net
Собираем метрики
1
Devops.Events
2. Содержание 2
• Зачем нужно собирать метрики?
• Как можно собирать метрики?
• Разбираем Graphite по частям
• Вопросы производительности. Go-carbon
• Graphana. Основные фичи
О чем мы будем говорить
Devops.Events
15. Graphite 15
• carbon-cache.py - принимает метрики по многим протоколам и
как можно быстрее записывает их
• carbon-relay.py – репликация и шардинг
• carbon-aggregator.py – работает перед carbon-cache, собирая
метрики до того как отправить их в хранилище
• carbon-aggregator-cache.py – два предыдущих демона в одном
Вид изнутри
http://graphite.readthedocs.io/en/latest/index.html
Devops.Events
18. Statsd 18
• statsd – простой демон, созданный для того чтобы
собирать и агрегировать метрики.
• Должна существовать клиентская реализация для
работы statsd в приложении. В связи с огромной
популярностью формат statsd стал де-факто
протоколом для сбора и агрегации метрик.
• Приложение по UDP шлет метрики в statsd, сам же
statsd собирает их и отправляет на бэкенд.
Вид изнутри
19. Statsite 19
Сервер метрик. Реализация statsd на С.
(https://github.com/statsite/statsite)
• Быстрый и надежный
• Минимизирует потребление памяти
• Поддерживает большое количество бэкендов
Вид изнутри
Devops.Events
20. Statsite 20
Пример использования
>>> import statsd
>>> c = statsd.StatsClient('localhost', 8125) # statsite host and port (udp)
>>> c.incr('foo') # Increment the 'foo' counter.
>>> c.timing('stats.timed', 320) # Record a 320ms 'stats.timed'.
>>> import statsd
>>> c = statsd.StatsClient('localhost', 8125, prefix='foo') # statsite host and
port (udp)
>>> c.incr('bar') # Will be 'foo.bar' in statsite/graphite.
Devops.Events
21. Пример реализации для falcon 21
def wrapper(func, timer_name):
@wraps(func)
def wrapped(*args, **kwargs):
with statsd.timer(timer_name):
res = func(*args, **kwargs)
return res
return wrapped
class StatsReportingAPI(type): # Use this a a __metaclass__ for any resource you want to automatically
report request timings
def __new__(meta, classname, bases, classDict):
newClassDict = {}
for attributeName, attribute in classDict.items():
if attributeName.startswith('on_') and type(attribute) == FunctionType:
key = '%s.%s.%s' % (
classDict['__module__'],
classname,
attributeName
)
attribute = wrapper(attribute, key)
newClassDict[attributeName] = attribute
return type.__new__(meta, classname, bases, newClassDict)
23. Сбрасываем метрики в графит 23
• Читаем stdin. На вход plain text вида
key|val|timestampn
• Собираем данные, пакуем с помощью pickle
• Раз в N секунд отправляем собранные метрики
sinks/statsite_graphite_sink.py graphite
Devops.Events
25. Работаем в продакшене 25
• Метрик становится больше
• Хотим хранить более точные данные
• Метрики собираем, посмотреть становится
проблематично
• Основная проблема I/O
Devops.Events
26. Ищем альтернативы 26
carbon-cache go-carbon
Использует одно ядро Один демон использует множество
ядер
Много опций для конфигурации Написан на Go
Поставляет в коробке Мало опций для конфигурации
Работает примерно в 4 раза
быстрее*
Devops.Events
27. Ищем альтернативы 27
carbon-relay carbon-ng-relay carbon-c-relay
Написан на twisted Написан на Go Написан на С
Нативный Web-panel Расширенное
управление кластером
Лайф апдейты
Агригаторы
В 2-3 раза быстрее
carbon relay*
На порядок быстрее
carbon-ng-relay*
Devops.Events
30. Grafana 30
Open-source решение для построение дашбордов и
различных графиков для Graphite, Elastic Search,
OpenTSDB, Prometheus and InfluxDB.
https://grafana.com/
Devops.Events
Как понимать что фича или система делает, то что мы от нее хотели
Как понима
Скорее требования, которые важны для оперирования.
Лучше посмотреть, что зарание все хорошо
Несколько стратегий для сбора Push - система шлет о себе данные.
Time series data - это приницп хранения данных, когда данные индексированны по времени. То есть какому-то промежутку времени, сооветсвуют какие-то данны