diff --git a/ansible-playbook/vars/metrics-catalog.testing.yml b/ansible-playbook/vars/metrics-catalog.testing.yml index e4a9bb7..4b55688 100644 --- a/ansible-playbook/vars/metrics-catalog.testing.yml +++ b/ansible-playbook/vars/metrics-catalog.testing.yml @@ -70,8 +70,9 @@ metrics_catalog: http_method: "GET" http_status_code: "200" namespace: "webshop-production" + duration_sec: "0.3" + kubernetes.pod_node_name: "ox2-kub-prod18" expect: - label_logfield_mapping: *default_label_logfield_mapping label_values: path: "/vendor/:name" method: "GET" @@ -88,8 +89,9 @@ metrics_catalog: http_method: "GET" http_status_code: "200" namespace: "webshop-production" + duration_sec: "0.3" + kubernetes.pod_node_name: "ox2-kub-prod18" expect: - label_logfield_mapping: *default_label_logfield_mapping label_values: path: "/vendor/:name" method: "GET" @@ -133,8 +135,9 @@ metrics_catalog: http_method: "GET" http_status_code: "200" namespace: "webshop-production" + duration_sec: "0.3" + kubernetes.pod_node_name: "ox2-kub-prod18" expect: - label_logfield_mapping: *default_label_logfield_mapping label_values: vhost: "any.local" service_name: "webshop" diff --git a/files/aggregator/tests/logs-to-metrics_gen_tests.toml.j2 b/files/aggregator/tests/logs-to-metrics_gen_tests.toml.j2 new file mode 100644 index 0000000..6991b6a --- /dev/null +++ b/files/aggregator/tests/logs-to-metrics_gen_tests.toml.j2 @@ -0,0 +1,71 @@ +############################################################################### +# GENERATED METRICS TESTS +# ВНИМАНИЕ! Тесты привязаны к metrics_catalog -> metrics-catalog.{{vector_environment}}.yml +############################################################################### + +{% for namespace, metrics in metrics_catalog.metrics.items() -%} + {%- for metric_name, metric_conf in metrics.items() -%} + {%- for selector_conf in metric_conf.event_selectors -%} + + {%- if selector_conf.testdata is defined -%} + {%- set metric_namespace = namespace -%}{#- если пустое, то имя метки должно начинаться с _ -#} + {%- set metric_full_name = metric_namespace + "_" + metric_name -%} + {%- set selector_index = (loop.index0 | string) -%} + + {%- for test_conf in selector_conf.testdata -%} + {%- set test_index = (loop.index0 | string) -%} + {%- set test_name = "transforms.metrics-http-accesslog-k8s: check metric " + metric_full_name + "/selector[" + selector_index + "]/test[" + test_index + "]" -%} + +[[tests]] + name = "{{ test_name }}" + + [[tests.inputs]] + insert_at = "metrics-http-accesslog-k8s_exclude_filter" + type = "log" + + {% if not selector_conf.filter.keys() is subset(test_conf.input_values.keys()) %} +>>> AnsibleTemplateError: Ошибка при генерации кода теста из шаблона. Тест: {{ test_name }}. Ключи из .selector[{{ selector_index}}].filter должны встречаться в selector[{{ selector_index}}]/test[{{test_index}}].input_values. + {% endif %} + + [tests.inputs.log_fields] + {% for logfield_name, logfield_value in test_conf.input_values.items() -%} + "{{ logfield_name | replace('"','\\"') | safe }}" = "{{ logfield_value | replace('"','\\"') | safe }}" + {# newline #} + {%- endfor %} + + [[tests.outputs]] + extract_from = "metrics-http-accesslog-k8s" + {# Выводим текст чтобы в случае ошибки конфигурации упасть при валидации #} + {%- set metric_def_labels = metric_conf.label_logfield_mapping.keys() | sort | join(', ') -%} + {%- set metric_test_expect_labels = test_conf.expect.label_values.keys() | sort | join(', ') -%} + {%- set metric_test_labels_ok = (metric_def_labels == metric_test_expect_labels) -%} + {% if not metric_test_labels_ok %}{# сообщение без переносов должно быть, чтобы при сбое валидации в vector было видно целиком #} +>>> 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 }}] + {% endif %} + + [[tests.outputs.conditions]] + type = "vrl" + source = ''' + assert!(!exists(.tags.pod_name)) + {# проверить имя метрики и перфикса -#} + assert_eq!(.namespace, "{{ metric_namespace }}") + assert!(includes([{{ metrics.keys() | map('to_json') | join(', ') }}], "{{ metric_name }}")) + + {% for label_name, _ in metric_conf.label_logfield_mapping.items() -%} + {# проверяем что метрика имеет нужные label -#} + assert!(exists(.tags.{{ label_name }})) + {# проверить совпадения значения label метрик по label_logfield_mapping из метрики -#} + {% if metric_test_labels_ok -%} + assert_eq!(.tags.{{ label_name }}, "{{ test_conf.expect.label_values[label_name] }}") + {% else -%} + ^^ см. AnsibleTemplateError выше по тексту + {% endif -%} + {% endfor %} +{{ "" }} + ''' +{# newline #} + {%- endfor %} + {%- endif %} + {%- endfor %} + {%- endfor %} +{% endfor %} diff --git a/files/aggregator/tests/logs-to-metrics_tests.testing.toml.j2 b/files/aggregator/tests/logs-to-metrics_tests.testing.toml.j2 index af70640..044e702 100644 --- a/files/aggregator/tests/logs-to-metrics_tests.testing.toml.j2 +++ b/files/aggregator/tests/logs-to-metrics_tests.testing.toml.j2 @@ -214,74 +214,5 @@ "upstream_network_bytes_written" = 14693 "upstream_duration_sec" = 0.217 -### -### GENERATED TESTS 2 -### -{% for namespace, metrics in metrics_catalog.metrics.items() -%} - {%- for metric_name, metric_conf in metrics.items() -%} - {%- for selector_conf in metric_conf.event_selectors -%} - - {%- if selector_conf.testdata is defined -%} - {%- set metric_namespace = namespace -%}{#- если пустое, то имя метки должно начинаться с _ -#} - {%- set metric_full_name = metric_namespace + "_" + metric_name -%} - {%- set selector_index = (loop.index | string) -%} - - {%- for test_conf in selector_conf.testdata -%} - {%- set test_name = "transforms.metrics-http-accesslog-k8s: check metric " + metric_full_name + "(selector #" + selector_index + ", test #" + (loop.index | string) + ")" -%} - -[[tests]] - name = "{{ test_name }}" - - [[tests.inputs]] - insert_at = "metrics-http-accesslog-k8s_exclude_filter" - type = "log" - - [tests.inputs.log_fields] - # сгенерированные строки - {% for logfield_name, logfield_value in test_conf.input_values.items() -%} - "{{ logfield_name | replace('"','\\"') | safe }}" = "{{ logfield_value | replace('"','\\"') | safe }}" - {# newline #} - {%- endfor %} - - # Остальное нужное для обраотки - "duration_sec" = 0.3 - "kubernetes.pod_node_name" = "ox2-kub-prod18" - - [[tests.outputs]] - extract_from = "metrics-http-accesslog-k8s" - - [[tests.outputs.conditions]] - type = "vrl" - source = ''' - assert!(!exists(.tags.pod_name)) - - {# проверить имя метрики и перфикса -#} - - assert_eq!(.name, "{{ metric_name }}") - assert_eq!(.namespace, "{{ metric_namespace }}") - assert!(includes([.name], "{{ metric_name }}")) - - {# проверить мапинг, для начала можно сравнить количество, если не совпадает, то выборсить ошибоку ansible -#} - {%- if metric_conf.label_logfield_mapping | length != test_conf.expect.label_logfield_mapping | length -%} - {{ "Ошибка: Длина массива не равна количеству элементов в словаре!" | fail }} - {%- endif -%} - - {% for label_name, _ in metric_conf.label_logfield_mapping.items() -%} - {# проверяем что метрика имеет нужные label -#} - assert!(exists(.tags.{{ label_name }})) - {# проверить совпадения значения label метрик по label_logfield_mapping из метрики -#} - assert_eq!(.tags.{{ label_name }}, "{{ test_conf.expect.label_values[label_name] }}") - {% endfor %} -{{ "" }} - ''' -{# newline #} - {%- endfor %} - {%- endif %} - {%- endfor %} - {%- endfor %} -{% endfor %} - - - {# end --> if vector_environment == 'testing' #} {% endif %} diff --git a/schema/vectordev-metrics-catalog.json b/schema/vectordev-metrics-catalog.json index 35bc4d6..29a2a35 100644 --- a/schema/vectordev-metrics-catalog.json +++ b/schema/vectordev-metrics-catalog.json @@ -1,5 +1,5 @@ { - "$id": "https://github.com/vseinstrumentiru/vector.dev-metrics-to-logs-helper/blob/main/schema/vectordev-metrics-catalog.json", + "$id": "https://github.com/vseinstrumentiru/vector.dev-metrics-to-logs-helper/blob/main/schema/vectordev-metrics-catalog.json#v1.2", "$schema": "http://json-schema.org/draft-07/schema#", "$ref": "#/definitions/Schema", "definitions": { @@ -250,9 +250,6 @@ "expect": { "type": "object", "properties": { - "label_logfield_mapping": { - "$ref": "#/definitions/LabelLogfieldMapping" - }, "label_values": { "type": "object", "minProperties": 1, @@ -262,7 +259,6 @@ } }, "required": [ - "label_logfield_mapping", "label_values" ] }