Оповещения

Настройка правил оповещения

Алертинг (оповещения) реализованы на основе 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:

  1. Загрузить в кластер управления манифесты объектов 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
  1. В кластере, для которого необходимо настроить алертинг, перейти в раздел "Кластер → Оповещения → Получатели", создать получателя с типом webhook. В поле "URL-адрес" ввести значение http://demo-webhook.monitoring.svc/webhook. В качестве имени получателя указать demo-webhook. Остальные поля следует оставить незаполненными. Сохранить внесенные изменения.
  2. В разделе "Кластер → Оповещения → Маршруты" настроить отправку оповещений по этому каналу. При необходимости можно выбрать лейблы уведомлений, которые будут служить фильтром для отправки по заданному каналу.
  3. В неймспейсе monitoring кластера управления перейти к просмотру пода с именем "demo-webhook". Открыть окно просмотра логов контейнера (рисунок 224). В случае корректной настройки в логах будут сообщения сработавших алертов в кластере (рисунок 225).

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

Рисунок 225 ‒ Просмотр логов контейнера

Telegram

Для настройки отправки оповещений в telegram необходимо:

  1. Создать telegram-бота. Следует обратить внимание, что токен бота выдается однократно при создании через @BotFather.
  2. Определить получателя ‒ это может быть отправка пользователю или в чат группе пользователей.

Когда бот и получатели определены, в графическом интерфейсе нужно настроить получателя:

  • 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;
  • Нужно ли отключить проверку сертификата (по умолчанию ‒ нет).

По завершении настройки получателя необходимо настроить, какие оповещения будут отправляться по этому каналу. Для этого в разделе "Кластер → Оповещения → Маршруты" нужно настроить отправку оповещений по этому каналу. При необходимости можно выбрать лейблы уведомлений, которые будут служить фильтром для отправки по заданному каналу.

Email

В зависимости от провайдера вашей почты потребуется заполнить данные (например, 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:

  1. Подготовить манифест файла конфигурации 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.

  1. Установить 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

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