Определение общих предупреждений Prometheus с разными порогами предупреждений для каждой службы

Я определил несколько предупреждений с выражениями, которые выглядят следующим образом:

sum(rate(some_error_metric[1m])) BY (namespace,application) > 10
sum(rate(some_other_error_metric[1m])) BY (namespace,application) > 10
...

Вышеупомянутые предупреждения в настоящее время срабатывают, когда какое-либо из наших приложений выдает эти показатели со скоростью более 10 в минуту.

Вместо того, чтобы жестко задавать порог 10, я хочу иметь возможность указывать разные пороги для каждого приложения.

например application_1 должен подавать сигналы с частотой 10 сигналов в минуту, application_2 должен подавать сигналы с частотой 20 сигналов в минуту и ​​т. Д.

Возможно ли это без дублирования предупреждений для каждого приложения?

Этот вопрос о переполнении стека: значения динамических меток в правилах предупреждений Promethues предполагает, что это может быть возможно достичь того, что я хочу, используя правила записи, однако следование шаблону, предложенному в единственном ответе на этот вопрос, приводит к правилам записи, которые Prometheus, похоже, не может проанализировать:

  - record: application_1_warning_threshold
    expr: warning_threshold{application="application_1"} 10
  - record: application_2_warning_threshold
    expr: warning_threshold{application="application_2"} 20
  ...

person rcgeorge23    schedule 29.05.2019    source источник


Ответы (2)


Вот моя конфигурация TasksMissing оповещения с разными пороговыми значениями для каждого задания:

groups:
- name: availability.rules
  rules:

  # Expected number of tasks per job and environment.
  - record: job_env:up:count
    expr: count(up) without (instance)

  # Actually up and running tasks per job and environment.
  - record: job_env:up:sum
    expr: sum(up) without (instance)

  # Ratio of up and running to expected tasks per job and environment.
  - record: job_env:up:ratio
    expr: job_env:up:sum / job_env:up:count

  # Global warning and critical availability ratio thresholds.
  - record: job:up:ratio_warning_threshold
    expr: 0.7
  - record: job:up:ratio_critical_threshold
    expr: 0.5


  # Job-specific warning and critical availability ratio thresholds.

  # Always alert if one Prometheus instance is down.
  - record: job:up:ratio_critical_threshold
    labels:
      job: prometheus
    expr: 0.99

  # Never alert for some-batch-job instances down:
  - record: job:up:ratio_warning_threshold
    labels:
      job: some-batch-job
    expr: 0
  - record: job:up:ratio_critical_threshold
    labels:
      job: some-batch-job
    expr: 0


  # TasksMissing is fired when a certain percentage of tasks belonging to a job are down. Namely:
  #
  #     job_env:up:ratio < job:up:ratio_(warning|critical)_threshold
  #
  # with a job-specific warning/critical threshold when defined, or the global default otherwise.

  - alert: TasksMissing
    expr: |
      # Default warning threshold is < 70%
        job_env:up:ratio
      < on(job) group_left()
        (
            job:up:ratio_warning_threshold
          or on(job)
              count by(job) (job_env:up:ratio) * 0
            + on() group_left()
              job:up:ratio_warning_threshold{job=""}
        )
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: Tasks missing for {{ $labels.job }} in {{ $labels.env }}
      description:
       '...'

  - alert: TasksMissing
    expr: |
      # Default critical threshold is < 50%
        job_env:up:ratio
      < on(job) group_left()
        (
            job:up:ratio_critical_threshold
          or on(job)
              count by(job) (job_env:up:ratio) * 0
            + on() group_left()
              job:up:ratio_critical_threshold{job=""}
        )
    for: 2m
    labels:
      severity: critical
    annotations:
      summary: Tasks missing for {{ $labels.job }} in {{ $labels.env }}
      description:
       '...'

person Alin Sînpălean    schedule 31.05.2019

Тот же вопрос:

вот application_10000, application_10001, application_10002, но мы этого не знаем. поэтому нам нужно правило по умолчанию для других приложений. я пробовал это:

record: record_rule_name_10000
expr: warning_threshold{application="application_10000"} > 500
labels:
  team: record_rule_name_10000

record: record_rule_name_10001
expr: warning_threshold{application="application_10001"} > 501
labels:
  team: record_rule_name_10001


alert: record_rule_name_10000
expr: warning_threshold
  > on(team) group_left() (record_rule_name_10000
  or on(team) count by(team) (warning_threshold) * 0 + 100)
for: 20s
annotations:
  default_threshold: "100"
  now_value: '{{ $value }}'
  platform: vkmq
  threshold: "500"
alert: record_rule_name_10001
expr: warning_threshold
  > on(team) group_left() (record_rule_name_10001
  or on(team) count by(team) (warning_threshold) * 0 + 102)
for: 20s
annotations:
  default_threshold: "100"
  now_value: '{{ $value }}'
  platform: vkmq
  threshold: "501"

application_10002 все еще не работает одно значение по умолчанию

person francis    schedule 25.12.2019