Оповещения
Настройка правил оповещения
Алертинг (оповещения) реализованы на основе VictoriaMetrics AlertManager и VictoriaMetrics AlertManagerConfig. Интерфейс доработан таким образом, чтобы минимизировать риск возникновения ошибок в процессе конфигурации.
Для настройки оповещений нужно перейти в клиентский кластер, в раздел "Оповещения".
Для настройки правил оповещения (alert) или запись (record) необходимо создать группы правил. Группы разделены логически, поэтому выбор типа правил вынесен на уровень конфигурации группы правил.
Группы правил оповещения
Чтобы создать группу правил оповещения, нужно перейти на страницу "Группы правил оповещения", нажать кнопку Добавить группу правил оповещения (рисунок 217).

Рисунок 217 ‒ Правила оповещения
На открывшейся странице (рисунок 218) требуется заполнить сведения о группе правил:
- Имя группы (обязательное);
- Тип выражений (
Prometheus/Graphite, по умолчаниюPrometheus); - Тип правил в группе ("оповещения (alert)" или "запись (record)");
- Как часто оцениваются правила в группе;
- Сколько правил могут выполняться одновременно в группе.

Рисунок 218 ‒ Добавление группы правил оповещения
После создания группы правил:
- имя группы, тип выражений, тип правил становятся неизменяемыми. Тип правила записывается в каждое правило, входящее в группу, в поле "type".
- можно перейти в группу для добавления в нее правил;
- экран изменяется. Верхняя часть экрана содержит сведения о группе. В нижней части пользователь может управлять правилами. В левой стороне расположен список правил. Можно добавить правило, нажав на + в списке правил. Добавление правила будет отображено в правой стороне экрана. Просмотр созданного правила будет отображено также в правой стороне нижней части экрана.
Следует обратить внимание, что группа правил и каждое правило в группе ‒ отдельные объекты, поэтому кнопки сохранения вынесены отдельно для группы и для правила в группе. Удаление группы приводит к каскадному удалению правил (рисунок 219).

Рисунок 219 ‒ Удаление группы правил
Правила в группе
Правила могут быть с типом "оповещение" (alert) или "запись" (record).
- "Правила оповещения" позволяют определять условия оповещения на основе выражений языка выражений Prometheus/Graphite и отправлять уведомления о срабатывании выражения.
- "Правила записи" позволяют предварительно вычислить часто необходимые или затратные в вычислительном отношении выражения и сохранить их результат как новый набор временных рядов. Запрос предварительно вычисленного результата часто будет намного быстрее, чем выполнение исходного выражения каждый раз, когда оно необходимо. Это особенно полезно для информационных панелей, которым необходимо повторно запрашивать одно и то же выражение при каждом обновлении.
Правила оповещения
В конфигурацию правила входят (рисунок 220):

Рисунок 220 ‒ Правило оповещения
- Название правила (обязательное);
- Время ожидания перед отправкой. Это временной лаг, в течение которого система ожидает, сохранится ли состояние, соответствующее выражению. Если состояние сохранится, алерт (оповещение) будет отправлен;
- Критичность (будет записана в значение лейбла с ключом severity. Если нет подходящего уровня критичности, следует оставить в поле значение "Не выбрано" и задать критичность с помощью лейбла);
- Ссылка на решение (будет записана в значение аннотации с ключом
runbook_url); - Короткое описание (будет записана в значение аннотации с ключом
summary); - Описание (будет записана в значение аннотации с ключом
description); - Выражение (обязательное);
- Лейблы;
- Аннотации;
Уровни критичности:
- Не выбрано (по умолчанию) ‒ может использоваться в паре с выбранным вручную лейблом, не перезаписывает лейбл;
- Авария (Emergency) ‒ система не может быть использована;
- Тревога (Alert) ‒ требуется немедленная реакция;
- Опасность (Critical) ‒ критическое состояние;
- Ошибка (Error) ‒ состояние ошибки;
- Предупреждение (Warning) ‒ состояние может привести к поломке;
- Уведомление (Notice) ‒ в пределах нормы, но стоит обратить внимание;
- Инфо (Info) ‒ информационное сообщение;
- Отладка (Debug) ‒ сообщение для отладки системы.
Следует обратить внимание, что, если создать аннотацию с дублирующим ключом: description, summary или runbook_url, то такая аннотация будет перезаписана значением, введенным в теле правила.
После создания название не может быть изменено. На созданном правиле могут использованы кнопки: Сохранить, Удалить правило.
Следует обратить внимание, что по умолчанию оповещения маршрутизируются в кластер мониторинга VictoriaMetrics, находящийся в кластере управления. Можно увидеть сработавшие оповещения в интерфейсе клиентского кластера в разделе "Оповещения → Просмотр оповещений".
Для настройки дополнительной маршрутизации необходимо создать получателей и маршруты. При необходимости добавления интервалов времени, в которые оповещения приходить не будут, можно задать временные интервалы и указать их в маршрутах.
Пример правила оповещения
Для проверки функционала создать, например, правило, которое будет срабатывать при создании нового пода в кластере Kubernetes. Для этого в разделе "Кластер → Оповещение → Группа правил" создать новую группу правил с типом "Оповещение". Добавить правило:
sum by(namespace, pod) (increase(kube_pod_created[5m])) > 0
Это выражение работает следующим образом:
kube_pod_created‒ метрика, которая показывает время создания каждого пода (в формате Unix timestamp);increase(...[5m])‒ вычисляет количество новых значений за последние 5 минут;sum by(namespace, pod)‒ группирует результаты по неймспейсам и имени пода;> "0"‒ условие, которое означает, что был создан хотя бы один новый под.
Для удобства восприятия можно добавить:
- Короткое описание ‒ "New pod created in ";
- Описание ‒ "Pod was created in namespace ".
Правило будет иметь вид, как показано на рисунке 221.

Рисунок 221 ‒ Пример правила оповещения
Правила записи
В конфигурацию правила входят (рисунок 222):
- Название правила (обязательное);
- Выражение (обязательное);
- Лейблы.

