Slide 1

Slide 1 text

Кто возьмет метрик пачку, тот получит ресурсов недостачку... Владимир Гурьянов Solution Architect системы мониторинга Okmeter

Slide 2

Slide 2 text

Владимир Гурьянов Solution Architect системы мониторинга Okmeter vladimir.guryanov@flant.com Чем занимаюсь Инженер, тимлид и архитектор с 10-летним стажем. Опыт С 2010 г. занимаюсь разработкой. С 2021 г. работаю в компании «Флант». С 2022 г. руковожу разработкой «хранилища мониторинга». С чем работаю больше всего Обо мне

Slide 3

Slide 3 text

хостов Статистика по Okmeter зрелый продукт, сотни проектов 12 лет эксплуатации >250 компаний >5К метрик/мин >100 млн уникальных метрик 24/7 поддержка >10К используют Okmeter в качестве системы мониторинга по фактическим значениям круглосуточная помощь в любой ситуации в production с каждого хоста

Slide 4

Slide 4 text

Опыт «Фланта» За 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

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

Prometheus потребляет много ресурсов

Slide 8

Slide 8 text

Это преступление!

Slide 9

Slide 9 text

Кто был на месте преступления?

Slide 10

Slide 10 text

Кто вы, мистер Prometheus? Prometheus

Slide 11

Slide 11 text

Кто вы, мистер Prometheus? Prometheus Service Discovering

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

Кто вы, мистер 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.

Slide 16

Slide 16 text

Кто вы, мистер 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).

Slide 17

Slide 17 text

Кто вы, мистер 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.

Slide 18

Slide 18 text

Кто вы, мистер 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 Создание новых метрик. Проверка «триггеров».

Slide 19

Slide 19 text

Кто вы, мистер 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 Создание новых метрик. Проверка «триггеров».

Slide 20

Slide 20 text

Кто вы, мистер Prometheus? Prometheus Service Discovering Scraping Storage Rules and Alerts UI

Slide 21

Slide 21 text

Pprof Prometheus

Slide 22

Slide 22 text

Кто вы, мистер Prometheus? Prometheus Service Discovering Scraping Storage Rules and Alerts UI ~0%

Slide 23

Slide 23 text

Кто вы, мистер Prometheus? Prometheus Service Discovering Scraping Storage Rules and Alerts UI ~0% ~5%

Slide 24

Slide 24 text

Кто вы, мистер Prometheus? Prometheus Service Discovering Scraping Storage Rules and Alerts UI ~0% ~5% ~10%

Slide 25

Slide 25 text

Кто вы, мистер Prometheus? Prometheus Service Discovering Scraping Storage Rules and Alerts UI ~0% ~30% ~5% ~10%

Slide 26

Slide 26 text

Кто вы, мистер Prometheus? Prometheus Service Discovering Scraping Storage Rules and Alerts UI ~0% ~30% ~55% ~5% ~10%

Slide 27

Slide 27 text

Подозреваемый №1: Storage. Досье

Slide 28

Slide 28 text

Storage, как храним?

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

Storage, как храним? { ключ: значение, ключ: значение, … } LabelSet

Slide 32

Slide 32 text

Storage, как храним? { ключ: значение, ключ: значение, … } { name: cpu_usage, node: curiosity, core: 4 } LabelSet

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

