Примеры шаблонов меток и аннотаций
Шаблонизация позволяет добавлять динамические данные из запросов в метки и аннотации оповещений. Динамические данные улучшают контекст оповещения, облегчая дежурным быструю оценку и устранение проблемы.
Эта страница содержит распространённые примеры шаблонизации меток и аннотаций. Дополнительные сведения о шаблонизации см. в:
Пример аннотации
Аннотации добавляют дополнительные детали к экземплярам оповещений и часто используются, чтобы предоставить полезную информацию для идентификации проблемы и руководства по реагированию.
Распространённый сценарий использования аннотаций — отобразить конкретное значение запроса или порог, вызвавшие срабатывание оповещения.
Например, вы можете отобразить значение запроса из переменной
$values, чтобы сообщить о значении CPU, вызвавшем срабатывание оповещения.
CPU usage has exceeded 80% ({{ $values.A.value }}) for the last 5 minutes.
В качестве альтернативы вы можете использовать функцию
index() для получения значения запроса следующим образом.
CPU usage has exceeded 80% ({{ index $values "A" }}) for the last 5 minutes.
CPU usage has exceeded 80% (81.2345) for the last 5 minutes.
Включение меток для дополнительных деталей
Чтобы предоставить дополнительный контекст, вы можете включить метки из запроса с помощью переменной
$labels.
Например, предыдущий случай также может включать затронутый instance.
CPU usage for {{ $labels.instance }} has exceeded 80% ({{ $values.A.Value }}) for the last 5 minutes.
CPU usage for Instance 1 has exceeded 80% (81.2345) for the last 5 minutes.
Вы можете включить любые метки, возвращаемые запросом, в шаблон. Например, следующий шаблон включает информацию о среде и регионе, где произошло оповещение.
Alert triggered in {{ $labels.environment }} on {{ $labels.region }} region.
Alert triggered in production on AMER region.
Вывод range-запроса
Чтобы вывести значение instant-запроса, вы можете вывести его Ref ID с помощью функции index или переменной $values:
{{ $values.A.Value }}
Для range-запросов приведите их от временной серии к instant vector с помощью выражения reduce. Затем вы можете вывести результат, ссылаясь на его Ref ID. Например, если выражение reduce усредняет A с Ref ID B, вы затем выведите $values.B:
{{ $values.B.Value }}
Гуманизация значения запроса
Чтобы вывести гуманизированное (человекочитаемое) значение instant-запроса, используйте функцию
humanize:
{{ humanize $values.A.Value }}
В качестве альтернативы:
{{ humanize (index $values "A").Value }}
554.9
Чтобы вывести значение instant-запроса в процентах, используйте функцию
humanizePercentage:
{{ humanizePercentage $values.A.Value }}
10%
Дополнительные функции для отображения или форматирования данных см. в:
Пример метки
Метки определяют, как оповещения маршрутизируются и управляются, обеспечивая доставку уведомлений нужным командам в нужное время. Если метки, возвращаемые вашими запросами, не полностью отражают необходимый контекст, вы можете создать новую метку и задать её значение на основе данных запроса.
На основе значения запроса
Вот пример создания метки severity на основе значения запроса:
{{- if (gt $values.A.Value 90.0) -}}critical
{{- else if (gt $values.A.Value 80.0) -}}high
{{- else if (gt $values.A.Value 60.0) -}}medium
{{- else -}}low
{{- end -}}
В этом примере метка severity определяется значением запроса:
criticalдля значений выше 90,highдля значений выше 80,mediumдля значений выше 60,- и
lowдля всего, что ниже.
Затем вы можете использовать метку severity, чтобы управлять тем, как обрабатываются оповещения. Например, вы можете отправлять оповещения critical немедленно, а оповещения серьёзности low маршрутизировать команде для дальнейшего расследования.
Примечание: Экземпляр оповещения уникально идентифицируется своим набором меток.
- Избегайте отображения значений запроса в метках, так как это может создать множество экземпляров оповещений — по одному на каждый отдельный набор меток. Вместо этого используйте аннотации для значений запроса.
- Если значение шаблонизированной метки меняется, оно сопоставляется с другим экземпляром оповещения, а предыдущий экземпляр считается устаревшим. Все детали см. в этом примере использования динамических меток.
На основе метки запроса
Вы можете использовать метки, чтобы различать оповещения, приходящие из разных сред (например, production, staging, dev). Например, вы можете захотеть добавить метку, задающую среду на основе метки экземпляра. Вот как её можно шаблонизировать:
{{- if eq $labels.instance "prod-server-1" -}}
production
{{- else if eq $labels.instance "staging-server-1" -}}
staging
{{- else -}}
development
{{- end -}}
Это выведет:
- Для экземпляра
prod-server-1метка будетproduction. - Для
staging-server-1метка будетstaging. - Все остальные экземпляры будут помечены
development.
Чтобы сделать этот шаблон более гибким, вы можете использовать регулярное выражение, сопоставляющее имя экземпляра с префиксом имени экземпляра, с помощью функции
match():
{{- if match "^prod-server-.*" $labels.instance -}}
production
{{- else if match "^staging-server-.*" $labels.instance -}}
staging
{{- else -}}
development
{{- end -}}
Устаревшие шаблоны оповещений
Для пользователей, работающих с устаревшей системой оповещений Grafana, шаблоны всё ещё можно использовать для извлечения полезной информации из условий оповещений. Однако важно отметить, что вы не можете использовать $labels для вывода меток из запроса, если используете classic conditions, и должны использовать вместо этого $values. Причина в том, что classic conditions отбрасывают эти метки, чтобы обеспечить одномерное поведение (не более одного оповещения на правило оповещения). Если бы classic conditions не отбрасывали эти метки, то запросы, возвращающие множество временных рядов, вызывали бы постоянное колебание оповещений между firing и resolved, так как метки менялись бы при каждом вычислении правила оповещения.
Вместо этого переменная $values содержит приведённые значения всех временных рядов для всех срабатывающих условий. Например, если у вас есть правило оповещения с запросом A, возвращающим два временных ряда, и classic condition B с двумя условиями, то $values будет содержать B0, B1, B2 и B3. Если бы classic condition B имело только одно условие, то $values содержало бы только B0 и B1.
Вывод всех меток из classic condition
Чтобы вывести все метки всех срабатывающих временных рядов, используйте следующий шаблон (обязательно замените B в регулярном выражении на Ref ID classic condition, если он отличается):
{{ range $k, $v := $values -}}
{{ if (match "B[0-9]+" $k) -}}
{{ $k }}: {{ $v.Labels }}{{ end }}
{{ end }}
Например, classic condition для двух временных рядов, превышающих одно условие, выведет:
B0: instance=server1
B1: instance=server2
Если classic condition имеет два или более условий, и временной ряд превышает несколько условий одновременно, то его метки будут дублированы для каждого превышенного условия:
B0: instance=server1
B1: instance=server2
B2: instance=server1
B3: instance=server2
Если вам нужно выводить уникальные метки, вам следует рассмотреть переход ваших правил оповещений от одномерных к многомерным. Вы можете сделать это, заменив ваше classic condition на выражения reduce и math.
Вывод всех значений из classic condition
Чтобы вывести все значения из classic condition, возьмите предыдущий пример и замените $v.Labels на $v.Value:
{{ range $k, $v := $values -}}
{{ if (match "B[0-9]+" $k) -}}
{{ $k }}: {{ $v.Value }}{{ end }}
{{ end }}
Например, classic condition для двух временных рядов, превышающих одно условие, выведет:
B0: 81.2345
B1: 84.5678
Если classic condition имеет два или более условий, и временной ряд превышает несколько условий одновременно, то $values будет содержать значения всех условий:
B0: 81.2345
B1: 92.3456
B2: 84.5678
B3: 95.6789