Skip to content

Commit c287a89

Browse files
authored
Добавлены проверки правильности конфигурации и сообщения об ошибках (#4)
* Из json-schema удалено требования наличия label_logfield_mapping, теперь тест берет данные из самой метрики и проверяет соответствие по нему. Не надо указывать вручную как ранее. * Если названия меток в тесте не соовтетствуют меткам в описанииметрики, то в код добавиться текст ошибки, который видно на этапе валидации конфигуации vector.
1 parent 94b3085 commit c287a89

File tree

4 files changed

+78
-77
lines changed

4 files changed

+78
-77
lines changed

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,9 @@ metrics_catalog:
7070
http_method: "GET"
7171
http_status_code: "200"
7272
namespace: "webshop-production"
73+
duration_sec: "0.3"
74+
kubernetes.pod_node_name: "ox2-kub-prod18"
7375
expect:
74-
label_logfield_mapping: *default_label_logfield_mapping
7576
label_values:
7677
path: "/vendor/:name"
7778
method: "GET"
@@ -88,8 +89,9 @@ metrics_catalog:
8889
http_method: "GET"
8990
http_status_code: "200"
9091
namespace: "webshop-production"
92+
duration_sec: "0.3"
93+
kubernetes.pod_node_name: "ox2-kub-prod18"
9194
expect:
92-
label_logfield_mapping: *default_label_logfield_mapping
9395
label_values:
9496
path: "/vendor/:name"
9597
method: "GET"
@@ -133,8 +135,9 @@ metrics_catalog:
133135
http_method: "GET"
134136
http_status_code: "200"
135137
namespace: "webshop-production"
138+
duration_sec: "0.3"
139+
kubernetes.pod_node_name: "ox2-kub-prod18"
136140
expect:
137-
label_logfield_mapping: *default_label_logfield_mapping
138141
label_values:
139142
vhost: "any.local"
140143
service_name: "webshop"
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
###############################################################################
2+
# GENERATED METRICS TESTS
3+
# ВНИМАНИЕ! Тесты привязаны к metrics_catalog -> metrics-catalog.{{vector_environment}}.yml
4+
###############################################################################
5+
6+
{% for namespace, metrics in metrics_catalog.metrics.items() -%}
7+
{%- for metric_name, metric_conf in metrics.items() -%}
8+
{%- for selector_conf in metric_conf.event_selectors -%}
9+
10+
{%- if selector_conf.testdata is defined -%}
11+
{%- set metric_namespace = namespace -%}{#- если пустое, то имя метки должно начинаться с _ -#}
12+
{%- set metric_full_name = metric_namespace + "_" + metric_name -%}
13+
{%- set selector_index = (loop.index0 | string) -%}
14+
15+
{%- for test_conf in selector_conf.testdata -%}
16+
{%- set test_index = (loop.index0 | string) -%}
17+
{%- set test_name = "transforms.metrics-http-accesslog-k8s: check metric " + metric_full_name + "/selector[" + selector_index + "]/test[" + test_index + "]" -%}
18+
19+
[[tests]]
20+
name = "{{ test_name }}"
21+
22+
[[tests.inputs]]
23+
insert_at = "metrics-http-accesslog-k8s_exclude_filter"
24+
type = "log"
25+
26+
{% if not selector_conf.filter.keys() is subset(test_conf.input_values.keys()) %}
27+
>>> AnsibleTemplateError: Ошибка при генерации кода теста из шаблона. Тест: {{ test_name }}. Ключи из .selector[{{ selector_index}}].filter должны встречаться в selector[{{ selector_index}}]/test[{{test_index}}].input_values.
28+
{% endif %}
29+
30+
[tests.inputs.log_fields]
31+
{% for logfield_name, logfield_value in test_conf.input_values.items() -%}
32+
"{{ logfield_name | replace('"','\\"') | safe }}" = "{{ logfield_value | replace('"','\\"') | safe }}"
33+
{# newline #}
34+
{%- endfor %}
35+
36+
[[tests.outputs]]
37+
extract_from = "metrics-http-accesslog-k8s"
38+
{# Выводим текст чтобы в случае ошибки конфигурации упасть при валидации #}
39+
{%- set metric_def_labels = metric_conf.label_logfield_mapping.keys() | sort | join(', ') -%}
40+
{%- set metric_test_expect_labels = test_conf.expect.label_values.keys() | sort | join(', ') -%}
41+
{%- set metric_test_labels_ok = (metric_def_labels == metric_test_expect_labels) -%}
42+
{% if not metric_test_labels_ok %}{# сообщение без переносов должно быть, чтобы при сбое валидации в vector было видно целиком #}
43+
>>> AnsibleTemplateError: Ошибка при генерации кода теста из шаблона. Тест: {{ test_name }}. Должно быть полное соответствие меток в label_logfield_mapping метрики и label_values теста. Сравните: label_logfield_mapping = [{{ metric_def_labels }}] и selector[{{ selector_index}}]/test[{{test_index}}].expect.label_values = [{{ metric_test_expect_labels }}]
44+
{% endif %}
45+
46+
[[tests.outputs.conditions]]
47+
type = "vrl"
48+
source = '''
49+
assert!(!exists(.tags.pod_name))
50+
{# проверить имя метрики и перфикса -#}
51+
assert_eq!(.namespace, "{{ metric_namespace }}")
52+
assert!(includes([{{ metrics.keys() | map('to_json') | join(', ') }}], "{{ metric_name }}"))
53+
54+
{% for label_name, _ in metric_conf.label_logfield_mapping.items() -%}
55+
{# проверяем что метрика имеет нужные label -#}
56+
assert!(exists(.tags.{{ label_name }}))
57+
{# проверить совпадения значения label метрик по label_logfield_mapping из метрики -#}
58+
{% if metric_test_labels_ok -%}
59+
assert_eq!(.tags.{{ label_name }}, "{{ test_conf.expect.label_values[label_name] }}")
60+
{% else -%}
61+
^^ см. AnsibleTemplateError выше по тексту
62+
{% endif -%}
63+
{% endfor %}
64+
{{ "" }}
65+
'''
66+
{# newline #}
67+
{%- endfor %}
68+
{%- endif %}
69+
{%- endfor %}
70+
{%- endfor %}
71+
{% endfor %}

files/aggregator/tests/logs-to-metrics_tests.testing.toml.j2

Lines changed: 0 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -214,74 +214,5 @@
214214
"upstream_network_bytes_written" = 14693
215215
"upstream_duration_sec" = 0.217
216216

217-
###
218-
### GENERATED TESTS 2
219-
###
220-
{% for namespace, metrics in metrics_catalog.metrics.items() -%}
221-
{%- for metric_name, metric_conf in metrics.items() -%}
222-
{%- for selector_conf in metric_conf.event_selectors -%}
223-
224-
{%- if selector_conf.testdata is defined -%}
225-
{%- set metric_namespace = namespace -%}{#- если пустое, то имя метки должно начинаться с _ -#}
226-
{%- set metric_full_name = metric_namespace + "_" + metric_name -%}
227-
{%- set selector_index = (loop.index | string) -%}
228-
229-
{%- for test_conf in selector_conf.testdata -%}
230-
{%- set test_name = "transforms.metrics-http-accesslog-k8s: check metric " + metric_full_name + "(selector #" + selector_index + ", test #" + (loop.index | string) + ")" -%}
231-
232-
[[tests]]
233-
name = "{{ test_name }}"
234-
235-
[[tests.inputs]]
236-
insert_at = "metrics-http-accesslog-k8s_exclude_filter"
237-
type = "log"
238-
239-
[tests.inputs.log_fields]
240-
# сгенерированные строки
241-
{% for logfield_name, logfield_value in test_conf.input_values.items() -%}
242-
"{{ logfield_name | replace('"','\\"') | safe }}" = "{{ logfield_value | replace('"','\\"') | safe }}"
243-
{# newline #}
244-
{%- endfor %}
245-
246-
# Остальное нужное для обраотки
247-
"duration_sec" = 0.3
248-
"kubernetes.pod_node_name" = "ox2-kub-prod18"
249-
250-
[[tests.outputs]]
251-
extract_from = "metrics-http-accesslog-k8s"
252-
253-
[[tests.outputs.conditions]]
254-
type = "vrl"
255-
source = '''
256-
assert!(!exists(.tags.pod_name))
257-
258-
{# проверить имя метрики и перфикса -#}
259-
260-
assert_eq!(.name, "{{ metric_name }}")
261-
assert_eq!(.namespace, "{{ metric_namespace }}")
262-
assert!(includes([.name], "{{ metric_name }}"))
263-
264-
{# проверить мапинг, для начала можно сравнить количество, если не совпадает, то выборсить ошибоку ansible -#}
265-
{%- if metric_conf.label_logfield_mapping | length != test_conf.expect.label_logfield_mapping | length -%}
266-
{{ "Ошибка: Длина массива не равна количеству элементов в словаре!" | fail }}
267-
{%- endif -%}
268-
269-
{% for label_name, _ in metric_conf.label_logfield_mapping.items() -%}
270-
{# проверяем что метрика имеет нужные label -#}
271-
assert!(exists(.tags.{{ label_name }}))
272-
{# проверить совпадения значения label метрик по label_logfield_mapping из метрики -#}
273-
assert_eq!(.tags.{{ label_name }}, "{{ test_conf.expect.label_values[label_name] }}")
274-
{% endfor %}
275-
{{ "" }}
276-
'''
277-
{# newline #}
278-
{%- endfor %}
279-
{%- endif %}
280-
{%- endfor %}
281-
{%- endfor %}
282-
{% endfor %}
283-
284-
285-
286217
{# end --> if vector_environment == 'testing' #}
287218
{% endif %}

schema/vectordev-metrics-catalog.json

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"$id": "https://github.com/vseinstrumentiru/vector.dev-metrics-to-logs-helper/blob/main/schema/vectordev-metrics-catalog.json",
2+
"$id": "https://github.com/vseinstrumentiru/vector.dev-metrics-to-logs-helper/blob/main/schema/vectordev-metrics-catalog.json#v1.2",
33
"$schema": "http://json-schema.org/draft-07/schema#",
44
"$ref": "#/definitions/Schema",
55
"definitions": {
@@ -250,9 +250,6 @@
250250
"expect": {
251251
"type": "object",
252252
"properties": {
253-
"label_logfield_mapping": {
254-
"$ref": "#/definitions/LabelLogfieldMapping"
255-
},
256253
"label_values": {
257254
"type": "object",
258255
"minProperties": 1,
@@ -262,7 +259,6 @@
262259
}
263260
},
264261
"required": [
265-
"label_logfield_mapping",
266262
"label_values"
267263
]
268264
}

0 commit comments

Comments
 (0)