Рисунок 222 ‒ Правило записи
После создания название не может быть изменено. На созданном правиле есть кнопки: Сохранить, Удалить правило.
Предустановленные правила
В данном пункте представлен перечень всех предустановленных правил оповещений в клиентском кластере Комплекса.
Группа shturval-backup
veleroBackupPartialFailures
Описание: velero backup }} has }} partialy failed backups.
Выражение:
velero_backup_partial_failure_total{schedule!="} / velero_backup_attempt_total{schedule!="} > 0.25
veleroBackupFailures
Описание: velero backup }} has }} failed backups.
Выражение:
velero_backup_failure_total{schedule!="} / velero_backup_attempt_total{schedule!="} > 0.25
Группа alertmanager.rules
AlertmanagerFailedReload
Описание: Configuration has failed to load for }}/}}.
Выражение:
Without max_over_time, failed scrapes could create false negatives, see
https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details.
max_over_time(alertmanager_config_last_reload_successful{job="shturval-metrics-alertmanager",namespace="monitoring"}[5m]) == 0
AlertmanagerMembersInconsistent
Описание: Alertmanager }}/}} has only found }} members of the }} cluster.
Выражение:
Without max_over_time, failed scrapes could create false negatives, see
https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details.
max_over_time(alertmanager_cluster_members{job="shturval-metrics-alertmanager",namespace="monitoring"}[5m])
< on (namespace,service,cluster) group_left
count by (namespace,service,cluster) (max_over_time(alertmanager_cluster_members{job="shturval-metrics-alertmanager",namespace="monitoring"}[5m]))
AlertmanagerFailedToSendAlerts
Описание: Alertmanager }}/}} failed to send }} of notifications to }}.
Выражение:
(
rate(alertmanager_notifications_failed_total{job="shturval-metrics-alertmanager",namespace="monitoring"}[5m])
/
ignoring (reason) group_left rate(alertmanager_notifications_total{job="shturval-metrics-alertmanager",namespace="monitoring"}[5m])
)
> 0.01
AlertmanagerClusterFailedToSendAlerts
Описание: The minimum notification failure rate to }} sent from any instance in the }} cluster is }}.
Выражение:
min by (namespace,service, integration) (
rate(alertmanager_notifications_failed_total{job="shturval-metrics-alertmanager",namespace="monitoring", integration=~`.*`}[5m])
/
ignoring (reason) group_left rate(alertmanager_notifications_total{job="shturval-metrics-alertmanager",namespace="monitoring", integration=~`.*`}[5m])
)
> 0.01
AlertmanagerClusterFailedToSendAlerts
Описание: The minimum notification failure rate to }} sent from any instance in the }} cluster is }}.
Выражение:
min by (namespace,service, integration) (
rate(alertmanager_notifications_failed_total{job="shturval-metrics-alertmanager",namespace="monitoring", integration!~`.*`}[5m])
/
ignoring (reason) group_left rate(alertmanager_notifications_total{job="shturval-metrics-alertmanager",namespace="monitoring", integration!~`.*`}[5m])
)
> 0.01
AlertmanagerConfigInconsistent
Описание: Alertmanager instances within the }} cluster have different configurations.
Выражение:
count by (namespace,service,cluster) (
count_values by (namespace,service,cluster) ("config_hash", alertmanager_config_hash{job="shturval-metrics-alertmanager",namespace="monitoring"})
)
!= 1
AlertmanagerClusterDown
Описание: }} of Alertmanager instances within the }} cluster have been up for less than half of the last 5m.
Выражение:
(
count by (namespace,service,cluster) (
avg_over_time(up{job="shturval-metrics-alertmanager",namespace="monitoring"}[5m]) < 0.5
)
/
count by (namespace,service,cluster) (
up{job="shturval-metrics-alertmanager",namespace="monitoring"}
)
)
>= 0.5
AlertmanagerClusterCrashlooping
Описание: }} of Alertmanager instances within the }} cluster have restarted at least 5 times in the last 10m.
Выражение:
(
count by (namespace,service,cluster) (
changes(process_start_time_seconds{job="shturval-metrics-alertmanager",namespace="monitoring"}[10m]) > 4
)
/
count by (namespace,service,cluster) (
up{job="shturval-metrics-alertmanager",namespace="monitoring"}
)
)
>= 0.5
Группа config-reloaders
ConfigReloaderSidecarErrors
Описание: Errors encountered while the }} config-reloader sidecar attempts to sync config in }} namespace. As a result, configuration for service running in }} may be stale and cannot be updated anymore.
Выражение:
max_over_time(reloader_last_reload_successful{namespace=~".+"}[5m]) == 0
Группа etcd
etcdMembersDown
Описание: etcd cluster "}}": members are down (}}).
Выражение:
max without (endpoint) (
sum without (instance) (up{job=~".*etcd.*"} == bool 0)
or
count without (To) (
sum without (instance) (rate(etcd_network_peer_sent_failures_total{job=~".*etcd.*"}[120s])) > 0.01
)
)
> 0
etcdInsufficientMembers
Описание: etcd cluster "}}": insufficient members (}}).
Выражение:
sum(up{job=~".*etcd.*"} == bool 1) without (instance) < ((count(up{job=~".*etcd.*"}) without (instance) + 1) / 2)
etcdNoLeader
Описание: etcd cluster "}}": member }} has no leader.
Выражение:
etcd_server_has_leader{job=~".*etcd.*"} == 0
etcdHighNumberOfLeaderChanges
Описание: etcd cluster "}}": }} leader changes within the last 15 minutes. Frequent elections may be a sign of insufficient resources, high network latency, or disruptions by other components and should be investigated. etcd cluster has high number of leader changes.
Выражение:
increase((max without (instance) (etcd_server_leader_changes_seen_total{job=~".*etcd.*"}) or 0*absent(etcd_server_leader_changes_seen_total{job=~".*etcd.*"}))[15m:1m]) >= 4
etcdHighNumberOfFailedGRPCRequests
Описание: etcd cluster "}}": }}% of requests for }} failed on etcd instance }}.
Выражение:
100 * sum(rate(grpc_server_handled_total{job=~".*etcd.*", grpc_code=~"Unknown|FailedPrecondition|ResourceExhausted|Internal|Unavailable|DataLoss|DeadlineExceeded"}[5m])) without (grpc_type, grpc_code)
/
sum(rate(grpc_server_handled_total{job=~".*etcd.*"}[5m])) without (grpc_type, grpc_code)
> 1
etcdHighNumberOfFailedGRPCRequests
Описание: etcd cluster "}}": }}% of requests for }} failed on etcd instance }}.
Выражение:
100 * sum(rate(grpc_server_handled_total{job=~".*etcd.*", grpc_code=~"Unknown|FailedPrecondition|ResourceExhausted|Internal|Unavailable|DataLoss|DeadlineExceeded"}[5m])) without (grpc_type, grpc_code)
/
sum(rate(grpc_server_handled_total{job=~".*etcd.*"}[5m])) without (grpc_type, grpc_code)
> 5
etcdGRPCRequestsSlow
Описание: etcd cluster "}}": 99th percentile of gRPC requests is }}s on etcd instance }} for }} method. etcd grpc requests are slow
Выражение:
histogram_quantile(0.99, sum(rate(grpc_server_handling_seconds_bucket{job=~".*etcd.*", grpc_method!="Defragment", grpc_type="unary"}[5m])) without(grpc_type))
> 0.15
etcdMemberCommunicationSlow
Описание: etcd cluster "}}": member communication with }} is taking }}s on etcd instance }}.
Выражение:
histogram_quantile(0.99, rate(etcd_network_peer_round_trip_time_seconds_bucket{job=~".*etcd.*"}[5m]))
> 0.15
etcdHighNumberOfFailedProposals
Описание: etcd cluster "}}": }} proposal failures within the last 30 minutes on etcd instance }}.
Выражение:
rate(etcd_server_proposals_failed_total{job=~".*etcd.*"}[15m]) > 5
etcdHighFsyncDurations
Описание: etcd cluster "}}": 99th percentile fsync durations are }}s on etcd instance }}.
Выражение:
histogram_quantile(0.99, rate(etcd_disk_wal_fsync_duration_seconds_bucket{job=~".*etcd.*"}[5m]))
> 0.5
etcdHighFsyncDurations
Описание: etcd cluster "}}": 99th percentile fsync durations are }}s on etcd instance }}.
Выражение:
histogram_quantile(0.99, rate(etcd_disk_wal_fsync_duration_seconds_bucket{job=~".*etcd.*"}[5m]))
> 1
etcdHighCommitDurations
Описание: etcd cluster "}}": 99th percentile commit durations }}s on etcd instance }}.
Выражение:
histogram_quantile(0.99, rate(etcd_disk_backend_commit_duration_seconds_bucket{job=~".*etcd.*"}[5m]))
> 0.25
etcdDatabaseQuotaLowSpace
Описание: etcd cluster "}}": database size exceeds the defined quota on etcd instance }}, please defrag or increase the quota as the writes to etcd will be disabled when it is full.
Выражение:
(last_over_time(etcd_mvcc_db_total_size_in_bytes{job=~".*etcd.*"}[5m]) / last_over_time(etcd_server_quota_backend_bytes{job=~".*etcd.*"}[5m]))*100 > 95
etcdExcessiveDatabaseGrowth
Описание: etcd cluster "}}": Predicting running out of disk space in the next four hours, based on write observations within the past four hours on etcd instance }}, please check as it might be disruptive.
Выражение:
predict_linear(etcd_mvcc_db_total_size_in_bytes{job=~".*etcd.*"}[4h], 4*60*60) > etcd_server_quota_backend_bytes{job=~".*etcd.*"}
etcdDatabaseHighFragmentationRatio
Описание: etcd cluster "}}": database size in use on instance }} is }} of the actual allocated disk space, please run defragmentation (e.g. etcdctl defrag) to retrieve the unused fragmented disk space.
Выражение:
(last_over_time(etcd_mvcc_db_total_size_in_use_in_bytes{job=~".*etcd.*"}[5m]) / last_over_time(etcd_mvcc_db_total_size_in_bytes{job=~".*etcd.*"}[5m])) < 0.5 and etcd_mvcc_db_total_size_in_use_in_bytes{job=~".*etcd.*"} > 104857600
Группа general.rules
TargetDown
Описание: }}% of the }}/}} targets in }} namespace are down.
Выражение:
100 * (count(up == 0) BY (cluster, job, namespace, service) / count(up) BY (cluster, job, namespace, service)) > 10
Watchdog
Описание: This is an alert meant to ensure that the entire alerting pipeline is functional. This alert is always firing, therefore it should always be firing in Alertmanager and always fire against a receiver. There are integrations with various notification mechanisms that send a notification when this alert is not firing. For example the "DeadMansSnitch" integration in PagerDuty.
Выражение:
vector(1)
InfoInhibitor
Описание: This is an alert that is used to inhibit info alerts. By themselves, the info-level alerts are sometimes very noisy, but they are relevant when combined with other alerts. This alert fires whenever there’s a severity="info" alert, and stops firing when another alert with a severity of ‘warning’ or ‘critical’ starts firing on the same namespace. This alert should be routed to a null receiver and configured to inhibit alerts with severity="info".
Выражение:
ALERTS{severity = "info"} == 1 unless on (namespace) ALERTS{alertname != "InfoInhibitor", severity =~ "warning|critical", alertstate="firing"} == 1
Группа kube-apiserver-slos
KubeAPIErrorBudgetBurn
Описание: The API server is burning too much error budget.
Выражение:
sum(apiserver_request:burnrate1h) > (14.40 * 0.01000)
and
sum(apiserver_request:burnrate5m) > (14.40 * 0.01000)
- Long:1h
- Short:5m
KubeAPIErrorBudgetBurn
Описание: The API server is burning too much error budget.
Выражение:
sum(apiserver_request:burnrate6h) > (6.00 * 0.01000)
and
sum(apiserver_request:burnrate30m) > (6.00 * 0.01000)
- Long:6h
- Short:30m
KubeAPIErrorBudgetBurn
Описание: The API server is burning too much error budget.
Выражение:
sum(apiserver_request:burnrate1d) > (3.00 * 0.01000)
and
sum(apiserver_request:burnrate2h) > (3.00 * 0.01000)
- Long:1d
- Short:2h
KubeAPIErrorBudgetBurn
Описание: The API server is burning too much error budget.
Выражение:
sum(apiserver_request:burnrate3d) > (1.00 * 0.01000)
and
sum(apiserver_request:burnrate6h) > (1.00 * 0.01000)
Группа kube-state-metrics
KubeStateMetricsListErrors
Описание: kube-state-metrics is experiencing errors at an elevated rate in list operations. This is likely causing it to not be able to expose metrics about Kubernetes objects correctly or at all.
Выражение:
(sum(rate(kube_state_metrics_list_total{job="kube-state-metrics",result="error"}[5m])) by (cluster)
/
sum(rate(kube_state_metrics_list_total{job="kube-state-metrics"}[5m])) by (cluster))
> 0.01
KubeStateMetricsWatchErrors
Описание: kube-state-metrics is experiencing errors at an elevated rate in watch operations. This is likely causing it to not be able to expose metrics about Kubernetes objects correctly or at all.
Выражение:
(sum(rate(kube_state_metrics_watch_total{job="kube-state-metrics",result="error"}[5m])) by (cluster)
/
sum(rate(kube_state_metrics_watch_total{job="kube-state-metrics"}[5m])) by (cluster))
> 0.01
KubeStateMetricsShardingMismatch
Описание: kube-state-metrics pods are running with different –total-shards configuration, some Kubernetes objects may be exposed multiple times or not exposed at all.
Выражение:
stdvar (kube_state_metrics_total_shards{job="kube-state-metrics"}) by (cluster) != 0
KubeStateMetricsShardsMissing
Описание: kube-state-metrics shards are missing, some Kubernetes objects are not being exposed.
Выражение:
2^max(kube_state_metrics_total_shards{job="kube-state-metrics"}) by (cluster) ‒ 1
-
sum( 2 ^ max by (cluster, shard_ordinal) (kube_state_metrics_shard_ordinal{job="kube-state-metrics"}) ) by (cluster)
!= 0
Группа kubernetes-apps
KubePodCrashLooping
Описание: Pod }}/}} (}}) is in waiting state (reason: "CrashLoopBackOff").
Выражение:
max_over_time(kube_pod_container_status_waiting_reason{reason="CrashLoopBackOff", job="kube-state-metrics", namespace=~".*"}[5m]) >= 1
KubePodNotReady
Описание: Pod }}/}} has been in a non-ready state for longer than 15 minutes.
Выражение:
sum by (namespace, pod, cluster) (
max by (namespace, pod, cluster) (
kube_pod_status_phase{job="kube-state-metrics", namespace=~".*", phase=~"Pending|Unknown|Failed"}
) * on (namespace, pod, cluster) group_left(owner_kind) topk by (namespace, pod, cluster) (
1, max by (namespace, pod, owner_kind, cluster) (kube_pod_owner{owner_kind!="Job"})
)
) > 0
KubeDeploymentGenerationMismatch
Описание: Deployment generation for }}/}} does not match, this indicates that the Deployment has failed but has not been rolled back.
Выражение:
kube_deployment_status_observed_generation{job="kube-state-metrics", namespace=~".*"}
!=
kube_deployment_metadata_generation{job="kube-state-metrics", namespace=~".*"}
KubeDeploymentReplicasMismatch
Описание: Deployment }}/}} has not matched the expected number of replicas for longer than 15 minutes.
Выражение:
(
kube_deployment_spec_replicas{job="kube-state-metrics", namespace=~".*"}
>
kube_deployment_status_replicas_available{job="kube-state-metrics", namespace=~".*"}
) and (
changes(kube_deployment_status_replicas_updated{job="kube-state-metrics", namespace=~".*"}[10m])
==
0
)
KubeDeploymentRolloutStuck
Описание: Rollout of deployment }}/}} is not progressing for longer than 15 minutes.
Выражение:
kube_deployment_status_condition{condition="Progressing", status="false",job="kube-state-metrics", namespace=~".*"}
!= 0
KubeStatefulSetReplicasMismatch
Описание: StatefulSet }}/}} has not matched the expected number of replicas for longer than 15 minutes.
Выражение:
(
kube_statefulset_status_replicas_ready{job="kube-state-metrics", namespace=~".*"}
!=
kube_statefulset_status_replicas{job="kube-state-metrics", namespace=~".*"}
) and (
changes(kube_statefulset_status_replicas_updated{job="kube-state-metrics", namespace=~".*"}[10m])
==
0
)
KubeStatefulSetGenerationMismatch
Описание: StatefulSet generation for }}/}} does not match, this indicates that the StatefulSet has failed but has not been rolled back.
Выражение:
kube_statefulset_status_observed_generation{job="kube-state-metrics", namespace=~".*"}
!=
kube_statefulset_metadata_generation{job="kube-state-metrics", namespace=~".*"}
KubeStatefulSetUpdateNotRolledOut
Описание: StatefulSet }}/}} update has not been rolled out.
Выражение:
(
max without (revision) (
kube_statefulset_status_current_revision{job="kube-state-metrics", namespace=~".*"}
unless
kube_statefulset_status_update_revision{job="kube-state-metrics", namespace=~".*"}
)
*
(
kube_statefulset_replicas{job="kube-state-metrics", namespace=~".*"}
!=
kube_statefulset_status_replicas_updated{job="kube-state-metrics", namespace=~".*"}
)
) and (
changes(kube_statefulset_status_replicas_updated{job="kube-state-metrics", namespace=~".*"}[5m])
==
0
)
KubeDaemonSetRolloutStuck
Описание: DaemonSet }}/}} has not finished or progressed for at least 15 minutes.
Выражение:
(
(
kube_daemonset_status_current_number_scheduled{job="kube-state-metrics", namespace=~".*"}
!=
kube_daemonset_status_desired_number_scheduled{job="kube-state-metrics", namespace=~".*"}
) or (
kube_daemonset_status_number_misscheduled{job="kube-state-metrics", namespace=~".*"}
!=
0
) or (
kube_daemonset_status_updated_number_scheduled{job="kube-state-metrics", namespace=~".*"}
!=
kube_daemonset_status_desired_number_scheduled{job="kube-state-metrics", namespace=~".*"}
) or (
kube_daemonset_status_number_available{job="kube-state-metrics", namespace=~".*"}
!=
kube_daemonset_status_desired_number_scheduled{job="kube-state-metrics", namespace=~".*"}
)
) and (
changes(kube_daemonset_status_updated_number_scheduled{job="kube-state-metrics", namespace=~".*"}[5m])
==
0
)
KubeContainerWaiting
Описание: pod/}} in namespace }} on container }} has been in waiting state for longer than 1 hour.
Выражение:
sum by (namespace, pod, container, cluster) (kube_pod_container_status_waiting_reason{job="kube-state-metrics", namespace=~".*"}) > 0
KubeDaemonSetNotScheduled
Описание: }} Pods of DaemonSet }}/}} are not scheduled.
Выражение:
kube_daemonset_status_desired_number_scheduled{job="kube-state-metrics", namespace=~".*"}
-
kube_daemonset_status_current_number_scheduled{job="kube-state-metrics", namespace=~".*"} > 0
KubeDaemonSetMisScheduled
Описание: }} Pods of DaemonSet }}/}} are running where they are not supposed to run.
Выражение:
kube_daemonset_status_number_misscheduled{job="kube-state-metrics", namespace=~".*"} > 0
KubeJobNotCompleted
Описание: Job }}/}} is taking more than }} to complete.
Выражение:
time() ‒ max by (namespace, job_name, cluster) (kube_job_status_start_time{job="kube-state-metrics", namespace=~".*"}
and
kube_job_status_active{job="kube-state-metrics", namespace=~".*"} > 0) > 43200
KubeJobFailed
Описание: Job }}/}} failed to complete. Removing failed job after investigation should clear this alert.
Выражение:
kube_job_failed{job="kube-state-metrics", namespace=~".*"} > 0
KubeHpaReplicasMismatch
Описание: HPA }}/}} has not matched the desired number of replicas for longer than 15 minutes.
Выражение:
(kube_horizontalpodautoscaler_status_desired_replicas{job="kube-state-metrics", namespace=~".*"}
!=
kube_horizontalpodautoscaler_status_current_replicas{job="kube-state-metrics", namespace=~".*"})
and
(kube_horizontalpodautoscaler_status_current_replicas{job="kube-state-metrics", namespace=~".*"}
>
kube_horizontalpodautoscaler_spec_min_replicas{job="kube-state-metrics", namespace=~".*"})
and
(kube_horizontalpodautoscaler_status_current_replicas{job="kube-state-metrics", namespace=~".*"}
<
kube_horizontalpodautoscaler_spec_max_replicas{job="kube-state-metrics", namespace=~".*"})
and
changes(kube_horizontalpodautoscaler_status_current_replicas{job="kube-state-metrics", namespace=~".*"}[15m]) == 0
KubeHpaMaxedOut
Описание: HPA }}/}} has been running at max replicas for longer than 15 minutes.
Выражение:
kube_horizontalpodautoscaler_status_current_replicas{job="kube-state-metrics", namespace=~".*"}
==
kube_horizontalpodautoscaler_spec_max_replicas{job="kube-state-metrics", namespace=~".*"}
Группа kubernetes-resources
KubeCPUOvercommit
Описание: Cluster }} has overcommitted CPU resource requests for Pods by }} CPU shares and cannot tolerate node failure.
Выражение:
sum(namespace_cpu:kube_pod_container_resource_requests:sum{job="kube-state-metrics",}) by (cluster) ‒ (sum(kube_node_status_allocatable{job="kube-state-metrics",resource="cpu"}) by (cluster) ‒ max(kube_node_status_allocatable{job="kube-state-metrics",resource="cpu"}) by (cluster)) > 0
and
(sum(kube_node_status_allocatable{job="kube-state-metrics",resource="cpu"}) by (cluster) ‒ max(kube_node_status_allocatable{job="kube-state-metrics",resource="cpu"}) by (cluster)) > 0
KubeMemoryOvercommit
Описание: Cluster }} has overcommitted memory resource requests for Pods by }} bytes and cannot tolerate node failure.
Выражение:
sum(namespace_memory:kube_pod_container_resource_requests:sum{}) by (cluster) ‒ (sum(kube_node_status_allocatable{resource="memory", job="kube-state-metrics"}) by (cluster) ‒ max(kube_node_status_allocatable{resource="memory", job="kube-state-metrics"}) by (cluster)) > 0
and
(sum(kube_node_status_allocatable{resource="memory", job="kube-state-metrics"}) by (cluster) ‒ max(kube_node_status_allocatable{resource="memory", job="kube-state-metrics"}) by (cluster)) > 0
KubeCPUQuotaOvercommit
Описание: Cluster }} has overcommitted CPU resource requests for Namespaces.
Выражение:
sum(min without(resource) (kube_resourcequota{job="kube-state-metrics", type="hard", resource=~"(cpu|requests.cpu)"})) by (cluster)
/
sum(kube_node_status_allocatable{resource="cpu", job="kube-state-metrics"}) by (cluster)
> 1.5
KubeMemoryQuotaOvercommit
Описание: Cluster }} has overcommitted memory resource requests for Namespaces.
Выражение:
sum(min without(resource) (kube_resourcequota{job="kube-state-metrics", type="hard", resource=~"(memory|requests.memory)"})) by (cluster)
/
sum(kube_node_status_allocatable{resource="memory", job="kube-state-metrics"}) by (cluster)
> 1.5
KubeQuotaAlmostFull
Описание: Namespace }} is using }} of its }} quota.
Выражение:
kube_resourcequota{job="kube-state-metrics", type="used"}
/ ignoring(instance, job, type)
(kube_resourcequota{job="kube-state-metrics", type="hard"} > 0)
> 0.9 < 1
KubeQuotaFullyUsed
Описание: Namespace }} is using }} of its }} quota.
Выражение:
kube_resourcequota{job="kube-state-metrics", type="used"}
/ ignoring(instance, job, type)
(kube_resourcequota{job="kube-state-metrics", type="hard"} > 0)
== 1
KubeQuotaExceeded
Описание: Namespace }} is using }} of its }} quota.
Выражение:
kube_resourcequota{job="kube-state-metrics", type="used"}
/ ignoring(instance, job, type)
(kube_resourcequota{job="kube-state-metrics", type="hard"} > 0)
> 1
CPUThrottlingHigh
Описание: }} throttling of CPU in namespace }} for container }} in pod }}.
Выражение:
sum(increase(container_cpu_cfs_throttled_periods_total{container!=", }[5m])) by (cluster, container, pod, namespace)
/
sum(increase(container_cpu_cfs_periods_total{}[5m])) by (cluster, container, pod, namespace)
> ( 25 / 100 )
Группа kubernetes-storage
KubePersistentVolumeFillingUp
Описание: The PersistentVolume claimed by }} in Namespace }} on Cluster }} is only }} free.
Выражение:
(
kubelet_volume_stats_available_bytes{job="kubelet", namespace=~".*", metrics_path="/metrics"}
/
kubelet_volume_stats_capacity_bytes{job="kubelet", namespace=~".*", metrics_path="/metrics"}
) < 0.03
and
kubelet_volume_stats_used_bytes{job="kubelet", namespace=~".*", metrics_path="/metrics"} > 0
unless on (cluster, namespace, persistentvolumeclaim)
kube_persistentvolumeclaim_access_mode{ access_mode="ReadOnlyMany"} == 1
unless on (cluster, namespace, persistentvolumeclaim)
kube_persistentvolumeclaim_labels{label_excluded_from_alerts="true"} == 1
KubePersistentVolumeFillingUp
Описание: Based on recent sampling, the PersistentVolume claimed by }} in Namespace }} on Cluster }} is expected to fill up within four days. Currently }} is available.
Выражение:
(
kubelet_volume_stats_available_bytes{job="kubelet", namespace=~".*", metrics_path="/metrics"}
/
kubelet_volume_stats_capacity_bytes{job="kubelet", namespace=~".*", metrics_path="/metrics"}
) < 0.15
and
kubelet_volume_stats_used_bytes{job="kubelet", namespace=~".*", metrics_path="/metrics"} > 0
and
predict_linear(kubelet_volume_stats_available_bytes{job="kubelet", namespace=~".*", metrics_path="/metrics"}[6h], 4 * 24 * 3600) < 0
unless on (cluster, namespace, persistentvolumeclaim)
kube_persistentvolumeclaim_access_mode{ access_mode="ReadOnlyMany"} == 1
unless on (cluster, namespace, persistentvolumeclaim)
kube_persistentvolumeclaim_labels{label_excluded_from_alerts="true"} == 1
KubePersistentVolumeInodesFillingUp
Описание: The PersistentVolume claimed by }} in Namespace }} on Cluster }} only has }} free inodes.
Выражение:
(
kubelet_volume_stats_inodes_free{job="kubelet", namespace=~".*", metrics_path="/metrics"}
/
kubelet_volume_stats_inodes{job="kubelet", namespace=~".*", metrics_path="/metrics"}
) < 0.03
and
kubelet_volume_stats_inodes_used{job="kubelet", namespace=~".*", metrics_path="/metrics"} > 0
unless on (cluster, namespace, persistentvolumeclaim)
kube_persistentvolumeclaim_access_mode{ access_mode="ReadOnlyMany"} == 1
unless on (cluster, namespace, persistentvolumeclaim)
kube_persistentvolumeclaim_labels{label_excluded_from_alerts="true"} == 1
KubePersistentVolumeInodesFillingUp
Описание: Based on recent sampling, the PersistentVolume claimed by }} in Namespace }} on Cluster }} is expected to run out of inodes within four days. Currently }} of its inodes are free.
Выражение:
(
kubelet_volume_stats_inodes_free{job="kubelet", namespace=~".*", metrics_path="/metrics"}
/
kubelet_volume_stats_inodes{job="kubelet", namespace=~".*", metrics_path="/metrics"}
) < 0.15
and
kubelet_volume_stats_inodes_used{job="kubelet", namespace=~".*", metrics_path="/metrics"} > 0
and
predict_linear(kubelet_volume_stats_inodes_free{job="kubelet", namespace=~".*", metrics_path="/metrics"}[6h], 4 * 24 * 3600) < 0
unless on (cluster, namespace, persistentvolumeclaim)
kube_persistentvolumeclaim_access_mode{ access_mode="ReadOnlyMany"} == 1
unless on (cluster, namespace, persistentvolumeclaim)
kube_persistentvolumeclaim_labels{label_excluded_from_alerts="true"} == 1
KubePersistentVolumeErrors
Описание: The persistent volume }} on Cluster }} has status }}.
Выражение:
kube_persistentvolume_status_phase{phase=~"Failed|Pending",job="kube-state-metrics"} > 0
Группа kubernetes-system-apiserver
KubeClientCertificateExpiration
Описание: A client certificate used to authenticate to kubernetes apiserver is expiring in less than 7.0 days.
Выражение:
apiserver_client_certificate_expiration_seconds_count{job="apiserver"} > "0" and on (job) histogram_quantile(0.01, sum by (job, le) (rate(apiserver_client_certificate_expiration_seconds_bucket{job="apiserver"}[5m]))) < 604800
KubeClientCertificateExpiration
Описание: A client certificate used to authenticate to kubernetes apiserver is expiring in less than 24.0 hours.
Выражение:
apiserver_client_certificate_expiration_seconds_count{job="apiserver"} > "0" and on (job) histogram_quantile(0.01, sum by (job, le) (rate(apiserver_client_certificate_expiration_seconds_bucket{job="apiserver"}[5m]))) < 86400
KubeAggregatedAPIErrors
Описание: Kubernetes aggregated API }}/}} has reported errors. It has appeared unavailable }} times averaged over the past 10m.
Выражение:
sum by (name, namespace, cluster)(increase(aggregator_unavailable_apiservice_total{job="apiserver"}[10m])) > 4
KubeAggregatedAPIDown
Описание: Kubernetes aggregated API }}/}} has been only }}% available over the last 10m.
Выражение:
(1 ‒ max by (name, namespace, cluster)(avg_over_time(aggregator_unavailable_apiservice{job="apiserver"}[10m]))) * 100 < 85
KubeAPIDown
Описание: KubeAPI has disappeared from Prometheus target discovery.
Выражение:
absent(up{job="apiserver"} == 1)
KubeAPITerminatedRequests
Описание: The kubernetes apiserver has terminated }} of its incoming requests.
Выражение:
sum(rate(apiserver_request_terminations_total{job="apiserver"}[10m])) / ( sum(rate(apiserver_request_total{job="apiserver"}[10m])) + sum(rate(apiserver_request_terminations_total{job="apiserver"}[10m])) ) > 0.20
Группа kubernetes-system-controller-manager
KubeControllerManagerDown
Описание: KubeControllerManager has disappeared from Prometheus target discovery.
Выражение:
absent(up{job="kube-controller-manager"} == 1)
Группа kubernetes-system-kubelet
KubeNodeNotReady
Описание: }} has been unready for more than 15 minutes.
Выражение:
kube_node_status_condition{job="kube-state-metrics",condition="Ready",status="true"} == 0
KubeNodeUnreachable
Описание: }} is unreachable and some workloads may be rescheduled.
Выражение:
(kube_node_spec_taint{job="kube-state-metrics",key="node.kubernetes.io/unreachable",effect="NoSchedule"} unless ignoring(key,value) kube_node_spec_taint{job="kube-state-metrics",key=~"ToBeDeletedByClusterAutoscaler|cloud.google.com/impending-node-termination|aws-node-termination-handler/spot-itn"}) == 1
KubeletTooManyPods
Описание: Kubelet ‘}}’ is running at }} of its Pod capacity.
Выражение:
count by (cluster, node) (
(kube_pod_status_phase{job="kube-state-metrics",phase="Running"} == 1) * on (instance,pod,namespace,cluster) group_left(node) topk by (instance,pod,namespace,cluster) (1, kube_pod_info{job="kube-state-metrics"})
)
/
max by (cluster, node) (
kube_node_status_capacity{job="kube-state-metrics",resource="pods"} != 1
) > 0.95
KubeNodeReadinessFlapping
Описание: The readiness status of node }} has changed }} times in the last 15 minutes.
Выражение:
sum(changes(kube_node_status_condition{job="kube-state-metrics",status="true",condition="Ready"}[15m])) by (cluster, node) > 2
KubeletPlegDurationHigh
Описание: The Kubelet Pod Lifecycle Event Generator has a 99th percentile duration of }} seconds on node }}.
Выражение:
node_quantile:kubelet_pleg_relist_duration_seconds:histogram_quantile{quantile="0.99"} >= 10
KubeletPodStartUpLatencyHigh
Описание: Kubelet Pod startup 99th percentile latency is }} seconds on node }}.
Выражение:
histogram_quantile(0.99, sum(rate(kubelet_pod_worker_duration_seconds_bucket{job="kubelet", metrics_path="/metrics"}[5m])) by (cluster, instance, le)) * on (cluster, instance) group_left(node) kubelet_node_name{job="kubelet", metrics_path="/metrics"} > 60
KubeletClientCertificateExpiration
Описание: Client certificate for Kubelet on node }} expires in }}.
Выражение:
kubelet_certificate_manager_client_ttl_seconds < 604800
KubeletClientCertificateExpiration
Описание: Client certificate for Kubelet on node }} expires in }}.
Выражение:
kubelet_certificate_manager_client_ttl_seconds < 86400
KubeletServerCertificateExpiration
Описание: Server certificate for Kubelet on node }} expires in }}.
Выражение:
kubelet_certificate_manager_server_ttl_seconds < 604800
KubeletServerCertificateExpiration
Описание: Server certificate for Kubelet on node }} expires in }}.
Выражение:
kubelet_certificate_manager_server_ttl_seconds < 86400
KubeletClientCertificateRenewalErrors
Описание: Kubelet on node }} has failed to renew its client certificate (}} errors in the last 5 minutes).
Выражение:
increase(kubelet_certificate_manager_client_expiration_renew_errors[5m]) > 0
KubeletServerCertificateRenewalErrors
Описание: Kubelet on node }} has failed to renew its server certificate (}} errors in the last 5 minutes).
Выражение:
increase(kubelet_server_expiration_renew_errors[5m]) > 0
KubeletDown
Описание: Kubelet has disappeared from Prometheus target discovery.
Выражение:
absent(up{job="kubelet", metrics_path="/metrics"} == 1)
Группа kubernetes-system-scheduler
KubeSchedulerDown
Описание: KubeScheduler has disappeared from Prometheus target discovery.
Выражение:
absent(up{job="kube-scheduler"} == 1)
Группа kubernetes-system
KubeVersionMismatch
Описание: There are }} different semantic versions of Kubernetes components running.
Выражение:
count by (cluster) (count by (git_version, cluster) (label_replace(kubernetes_build_info{job!~"kube-dns|coredns"},"git_version","$1","git_version","(v[0-9]*.[0-9]*).*"))) > 1
KubeClientErrors
- Описание: Kubernetes API server client ‘}}/}}’ is experiencing }} errors.’
Выражение:
(sum(rate(rest_client_requests_total{job="apiserver",code=~"5.."}[5m])) by (cluster, instance, job, namespace)
/
sum(rate(rest_client_requests_total{job="apiserver"}[5m])) by (cluster, instance, job, namespace))
> 0.01
Группа node-exporter
NodeFilesystemSpaceFillingUp
Описание: Filesystem on }}, mounted on }}, at }} has only }}% available space left and is filling up.
Выражение:
(
node_filesystem_avail_bytes{job="node-exporter",fstype!=",mountpoint!="} / node_filesystem_size_bytes{job="node-exporter",fstype!=",mountpoint!="} * 100 < 15
and
predict_linear(node_filesystem_avail_bytes{job="node-exporter",fstype!=",mountpoint!="}[6h], 24*60*60) < 0
and
node_filesystem_readonly{job="node-exporter",fstype!=",mountpoint!="} == 0
)
NodeFilesystemSpaceFillingUp
Описание: Filesystem on }}, mounted on }}, at }} has only }}% available space left and is filling up fast.
Выражение:
(
node_filesystem_avail_bytes{job="node-exporter",fstype!=",mountpoint!="} / node_filesystem_size_bytes{job="node-exporter",fstype!=",mountpoint!="} * 100 < 10
and
predict_linear(node_filesystem_avail_bytes{job="node-exporter",fstype!=",mountpoint!="}[6h], 4*60*60) < 0
and
node_filesystem_readonly{job="node-exporter",fstype!=",mountpoint!="} == 0
)
NodeFilesystemAlmostOutOfSpace
Описание: Filesystem on }}, mounted on }}, at }} has only }}% available space left.
Выражение:
(
node_filesystem_avail_bytes{job="node-exporter",fstype!=",mountpoint!="} / node_filesystem_size_bytes{job="node-exporter",fstype!=",mountpoint!="} * 100 < 5
and
node_filesystem_readonly{job="node-exporter",fstype!=",mountpoint!="} == 0
)
NodeFilesystemAlmostOutOfSpace
Описание: Filesystem on }}, mounted on }}, at }} has only }}% available space left.
Выражение:
(
node_filesystem_avail_bytes{job="node-exporter",fstype!=",mountpoint!="} / node_filesystem_size_bytes{job="node-exporter",fstype!=",mountpoint!="} * 100 < 3
and
node_filesystem_readonly{job="node-exporter",fstype!=",mountpoint!="} == 0
)
NodeFilesystemFilesFillingUp
Описание: Filesystem on }}, mounted on }}, at }} has only }}% available inodes left and is filling up.
Выражение:
(
node_filesystem_files_free{job="node-exporter",fstype!=",mountpoint!="} / node_filesystem_files{job="node-exporter",fstype!=",mountpoint!="} * 100 < 40
and
predict_linear(node_filesystem_files_free{job="node-exporter",fstype!=",mountpoint!="}[6h], 24*60*60) < 0
and
node_filesystem_readonly{job="node-exporter",fstype!=",mountpoint!="} == 0
)
NodeFilesystemFilesFillingUp
Описание: Filesystem on }}, mounted on }}, at }} has only }}% available inodes left and is filling up fast.
Выражение:
(
node_filesystem_files_free{job="node-exporter",fstype!=",mountpoint!="} / node_filesystem_files{job="node-exporter",fstype!=",mountpoint!="} * 100 < 20
and
predict_linear(node_filesystem_files_free{job="node-exporter",fstype!=",mountpoint!="}[6h], 4*60*60) < 0
and
node_filesystem_readonly{job="node-exporter",fstype!=",mountpoint!="} == 0
)
NodeFilesystemAlmostOutOfFiles
Описание: Filesystem on }}, mounted on }}, at }} has only }}% available inodes left.
Выражение:
(
node_filesystem_files_free{job="node-exporter",fstype!=",mountpoint!="} / node_filesystem_files{job="node-exporter",fstype!=",mountpoint!="} * 100 < 5
and
node_filesystem_readonly{job="node-exporter",fstype!=",mountpoint!="} == 0
)
NodeFilesystemAlmostOutOfFiles
Описание: Filesystem on }}, mounted on }}, at }} has only }}% available inodes left.
Выражение:
(
node_filesystem_files_free{job="node-exporter",fstype!=",mountpoint!="} / node_filesystem_files{job="node-exporter",fstype!=",mountpoint!="} * 100 < 3
and
node_filesystem_readonly{job="node-exporter",fstype!=",mountpoint!="} == 0
)
NodeNetworkReceiveErrs
Описание: }} interface }} has encountered }} receive errors in the last two minutes.
Выражение:
rate(node_network_receive_errs_total{job="node-exporter"}[2m]) / rate(node_network_receive_packets_total{job="node-exporter"}[2m]) > 0.01
NodeNetworkTransmitErrs
Описание: }} interface }} has encountered }} transmit errors in the last two minutes.
Выражение:
rate(node_network_transmit_errs_total{job="node-exporter"}[2m]) / rate(node_network_transmit_packets_total{job="node-exporter"}[2m]) > 0.01
NodeHighNumberConntrackEntriesUsed
Описание: }} of conntrack entries are used.
Выражение:
(node_nf_conntrack_entries{job="node-exporter"} / node_nf_conntrack_entries_limit) > 0.75
NodeTextFileCollectorScrapeError
Описание: Node Exporter text file collector on }} failed to scrape.
Выражение:
node_textfile_scrape_error{job="node-exporter"} == 1
NodeClockSkewDetected
Описание: Clock at }} is out of sync by more than 0.05s. Ensure NTP is configured correctly on this host.
Выражение:
(
node_timex_offset_seconds{job="node-exporter"} > 0.05
and
deriv(node_timex_offset_seconds{job="node-exporter"}[5m]) >= 0
)
or
(
node_timex_offset_seconds{job="node-exporter"} < -0.05
and
deriv(node_timex_offset_seconds{job="node-exporter"}[5m]) <= 0
)
NodeClockNotSynchronising
Описание: Clock at }} is not synchronising. Ensure NTP is configured on this host.
Выражение:
min_over_time(node_timex_sync_status{job="node-exporter"}[5m]) == 0
and
node_timex_maxerror_seconds{job="node-exporter"} >= 16
NodeRAIDDegraded
Описание: RAID array ‘}}’ at }} is in degraded state due to one or more disks failures. Number of spare drives is insufficient to fix issue automatically.
Выражение:
node_md_disks_required{job="node-exporter",device=~"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)"} ‒ ignoring (state) (node_md_disks{state="active",job="node-exporter",device=~"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)"}) > 0
NodeRAIDDiskFailure
Описание: At least one device in RAID array at }} failed. Array ‘}}’ needs attention and possibly a disk swap.
Выражение:
node_md_disks{state="failed",job="node-exporter",device=~"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)"} > 0
NodeFileDescriptorLimit
Описание: File descriptors limit at }} is currently at }}%.
Выражение:
(
node_filefd_allocated{job="node-exporter"} * 100 / node_filefd_maximum{job="node-exporter"} > 70
)
NodeFileDescriptorLimit
Описание: File descriptors limit at }} is currently at }}%.
Выражение:
(
node_filefd_allocated{job="node-exporter"} * 100 / node_filefd_maximum{job="node-exporter"} > 90
)
NodeCPUHighUsage
Описание: CPU usage at }} has been above 90% for the last 15 minutes, is currently at }}%.
Выражение:
sum without(mode) (avg without (cpu) (rate(node_cpu_seconds_total{job="node-exporter", mode!="idle"}[2m]))) * 100 > 90
NodeSystemSaturation
Описание: System load per core at }} has been above 2 for the last 15 minutes, is currently at }}. This might indicate this instance resources saturation and can cause it becoming unresponsive.
Выражение:
node_load1{job="node-exporter"}
/ count without (cpu, mode) (node_cpu_seconds_total{job="node-exporter", mode="idle"}) > 2
NodeMemoryMajorPagesFaults
Описание: Memory major pages are occurring at very high rate at }}, 500 major page faults per second for the last 15 minutes, is currently at }}. Please check that there is enough memory available at this instance.
Выражение:
rate(node_vmstat_pgmajfault{job="node-exporter"}[5m]) > 500
NodeMemoryHighUtilization
Описание: Memory is filling up at }}, has been above 90% for the last 15 minutes, is currently at }}%.
Выражение:
100 ‒ (node_memory_MemAvailable_bytes{job="node-exporter"} / node_memory_MemTotal_bytes{job="node-exporter"} * 100) > 90
NodeDiskIOSaturation
Описание: Disk IO queue (aqu-sq) is high on }} at }}, has been above 10 for the last 15 minutes, is currently at }}. This symptom might indicate disk saturation.
Выражение:
rate(node_disk_io_time_weighted_seconds_total{job="node-exporter", device=~"(/dev/)?(mmcblk.p.+|nvme.+|rbd.+|sd.+|vd.+|xvd.+|dm-.+|md.+|dasd.+)"}[5m]) > 10
NodeSystemdServiceFailed
Описание: Systemd service }} has entered failed state at }}
Выражение:
node_systemd_unit_state{job="node-exporter", state="failed"} == 1
NodeBondingDegraded
Описание: Bonding interface }} on }} is in degraded state due to one or more slave failures.
Выражение:
(node_bonding_slaves ‒ node_bonding_active) != 0
Группа node-network
NodeNetworkInterfaceFlapping
Описание: Network interface "}}" changing its up status often on node-exporter }}/}}
Выражение:
changes(node_network_up{job="node-exporter",device!~"veth.+"}[2m]) > 2
Группа prometheus-operator
PrometheusOperatorListErrors
Описание: Errors while performing List operations in controller }} in }} namespace.
Выражение:
(sum by (cluster,controller,namespace) (rate(prometheus_operator_list_operations_failed_total{job="shturval-metrics-operator",namespace="monitoring"}[10m])) / sum by (cluster,controller,namespace) (rate(prometheus_operator_list_operations_total{job="shturval-metrics-operator",namespace="monitoring"}[10m]))) > 0.4
PrometheusOperatorWatchErrors
Описание: Errors while performing watch operations in controller }} in }} namespace.
Выражение:
(sum by (cluster,controller,namespace) (rate(prometheus_operator_watch_operations_failed_total{job="shturval-metrics-operator",namespace="monitoring"}[5m])) / sum by (cluster,controller,namespace) (rate(prometheus_operator_watch_operations_total{job="shturval-metrics-operator",namespace="monitoring"}[5m]))) > 0.4
PrometheusOperatorSyncFailed
Описание: Controller }} in }} namespace fails to reconcile }} objects.
Выражение:
min_over_time(prometheus_operator_syncs{status="failed",job="shturval-metrics-operator",namespace="monitoring"}[5m]) > 0
PrometheusOperatorReconcileErrors
Описание: }} of reconciling operations failed for }} controller in }} namespace.
Выражение:
(sum by (cluster,controller,namespace) (rate(prometheus_operator_reconcile_errors_total{job="shturval-metrics-operator",namespace="monitoring"}[5m]))) / (sum by (cluster,controller,namespace) (rate(prometheus_operator_reconcile_operations_total{job="shturval-metrics-operator",namespace="monitoring"}[5m]))) > 0.1
PrometheusOperatorStatusUpdateErrors
Описание: }} of status update operations failed for }} controller in }} namespace.
Выражение:
(sum by (cluster,controller,namespace) (rate(prometheus_operator_status_update_errors_total{job="shturval-metrics-operator",namespace="monitoring"}[5m]))) / (sum by (cluster,controller,namespace) (rate(prometheus_operator_status_update_operations_total{job="shturval-metrics-operator",namespace="monitoring"}[5m]))) > 0.1
PrometheusOperatorNodeLookupErrors
Описание: Errors while reconciling Prometheus in }} Namespace.
Выражение:
rate(prometheus_operator_node_address_lookup_errors_total{job="shturval-metrics-operator",namespace="monitoring"}[5m]) > 0.1
PrometheusOperatorNotReady
Описание: Prometheus operator in }} namespace isn’t ready to reconcile }} resources.
Выражение:
min by (cluster,controller,namespace) (max_over_time(prometheus_operator_ready{job="shturval-metrics-operator",namespace="monitoring"}[5m]) == 0)
PrometheusOperatorRejectedResources
Описание: Prometheus operator in }} namespace rejected }} }}/}} resources.
Выражение:
min_over_time(prometheus_operator_managed_resources{state="rejected",job="shturval-metrics-operator",namespace="monitoring"}[5m]) > 0
Группа prometheus
PrometheusBadConfig
Описание: Prometheus }}/}} has failed to reload its configuration.
Выражение:
Without max_over_time, failed scrapes could create false negatives, see
https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details.
max_over_time(prometheus_config_last_reload_successful{job="shturval-metrics-prometheus",namespace="monitoring"}[5m]) == 0
PrometheusSDRefreshFailure
Описание: Prometheus }}/}} has failed to refresh SD with mechanism }}.
Выражение:
increase(prometheus_sd_refresh_failures_total{job="shturval-metrics-prometheus",namespace="monitoring"}[10m]) > 0
PrometheusNotificationQueueRunningFull
Описание: Alert notification queue of Prometheus }}/}} is running full.
Выражение:
Without min_over_time, failed scrapes could create false negatives, see
https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details.
(
predict_linear(prometheus_notifications_queue_length{job="shturval-metrics-prometheus",namespace="monitoring"}[5m], 60 * 30)
>
min_over_time(prometheus_notifications_queue_capacity{job="shturval-metrics-prometheus",namespace="monitoring"}[5m])
)
PrometheusErrorSendingAlertsToSomeAlertmanagers
Описание: }}% errors while sending alerts from Prometheus }}/}} to Alertmanager }}.
Выражение:
(
rate(prometheus_notifications_errors_total{job="shturval-metrics-prometheus",namespace="monitoring"}[5m])
/
rate(prometheus_notifications_sent_total{job="shturval-metrics-prometheus",namespace="monitoring"}[5m])
)
* 100
> 1
PrometheusNotConnectedToAlertmanagers
Описание: Prometheus }}/}} is not connected to any Alertmanagers.
Выражение:
Without max_over_time, failed scrapes could create false negatives, see
https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details.
max_over_time(prometheus_notifications_alertmanagers_discovered{job="shturval-metrics-prometheus",namespace="monitoring"}[5m]) < 1
PrometheusTSDBReloadsFailing
Описание: Prometheus }}/}} has detected }} reload failures over the last 3h.
Выражение:
increase(prometheus_tsdb_reloads_failures_total{job="shturval-metrics-prometheus",namespace="monitoring"}[3h]) > 0
PrometheusTSDBCompactionsFailing
Описание: Prometheus }}/}} has detected }} compaction failures over the last 3h.
Выражение:
increase(prometheus_tsdb_compactions_failed_total{job="shturval-metrics-prometheus",namespace="monitoring"}[3h]) > 0
PrometheusNotIngestingSamples
Описание: Prometheus }}/}} is not ingesting samples.
Выражение:
(
rate(prometheus_tsdb_head_samples_appended_total{job="shturval-metrics-prometheus",namespace="monitoring"}[5m]) <= 0
and
(
sum without(scrape_job) (prometheus_target_metadata_cache_entries{job="shturval-metrics-prometheus",namespace="monitoring"}) > 0
or
sum without(rule_group) (prometheus_rule_group_rules{job="shturval-metrics-prometheus",namespace="monitoring"}) > 0
)
)
PrometheusDuplicateTimestamps
Описание: Prometheus }}/}} is dropping }} samples/s with different values but duplicated timestamp.
Выражение:
rate(prometheus_target_scrapes_sample_duplicate_timestamp_total{job="shturval-metrics-prometheus",namespace="monitoring"}[5m]) > 0
PrometheusOutOfOrderTimestamps
Описание: Prometheus }}/}} is dropping }} samples/s with timestamps arriving out of order.
Выражение:
rate(prometheus_target_scrapes_sample_out_of_order_total{job="shturval-metrics-prometheus",namespace="monitoring"}[5m]) > 0
PrometheusRemoteStorageFailures
Описание: Prometheus }}/}} failed to send }}% of the samples to }}:}}
Выражение:
(
(rate(prometheus_remote_storage_failed_samples_total{job="shturval-metrics-prometheus",namespace="monitoring"}[5m]) or rate(prometheus_remote_storage_samples_failed_total{job="shturval-metrics-prometheus",namespace="monitoring"}[5m]))
/
(
(rate(prometheus_remote_storage_failed_samples_total{job="shturval-metrics-prometheus",namespace="monitoring"}[5m]) or rate(prometheus_remote_storage_samples_failed_total{job="shturval-metrics-prometheus",namespace="monitoring"}[5m]))
+
(rate(prometheus_remote_storage_succeeded_samples_total{job="shturval-metrics-prometheus",namespace="monitoring"}[5m]) or rate(prometheus_remote_storage_samples_total{job="shturval-metrics-prometheus",namespace="monitoring"}[5m]))
)
)
* 100
> 1
PrometheusRemoteWriteBehind
Описание: Prometheus }}/}} remote write is }}s behind for }}:}}.
Выражение:
Without max_over_time, failed scrapes could create false negatives, see
https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details.
(
max_over_time(prometheus_remote_storage_highest_timestamp_in_seconds{job="shturval-metrics-prometheus",namespace="monitoring"}[5m])
- ignoring(remote_name, url) group_right
max_over_time(prometheus_remote_storage_queue_highest_sent_timestamp_seconds{job="shturval-metrics-prometheus",namespace="monitoring"}[5m])
)
> 120
PrometheusRemoteWriteDesiredShards
Описание: Prometheus }}/}} remote write desired shards calculation wants to run }} shards for queue }}:}}, which is more than the max of $labels.instance | query | first | value }}}}.
Выражение:
Without max_over_time, failed scrapes could create false negatives, see
https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details.
(
max_over_time(prometheus_remote_storage_shards_desired{job="shturval-metrics-prometheus",namespace="monitoring"}[5m])
>
max_over_time(prometheus_remote_storage_shards_max{job="shturval-metrics-prometheus",namespace="monitoring"}[5m])
)
PrometheusRuleFailures
Описание: Prometheus }}/}} has failed to evaluate }} rules in the last 5m.
Выражение:
increase(prometheus_rule_evaluation_failures_total{job="shturval-metrics-prometheus",namespace="monitoring"}[5m]) > 0
PrometheusMissingRuleEvaluations
Описание: Prometheus }}/}} has missed }} rule group evaluations in the last 5m.
Выражение:
increase(prometheus_rule_group_iterations_missed_total{job="shturval-metrics-prometheus",namespace="monitoring"}[5m]) > 0
PrometheusTargetLimitHit
Описание: Prometheus }}/}} has dropped }} targets because the number of targets exceeded the configured target_limit.
Выражение:
increase(prometheus_target_scrape_pool_exceeded_target_limit_total{job="shturval-metrics-prometheus",namespace="monitoring"}[5m]) > 0
PrometheusLabelLimitHit
Описание: Prometheus }}/}} has dropped }} targets because some samples exceeded the configured label_limit, label_name_length_limit or label_value_length_limit.
Выражение:
increase(prometheus_target_scrape_pool_exceeded_label_limits_total{job="shturval-metrics-prometheus",namespace="monitoring"}[5m]) > 0
PrometheusScrapeBodySizeLimitHit
Описание: Prometheus }}/}} has failed }} scrapes in the last 5m because some targets exceeded the configured body_size_limit.
Выражение:
increase(prometheus_target_scrapes_exceeded_body_size_limit_total{job="shturval-metrics-prometheus",namespace="monitoring"}[5m]) > 0
PrometheusScrapeSampleLimitHit
Описание: Prometheus }}/}} has failed }} scrapes in the last 5m because some targets exceeded the configured sample_limit.
Выражение:
increase(prometheus_target_scrapes_exceeded_sample_limit_total{job="shturval-metrics-prometheus",namespace="monitoring"}[5m]) > 0
PrometheusTargetSyncFailure
Описание: }} targets in Prometheus }}/}} have failed to sync because invalid configuration was supplied.
Выражение:
increase(prometheus_target_sync_failed_total{job="shturval-metrics-prometheus",namespace="monitoring"}[30m]) > 0
PrometheusHighQueryLoad
Описание: Prometheus }}/}} query API has less than 20% available capacity in its query engine for the last 15 minutes.
Выражение:
avg_over_time(prometheus_engine_queries{job="shturval-metrics-prometheus",namespace="monitoring"}[5m]) / max_over_time(prometheus_engine_queries_concurrent_max{job="shturval-metrics-prometheus",namespace="monitoring"}[5m]) > 0.8
PrometheusErrorSendingAlertsToAnyAlertmanager
Описание: }}% minimum errors while sending alerts from Prometheus }}/}} to any Alertmanager.
Выражение:
min without (alertmanager) (
rate(prometheus_notifications_errors_total{job="shturval-metrics-prometheus",namespace="monitoring",alertmanager!~``}[5m])
/
rate(prometheus_notifications_sent_total{job="shturval-metrics-prometheus",namespace="monitoring",alertmanager!~``}[5m])
)
* 100
> 3
Группа x509-certificate-exporter.rules
X509ExporterReadErrors
Описание: Over the last 15 minutes, this x509-certificate-exporter instance has experienced errors reading certificate files or querying the Kubernetes API. This could be caused by a misconfiguration if triggered when the exporter starts.
Выражение:
delta(x509_read_errors[15m]) > 0
CertificateError
Описание: Certificate could not be decoded }}in Kubernetes secret "}}/}}"}}at location "}}"}}
Выражение:
x509_cert_error > 0
CertificateRenewal
Описание: Certificate for "}}" should be renewed }}in Kubernetes secret "}}/}}"}}at location "}}"}}
Выражение:
(x509_cert_not_after ‒ time()) < (28 * 86400)
CertificateExpiration
Описание: Certificate for "}}" is about to expire after }} }}in Kubernetes secret "}}/}}"}}at location "}}"}}
Выражение:
(x509_cert_not_after ‒ time()) < (14 * 86400)
Группа shturval-backup
veleroBackupPartialFailures
Описание: velero backup }} has }} partialy failed backups.
Выражение:
velero_backup_partial_failure_total{schedule!="} / velero_backup_attempt_total{schedule!="} > 0.25
veleroBackupFailures
Описание: velero backup }} has }} failed backups.
Выражение:
velero_backup_failure_total{schedule!="} / velero_backup_attempt_total{schedule!="} > 0.25
Обработка правил оповещения
По умолчанию оповещения маршрутизируются в кластер мониторинга VictoriaMetrics, находящийся в кластере управления. Можно увидеть сработавшие оповещения в интерфейсе клиентского кластера в разделе "Оповещения → Просмотр оповещений".
Для настройки дополнительной маршрутизации необходимо создать получателей и маршруты. При необходимости добавления интервалов времени, в которые оповещения приходить не будут, можно задать временные интервалы и указать их в маршрутах.
Получатели
Страница "Получатели" представляет собой таблицу с полями:
- Имя получателя (есть возможность фильтрации по имени);
- Тип (есть выбор из ограниченного списка:
default,webhook,email,telegram).

