Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions ansible-playbook/vars/metrics-catalog.testing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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"
Expand Down Expand Up @@ -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"
Expand Down
71 changes: 71 additions & 0 deletions files/aggregator/tests/logs-to-metrics_gen_tests.toml.j2
Original file line number Diff line number Diff line change
@@ -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 %}
69 changes: 0 additions & 69 deletions files/aggregator/tests/logs-to-metrics_tests.testing.toml.j2
Original file line number Diff line number Diff line change
Expand Up @@ -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 %}
6 changes: 1 addition & 5 deletions schema/vectordev-metrics-catalog.json
Original file line number Diff line number Diff line change
@@ -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": {
Expand Down Expand Up @@ -250,9 +250,6 @@
"expect": {
"type": "object",
"properties": {
"label_logfield_mapping": {
"$ref": "#/definitions/LabelLogfieldMapping"
},
"label_values": {
"type": "object",
"minProperties": 1,
Expand All @@ -262,7 +259,6 @@
}
},
"required": [
"label_logfield_mapping",
"label_values"
]
}
Expand Down