Skip to content

Commit 801a718

Browse files
committed
Улучен код фильтрации, теперь быстрый выход при первом совпадении события
1 parent 95ae209 commit 801a718

File tree

4 files changed

+63
-33
lines changed

4 files changed

+63
-33
lines changed

README.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,36 @@
4444
![Граф компонентов vector.dev](docs/vector_topology-v1.2.svg)
4545

4646

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+
4777
## Контакты
4878

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

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

Lines changed: 18 additions & 14 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:
@@ -101,11 +105,11 @@ metrics_catalog:
101105
service_name: "webshop-canary"
102106
- selector: "Все запросы на Webshop Circuit Breaker"
103107
filter:
108+
service_name:
109+
eq: "webshop-cb"
104110
http_path:
105111
re: ".*"
106112
label_override: ":url_path"
107-
service_name:
108-
eq: "webshop-cb"
109113
testdata: # указывать в ключах имена полей на выходе из transforms.http_accesslog-k8s
110114
- test:
111115
input_values:

files/aggregator/tests/logs-to-metrics_gen_tests.toml.j2

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
###
44
{% set _metrics_catalog = metrics_catalog %}
55

6+
# Metrics selectors tests
7+
68
{% for namespace, metrics in _metrics_catalog.metrics.items() -%}
79
{%- for metric_name, metric_conf in metrics.items() -%}
810
{%- for selector_conf in metric_conf.event_selectors -%}
@@ -28,7 +30,6 @@
2830
{% endif %}
2931

3032
[tests.inputs.log_fields]
31-
# сгенерированные строки
3233
{% for logfield_name, logfield_value in test_conf.input_values.items() -%}
3334
"{{ logfield_name | replace('"','\\"') | safe }}" = "{{ logfield_value | replace('"','\\"') | safe }}"
3435
{# newline #}

files/aggregator/transforms/logs-to-metrics.toml.j2

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -52,28 +52,22 @@ inputs = ["metrics-http-accesslog-k8s_exclude_filter"]
5252
#
5353
drop_on_abort = true
5454
source = '''
55-
is_allowed = false
56-
5755
{% for event_selector in _metric_conf.event_selectors -%}
5856
{%- set selector_id = loop.index0 | string %}
5957
{%- set selector_name = event_selector.selector %}
6058
{%- set source_ref = _metric_full_name + "/selector[" + selector_id + "]: " + selector_name %}
6159

6260
# source_ref: {{ source_ref }}
63-
is_selector_match = {{ build_selector_matching_expr(event_selector, source_ref) }}
64-
is_allowed = is_allowed || is_selector_match
65-
66-
{%- for logfield_name, operator in event_selector.filter.items() %}
61+
if ( {{ build_selector_matching_expr(event_selector, source_ref) }} ) {
62+
{% for logfield_name, operator in event_selector.filter.items() %}
6763
{%- if operator.re is defined %}
6864
{%- if operator.re != "" %}
6965
{%- if operator.label_override is defined and operator.label_override != "" %}
70-
{{ '' }}
71-
# нужно снижение кардинальности значений label_override
72-
if ( is_selector_match ) {
66+
## ! нужно снижение кардинальности значений - установлен label_override
7367
{# logfield_name всегда строка и валидируется через json-schaema в исходных данных #}
7468
.{{ logfield_name }} = to_string!(.{{ logfield_name }});
7569
.{{ logfield_name }} = replace(.{{ logfield_name }}, r'{{ operator.re }}', s'{{ operator.label_override }}');
76-
}
70+
#
7771
{%- else %}
7872
{# no label_override #}
7973
{%- endif %}
@@ -83,12 +77,17 @@ source = '''
8377
{{ '' }}
8478
{%- endif %}
8579
{%- endfor %}
86-
80+
true;
81+
}
82+
{%- if not loop.last %}
83+
else {{' '}}
84+
{%- else %}
85+
else {
86+
abort # совпадений не было найдено, удалить это событие
87+
}
88+
{%- endif %}
8789
{% endfor %}
8890

89-
if ( !is_allowed ) {
90-
abort # совпадений не было найдено, удалить это событие
91-
}
9291
'''
9392
{# newline #}
9493

@@ -122,10 +121,6 @@ inputs = [ "{{ _remap_name }}" ]
122121

123122
###############################################################################
124123

125-
126-
127-
128-
129124
[transforms.metrics-http-accesslog-k8s]
130125
type = "filter"
131126
inputs = [{{ _all_collector_inputs | map("to_json") | join(',')}}]

0 commit comments

Comments
 (0)