Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Кто возьмет метрик пачку, тот получит ресурсов ...

flant
August 23, 2024

Кто возьмет метрик пачку, тот получит ресурсов недостачку... (Владимир Гурьянов, DevOpsConf 2024)

Сложно представить себе современный проект без эффективной системы мониторинга, и в этом контексте Prometheus выделяется как стандарт де-факто.

В своем докладе я проанализирую, почему Prometheus потребляет столько ресурсов и расскажу, как можно этого избежать. Начнем анализ с изучения механизмов хранения серий данных в Time Series Database (TSDB) Prometheus. Особое внимание уделим тому, как выбор метрик, отправляемых в Prometheus, влияет на потребление ресурсов системы.

Затем перейдем к обсуждению различных подходов и инструментов, которые могут помочь оптимизировать работу Prometheus. Основной задачей будет найти баланс между сокращением потребления ресурсов и сохранением информативности и полезности данных, хранящихся в системе.

Эти аспекты являются ключевыми для обеспечения эффективного и экономичного мониторинга в современных проектах.

flant

August 23, 2024
Tweet

More Decks by flant

Other Decks in Technology

Transcript

  1. Владимир Гурьянов Solution Architect системы мониторинга Okmeter vladimir.guryanov@flant.com Чем занимаюсь

    Инженер, тимлид и архитектор с 10-летним стажем. Опыт С 2010 г. занимаюсь разработкой. С 2021 г. работаю в компании «Флант». С 2022 г. руковожу разработкой «хранилища мониторинга». С чем работаю больше всего Обо мне
  2. хостов Статистика по Okmeter зрелый продукт, сотни проектов 12 лет

    эксплуатации >250 компаний >5К метрик/мин >100 млн уникальных метрик 24/7 поддержка >10К используют Okmeter в качестве системы мониторинга по фактическим значениям круглосуточная помощь в любой ситуации в production с каждого хоста
  3. Опыт «Фланта» За 15 лет более тысячи компаний построили инфраструктуру

    с нашей поддержкой 1 000+ компаний доверяют нам свой production > 250 компаний под нашим управлением > 9 000 серверов работает на наших решениях > 50 000 приложений Количество заказчиков 2008 1 2010 11 2012 25 2014 52 2016 52 2018 107 2020 131 2022 202 Прямо сейчас: 2023 250
  4. Кто вы, мистер Prometheus? Prometheus Service Discovering EC2, Consul, K8s…

    Prometheus взаимодействует с различными API для получения списка источников данных. 1. Service Discovering
  5. Кто вы, мистер Prometheus? Prometheus Service Discovering Scraping EC2, Consul,

    K8s… Prometheus взаимодействует с различными API для получения списка источников данных. 1. Service Discovering 2. Scraping Собирает данные с источников по pull- модели и протоколу HTTP.
  6. Кто вы, мистер Prometheus? Prometheus Service Discovering Scraping EC2, Consul,

    K8s… exporter 3rd Party Application Источники данных: • exporter — приложение, которое само собирает метрики и отдает их в формате Prometheus Prometheus взаимодействует с различными API для получения списка источников данных. 1. Service Discovering 2. Scraping Собирает данные с источников по pull- модели и протоколу HTTP.
  7. Кто вы, мистер Prometheus? Prometheus Service Discovering Scraping EC2, Consul,

    K8s… exporter client library 3rd Party Application Application Источники данных: • exporter — приложение, которое само собирает метрики и отдает их в формате Prometheus • приложения Prometheus взаимодействует с различными API для получения списка источников данных. 1. Service Discovering 2. Scraping Собирает данные с источников по pull- модели и протоколу HTTP.
  8. Кто вы, мистер Prometheus? Prometheus Service Discovering Scraping Storage EC2,

    Consul, K8s… exporter client library 3rd Party Application Application Prometheus взаимодействует с различными API для получения списка источников данных. 1. Service Discovering 2. Scraping Собирает данные с источников по pull- модели и протоколу HTTP. 3. Storage Полученные данные сохраняются в Time Series Database (TSDB).
  9. Кто вы, мистер Prometheus? Prometheus Service Discovering Scraping Storage EC2,

    Consul, K8s… exporter client library 3rd Party Application Grafana Application Prometheus взаимодействует с различными API для получения списка источников данных. 1. Service Discovering 2. Scraping Собирает данные с источников по pull- модели и протоколу HTTP. 3. Storage Полученные данные сохраняются в Time Series Database (TSDB). 4. Визуализация данных Для получения данных используется PromQL. Для визуализации, как правило, используется Grafana.
  10. Кто вы, мистер Prometheus? Prometheus Service Discovering Scraping Storage Rules

    and Alerts EC2, Consul, K8s… exporter client library 3rd Party Application Grafana Application Prometheus взаимодействует с различными API для получения списка источников данных. 1. Service Discovering 2. Scraping Собирает данные с источников по pull- модели и протоколу HTTP. 3. Storage Полученные данные сохраняются в Time Series Database (TSDB). 4. Визуализация данных Для получения данных используется PromQL. Для визуализации, как правило, используется Grafana. 5. Prometheus Rules Создание новых метрик. Проверка «триггеров».
  11. Кто вы, мистер Prometheus? Prometheus Service Discovering Scraping Storage Rules

    and Alerts EC2, Consul, K8s… exporter client library 3rd Party Application Alertmanager Email, Slack, Telegram, etc. Grafana Application Prometheus взаимодействует с различными API для получения списка источников данных. 1. Service Discovering 2. Scraping Собирает данные с источников по pull- модели и протоколу HTTP. 3. Storage Полученные данные сохраняются в Time Series Database (TSDB). 6. Alertmanager Постобработка уведомлений и отправка их по каналам доставки. 4. Визуализация данных Для получения данных используется PromQL. Для визуализации, как правило, используется Grafana. 5. Prometheus Rules Создание новых метрик. Проверка «триггеров».
  12. Storage, как храним? ts 10 ts 10 ts 10 ts

    10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10
  13. Storage, как храним? ts 10 ts 10 ts 10 ts

    10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 LabelSet
  14. Storage, как храним? ts 10 ts 10 ts 10 ts

    10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 LabelSet
  15. { name: cpu_usage, node: curiosity, core: 0 } Storage, как

    храним? ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 { name: cpu_usage, node: curiosity, core: 1 } { name: cpu_usage, node: curiosity, core: 999999 } LabelSet
  16. { name: cpu_usage, node: curiosity, core: 0 } Storage, как

    храним? ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 {ls} { name: cpu_usage, node: curiosity, core: 1 } { name: cpu_usage, node: curiosity, core: 999999 }
  17. { name: cpu_usage, node: curiosity, core: 0 } Storage, как

    храним? ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 { name: cpu_usage, node: curiosity, core: 1 } { name: cpu_usage, node: curiosity, core: 999999 } #t_id {ls}
  18. { name: cpu_usage, node: curiosity, core: 0 } Storage, как

    храним? ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 { name: cpu_usage, node: curiosity, core: 1 } { name: cpu_usage, node: curiosity, core: 999999 } Временной ряд #t_id {ls}
  19. {ls} 1 000 000 {ls} {ls} Storage, как храним? {ls}➞#id

    map ts 10 #id {ls}➞#id ts 10 #id {ls}➞#id
  20. {ls} 1 000 000 {ls} {ls} Storage, как храним? {ls}➞#id

    map ts 10 #id {ls}➞#id ts 10 #id {ls}➞#id {ls}➞#id ts 10 #id
  21. {ls} 1 000 000 {ls} {ls} Storage, как храним? {ls}➞#id

    map ts 10 #id {ls}➞#id {ls}➞#id ts 10 #id {ls}➞#id ts 10 #id ts 10 #id ts 10 #id
  22. {ls} 1 000 000 {ls} {ls} Storage, как храним? {ls}➞#id

    map ts 10 #id {ls}➞#id {ls}➞#id ts 10 #id {ls}➞#id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 ts 10 ts 10
  23. {ls} 1 000 000 {ls} {ls} Storage, как храним? {ls}➞#id

    map ts 10 #id {ls}➞#id {ls}➞#id ts 10 #id {ls}➞#id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 ts 10 ts 10
  24. {ls} 1 000 000 {ls} {ls} {ls}➞#id map ts 10

    #id {ls}➞#id {ls}➞#id ts 10 #id {ls}➞#id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 ts 10 ts 10 {ls}➞#id {ls}➞#id ts 10 ts 10 #id ts 10 ts 10 #id ts 10 ts 10 #id map Storage, как храним?
  25. {ls} 1 000 000 {ls} {ls} Storage, как храним? {ls}➞#id

    map ts 10 #id {ls}➞#id {ls}➞#id ts 10 #id {ls}➞#id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 ts 10 ts 10 {ls}➞#id {ls}➞#id ts 10 ts 10 #id ts 10 ts 10 #id ts 10 ts 10 #id map
  26. {ls} 1 000 000 {ls} {ls} Chunks {ls}➞#id map ts

    10 #id {ls}➞#id {ls}➞#id ts 10 #id {ls}➞#id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 ts 10 ts 10 {ls}➞#id {ls}➞#id ts 10 ts 10 #id ts 10 ts 10 #id ts 10 ts 10 #id map
  27. ts 10 Чтение одной точки = чтение всех данных Timestamp

    занимает 1 бит ts 10 ts 10 Delta-Delta кодирование Chunks
  28. ts 10 ts 10 ts 10 Delta-Delta кодирование Gorilla кодирование

    Чтение одной точки = чтение всех данных Timestamp занимает 1 бит Chunks
  29. ts 10 … ts 10 … Chunk Chunk 2 часа

    1 млн 1 млн файлов Chunks
  30. ts 10 … ts 10 … Chunk Chunk 24 часа

    12 млн 12 млн файлов Chunk Chunk Chunks
  31. ts 10 … ts 10 … Chunk Chunk 24 часа

    12 млн 12 млн файлов Chunk Chunk Chunks Много файлов
  32. ts 10 … ts 10 … Chunk Chunk 24 часа

    12 млн 12 млн файлов Chunk Chunk Chunks Данные хранятся непоследовательно Много файлов
  33. ts 10 … ts 10 … Chunk Chunk 24 часа

    12 млн 12 млн файлов Chunk Chunk Много файлов Данные хранятся непоследовательно Chunks
  34. ts 10 ts 10 Мало файлов ts 10 Chunk-2 Chunk-2

    Chunk-2 Chunk-1 Chunk-1 Chunk-1 Chunk-1 Chunk-1 Chunk-1 Chunks
  35. ts 10 ts 10 Мало файлов Данные хранятся последовательно ts

    10 Chunk-2 Chunk-2 Chunk-2 Chunk-1 Chunk-1 Chunk-1 Chunk-1 Chunk-1 Chunk-1 Chunks
  36. ts 10 ts 10 ts 10 Chunk-2 Chunk-2 Chunk-2 Chunk-1

    Chunk-1 Chunk-1 Chunk-1 Chunk-1 Chunk-1 Chunks Мало файлов Данные хранятся последовательно Мы знаем смешение и можем быстро прочитать нужный chunk
  37. ts 10 ts 10 ts 10 Chunk-2 Chunk-2 Chunk-2 Chunk-1

    Chunk-1 Chunk-1 Chunk-1 Chunk-1 Chunk-1 128 МБ Chunks Мало файлов Данные хранятся последовательно Мы знаем смешение и можем быстро прочитать нужный chunk Размер файла 128 МБ
  38. ts 10 ts 10 ts 10 Chunk-2 Chunk-2 Chunk-2 Chunk-1

    Chunk-1 Chunk-1 128 МБ Chunks Мало файлов Данные хранятся последовательно Мы знаем смещение и можем быстро прочитать нужный chunk Размер файла 128 МБ
  39. ts 10 ts 10 ts 10 Chunk-3 Chunk-3 Chunk-3 Chunk-2

    Chunk-2 Chunk-2 Chunk-1 Chunk-1 Chunk-1 128 МБ Chunks Мало файлов Данные хранятся последовательно Мы знаем смещение и можем быстро прочитать нужный chunk Размер файла 128 МБ
  40. ts 10 ts 10 ts 10 Chunk-3 Chunk-3 Chunk-3 Chunk-2

    Chunk-2 Chunk-1 Chunk-1 Chunk-1 128 МБ Chunk-2 Chunk-2 Chunks Мало файлов Данные хранятся последовательно Мы знаем смещение и можем быстро прочитать нужный chunk Размер файла 128 МБ
  41. ts 10 ts 10 ts 10 Chunk-3 Chunk-3 Chunk-3 Chunk-2

    Chunk-2 Chunk-1 Chunk-1 Chunk-1 128 МБ Chunk-2 Chunk-2 Chunks Мало файлов Данные хранятся последовательно Мы знаем смещение и можем быстро прочитать нужный chunk Размер файла 128 МБ
  42. ts 10 ts 10 ts 10 Chunk-3 Chunk-3 Chunk-3 Chunk-2

    Chunk-2 Chunk-1 Chunk-1 Chunk-1 128 МБ Chunk-2 Chunk-2 128 МБ Chunk-2 Chunk-2 Chunk-2
  43. ts 10 ts 10 Мало файлов Данные хранятся последовательно Мы

    знаем смещение и можем быстро прочитать нужный chunk ts 10 Chunk-3 Chunk-3 Chunk-3 Chunk-2 Chunk-2 Chunk-1 Chunk-1 Chunk-1 128 МБ Chunk-2 Chunk-2 128 МБ Chunk-2 Chunk-2 Chunk-2 Размер файла 128 МБ Chunks
  44. ts 10 Chunk 2 ч. 2-часовой chunk: занимает непредсказуемый объем

    памяти при записи занимает непредсказуемое место в памяти при чтении 15 секунд Chunks
  45. ts 10 Chunk-2 Chunk-1 120 точек 15 секунд Chunks Chunk

    фиксированного размера
  46. ts 10 Chunk-2 Chunk-1 120 точек Chunk-1 15 секунд Chunks

    Chunk фиксированного размера Завершенные chunks не храним в памяти
  47. ts 10 Chunk-2 M-map chunks Chunk-1 15 секунд Chunks Chunk

    фиксированного размера Завершенные chunks не храним в памяти M-map завершенных chunks для быстрого доступа к данным
  48. ts 10 Chunk-7 M-map chunks Chunk-1 Chunk-2 Chunk-3 Chunk-4 Chunk-5

    Chunk-6 15 секунд Chunks Chunk фиксированного размера Завершенные chunks не храним в памяти M-map завершенных chunks для быстрого доступа к данным При достижении размера блока 2 часа + ½ блока (3 часа) блок финализируется
  49. ts 10 Chunk-7 M-map chunks Chunk-1 Chunk-2 Chunk-3 Chunk-4 Chunk-5

    Chunk-6 15 секунд Chunks Chunk фиксированного размера Завершенные chunks не храним в памяти M-map завершенных chunks для быстрого доступа к данным При достижении размера блока 2 часа + ½ блока (3 часа) блок финализируется
  50. ts 10 Chunk-7 M-map chunks Chunk-1 Chunk-2 Chunk-3 Chunk-4 block

    Chunks Chunk-5 Chunk-6 15 секунд Chunks Chunk фиксированного размера Завершенные chunks не храним в памяти M-map завершенных chunks для быстрого доступа к данным При достижении размера блока 2 часа + ½ блока (3 часа) блок финализируется
  51. ts 10 Chunk-7 M-map chunks Chunk-1 Chunk-2 Chunk-3 Chunk-4 block

    Chunks Chunk-5 Chunk-6 15 секунд Chunks Chunk фиксированного размера Завершенные chunks не храним в памяти M-map завершенных chunks для быстрого доступа к данным При достижении размера блока 2 часа + ½ блока (3 часа) блок финализируется
  52. ts 10 Chunk-7 M-map chunks Chunk-1 Chunk-2 Chunk-3 Chunk-4 block

    Chunks Index Chunk-5 Chunk-6 15 секунд Chunks Chunk фиксированного размера Завершенные chunks не храним в памяти M-map завершенных chunks для быстрого доступа к данным При достижении размера блока 2 часа + ½ блока (3 часа) блок финализируется
  53. ts 10 Chunk-7 M-map chunks Chunk-5 Chunk-6 block Chunks Index

    Chunks Chunk фиксированного размера Завершенные chunks не храним в памяти M-map завершенных chunks для быстрого доступа к данным При достижении размера блока 2 часа + ½ блока (3 часа) блок финализируется
  54. Chunks — собираем все вместе Данные по сериям хранятся в

    chunk • Для каждой серии данные пишутся в отдельный chunk
  55. Данные по сериям хранятся в chunk • Для каждой серии

    данные пишутся в отдельный chunk • В каждый chunk пишется не более 120 точек Chunks — собираем все вместе
  56. Данные по сериям хранятся в chunk • Для каждой серии

    данные пишутся в отдельный chunk • В каждый chunk пишется не более 120 точек • При достижении 120 точек chunk сохраняется на диск Chunks — собираем все вместе
  57. Данные по сериям хранятся в chunk • Для каждой серии

    данные пишутся в отдельный chunk • В каждый chunk пишется не более 120 точек • При достижении 120 точек chunk сохраняется на диск • Все chunks пишутся в файл последовательно Chunks — собираем все вместе
  58. Данные по сериям хранятся в chunk • Для каждой серии

    данные пишутся в отдельный chunk • В каждый chunk пишется не более 120 точек • При достижении 120 точек chunk сохраняется на диск • Все chunks пишутся в файл последовательно • При достижении 3 часов чанки «отрезаются» и сохраняются в блок Chunks — собираем все вместе
  59. Данные хранятся в закодированном виде • Для чтения одной точки

    надо прочитать весь chunk Данные по сериям хранятся в chunk • Для каждой серии данные пишутся в отдельный chunk • В каждый chunk пишется не более 120 точек • При достижении 120 точек chunk сохраняется на диск • Все chunks пишутся в файл последовательно • При достижении 3 часов чанки «отрезаются» и сохраняются в блок Chunks — собираем все вместе
  60. Данные по сериям хранятся в chunk • Для каждой серии

    данные пишутся в отдельный chunk • В каждый chunk пишется не более 120 точек • При достижении 120 точек chunk сохраняется на диск • Все chunks пишутся в файл последовательно • При достижении 3 часов чанки «отрезаются» и сохраняются в блок Данные хранятся в закодированном виде • Для чтения одной точки надо прочитать весь chunk • При равных промежутках между сборами данных timestamp занимает 1 бит Chunks — собираем все вместе
  61. {_name_=”http_requests_total”, job=”ingress”, method=”GET”} Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3,

    job SymbolID=4, ingress SymbolID=5, method Index Symbols содержит все labels и values
  62. {_name_=”http_requests_total”, job=”ingress”, method=”GET”} Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3,

    job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET Index Symbols содержит все labels и values
  63. {_name_=”http_requests_total”, job=”ingress”, method=”GET”} Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3,

    job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET Index Symbols содержит все labels и values
  64. {_name_=”http_requests_total”, job=”ingress”, method=”GET”} Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3,

    job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET Postings Index Symbols содержит все labels и values Posting содержит пары label name и label value и массив серий, в которых они есть
  65. {_name_=”http_requests_total”, job=”ingress”, method=”GET”} Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3,

    job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET Postings Index Symbols содержит все labels и values Posting содержит пары label name и label value и массив серий, в которых они есть
  66. {_name_=”http_requests_total”, job=”ingress”, method=”GET”} Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3,

    job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET Postings Index Symbols содержит все labels и values Posting содержит пары label name и label value и массив серий, в которых они есть
  67. {_name_=”http_requests_total”, job=”ingress”, method=”GET”} Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3,

    job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET 1,2 Postings Index Symbols содержит все labels и values Posting содержит пары label name и label value и массив серий, в которых они есть
  68. {_name_=”http_requests_total”, job=”ingress”, method=”GET”} Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3,

    job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET 1,2=[SeriesID-1] Postings Index Symbols содержит все labels и values Posting содержит пары label name и label value и массив серий, в которых они есть
  69. {_name_=”http_requests_total”, job=”ingress”, method=”GET”} Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3,

    job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET 1,2=[SeriesID-1] Postings 3,4=[SeriesID-1] Index Symbols содержит все labels и values Posting содержит пары label name и label value и массив серий, в которых они есть
  70. {_name_=”http_requests_total”, job=”ingress”, method=”GET”} Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3,

    job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET 1,2=[SeriesID-1] Postings 3,4=[SeriesID-1] 5,6=[SeriesID-1] Index Symbols содержит все labels и values Posting содержит пары label name и label value и массив серий, в которых они есть
  71. {_name_=”http_requests_total”, job=”ingress”, method=”GET”} Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3,

    job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET 1,2=[SeriesID-1] Postings 3,4=[SeriesID-1] 5,6=[SeriesID-1] Series Index Symbols содержит все labels и values Posting содержит пары label name и label value и массив серий, в которых они есть Series содержит ID серий, массив label name и label value для этой серии и ссылки на chunks
  72. {_name_=”http_requests_total”, job=”ingress”, method=”GET”} Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3,

    job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET 1,2=[SeriesID-1] Postings 3,4=[SeriesID-1] 5,6=[SeriesID-1] seriesID=1 Series Index Symbols содержит все labels и values Posting содержит пары label name и label value и массив серий, в которых они есть Series содержит ID серий, массив label name и label value для этой серии и ссылки на chunks
  73. {_name_=”http_requests_total”, job=”ingress”, method=”GET”} Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3,

    job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET 1,2=[SeriesID-1] Postings 3,4=[SeriesID-1] 5,6=[SeriesID-1] seriesID=1, [1,2,3,4,5,6] Series Index Symbols содержит все labels и values Posting содержит пары label name и label value и массив серий, в которых они есть Series содержит ID серий, массив label name и label value для этой серии и ссылки на chunks
  74. {_name_=”http_requests_total”, job=”ingress”, method=”GET”} Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3,

    job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET 1,2=[SeriesID-1] Postings 3,4=[SeriesID-1] 5,6=[SeriesID-1] seriesID=1, [1,2,3,4,5,6], chunk_refs Series Index Symbols содержит все labels и values Posting содержит пары label name и label value и массив серий, в которых они есть Series содержит ID серий, массив label name и label value для этой серии и ссылки на chunks
  75. {_name_=”http_requests_total”, job=”ingress”, method=”GET”} Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3,

    job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET 1,2=[SeriesID-1] Postings 3,4=[SeriesID-1] 5,6=[SeriesID-1] seriesID=1, [1,2,3,4,5,6], chunk_refs Series Index Symbols содержит все labels и values Posting содержит пары label name и label value и массив серий, в которых они есть Series содержит ID серий, массив label name и label value для этой серии и ссылки на chunks
  76. {_name_=”http_requests_total”, job=”ingress”, method=”GET”} Index Chunk-1 SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total

    SymbolID=3, job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET 1,2=[SeriesID-1] Postings 3,4=[SeriesID-1] 5,6=[SeriesID-1] seriesID=1, [1,2,3,4,5,6], chunk_refs Series Index Symbols содержит все labels и values Posting содержит пары label name и label value и массив серий, в которых они есть Series содержит ID серий, массив label name и label value для этой серии и ссылки на chunks
  77. {_name_=”http_requests_total”, job=”ingress”, method=”GET”} Index Chunk-1 SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total

    SymbolID=3, job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET 1,2=[SeriesID-1] Postings 3,4=[SeriesID-1] 5,6=[SeriesID-1] seriesID=1, [1,2,3,4,5,6], chunk_refs Series Chunk-2 Index Symbols содержит все labels и values Posting содержит пары label name и label value и массив серий, в которых они есть Series содержит ID серий, массив label name и label value для этой серии и ссылки на chunks
  78. {_name_=”http_requests_total”, job=”ingress”, method=”GET”} Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3,

    job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET 1,2=[SeriesID-1] Postings 3,4=[SeriesID-1] 5,6=[SeriesID-1] seriesID=1, [1,2,3,4,5,6], chunk_refs Series Chunk-1 Chunk-2 Index Symbols содержит все labels и values Posting содержит пары label name и label value и массив серий, в которых они есть Series содержит ID серий, массив label name и label value для этой серии и ссылки на chunks
  79. {_name_=”http_requests_total”, job=”ingress”, method=”POST”} Index SymbolID=1, _name_ Symbols Chunk-1 Chunk-2 SymbolID=2,

    http_requests_total SymbolID=3, job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET 1,2=[SeriesID-1] Postings 3,4=[SeriesID-1] 5,6=[SeriesID-1] seriesID=1, [1,2,3,4,5,6], chunk_refs Series Index
  80. Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3, job SymbolID=4, ingress

    SymbolID=5, method SymbolID=6, GET 1,2=[SeriesID-1] Postings 3,4=[SeriesID-1] 5,6=[SeriesID-1] seriesID=1, [1,2,3,4,5,6], chunk_refs Series {_name_=”http_requests_total”, job=”ingress”, method=”POST”} SymbolID=7, POST Chunk-1 Chunk-2 Index Обновляем Symbols
  81. Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3, job SymbolID=4, ingress

    SymbolID=5, method SymbolID=6, GET Postings 5,6=[SeriesID-1] seriesID=1, [1,2,3,4,5,6], chunk_refs Series {_name_=”http_requests_total”, job=”ingress”, method=”POST”} SymbolID=7, POST 1,2=[SeriesID-1,SeriesID-2] 3,4=[SeriesID-1,SeriesID-2] 5,7=[SeriesID-2] Chunk-1 Chunk-2 Index Обновляем Symbols Обновляем Postings
  82. Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3, job SymbolID=4, ingress

    SymbolID=5, method SymbolID=6, GET Postings 5,6=[SeriesID-1] seriesID=1, [1,2,3,4,5,6], chunk_refs Series {_name_=”http_requests_total”, job=”ingress”, method=”POST”} SymbolID=7, POST 1,2=[SeriesID-1,SeriesID-2] 3,4=[SeriesID-1,SeriesID-2] 5,7=[SeriesID-2] Chunk-1 Chunk-2 Index Обновляем Symbols Обновляем Postings
  83. {_name_=”http_requests_total”, job=”ingress”, method=”POST”} Chunks Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total

    SymbolID=3, job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET Postings seriesID=1, [1,2,3,4,5,6], chunk_refs Series seriesID=2, [1,2,3,4,5,7], chunk_refs 5,6=[SeriesID-1] SymbolID=7, POST 1,2=[SeriesID-1,SeriesID-2] 3,4=[SeriesID-1,SeriesID-2] 5,7=[SeriesID-2] Chunk-1 Chunk-2 Chunk-1 Chunk-2 Index Обновляем Symbols Обновляем Postings Обновляем Series
  84. {_name_=”http_requests_total”, job=”ingress”, method=”POST”} Chunks Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total

    SymbolID=3, job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET Postings seriesID=1, [1,2,3,4,5,6], chunk_refs Series seriesID=2, [1,2,3,4,5,7], chunk_refs 5,6=[SeriesID-1] SymbolID=7, POST 1,2=[SeriesID-1,SeriesID-2] 3,4=[SeriesID-1,SeriesID-2] 5,7=[SeriesID-2] Chunk-1 Chunk-2 Chunk-1 Chunk-2 Index Symbols содержит все labels и values Posting содержит пары label name и label value и массив серий, в которых они есть Series содержит ID серий, массив label name и label value для этой серии и ссылки на chunks
  85. Количество серий: 1 x 3 x 1 = 3 Cardinality

    {_name_=”http_requests_total”, instance=”10.101.10.1:8090”, job=”ingress”} 10.101.10.2:8090 10.101.10.3:8090 1 3 1
  86. Количество серий: 1 x 3 x 1 x 5 =

    15 Влияние cardinality на chunks {_name_=”http_requests_total”, instance=”10.101.10.1:8090”, job=”ingress”, method=”GET”} 10.101.10.2:8090 10.101.10.3:8090 PUT DELL POST 1 3 1 5 HEAD
  87. ts 10 ts 10 ts 10 Chunk Chunk Chunk ts

    10 Chunk Увеличение количества chunks в памяти Влияние cardinality на chunks 15
  88. {_name_=”http_requests_total”, instance=”10.101.10.1:8090”, job=”ingress”, method=”GET”, uri=”YYY”} 10.101.10.2:8090 10.101.10.3:8090 PUT DELL POST

    1 3 1 5 Количество серий: 1 x 3 x 1 x 5 x 1000 = 15 000 HEAD 1000 Влияние cardinality на chunks
  89. ts 10 ts 10 ts 10 Chunk Chunk Chunk ts

    10 Chunk Увеличение количества chunks в памяти Увеличение количества chunks, которые надо прочитать в память при запросах на чтение Влияние cardinality на chunks 15 000
  90. Растет размер индекса Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3,

    job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET Postings seriesID=1, [1,2,3,4,5,6], chunk_refs Series seriesID=2, [1,2,3,4,5,7], chunk_refs SymbolID=7, POST Chunks SymbolID=n, … 1,2=[SeriesID-1,SeriesID-2] 3,4=[SeriesID-1,SeriesID-2] 5,7=[SeriesID-2] 5,6=[SeriesID-1] Влияние cardinality на index
  91. Растет размер индекса Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3,

    job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET seriesID=1, [1,2,3,4,5,6], chunk_refs Series seriesID=2, [1,2,3,4,5,7], chunk_refs SymbolID=7, POST Chunks SymbolID=n, … 1,2=[SeriesID-1,SeriesID-2,SeriesID-X] 3,4=[SeriesID-1,SeriesID-2] 5,7=[SeriesID-2] x,y=[SeriesID-X] 5,6=[SeriesID-1, SeriesID-X] Влияние cardinality на index Postings
  92. Растет размер индекса Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3,

    job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET seriesID=1, [1,2,3,4,5,6], chunk_refs Series seriesID=2, [1,2,3,4,5,7], chunk_refs SymbolID=7, POST Chunks SymbolID=n, … seriesID=X, [n], chunk_refs 1,2=[SeriesID-1,SeriesID-2,SeriesID-X] 3,4=[SeriesID-1,SeriesID-2] 5,7=[SeriesID-2] x,y=[SeriesID-X] 5,6=[SeriesID-1, SeriesID-X] Влияние cardinality на index Postings
  93. Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3, job SymbolID=4, ingress

    SymbolID=5, method SymbolID=6, GET seriesID=1, [1,2,3,4,5,6], chunk_refs Series seriesID=2, [1,2,3,4,5,7], chunk_refs SymbolID=7, POST Chunks SymbolID=n, … seriesID=X, [n], chunk_refs 1,2=[SeriesID-1,SeriesID-2,SeriesID-X] 3,4=[SeriesID-1,SeriesID-2] 5,7=[SeriesID-2] x,y=[SeriesID-X] 5,6=[SeriesID-1, SeriesID-X] Влияние cardinality на index Растет размер индекса Postings
  94. Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3, job SymbolID=4, ingress

    SymbolID=5, method SymbolID=6, GET seriesID=1, [1,2,3,4,5,6], chunk_refs Series seriesID=2, [1,2,3,4,5,7], chunk_refs SymbolID=7, POST Chunks SymbolID=n, … seriesID=X, [n], chunk_refs 1,2=[SeriesID-1,SeriesID-2,SeriesID-X] 3,4=[SeriesID-1,SeriesID-2] 5,7=[SeriesID-2] x,y=[SeriesID-X] 5,6=[SeriesID-1, SeriesID-X] Влияние cardinality на index Растет размер индекса Увеличивается количество операций (ресурсов) для записи одного sample Postings
  95. Растет размер индекса Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3,

    job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET seriesID=1, [1,2,3,4,5,6], chunk_refs Series seriesID=2, [1,2,3,4,5,7], chunk_refs SymbolID=7, POST Chunks Увеличивается количество операций (ресурсов) для записи одного sample SymbolID=n, … seriesID=X, [n], chunk_refs 1,2=[SeriesID-1,SeriesID-2,SeriesID-X] 3,4=[SeriesID-1,SeriesID-2] 5,7=[SeriesID-2] x,y=[SeriesID-X] 5,6=[SeriesID-1, SeriesID-X] Увеличивается количество операций (ресурсов) для чтения одного sample Влияние cardinality на index Postings
  96. Сужаем круг подозреваемых Cardinality — это количество уникальных наборов лейблов

    для метрики. Churn — это мера, показывающая скорость, с которой временные ряды добавляются или удаляются из системы мониторинга, отражая динамику изменений в метриках.
  97. ts 10 ts 10 ts 10 ts 10 ts 10

    ts 10 ts 10 Влияние churn на chunks
  98. ts 10 ts 10 ts 10 ts 10 ts 10

    Chunk-t4 ts 10 ts 10 120 samples Влияние churn на chunks
  99. Незавершённые chunks хранятся в памяти ts 10 ts 10 ts

    10 ts 10 ts 10 Chunk-t4 Влияние churn на chunks
  100. Незавершённые chunks хранятся в памяти Неоптимальное кодирование ts 10 ts

    10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 ts 10 Block Index Chunks Влияние churn на chunks
  101. Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3, job SymbolID=4, ingress

    SymbolID=5, method SymbolID=6, GET Postings seriesID=1, [1,2,3,4,5,6], chunk_refs Series seriesID=2, [1,2,3,4,5,7], chunk_refs SymbolID=7, POST Chunks SymbolID=n, … seriesID=X, [n], chunk_refs 1,2=[SeriesID-1,SeriesID-2,SeriesID-X] 3,4=[SeriesID-1,SeriesID-2] 5,7=[SeriesID-2] x,y=[SeriesID-X] 5,6=[SeriesID-1, SeriesID-X] Влияние churn на index Растет размер индекса
  102. Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3, job SymbolID=4, ingress

    SymbolID=5, method SymbolID=6, GET Postings seriesID=1, [1,2,3,4,5,6], chunk_refs Series seriesID=2, [1,2,3,4,5,7], chunk_refs SymbolID=7, POST Chunks SymbolID=n, … seriesID=X, [n], chunk_refs 1,2=[SeriesID-1,SeriesID-2,SeriesID-X] 3,4=[SeriesID-1,SeriesID-2] 5,7=[SeriesID-2] x,y=[SeriesID-X] 5,6=[SeriesID-1, SeriesID-X] Влияние churn на index Растет размер индекса Увеличивается количество операций (ресурсов) для записи одного sample
  103. Растет размер индекса Index SymbolID=1, _name_ Symbols SymbolID=2, http_requests_total SymbolID=3,

    job SymbolID=4, ingress SymbolID=5, method SymbolID=6, GET Postings seriesID=1, [1,2,3,4,5,6], chunk_refs Series seriesID=2, [1,2,3,4,5,7], chunk_refs SymbolID=7, POST Chunks Увеличивается количество операций (ресурсов) для записи одного sample SymbolID=n, … seriesID=X, [n], chunk_refs 1,2=[SeriesID-1,SeriesID-2,SeriesID-X] 3,4=[SeriesID-1,SeriesID-2] 5,7=[SeriesID-2] x,y=[SeriesID-X] 5,6=[SeriesID-1, SeriesID-X] Увеличивается количество операций (ресурсов) для чтения Влияние churn на index
  104. Виновны! Cardinality — это количество уникальных наборов лейблов для метрики.

    Churn — это мера, показывающая скорость, с которой временные ряды добавляются или удаляются из системы мониторинга, отражая динамику изменений в метриках.
  105. Churn Label pairs most involved in churning: 17 job=node 11

    __name__=node_systemd_unit_state 6 instance=foo:9100 4 instance=bar:9100 3 instance=baz:9100 ./tsdb analyze
  106. Prometheus mimirtool Cardinality Grafana Prometheus Rules Метрики Метрики в Dashboards

    Метрики в Rules Неиспользуемые метрики
  107. Стараемся не добавлять лишние labels к метрикам • Большинство библиотек

    для инструментирования имеют гибкие настройки Избавляемся от лишнего
  108. Стараемся не добавлять лишние labels к метрикам • Большинство библиотек

    для инструментирования имеют гибкие настройки • Некоторые экспортеры имеют дополнительные настройки Избавляемся от лишнего
  109. Стараемся не добавлять лишние labels к метрикам Если нет возможности

    на это повлиять, можно удалить лишние labels • relabel_configs позволяет как добавлять, так и удалять labels - source_labels: [requestID] action: labeldrop Избавляемся от лишнего
  110. Стараемся не добавлять лишние labels к метрикам Если нет возможности

    на это повлиять, можно удалить лишние labels или всю метрику целиком - source_labels: [__name__] regexp: not_important_metric action: drop Избавляемся от лишнего
  111. Стараемся не добавлять лишние labels к метрикам Если нет возможности

    на это повлиять, можно удалить лишние labels или всю метрику целиком Выставляем лимиты на sample на targets Избавляемся от лишнего
  112. Стараемся не добавлять лишние labels к метрикам Если нет возможности

    на это повлиять, можно удалить лишние labels или всю метрику целиком Выставляем лимиты на sample на targets Выставляем лимиты на количество targets Избавляемся от лишнего
  113. {__name__=”http_requests_total”, code=”500”, user_agent=”google Chrome 17”, uri=”/books/buy/17”, method=”POST”, request_id=”XXXX-XX-XX”, backend=”backend-32”, user_id=”17”}

    Как можно? • Уведомление на 500-е ошибки • Метрика • Для остального есть логи и трейсы
  114. Exemplars • Exemplars хранятся отдельно • Это не бесплатно •

    Так же, как с метриками, добавляйте их по необходимости
  115. Тимур Тукаев Head of technical marketing Спасибо! Владимир Водяницкий Куратор

    доклада Proofreader Иван Богданов Куратор доклада George Gaál Алёна Лунина Оформление презентации Владимир Куценко Оформление презентации Евгений Бастрыков Teamlead Observability
  116. Владимир Гурьянов Флант DevOps и Kubernetes, обслуживание 24/7 habr.com/ru/company/flant youtube.com/c/Флант

    flant.ru t.me/flant_ru t.me/Magvai69 vladimir.guryanov@flant.com Еще один доклад Оценить доклад Solution Architect системы мониторинга Okmeter
  117. {ls} 1 000 000 {ls} {ls} {ls}➞#id map ts 10

    #id {ls}➞#id {ls}➞#id ts 10 #id {ls}➞#id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 #id ts 10 ts 10 ts 10 {ls}➞#id {ls}➞#id ts 10 ts 10 #id ts 10 ts 10 #id ts 10 ts 10 #id map TSDB