Рисунок 223 ‒ Добавление получателя
На странице есть возможность добавить нового получателя (рисунок 223) или удалить ранее созданный.
Получатель с названием "devnull" имеет тип "default", создается по умолчанию и не может быть удален или изменен. Он блокирует отправку оповещений. При добавлении нового получателя тип "default" недоступен для выбора:
- Имя получателя (обязательное поле);
- Тип получателя:
webhook,email,telegram.
В зависимости от выбранного типа получателя набор полей для конфигурации будет разным.
Webhook
Webhook используется для отправки сообщений в сервисы агрегации уведомлений, service-desk, task-manager.
- Имя пользователя ‒ (необязательное поле) используется для авторизации в паре с паролем; не требуется при использовании Bearer-токена;
- Пароль ‒ (необязательное поле) используется для авторизации в паре с именем пользователя; не требуется при использовании Bearer-токена;
- Bearer-токен ‒ (необязательное поле) используется для авторизации; не требуется при использовании имени пользователя и пароля;
- URL-прокси;
- Отправлять решенные ‒ инициирует отправку сообщения о том, что оповещение перестало быть актуальным (по умолчанию ‒
да); - Максимальное количество оповещений, отправляемых в одном сообщении webhook ‒ Максимальное количество предупреждений, отправляемых на одно сообщение веб-перехватчика. При значении
0‒ включаются все оповещения; - URL-адрес ‒ (обязательное поле) endpoint для отправки HTTP-запросов;
- Использовать TLS ‒ (по умолчанию ‒
нет) при необходимости настроить безопасное соединение дополнительно требуется ввести: - Имя сервера (обязательное поле);
- Файл сертификата УЦ ‒ (обязательное поле) CAFile, файл сертификата удостоверяющего центра в формате base64;
- Файл сертификата клиента ‒ (обязательное поле) файл сертификата клиента в формате base64;
- Файл ключа клиента (обязательное поле) ‒ файл ключа клиента в формате base64;
- Нужно ли отключить проверку сертификата (по умолчанию ‒
нет);
Следует обратить внимание, что файл сертификата должен содержать ----BEGIN CERTIFICATE---- и ----END CERTIFICATE----.
По завершении настройки получателя необходимо настроить, какие оповещения будут отправляться по этому каналу. Для этого в разделе "Кластер → Оповещения → Маршруты" настроить отправку оповещений по этому каналу. При необходимости можно выбрать лейблы уведомлений, которые будут служить фильтром для отправки по заданному каналу.
Пример настройки webhook:
- Загрузить в кластер управления манифесты объектов Deployment, Service, VMRule с помощью импорта манифестов.
Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-webhook
namespace: monitoring
labels:
app: demo-webhook
spec:
replicas: 1
selector:
matchLabels:
app: demo-webhook
template:
metadata:
creationTimestamp: null
labels:
app: demo-webhook
spec:
terminationGracePeriodSeconds: 30
automountServiceAccountToken: false
containers:
‒ name: demo-webhook
image: quay.io/mgoerens/demo-webhook-receiver-alertmanager:0.0.1
imagePullPolicy: IfNotPresent
env:
‒ name: PORT
value: "8080"
livenessProbe:
httpGet:
path: /healthz
port: 8080
readinessProbe:
httpGet:
path: /healthz
port: 8080
resources:
limits:
cpu: 10m
memory: 30Mi
requests:
cpu: 10m
memory: 30Mi
securityContext:
capabilities:
drop:
‒ ALL
allowPrivilegeEscalation: false
Service:
apiVersion: v1
kind: Service
metadata:
name: demo-webhook
namespace: monitoring
labels:
app: demo-webhook
spec:
ports:
‒ port: 80
targetPort: 8080
protocol: TCP
name: http
selector:
app: demo-webhook
VMRule:
apiVersion: operator.victoriametrics.com/v1beta1
kind: VMRule
metadata:
labels:
app: demo-webhook
role: user
name: example-alert
namespace: victoria-metrics
spec:
groups:
‒ concurrency: 1
interval: 1m
labels:
ruletype: alert
name: example
rules:
‒ alert: ExampleAlert
expr: vector(1)
type: prometheus
- В кластере, для которого необходимо настроить алертинг, перейти в раздел "Кластер → Оповещения → Получатели", создать получателя с типом webhook. В поле "URL-адрес" ввести значение
http://demo-webhook.monitoring.svc/webhook. В качестве имени получателя указатьdemo-webhook. Остальные поля следует оставить незаполненными. Сохранить внесенные изменения. - В разделе "Кластер → Оповещения → Маршруты" настроить отправку оповещений по этому каналу. При необходимости можно выбрать лейблы уведомлений, которые будут служить фильтром для отправки по заданному каналу.
- В неймспейсе monitoring кластера управления перейти к просмотру пода с именем "demo-webhook". Открыть окно просмотра логов контейнера (рисунок 224). В случае корректной настройки в логах будут сообщения сработавших алертов в кластере (рисунок 225).

