Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Всеволод Поляков
История одного мониторинга…
Обо мне
Миллиардер

Плейбой

Филантроп
Обо мне
Консультант

Инженер

Сисадмин
хайрит!
https://jobs.dou.ua/companies/datarobot/vacancies/
https://ukrops.club
https://t.me/
UkropsDigest
Давайте поговорим
про мониторинг
НЕДОСТАТОЧНО
МОНИТОРИНГА!
Условия выбора
• Ценакачество

• Фичи которые нам нужны
Какие системы
есть?
Cabot
Расчёт стоимости
Версия SaaS
Стоимость в год:
(1300 * 12) = 15.600$
• Стоимость серверов: 3 (m4.x2large + 1 Tb) ≈ 1300$/m
Стоимость в год:
(1300 * 12) + (4500 * 12) = 69.600$
• Стоимость серверов: 3 (m4.x2large + 1 Tb) ≈ 1300$/m

• Стоимость 30% времени команды: (15.000$/m * 30)/100 ≈
4500$
Стоимость в год:
(1300 * 12) + (4500 * 12) = 69.600$
• Стоимость серверов: 3 (m4.x2large + 1 Tb) ≈ 1300$/m

• Стоимость 30% времени команды: (15.000$/m * 30)/100 ≈
4500$

• Упущенная выгода на внедрение = месяц * все деньги от
даунтаймов ≈ бесценно.
15$/h * 12 * 200h = 36.000$
69.600 - 36.000 = 33.600$
выгоды!
Datadog (minimum price) per host
Расчёт стоимости
Версия self hosted
Стоимость в год:
(516 * 12) = 6.192$
• Стоимость серверов: 3 (m4.large + 1 Tb) ≈ 516$/m
Стоимость в год:
(516 * 12) + (750 * 12) = 15.192$
• Стоимость серверов: 3 (m4.large + 1 Tb) ≈ 516$/m

• Стоимость 5% времени команды: (15.000$/m * 5)/100 ≈
750$
15$/h * 12 * 200h = 36.000$
23$/h * 12 * 200h = 55.200$
55.200 - 15.192 = 40.008$
выгоды!
Datadog (minimum price) per host
Datadog (maximum price) per host
Главное — правильно
сравнивать
Как считаю я
• Есть ли люди которым интересно заниматься и
поддерживать мониторинг?

• Какие фичи нам нужны и в каких решениях они есть?

• Сколько метрик мы собираемся собирать?

• Сколько времени мы хотим хранить данные?
Что такое
мониторинг?
Алерты
Детализация
Дебаг
Профайлинг
На хостах
Из базы данных
Чеки на хостах
Плюсы:

• Не нужна база данных

• Простая логика

Минусы:

• Всё равно нужна база данных

• Простой логики недостаточно

• Нет предсказаний

• Нет истории
Что хранить в БД?
• События:

• Можно делать что-угодно
Какие бывают события
• Статус ответа

• Время выполнения чего-то

• Ошибки

• Уникальные ID

• Потребление какого-то ресурса
Всеволод Поляков "История одного мониторинга"
Всеволод Поляков "История одного мониторинга"
Всеволод Поляков "История одного мониторинга"
Типичная математика
• Количество за фрейм времени (чтобы видеть тренд)

• Гистограммы (распределения)

• Среднеемаксимальноеминимальное

• Перцентили
Что хранить в БД?
• События:

• Дорого опрашивать

• Дорого хранить
Всеволод Поляков "История одного мониторинга"
Метрик должно
быть много!
Алерты Мало метрик
Детализация
Дебаг
Профайлинг
Много метрик
Ещё больше
метрик
/some_page
/some_page
Статус ответа
10..
20..
30..
40..
50..
/some_page
Статус ответа
10..
20..
30..
40..
50..
Время ответа
/some_page
Статус ответа
10..
20..
30..
40..
50..
Время ответа
Первый байт
Полное время
Коннект к бекенду
/some_page
Статус ответа
10..
20..
30..
40..
50..
Время ответа
Первый байт
Полное время
Коннект к бекенду
Гистограммы
0..100ms
100..200ms
…
1s..infinity
/some_page
Статус ответа
10..
20..
30..
40..
50..
Время ответа
Первый байт
Полное время
Коннект к бекенду
Гистограммы Перцентили
0..100ms
100..200ms
…
1s..infinity
99.9%
99%
…
50%
/some_page
Статус ответа
10..
20..
30..
40..
50..
Время ответа
Первый байт
Полное время
Коннект к бекенду
Гистограммы Перцентили
0..100ms
100..200ms
…
1s..infinity
99.9%
99%
…
50%
Уники по IP
/some_page
Статус ответа
10..
20..
30..
40..
50..
Время ответа
Первый байт
Полное время
Коннект к бекенду
Гистограммы Перцентили
0..100ms
100..200ms
…
1s..infinity
99.9%
99%
…
50%
Уники по IP
Прочие
метрики
• Время и количество выполнений функций

