Skip to content

Commit 06a3005

Browse files
authored
Исправление: label_override заменяет значение и в соседних метриках (#7)
* Переделка подсчета метрик по логам * Улучен код фильтрации, теперь быстрый выход при первом совпадении события Closes #6
1 parent c287a89 commit 06a3005

File tree

8 files changed

+437
-410
lines changed

8 files changed

+437
-410
lines changed

README.md

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,25 @@
11
# Преобразование логов http accesslog в метрики с vector.dev
22

3-
В данном каталоге лежат файлы описывающий подход, позволяющий генерировать метрики из логов без переписывания кода трансформов под каждый сервис.
3+
В данном каталоге лежат файлы описывающий подход, позволяющий генерировать [метрики из логов](https://vector.dev/docs/reference/configuration/transforms/log_to_metric/) без переписывания кода трансформов [vector.dev](https://vector.dev/) под каждый сервис.
44

5-
**Внимание!** [Версия v1](https://github.com/vseinstrumentiru/vector.dev-metrics-to-logs-helper/tree/1.0.0) содержала [баг #1](/../../issues/1) который проявлялся, только если вы добавляли разные определения метрик (разные лейблы, разные фильтры). В текущей версии это исправлено (см. [новый граф обработки](docs/vector_topology-separate-metric-fileters.svg)).
5+
**Описание:**
66

77
1. Полагаемся на то, что все сервисы пишут логи в фиксированном формате JSON и имеют одинаковый набор обязательных полей. См. [example_logs]
88
2. Для кодогенерации использован Ansible и jinja2 шаблоны. Генерируем toml файлы конфигурации vector.dev и тесты к ним, где нужно.
99
3. Метрики определяются в файле [ansible-playbook/vars/metrics-catalog.<env>.yml], после этого запускаем генерацию через ansible. См пример в Makefile. По умолчанию генерируется для `env=testing`, чтобы генерировать для production запускать `VECTOR_ENV=production make <команда>`
10-
4. Отдельной задачей конфигурации выгружаются на серверы с агрегаторами vector.dev, и для применения новой конфигурации выполняется перезапуск процесса vector
10+
4. Отдельной задачей конфигурации выгружаются на серверы с агрегаторами vector.dev, и для применения новой конфигурации выполняется перезапуск процесса vector (здесь не приведены).
11+
12+
13+
## Как было раньше
14+
15+
Каждый раз под новый источник мы писали новый код VRL, часто делая copy/paste с незначительными правками. Это могло занимать с отладкой и тестами весь рабочий день.
16+
Потому в 2023 нас это перестало устраивать и мы придумали это подход. Подробно читайте https://habr.com/ru/articles/809801/ и https://habr.com/ru/articles/864614/.
1117

1218
## Что нам дал рефакторинг
1319

1420
* Мы вместо 5 часов теперь тратим 10-30 минут на добавление/изменение метрик с учетом выкатки на прод
1521
* Появилась автоматическая валидация по схеме, теперь ошибку при описании метрки допустить сложнее
16-
* Теперь для добавления новой метрки не нужно знать как это закодировать на языку VRL - достаточно YAML девелопера )
22+
* Теперь для добавления новой метрки не нужно знать как это закодировать на языке VRL - достаточно YAML девелопера )
1723

1824

1925
## Ограничения
@@ -31,6 +37,43 @@
3137
4. Выполните сборку и тесты `VECTOR_ENV=<env> make test-vector-transforms`, если не указать VECTOR_ENV, то используется `VECTOR_ENV=testing`
3238
5. Созданные файлы смотрите в каталоге [.generated/vector_config]
3339

40+
## Граф компонентов vector.dev
41+
42+
В приведенной конфигурации создается следующий граф компонентов:
43+
44+
![Граф компонентов vector.dev](docs/vector_topology-v1.2.svg)
45+
46+
47+
## Как писать фильтры в metric-catalog.yml правлиьно
48+
49+
* При описании указывайте фильтры по полям с наименьшим количеством значений и сравниваемых через простое сравнение без регулярных выражений - это улучшит производительнсоть обработки.
50+
* В последнию очередь добавляйте условия с регулярными выржениями re/nre, т.к. чем позже они в выражении, тем больше шанс, что простые условия отсеят событие раньше.
51+
* Старайтесь всегда сначала обходиться простыми условиями, и лишь при невозможности их применения переходить на условия с регулярными выржениями re/nre.
52+
53+
Пример более тяжелого для вычисления фильтра (плохой пример):
54+
55+
- selector: Исключаем из метрик логи канарееченого релиза, которые получен для запросов из внутренней сети. Чтобы это не попадало SLO
56+
filter:
57+
service_name:
58+
re: "^.*-canary(-.*)?$"
59+
namespace:
60+
re: ".*-production"
61+
is_internal_traffic:
62+
eq: "1"
63+
64+
65+
Тот же фильтр с измененным порядокм полей будет вычисляться быстрее (хороший пример):
66+
67+
- selector: Исключаем из метрик логи канарееченого релиза, которые получен для запросов из внутренней сети. Чтобы это не попадало SLO
68+
filter:
69+
is_internal_traffic: # << поставили на первое место простой фильтр
70+
eq: "1"
71+
namespace:
72+
re: ".*-production"
73+
service_name:
74+
re: "^.*-canary(-.*)?$"
75+
76+
3477
## Контакты
3578

3679
Если вам интересны подробности вы можете писать нам, см. сайт https://vitech.team/ ("По вопросам сотрудничества") или приходите работать к нам.

ansible-playbook/vars/metrics-catalog.testing.yml

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,16 @@ metrics_catalog:
1212
exclude_events:
1313
- selector: Исключаем из метрик логи канарееченого релиза, которые получен для запросов из внутренней сети. Чтобы это не попадало SLO
1414
filter:
15-
is_internal_traffic:
16-
eq: "1"
1715
namespace:
1816
eq: "webshop-production"
17+
is_internal_traffic:
18+
eq: "1"
1919
service_name:
2020
re: "^.*-canary(-.*)?$"
21+
- selector: Исключаем /health(z)
22+
filter:
23+
http_path:
24+
re: "/healthz?"
2125

2226
metrics:
2327
vi_http:
@@ -33,33 +37,33 @@ metrics_catalog:
3337
##
3438
- selector: "Запросы к главной странице интернет магазина"
3539
filter:
36-
http_path: # имя поля в событии лога (входящие данные трансформа vector.dev)
37-
# возможные условия отбора: eq -> ==, neq -> !=, re -> match_any(), nre -> !match_any.
38-
# Порядок вычисления условий в группе: neq, nre, eq, re, (oneOfRe - не реализован)
39-
eq: "/" # оператор и значение для сравнениея
4040
namespace:
4141
eq: "webshop-production"
4242
service_name:
4343
re: "^webshop(?:-canary)?$"
44+
http_path: # имя поля в событии лога (входящие данные трансформа vector.dev)
45+
# возможные условия отбора: eq -> ==, neq -> !=, re -> match_any(), nre -> !match_any.
46+
# Порядок вычисления условий в группе: neq, nre, eq, re, (oneOfRe - не реализован)
47+
eq: "/" # оператор и значение для сравнениея
4448
http_method:
4549
eq: "GET"
4650
- selector: "Запросы на создание заказа в интернет магазине"
4751
filter:
48-
http_path:
49-
re: "^/order$|^/order-fast$"
5052
namespace:
5153
eq: "webshop-production"
5254
service_name:
5355
re: "^webshop(?:-canary)?$"
56+
http_path:
57+
re: "^/order$|^/order-fast$"
5458
- selector: "Открытие страницы производителя в интернет магазине"
5559
filter:
56-
http_path:
57-
re: "^/vendor/(?P<name>([^/]+/)+)$"
58-
label_override: "/vendor/:name"
5960
namespace:
6061
eq: "webshop-production"
6162
service_name:
6263
re: "^webshop(?:-canary)?$"
64+
http_path:
65+
re: "^/vendor/(?P<name>([^/]+/)+)$"
66+
label_override: "/vendor/:name"
6367
testdata: # указывать в ключах имена полей на выходе из transforms.http_accesslog-k8s
6468
- test:
6569
input_values:
@@ -83,12 +87,12 @@ metrics_catalog:
8387
- test: canary
8488
input_values:
8589
service_name: "webshop-canary"
90+
namespace: "webshop-production"
8691
container_name: "frontend"
8792
cluster_name: "test::dc2-old"
8893
http_path: "/vendor/gigant-2/"
8994
http_method: "GET"
9095
http_status_code: "200"
91-
namespace: "webshop-production"
9296
duration_sec: "0.3"
9397
kubernetes.pod_node_name: "ox2-kub-prod18"
9498
expect:
@@ -99,6 +103,32 @@ metrics_catalog:
99103
cluster_name: "test::dc2-old"
100104
container_name: "frontend"
101105
service_name: "webshop-canary"
106+
- selector: "Все запросы на Webshop Circuit Breaker"
107+
filter:
108+
service_name:
109+
eq: "webshop-cb"
110+
http_path:
111+
re: ".*"
112+
label_override: ":url_path"
113+
testdata: # указывать в ключах имена полей на выходе из transforms.http_accesslog-k8s
114+
- test:
115+
input_values:
116+
http_path: "/brand/abc-123/sub-1234/"
117+
http_method: "GET"
118+
http_status_code: "200"
119+
duration_sec: "2.1"
120+
cluster_name: "any_dc"
121+
container_name: "any_cn"
122+
kubernetes.pod_node_name: "ox2-kub-prod18"
123+
service_name: "webshop-cb"
124+
expect:
125+
label_values:
126+
path: ":url_path"
127+
method: "GET"
128+
status: "200"
129+
cluster_name: "any_dc"
130+
container_name: "any_cn"
131+
service_name: "webshop-cb"
102132
# Метрика vi_http_request_duration_seconds
103133
request_duration_seconds: # требуется для transforms.metrics-http-accesslog-k8s - бакеты определены там
104134
metric_type: histogram

0 commit comments

Comments
 (0)