{ 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

Slide 35

Slide 35 text

{ 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 }

Slide 36

Slide 36 text

{ 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}

Slide 37

Slide 37 text

{ 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}

Slide 38

Slide 38 text

Storage, как храним? 1 000 000 {ls} {ls} {ls}

Slide 39

Slide 39 text

Storage, как храним? 1 000 000 {ls} {ls} {ls} map

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

{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

Slide 47

Slide 47 text

{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

Slide 48

Slide 48 text

{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

Slide 49

Slide 49 text

{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

Slide 50

Slide 50 text

{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, как храним?

Slide 51

Slide 51 text

Мистер Storage, а что вы делали с 21:00 до 6:00?

Slide 52

Slide 52 text

{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

Slide 53

Slide 53 text

{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

Slide 54

Slide 54 text

Мистер Storage, а что это у вас там — данные?

Slide 55

Slide 55 text

Chunks

Slide 56

Slide 56 text

ts 10 Chunks

Slide 57

Slide 57 text

ts 10 ts 10 ts 10 Chunks

Slide 58

Slide 58 text

Чтение одной точки = чтение всех данных ts 10 ts 10 ts 10 Gorilla кодирование Chunks

Slide 59

Slide 59 text

ts 10 Чтение одной точки = чтение всех данных Timestamp занимает 1 бит ts 10 ts 10 Delta-Delta кодирование Chunks

Slide 60

Slide 60 text

ts 10 ts 10 ts 10 Delta-Delta кодирование Gorilla кодирование Чтение одной точки = чтение всех данных Timestamp занимает 1 бит Chunks

Slide 61

Slide 61 text

ts 10 ts 10 ts 10 Chunks

Slide 62

Slide 62 text

ts 10 Chunk Chunks

Slide 63

Slide 63 text

ts 10 Chunk 2 ч. Chunks

Slide 64

Slide 64 text

ts 10 Chunk Chunk 2 ч. Chunks

Slide 65

Slide 65 text

ts 10 Chunk … Chunks

Slide 66

Slide 66 text

А если 1 миллион источников?

Slide 67

Slide 67 text

ts 10 Chunk ts 10 Chunk 2 часа 1 млн 2 ч. 2 ч. Chunks

Slide 68

Slide 68 text

ts 10 Chunk ts 10 Chunk Chunk Chunk 2 часа 1 млн 2 ч. 2 ч. Chunks

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

А спустя 24 часа?

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

Ваше алиби не подтвердилось. Есть другое?

Slide 76

Slide 76 text

ts 10 ts 10 ts 10 Chunk-1 Chunk-1 Chunk-1 Chunks

Slide 77

Slide 77 text

ts 10 ts 10 ts 10 Chunk-2 Chunk-2 Chunk-2 Chunk-1 Chunk-1 Chunk-1 Chunks

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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 МБ

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

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 МБ

Slide 84

Slide 84 text

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 МБ

Slide 85

Slide 85 text

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 МБ

Slide 86

Slide 86 text

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

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

И снова вы что-то скрываете!

Slide 89

Slide 89 text

ts 10 Chunk 2 ч. Chunks

Slide 90

Slide 90 text

ts 10 Chunk 2 ч. 60 секунд Chunks

Slide 91

Slide 91 text

ts 10 Chunk 2 ч. 60 секунд Chunks 120

Slide 92

Slide 92 text

ts 10 Chunk 2 ч. 15 секунд Chunks

Slide 93

Slide 93 text

ts 10 Chunk 2 ч. 15 секунд Chunks 480

Slide 94

Slide 94 text

ts 10 Chunk 2 ч. 2-часовой chunk: занимает непредсказуемый объем памяти при записи 15 секунд Chunks

Slide 95

Slide 95 text

ts 10 Chunk 2 ч. 2-часовой chunk: занимает непредсказуемый объем памяти при записи занимает непредсказуемое место в памяти при чтении 15 секунд Chunks

Slide 96

Slide 96 text

Что можно сделать?

Slide 97

Slide 97 text

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

Slide 98

Slide 98 text

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

Slide 99

Slide 99 text

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

Slide 100

Slide 100 text

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 часа) блок финализируется

Slide 101

Slide 101 text

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 часа) блок финализируется

Slide 102

Slide 102 text

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 часа) блок финализируется

Slide 103

Slide 103 text

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 часа) блок финализируется

Slide 104

Slide 104 text

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 часа) блок финализируется

Slide 105

Slide 105 text

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

Slide 106

Slide 106 text

Chunks — собираем все вместе Данные по сериям хранятся в chunk ● Для каждой серии данные пишутся в отдельный chunk

Slide 107

Slide 107 text

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

Slide 108

Slide 108 text

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

Slide 109

Slide 109 text

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

Slide 110

Slide 110 text

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

Slide 111

Slide 111 text

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

Slide 112

Slide 112 text

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

Slide 113

Slide 113 text

Мистер Storage, а что это у вас там – index?

Slide 114

Slide 114 text

Index {_name_=”http_requests_total”, job=”ingress”, method=”GET”}

Slide 115

Slide 115 text

{_name_=”http_requests_total”, job=”ingress”, method=”GET”} Index Index

Slide 116

Slide 116 text

{_name_=”http_requests_total”, job=”ingress”, method=”GET”} Index Symbols Index Symbols содержит все labels и values

Slide 117

Slide 117 text

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

Slide 118

Slide 118 text

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

Slide 119

Slide 119 text

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

Slide 120

Slide 120 text

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

Slide 121

Slide 121 text

{_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

Slide 122

Slide 122 text

{_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

Slide 123

Slide 123 text

{_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

Slide 124

Slide 124 text

{_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 и массив серий, в которых они есть

Slide 125

Slide 125 text

{_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 и массив серий, в которых они есть

Slide 126

Slide 126 text

{_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 и массив серий, в которых они есть

Slide 127

Slide 127 text

{_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 и массив серий, в которых они есть

Slide 128

Slide 128 text

{_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 и массив серий, в которых они есть

Slide 129

Slide 129 text

{_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 и массив серий, в которых они есть

Slide 130

Slide 130 text

{_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 и массив серий, в которых они есть

Slide 131

Slide 131 text

{_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

Slide 132

Slide 132 text

{_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

Slide 133

Slide 133 text

{_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

Slide 134

Slide 134 text

{_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

Slide 135

Slide 135 text

{_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

Slide 136

Slide 136 text

{_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

Slide 137

Slide 137 text

{_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

Slide 138

Slide 138 text

{_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

Slide 139

Slide 139 text

А если добавить еще одну серию?

Slide 140

Slide 140 text

{_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

Slide 141

Slide 141 text

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

Slide 142

Slide 142 text

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

Slide 143

Slide 143 text

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

Slide 144

Slide 144 text

{_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

Slide 145

Slide 145 text

{_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

Slide 146

Slide 146 text

Что же приводит к потреблению ресурсов?

Slide 147

Slide 147 text

Сужаем круг подозреваемых Cardinality — это количество уникальных наборов лейблов для метрики

Slide 148

Slide 148 text

Cardinality {_name_=”http_requests_total”, instance=”10.101.10.1:8090”, job=”ingress”} 10.101.10.2:8090 10.101.10.3:8090

Slide 149

Slide 149 text

Cardinality {_name_=”http_requests_total”, instance=”10.101.10.1:8090”, job=”ingress”} 10.101.10.2:8090 10.101.10.3:8090 1

Slide 150

Slide 150 text

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

Slide 151

Slide 151 text

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

Slide 152

Slide 152 text

Количество серий: 1 x 3 x 1 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

Slide 153

Slide 153 text

Количество серий: 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

Slide 154

Slide 154 text

Chunks

Slide 155

Slide 155 text

ts 10 ts 10 ts 10 Chunk Chunk Chunk Влияние cardinality на chunks

Slide 156

Slide 156 text

Влияние 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 HEAD

Slide 157

Slide 157 text

Влияние 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

Slide 158

Slide 158 text

Количество серий: 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

Slide 159

Slide 159 text

ts 10 ts 10 ts 10 Chunk Chunk Chunk ts 10 Chunk Увеличение количества chunks в памяти Влияние cardinality на chunks 15

Slide 160

Slide 160 text

{_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 HEAD Влияние cardinality на chunks

Slide 161

Slide 161 text

{_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 HEAD 1000 Влияние cardinality на chunks

Slide 162

Slide 162 text

{_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

Slide 163

Slide 163 text

ts 10 ts 10 ts 10 Chunk Chunk Chunk ts 10 Chunk Увеличение количества chunks в памяти Увеличение количества chunks, которые надо прочитать в память при запросах на чтение Влияние cardinality на chunks 15 000

Slide 164

Slide 164 text

Index

Slide 165

Slide 165 text

Растет размер индекса 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

Slide 166

Slide 166 text

Растет размер индекса 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

Slide 167

Slide 167 text

Растет размер индекса 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

Slide 168

Slide 168 text

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

Slide 169

Slide 169 text

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

Slide 170

Slide 170 text

Растет размер индекса 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

Slide 171

Slide 171 text

Сужаем круг подозреваемых Cardinality — это количество уникальных наборов лейблов для метрики.

Slide 172

Slide 172 text

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

Slide 173

Slide 173 text

Chunks

Slide 174

Slide 174 text

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

Slide 175

Slide 175 text

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

Slide 176

Slide 176 text

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

Slide 177

Slide 177 text

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

Slide 178

Slide 178 text

ts 10 ts 10 ts 10 ts 10 ts 10 Chunk-t4 ts 10 ts 10 120 samples Влияние churn на chunks

Slide 179

Slide 179 text

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

Slide 180

Slide 180 text

Спустя 3 часа

Slide 181

Slide 181 text

Незавершённые 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

Slide 182

Slide 182 text

Index

Slide 183

Slide 183 text

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 Растет размер индекса

Slide 184

Slide 184 text

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

Slide 185

Slide 185 text

Растет размер индекса 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

Slide 186

Slide 186 text

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

Slide 187

Slide 187 text

А что лежит в чемоданчике детектива?

Slide 188

Slide 188 text

Churn

Slide 189

Slide 189 text

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

Slide 190

Slide 190 text

Churn ./tsdb analyze topk(10, sum without(instance)(sum_over_time(scrape_series_added[1h])))

Slide 191

Slide 191 text

Cardinality

Slide 192

Slide 192 text

Cardinality ./tsdb analyze

Slide 193

Slide 193 text

Cardinality ./tsdb analyze Prometheus Status

Slide 194

Slide 194 text

Cardinality ./tsdb analyze Prometheus Status mimirtool analyze

Slide 195

Slide 195 text

mimirtool Cardinality

Slide 196

Slide 196 text

mimirtool Cardinality Grafana Метрики в Dashboards

Slide 197

Slide 197 text

mimirtool Cardinality Grafana Prometheus Rules Метрики в Dashboards Метрики в Rules

Slide 198

Slide 198 text

Prometheus mimirtool Cardinality Grafana Prometheus Rules Метрики Метрики в Dashboards Метрики в Rules

Slide 199

Slide 199 text

Prometheus mimirtool Cardinality Grafana Prometheus Rules Метрики Метрики в Dashboards Метрики в Rules

Slide 200

Slide 200 text

Prometheus mimirtool Cardinality Grafana Prometheus Rules Метрики Метрики в Dashboards Метрики в Rules Неиспользуемые метрики

Slide 201

Slide 201 text

Нашли кто виноват. Что дальше?

Slide 202

Slide 202 text

Избавляемся от лишнего Стараемся не добавлять лишние labels к метрикам

Slide 203

Slide 203 text

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

Slide 204

Slide 204 text

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

Slide 205

Slide 205 text

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

Slide 206

Slide 206 text

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

Slide 207

Slide 207 text

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

Slide 208

Slide 208 text

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

Slide 209

Slide 209 text

Мы все удалили, как теперь расследовать инциденты?

Slide 210

Slide 210 text

Как было? ● Уведомление на 500-е ошибки

Slide 211

Slide 211 text

{__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-е ошибки ● Метрика

Slide 212

Slide 212 text

{__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-е ошибки ● Метрика

Slide 213

Slide 213 text

{__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-е ошибки ● Метрика ● Для остального есть логи и трейсы

Slide 214

Slide 214 text

Стоп, логи, метрики, трейсы — как это все связать вместе?

Slide 215

Slide 215 text

http_requests_total{method="POST", code="500"} 3 Exemplars Как выглядит обычная метрика

Slide 216

Slide 216 text

http_requests_total{method="POST", code="500"} 3 Exemplars Как выглядит обычная метрика http_requests_total{method="GET", code="500"} 3 # {trace_id="abc123"} Как выглядит метрика с exemplar

Slide 217

Slide 217 text

Exemplars ● Exemplars хранятся отдельно

Slide 218

Slide 218 text

Exemplars ● Exemplars хранятся отдельно ● Это не бесплатно

Slide 219

Slide 219 text

Exemplars ● Exemplars хранятся отдельно ● Это не бесплатно ● Так же, как с метриками, добавляйте их по необходимости

Slide 220

Slide 220 text

Вместо вывода

Slide 221

Slide 221 text

Это преступление!

Slide 222

Slide 222 text

Было Активных серий: 9 351 464

Slide 223

Slide 223 text

Стало Активных серий: 877 526

Slide 224

Slide 224 text

Бонус!

Slide 225

Slide 225 text

Что еще потребляет память?

Slide 226

Slide 226 text

Что еще потребляет память? prometheus remote_write

Slide 227

Slide 227 text

Что еще потребляет память? prometheus remote_write ● особенно когда не получается отправить данные

Slide 228

Slide 228 text

Тимур Тукаев Head of technical marketing Спасибо! Владимир Водяницкий Куратор доклада Proofreader Иван Богданов Куратор доклада George Gaál Алёна Лунина Оформление презентации Владимир Куценко Оформление презентации Евгений Бастрыков Teamlead Observability

Slide 229

Slide 229 text

Владимир Гурьянов Флант 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

Slide 230

Slide 230 text

Да!

Slide 231

Slide 231 text

{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