Рисунок 224 ‒ Пиктограмма просмотра

Рисунок 225 ‒ Просмотр логов контейнера
Telegram
Для настройки отправки оповещений в telegram необходимо:
- Создать telegram-бота. Следует обратить внимание, что токен бота выдается однократно при создании через
@BotFather. - Определить получателя ‒ это может быть отправка пользователю или в чат группе пользователей.
Когда бот и получатели определены, в графическом интерфейсе нужно настроить получателя:
- Telegram API URL (имеет значение по умолчанию, необязательно для заполнения);
- Формат сообщения: Markdown, Markdownv2, HTML (по умолчанию ‒
HTML); - Токен бота, от имени которого будет отправляться оповещение;
- Идентификатор чата (индивидуального или группового). Узнать идентификатор можно, стартовав из требуемого чата диалог в боте
https://t.me/userinfobot; - Отправлять решенные ‒ инициирует отправку сообщения о том, что оповещение перестало быть актуальным (по умолчанию ‒
да); - Отключить уведомления ‒ сообщения будут приходить без звукового уведомления (по умолчанию ‒
нет); - Шаблон уведомления в текстовом формате. Если шаблон не заполнить, то будет приходить сообщение по стандартному шаблону оператора, например:
Alerts Firing: Labels:
alertname = example
alertgroup = warning
cluster = clustername
ruletype = alert
severity = warning Annotations:
description = demo
summary = demo Source: http://vmalert-vmalert-503055269-6467fdc88f-5srrs:8080/vmalert/alert?group_id=13440678846293985821&alert_id=946083850580454XXX
Кроме того, можно настроить шаблон непосредственно в поле шаблона. Например, чтобы вывести информацию о дате и времени срабатывания, уровне критичности и описании, можно использовать шаблон непосредственно в поле "Шаблон уведомления в текстовом формате ":
{{ define "telegram.message" }}
{{ if eq .Status "firing" }}🔥{{ else }}✅{{ end }} *[{{ .Status | toUpper }}] {{ .CommonLabels.alertname }}*
{{ range .Alerts }}
*Severity:* {{ .Labels.severity | title }}
*Summary:* {{ .Annotations.summary }}
*Time:* {{ .StartsAt.Format "2006-01-02 15:04:05 UTC" }}
{{ if .Annotations.description }}*Description:* {{ .Annotations.description }}
{{ end -}}
{{ if .Annotations.runbook }}[Runbook]({{ .Annotations.runbook }})
{{ end -}}
{{ end }}
{{ end }}
{{ template "telegram.message" . }}
Тогда оповещение будет иметь вид:
🔥 [FIRING] TargetDown
Severity: Warning Summary: One or more targets are unreachable. Time: 2025-06-20 03:20:30 UTC
Description: 50% of the vector/ targets in logging namespace are down.
- Использовать TLS:
да/нет(по умолчанию ‒нет).
Учетные данные для отправки (необязательно): пара "Имя пользователя"/"Пароль" или "Bearer-токен":
- Имя пользователя ‒ (необязательное поле) используется для авторизации в паре с паролем; не требуется при использовании Bearer-токена;
- Пароль ‒ (необязательное поле) используется для авторизации в паре с именем пользователя; не требуется при использовании Bearer-токена;
- Bearer-токен ‒ (необязательное поле) используется для авторизации; не требуется при использовании имени пользователя и пароля.
При необходимости настройки безопасное соединение дополнительно необходимо ввести:
- Имя сервера (обязательное поле);
- Файл сертификата УЦ (обязательное поле) ‒ CAFile, файл сертификата удостоверяющего центра в формате base64;
- Файл сертификата клиента (обязательное поле) ‒ файл сертификата клиента в формате base64;
- Файл ключа клиента (обязательное поле) ‒ файл ключа клиента в формате base64;
- Нужно ли отключить проверку сертификата (по умолчанию ‒
нет).
По завершении настройки получателя необходимо настроить, какие оповещения будут отправляться по этому каналу. Для этого в разделе "Кластер → Оповещения → Маршруты" нужно настроить отправку оповещений по этому каналу. При необходимости можно выбрать лейблы уведомлений, которые будут служить фильтром для отправки по заданному каналу.
В зависимости от провайдера вашей почты потребуется заполнить данные (например, Gmail обязательно требует авторизационные данные):
Идентификатор авторизации‒ необходим для SMTP авторизации с использованием PLAIN.Имя пользователя‒ необходимо для SMTP авторизации с использованием CRAM-MD5, LOGIN или PLAIN. Если авторизация не используется, следует оставить поле незаполненным.Пароль‒ необходим для SMTP-авторизации с использованием CRAM-MD5, LOGIN или PLAIN. Если авторизация не используется, следует оставить поле незаполненным.Секрет авторизации‒ необходим для SMTP авторизации с использованием CRAM-MD5. Если авторизация с CRAM-MD5 не используется, следует оставить поле незаполненным.E-mail получателя‒ целевой e-mail-адрес для получения оповещений.Служебные заголовки, состоящие из имени заголовка и тела заголовка;Hostnameдля идентификации SMTP-сервера (необязательное);- Шаблон уведомления в формате HTML;
- Отправлять решенные ‒ инициирует отправку сообщения о том, что оповещение перестало быть актуальным (по умолчанию ‒
да); SMTP сервер(обязательное поле).
Следует обратить внимание, что для получения оповещений по e-mail:
- на стороне сервера должны быть открыты порты
25и/или587для SMTP,465‒ для SMTPS; - при централизованном алертинге в кластере управления Комплекса не установлено ограничений на выход по перечисленным портам;
- при локальном алертинге в клиентском кластере Комплекса не установлено ограничений на выход по перечисленным портам.
Пример настройки отправки уведомления на devmail:
- Подготовить манифест файла конфигурации maildev:
image:
registry: mirror.gcr.io
repository: maildev/maildev
pullPolicy: IfNotPresent
tag: "2.2.1"
resources:
limits:
cpu: 200m
memory: 256Mi
requests:
cpu: 100m
memory: 128Mi
ingress:
annotations:
cert-manager.io/cluster-issuer: <ваше значение параметра>
enabled: true
className: "nginx"
hosts:
‒ host: <ваше значение параметра>
paths:
‒ path: /
pathType: ImplementationSpecific
tls:
‒ secretName: maildev-ingress-tls
hosts:
‒ <ваше значение параметра>
Параметры описаны в таблице 22.
- Установить devmail с полученным файлом конфигурации в неймспейс monitoring кластера управления:
Важно ‒ Необходимо в конце команды вместо ИМЯ-ФАЙЛА-КОНФИГУРАЦИИ вписать имя, с которым был сохранен конфигурационный файл!
helm upgrade --install -n monitoring maildev https://github.com/christianknell/helm-charts/releases/download/maildev-1.3.4/maildev-1.3.4.tgz -f ИМЯ-ФАЙЛА-КОНФИГУРАЦИИ
В случае если настройка корректна, в неймспейсе monitoring кластера управления появится под с префиксом maildev (рисунок 226).