• В и К выполнений внешних запросов

• Прочие штуки (количество подключений, обьем хипа)
• Системные метрики

• Дисковая подсистема

• Сеть

• Всякая лабуда

• Докеры-шмокеры
Пересчитываем
стоимость
Это ещё не полное разрешение
(100 000 / 200 = 500) * 23 * 12 = 138,000$/year
SaaS
6 инстансов, 8 терабайт дисков
Храним сколько хотим
1700 * 12 = 20,400$/year
Где хранить
метрики?
Всеволод Поляков "История одного мониторинга"
Инстанс 1
Приложение
Prometheus
API
Коллектор
системных метрик
Prometheus
API
Инстанс 2
Инстанс 3
Инстанс 4
Service
Discovery
К
О
Л
Л
Е
К
Т
О
Р
Storage PromQL
Alerting
WebUI
Функции
• abs()
• absent()
• ceil()
• changes()
• clamp_max()
• clamp_min()
• count_scalar()
• day_of_month()
• day_of_week()
• days_in_month()
• delta()
• deriv()
• drop_common_labels()
• exp()
• floor()
• histogram_quantile()
• holt_winters()
• time()
• vector()
• year()
• <aggregation>_over_time()
• hour()
• idelta()
• increase()
• irate()
• label_join()
• label_replace()
• ln()
• log2()
• log10()
• minute()
• month()
• predict_linear()
• rate()
• resets()
• round()
• scalar()
• sort()
• sort_desc()
• sqrt()
Prometheus
• Удобно устанавливать

• Алертинг из коробки

• Cross-region из коробки

• Поддерживает теги

• Медленный и ресурсоемкий (не тестировал новую версию)

• Слабая математика

• Проблемы с перцентилями

• Проблема с историческими данными (нет инструментов для
ребалансинга)
Всеволод Поляков "История одного мониторинга"
Инстанс 1
Приложение
Коллектор
системных метрик
Инстанс 2
Инстанс 3
Инстанс 4
influxDB
Alerting
WebUI
Функции
•COUNT()
•DISTINCT()
•INTEGRAL()
•MEAN()
•MEDIAN()
•MODE()
•SPREAD()
•STDDEV()
•SUM()
•CEILING()
•CUMULATIVE_SUM()
•DERIVATIVE()
•DIFFERENCE()
•ELAPSED()
•FLOOR()
•HISTOGRAM()
•MOVING_AVERAGE()
•NON_NEGATIVE_DERIVATIVE()
•NON_NEGATIVE_DIFFERENCE()
Influxdb
• Поддерживает теги

• Платный кластеринг

• Достаточно медленный

• Достаточно глючный (в прошлом)

• Свой алертинг

• Всё ещё мало математики
Elasticsearch
• Всё в одном

• Достаточно медленный

• Можно записывать не много метрик

• Алертинг платный

