Skip to content

Commit 89fe458

Browse files
authored
Исправление: Лишние метрики считаются при добавлении новой метрики (#2)
* Обновлен Makefile Добавлена задача генерации графа компонентов, версия vector поднята до 0.43 * Удалены ненужные переменные в playbook * Переделаны трансформы для разделения обработки фильтров Трансформы подготовки логов вынесены в отдельный файл и их тесты тоже * Makefile fix * Добавлена иллюстрация графа трансформов "как было" * Исправлена сборка тестов * Добавлена схема исправленного графа обрботки метирк * Сделана генерация для разных env * Обновлен Readme * Исправлена задача генерации файлов конфига vector * Сделаны генерируемые тесты * Сделана генерация тестов к метрикам из metrics-catalog.yml * Json схема дополнена для разрешения описания testdata в metrics-catalog.yml
1 parent 30ad135 commit 89fe458

16 files changed

+1259
-482
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
.generated/*
22
.tools/*
3+
.vscode/settings.json
4+
ansible-playbook/playbook.tmp*
5+

Makefile

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ OS := $(shell uname -s)
99
TOOLS_DIR ?= .tools
1010
SUDO_PASSWORD ?= human
1111

12-
VECTOR_VERSION ?= 0.35.0
12+
VECTOR_VERSION ?= 0.43.0
1313
# если установлен в системе, то доступен как команда в /usr/bin/vector
1414
VECTOR_BINARY ?= $(TOOLS_DIR)/vector_$(VECTOR_VERSION)_$(OS)_amd64
1515
VECTOR_CONFIG_DIR ?= $(PWD)/.generated/vector_config
16+
VECTOR_ENV ?= testing
1617
YQ_VERSION ?= 4.30.5
1718
JV_VERSION ?= 0.4.0
1819

@@ -32,7 +33,7 @@ YQ_BINARY_URL := https://github.com/mikefarah/yq/releases/download/v$(YQ_VERSION
3233

3334

3435
.PHONY: install-dependencies
35-
install-dependencies: ## Install required dependencies
36+
install-dependencies: download-vector-bin ## Install required dependencies
3637
mkdir -p $(TOOLS_DIR)
3738
ifeq (,$(wildcard $(YQ_BINARY)))
3839
wget -qO $(YQ_BINARY) $(YQ_BINARY_URL) --show-progress && chmod +x $(YQ_BINARY)
@@ -75,9 +76,12 @@ endif
7576

7677

7778
.PHONY: validate-metrics-catalog-spec
78-
validate-metrics-catalog-spec: ## Validates metrics-catalog.yml
79+
validate-metrics-catalog-spec: ## Validates all metrics-catalog.*.yml files
7980
$(info $(M) Validate vars/metric-catalog.yml with json-schema...)
80-
$(JV_BINARY) ./schema/vectordev-metrics-catalog.json ./ansible-playbook/vars/metrics-catalog.yml
81+
@for file in ./ansible-playbook/vars/metrics-catalog.*.yml; do \
82+
echo "Checking file: $$file"; \
83+
$(JV_BINARY) ./schema/vectordev-metrics-catalog.json $$file && echo OK; \
84+
done
8185

8286

8387
.PHONY: lint-vector-config
@@ -106,7 +110,7 @@ generate-vector-conf: | validate-metrics-catalog-spec lint-vector-config ## Gene
106110
VECTOR_KAFKA_USERNAME=fake \
107111
ansible-playbook -connection=local --inventory localhost, $($@_tmpfile) \
108112
--tags aggregator \
109-
--extra-vars "development_mode=true" \
113+
--extra-vars "vector_environment=$(VECTOR_ENV)" \
110114
--extra-vars "ansible_sudo_pass=$(SUDO_PASSWORD)" \
111115
--extra-vars "local_build=true" \
112116
--extra-vars "vector_config_dir=$(VECTOR_CONFIG_DIR)" \
@@ -121,21 +125,33 @@ validate-vector-conf: generate-vector-conf ## Validate current vector.dev config
121125
$(info $(M) Validate vector config at $(VECTOR_CONFIG_DIR)...)
122126
$(VECTOR_BINARY) validate -C $(VECTOR_CONFIG_DIR) --no-environment
123127

124-
.PHONY: test-vector-transfroms
125-
test-vector-transfroms: | generate-vector-conf validate-vector-conf ## Run vector.dev transform tests
126-
$(info $(M) Run transforms tests with config $(VECTOR_CONFIG_DIR)...)
128+
.PHONY: test-vector-transforms
129+
test-vector-transforms: | generate-vector-conf validate-vector-conf ## Run vector.dev transform tests (with generate and validate config)
130+
$(info $(M) Run transforms tests with config $(VECTOR_CONF_NAME) at $(VECTOR_CONFIG_DIR)...)
127131
$(VECTOR_BINARY) test $(VECTOR_CONFIG_DIR)/*_sources_*.toml $(VECTOR_CONFIG_DIR)/*transforms_*.toml $(VECTOR_CONFIG_DIR)/*_tests_*.toml
128132

129-
.PHONY: test-vector-transfrom
130-
test-vector-transfrom: ## Run vector.dev test for a specifed test file
133+
.PHONY: test-vector-transform
134+
test-vector-transform: ## Run vector.dev test for a specified test file (no config generation included). Use var file=files/aggregator/tests/filename to provide a test file name
131135
ifndef file
132-
@echo "To run use file=testfile make ..."
136+
@echo "To run use file=files/aggregator/tests/testfile.toml.j2 make test-vector-transform"
137+
@echo "It will include the specified file into check excluding other test files, except embedded in transforms files"
133138
else
134-
$(info $(M) Run a transform test with config $(VECTOR_CONFIG_DIR)...)
139+
$(info $(M) Run a transform test with config $(VECTOR_CONF_NAME) at $(VECTOR_CONFIG_DIR)...)
135140
@echo Test file: $(file)
136-
$(VECTOR_BINARY) test $(VECTOR_CONFIG_DIR)/*_sources_*.toml $(VECTOR_CONFIG_DIR)/*transforms_*.toml $(file)
141+
$(eval PROCESSED_PATH=$(shell echo $(file) | sed 's/files\///' | sed 's/\.j2$$//' | tr '/' '_'))
142+
$(eval RENDERED_PATH=$(VECTOR_CONFIG_DIR)/$(PROCESSED_PATH))
143+
@echo Rendered test file: $(RENDERED_PATH)
144+
@test -s $(RENDERED_PATH) || { echo "No rendered test file exists! Exiting..."; exit 1; }
145+
$(VECTOR_BINARY) test $(VECTOR_CONFIG_DIR)/*_sources_*.toml $(VECTOR_CONFIG_DIR)/*transforms_*.toml ${RENDERED_PATH}
137146
endif
138147

148+
149+
.PHONY: generate-vector-graph
150+
generate-vector-graph: ## Generate vector.dev transform topology graph as SVG
151+
$(info $(M) Generate vector topology as SVG with config $(VECTOR_CONF_NAME) at $(VECTOR_CONFIG_DIR)...)
152+
$(info $(M) You should have graphviz installed: sudo apt install graphviz)
153+
$(VECTOR_BINARY) graph -C $(VECTOR_CONFIG_DIR) | dot -Tsvg > vector_topology.svg
154+
139155
help: ## Show this help
140156
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
141157

README.md

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
В данном каталоге лежат файлы описывающий подход, позволяющий генерировать метрики из логов без переписывания кода трансформов под каждый сервис.
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)).
6+
57
1. Полагаемся на то, что все сервисы пишут логи в фиксированном формате JSON и имеют одинаковый набор обязательных полей. См. [example_logs]
68
2. Для кодогенерации использован Ansible и jinja2 шаблоны. Генерируем toml файлы конфигурации vector.dev и тесты к ним, где нужно.
7-
3. Метрики определяются в файле [ansible-playbook/vars/metrics-catalog.yml], после этого запускаем генерацию через ansible. См пример в Makefile
9+
3. Метрики определяются в файле [ansible-playbook/vars/metrics-catalog.<env>.yml], после этого запускаем генерацию через ansible. См пример в Makefile. По умолчанию генерируется для `env=testing`, чтобы генерировать для production запускать `VECTOR_ENV=production make <команда>`
810
4. Отдельной задачей конфигурации выгружаются на серверы с агрегаторами vector.dev, и для применения новой конфигурации выполняется перезапуск процесса vector
911

1012
## Что нам дал рефакторинг
@@ -18,16 +20,19 @@
1820

1921
Данный код является ознакомительным и не представляет собой готовое решение, вы можете придумать свое на основе данных идей.
2022
Потому мы не приводим полные конфигурации vector.dev, код развертывания и полный набор ansible файлов для playbook.
21-
Однако вы можете сгенерировать по файлу [ansible-playbook/vars/metrics-catalog.yml] файлы конфигурации vector и посмотреть как они выглядят.
23+
Однако вы можете сгенерировать по файлу [ansible-playbook/vars/metrics-catalog.<env>.yml] файлы конфигурации vector и посмотреть как они выглядят.
2224

2325
## Генерирование файлов конфигурации
2426

2527
1. Используйте Ubuntu Linux (или Debian)
2628
2. Запустите `make install-dependencies` и `make install-dev-dependencies`
2729
3. Запустите `make download-vector-bin` - установить файлы vector для валидации запуска тестов
28-
4. Выполните сборку и тесты `make test-vector-transfroms`
30+
3. Метрики определяются в файле [ansible-playbook/vars/metrics-catalog.<env>.yml], после этого запускаем генерацию через ansible. См пример в Makefile. По умолчанию генерируется для `env=testing`, чтобы генерировать для production запускать `VECTOR_ENV=production make <команда>`
31+
4. Выполните сборку и тесты `VECTOR_ENV=<env> make test-vector-transforms`, если не указать VECTOR_ENV, то используется `VECTOR_ENV=testing`
2932
5. Созданные файлы смотрите в каталоге [.generated/vector_config]
3033

3134
## Контакты
3235

3336
Если вам интересны подробности вы можете писать нам, см. сайт https://vitech.team/ ("По вопросам сотрудничества") или приходите работать к нам.
37+
38+
Или https://github.com/r3code

ansible-playbook/playbook.yml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,14 @@
22
- name: Configure aggregator
33
hosts: aggregator
44
vars:
5-
development_mode: false
65
vector_user_configs_paths:
76
- "{{ playbook_dir }}/../files/aggregator"
87
clickhouse_local_endpoint: "{{ hostvars[inventory_hostname].clickhouse_local_endpoint }}"
98
vector_kafka_sasl_password: "{{ lookup('ansible.builtin.env', 'VECTOR_KAFKA_PASSWORD') }}"
109
vector_kafka_sasl_username: "{{ lookup('ansible.builtin.env', 'VECTOR_KAFKA_USERNAME') }}"
1110
vars_files:
12-
- "{{ playbook_dir }}/vars/metrics-catalog.yml"
13-
ignore_errors: true
11+
- "{{ playbook_dir }}/vars/metrics-catalog.{{ vector_environment }}.yml"
12+
any_errors_fatal: true
1413
tasks:
1514
- name: "Local Build. Generate Vector Config Files"
1615
ansible.builtin.include_tasks: tasks/vector_config_generate_tasks.yml

ansible-playbook/tasks/vector_config_generate_tasks.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
- name: Remove generated vector configs dir
33
ansible.builtin.file:
44
state: absent
5-
path: "{{ playbook_dir }}/../.generated/vector_configs/"
5+
path: "{{ playbook_dir }}/../.generated/vector_config/"
66
delegate_to: localhost
77

88
- name: Find user-defined configs
@@ -25,7 +25,7 @@
2525
- name: Create generated vector configs dir
2626
ansible.builtin.file:
2727
state: directory
28-
path: "{{ playbook_dir }}/.generated/vector_configs/"
28+
path: "{{ playbook_dir }}/../.generated/vector_config/"
2929
mode: 0777
3030
delegate_to: localhost
3131

ansible-playbook/vars/metrics-catalog.yml renamed to ansible-playbook/vars/metrics-catalog.production.yml

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ metrics_catalog:
1515
is_internal_traffic:
1616
eq: "1"
1717
namespace:
18-
eq: "shop-production"
18+
eq: "webshop-production"
1919
service_name:
2020
re: "^.*-canary(-.*)?$"
2121

@@ -38,31 +38,55 @@ metrics_catalog:
3838
# Порядок вычисления условий в группе: neq, nre, eq, re, (oneOfRe - не реализован)
3939
eq: "/" # оператор и значение для сравнениея
4040
namespace:
41-
eq: "shop-production"
41+
eq: "webshop-production"
4242
service_name:
43-
re: "^shop-service(?:-canary)?$"
43+
re: "^webshop(?:-canary)?$"
4444
http_method:
4545
eq: "GET"
4646
- selector: "Запросы на создание заказа в интернет магазине"
4747
filter:
4848
http_path:
4949
re: "^/order$|^/order-fast$"
5050
namespace:
51-
eq: "shop-production"
51+
eq: "webshop-production"
5252
service_name:
53-
re: "^shop-service(?:-canary)?$"
53+
re: "^webshop(?:-canary)?$"
5454
- selector: "Открытие страницы производителя в интернет магазине"
5555
filter:
5656
http_path:
5757
re: "^/vendor/(?P<name>([^/]+/)+)$"
5858
label_override: "/vendor/:name"
5959
namespace:
60-
eq: "shop-production"
60+
eq: "webshop-production"
6161
service_name:
62-
re: "^shop-service(?:-canary)?$"
62+
re: "^webshop(?:-canary)?$"
6363
# Метрика vi_http_request_duration_seconds
6464
request_duration_seconds: # требуется для transforms.metrics-http-accesslog-k8s - бакеты определены там
6565
metric_type: histogram
6666
group_by_logfield: "duration_sec"
6767
label_logfield_mapping: *default_label_logfield_mapping
6868
event_selectors: *global_http_requests_total_event_selectors
69+
vi_kubedns_http:
70+
requests_total:
71+
metric_type: counter
72+
group_by_logfield: *global_http_requests_total_status_code
73+
label_logfield_mapping: &kubedns_label_logfield_mapping
74+
vhost: "http_host"
75+
service_name: "service_name"
76+
k8s_cluster: "cluster_name"
77+
namespace: "namespace"
78+
method: "http_method"
79+
status: "http_status_code"
80+
event_selectors: &kubedns_http_requests_total_event_selectors
81+
# фильтры подходящих нам метирик
82+
- selector: Монолит - входящие запросы по kubedns
83+
filter:
84+
namespace:
85+
eq: "webshop-production"
86+
http_host:
87+
re: ".*local"
88+
request_duration_seconds:
89+
metric_type: histogram
90+
group_by_logfield: "duration_sec"
91+
label_logfield_mapping: *kubedns_label_logfield_mapping
92+
event_selectors: *kubedns_http_requests_total_event_selectors

0 commit comments

Comments
 (0)