Рисунок 226 ‒ Пример пода с префиксом maildev
- В кластере, для которого требуется настроить отправку оповещения на почту, в разделе "Кластер → Оповещения → Получатели" создать получателя с типом "email".
- Заполнить отправителя, получателя. Следует прописать SMTP-сервер
maildev-smtp.monitoring.svc:1025. Если настройка верна, то по адресу, указанному в качестве хоста в конфигурационном файле (https://maildev.имя-кластера-управления.<base_domain>/#/) будет доступен maildev. - В разделе "Кластер → Оповещения → Маршруты" настроить отправку оповещений по этому каналу. При необходимости выбрать лейблы уведомлений, которые будут служить фильтром для отправки по заданному каналу (рисунок 227).

Рисунок 227 ‒ Настройка маршрута
Если настройка выполнена верно, то на devmail появится уведомление, как на рисунке 228.

Рисунок 228 ‒ Уведомление
Временные интервалы
На странице временных интервалов (рисунок 229) можно определить интервалы месяцев, дней месяца, дней недели и часовых диапазонов для блокировки отправки оповещений. Эти интервалы используются в конфигурации маршрутов. Интервалы, охватывающие несколько смежных элементов времени, будут объединены в диапазоны. Для выделения можно использовать клавишу Shift. Кнопка Выбрать все выбирает все элементы, а повторное нажатие снимает выбор. Если в созданной конфигурации не задано ни одного значения, то это равнозначно выбору всех значений. Например, если указаны дни недели, но не выбраны месяцы, то эти дни недели будут выбраны в каждом месяце.

Рисунок 229 ‒ Добавление временного интервала
Блокировка оповещений
Для блокировки оповещений нужно определить критерии, для чего ввести (рисунок 230):
- Ключи лейблов оповещений (equel) ‒ ключи самих оповещений, а не правил оповещений. Это могут быть:
alertname,env,severity,namespaceи др. - По каким значениям лейблов отправлять оповещения (target_matchers) ‒ целевые лейблы оповещений, при совпадении значений которых оповещения будут отправлены.
- Не отправлять при наличии оповещений со значениями целевых лейблов (source_matchers) ‒ оповещения с этими значениями в лейблах внутри группы не будут отправлены по маршруту, пока есть нерешенные оповещения с целевыми лейблами.

Рисунок 230 ‒ Добавление блокировки оповещений
Маршруты
Все маршруты формируются в одном конфигурационном файле. Сначала заполняется корневой маршрут, далее настраиваются подмаршруты (рисунок 231):
Получатель‒ выбрать получателя из списка получателей; по умолчанию выбран получатель по умолчанию;Время ожидания до отправки первичных оповещений по группе‒ какой временной лаг должен пройти до первоначальной отправки оповещений; может быть необходим для отбрасывания ложных срабатываний;Время ожидания до отправки обновленных оповещений по группе‒ какой временной лаг должен пройти до отправки изменений по ранее отправленному оповещению;Время ожидания до повторной отправки оповещений по группе‒ какой временной лаг должен пройти до повторной отправки ранее отправленных оповещений;Совпадающие лейблы оповещений маршрутизации‒ выбрать лейблы для отправки по маршруту;Ключи совпадающих лейблов оповещений для группировки‒ по каким ключам сгруппировать оповещения среди выбранных в совпадающих лейблах;Интервалы блокировки оповещения‒ выбрать из ранее созданных интервалов, когда нужно приостанавливать отправку оповещений по маршруту.

Рисунок 231 ‒ Маршруты
Подмаршруты определяют более детальную маршрутизацию оповещений среди групп, выбранных в корневом маршруте. В подмаршруте необходимо определить, требуется ли продолжить обработку оповещений одной группы в других подмаршрутах. Группа определяется в корневом маршруте.
Просмотр оповещений
В Комплексе есть предустановленные правила и возможность настройки кастомных правил. На странице "Просмотр оповещений" доступен просмотр оповещений по сработавшим правилам (рисунок 232).

Рисунок 232 ‒ Просмотр оповещений
Результаты разбиты по вкладкам в соответствии со статусами срабатывания (рисунок 233):
Firing. Алерт срабатывает и указывает на актуальное нарушение заданного условия или наступление события.Pending. Алерт не срабатывает в данный момент, но есть вероятность срабатывания в будущем. Это может быть вызвано временными изменениями.Inactive. Алерт не срабатывает в течение определенного периода времени или отключен администратором. На каждой вкладке алерты разбиты по группам в соответствии с заданным выражением. В каждой группе указано выражение, описание условий срабатывания алерта и счетчик количества событий в группе, а также сами алерты.

Рисунок 233 ‒ Просмотр оповещений по вкладкам
Состав алерта:
- Идентификатор;
- Название;
- Дата и время срабатывания;
- Описание;
- Выражения;
- Критичность.
Перечень правил оповещения (п. Предустановленные правила) по умолчанию доступен на странице правил оповещения кластера или в кластере управления в разделе "Администрирование" на странице "Кастомные ресурсы". В API-группе "operator.victoriametrics.com" можно найти ресурс VMRule с префиксом system в неймспейсе с именем клиентского кластера (рисунок 234).

Рисунок 234 ‒ Ресурс VMRule