• Но, отлично подходит для RAW данных
Всеволод Поляков "История одного мониторинга"
Инстанс 1
Приложение
Коллектор
системных метрик
Инстанс 2
Инстанс 3
Инстанс 4
relay
Node 1
cache1
cache2
Web
Node 2
cache1
cache2
Web
Функции
absolute(seriesList)
aggregate(seriesList, func, xFilesFactor=None)
aggregateLine(seriesList, func='avg')
asPercent(seriesList, total=None, *nodes)
averageAbove(seriesList, n)
averageBelow(seriesList, n)
averageOutsidePercentile(seriesList, n)
averageSeries(*seriesLists)
changed(seriesList)
consolidateBy(seriesList, consolidationFunc)
countSeries(*seriesLists)
cumulative(seriesList)
currentAbove(seriesList, n)
currentBelow(seriesList, n)
derivative(seriesList)
diffSeries(*seriesLists)
divideSeries(dividendSeriesList, divisorSeries)
drawAsInfinite(seriesList)
exponentialMovingAverage(seriesList, windowSize)
highestAverage(seriesList, n)
highestCurrent(seriesList, n)
highestMax(seriesList, n)
hitcount(seriesList, intervalString, alignToInterval=False)
holtWintersAberration(seriesList, delta=3, bootstrapInterval=‘7d')
holtWintersConfidenceArea(seriesList, delta=3, bootstrapInterval='7d')
holtWintersConfidenceBands(seriesList, delta=3, bootstrapInterval='7d')
holtWintersForecast(seriesList, bootstrapInterval='7d')
integral(seriesList)
integralByInterval(seriesList, intervalUnit)
interpolate(seriesList, limit=inf)
invert(seriesList)
linearRegression(seriesList, startSourceAt=None, endSourceAt=None)
linearRegressionAnalysis(series)
lowestAverage(seriesList, n)
lowestCurrent(seriesList, n)
maxSeries(*seriesLists)
maximumAbove(seriesList, n)
maximumBelow(seriesList, n)
minMax(seriesList)
Функции
minSeries(*seriesLists)
minimumAbove(seriesList, n)
minimumBelow(seriesList, n)
mostDeviant(seriesList, n)
movingAverage(seriesList, windowSize, xFilesFactor=None)
movingMax(seriesList, windowSize, xFilesFactor=None)
movingMedian(seriesList, windowSize, xFilesFactor=None)
movingMin(seriesList, windowSize, xFilesFactor=None)
movingSum(seriesList, windowSize, xFilesFactor=None)
movingWindow(seriesList, windowSize, func='average', xFilesFacto
r=None)
multiplySeries(*seriesLists)
nPercentile(seriesList, n)
summarize(seriesList, intervalString, func='sum', alignToFrom=Fals
e)
transformNull(seriesList, default=0, referenceSeries=None)
unique(*seriesLists)
weightedAverage(seriesListAvg, seriesListWeight, *nodes)
nonNegativeDerivative(seriesList, maxValue=No
ne)
offset(seriesList, factor)
offsetToZero(seriesList)
perSecond(seriesList, maxValue=None)
percentileOfSeries(seriesList, n, interpolate=Fal
se)
pow(seriesList, factor)
randomWalkFunction(name, step=60)
rangeOfSeries(*seriesLists)
reduceSeries(seriesLists, reduceFunction, reduce
Node, *reduceMatchers)
removeAbovePercentile(seriesList, n)
removeAboveValue(seriesList, n)
removeBelowPercentile(seriesList, n)
removeBelowValue(seriesList, n)
removeBetweenPercentile(seriesList, n)
roundFunction(seriesList, precision=None)
scale(seriesList, factor)
scaleToSeconds(seriesList, seconds)
sinFunction(name, amplitude=1, step=60)
squareRoot(seriesList)
stddevSeries(*seriesLists)
Graphite
• Нет алертинга

• В меру проворный

• Достаточно математики

• Нет тегов (есть наработки)

• Своеобразный ребалансинг кластера

• И вообще кластер своеобразный
Всеволод Поляков "История одного мониторинга"
Инстанс 1
Приложение
Коллектор
системных метрик
Инстанс 2
Инстанс 3
Инстанс 4
OpenTSDB
HBase
(Hadoop)
Функции
• avg
• count
• Dev
• ep50r3
• first
• last
• mimmin
• mimmax
• min
• max
• p99
• sum
• zimsum
OpenTSDB
• Нет алертинга

• Местами неповоротливый

• Отличная расширяемость кластера

• Есть теги

• Мало математики
Cassandra back
Инстанс 1
Приложение
Коллектор
системных метрик
Инстанс 2
Инстанс 3
Инстанс 4
Hawkular
KairosDB
Cyanite
M3
OpenTSDB
Cassandra
Cassandra-back
• Нет алертинга

• Медленно читает

• Отличная расширяемость кластера

• Есть теги

• Мало математики, хотя можно руками дописывать
Go-graphite
Инстанс 1
Приложение
Коллектор
системных метрик
Инстанс 2
Инстанс 3
Инстанс 4
relay
Node 1
Go-carbon
Crabon-api
Node 2
Go-carbon
Crabonsearch
Функции
• Всё что в графите

• diffSeriesLists

• multiplySeriesLists

• Fast Fourier transform
• Kolmogorov–Smirnov test
• Low-pass filter
• Pearson correlation coefficient
• Polynomial regression
• Tukey's range test
Go-graphite
• Нет алертинга

• Быстрый на чтение

• Вменяемая расширяемость кластера (buckytools)

• Есть теги… ну можно прикрутить

• И с математикой всё отлично

• Читает из всех источников
Алерты
• Sensu

• Bosun

• Nagios

• Moira

• Grafana
–Выдуманный монах
“ELK для логов, сын мой”
И ещё одна штука…

More Related Content

Всеволод Поляков "История одного мониторинга"