Как получить одно уведомление о подтверждении/ОК в icinga2 из эскалации шаблонов уведомлений?

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

Когда у меня есть и «service-test-down-1», и «service-test-down-2», установленные для всех типов и состояний, я получаю два сообщения «ОК», когда служба становится в порядке. Когда я настроил его, как показано ниже, разделив сообщения OK и Not-OK, я никогда не получаю никаких OK. Я чувствую, что это должно быть прямо вперед, но я не смог добиться какого-либо прогресса.

apply Notification "service-test-down-1" to Service {
  command = "dispatch-service"
  states = [ Warning, Critical, Unknown ]
  types = [ Problem, Custom, FlappingStart, FlappingEnd,
            DowntimeStart, DowntimeEnd, DowntimeRemoved ]
  users = ["russ"]
  period = "24x7"
  assign where "tests" in service.groups
  vars.priority = "medium"
  times.begin = 0m
  times.end = 3m
  interval = 1m
}

apply Notification "service-test-down-2" to Service {
  command = "dispatch-service"
  states = [ Warning, Critical, Unknown ]
  types = [ Problem, Custom, FlappingStart, FlappingEnd,
            DowntimeStart, DowntimeEnd, DowntimeRemoved ]
  period = "24x7"
  users = ["russ"]
  assign where "tests" in service.groups
  vars.priority = "medium"
  times.begin = 3m
  times.end = 12h
  interval = 2m
}
apply Notification "service-test-recovery" to Service {
  command = "dispatch-service"
  states = [ OK ]
  types = [ Acknowledgement, Recovery ]
  users = ["russ"]
  period = "24x7"
  vars.priority = "medium"
  assign where "tests" in service.groups
  interval = 1
}

apply Service "NotificationTest" {
  enable_active_checks = true
  check_command = "passive"
  max_check_attempts = 1

  ignore where host.vars.noservices == true
  groups += ["tests"]
  assign where host.name == "icinga2.acceleration.net"
  max_check_attempts = 5
  check_interval = 5m
  retry_interval = 5m
}

Эта конфигурация печатается icinga как:

~# icinga2 object list --name service-test-* 
Object 'icinga2.acceleration.net!NotificationTest!service-test-down-1' of type 'Notification':
  % declared in '/opt/icinga2lib/lib.conf.d//test.conf', lines 2:1-2:51
  * __name = "icinga2.acceleration.net!NotificationTest!service-test-down-1"
  * command = "dispatch-service"
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 3:3-3:30
  * command_endpoint = ""
  * host_name = "icinga2.acceleration.net"
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 2:1-2:51
  * interval = 60
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 13:3-13:15
  * name = "service-test-down-1"
  * package = "_etc"
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 2:1-2:51
  * period = "24x7"
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 8:3-8:17
  * service_name = "NotificationTest"
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 2:1-2:51
  * states = [ "Warning", "Critical", "Unknown" ]
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 4:3-4:41
  * templates = [ "service-test-down-1" ]
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 2:1-2:51
  * times
    * begin = 0
      % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 11:3-11:18
    * end = 180
      % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 12:3-12:16
  * type = "Notification"
  * types = [ "Problem", "Custom", "FlappingStart", "FlappingEnd", "DowntimeStart", "DowntimeEnd", "DowntimeRemoved" ]
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 5:3-6:57
  * user_groups = null
  * users = [ "russ" ]
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 7:3-7:18
  * vars
    * priority = "medium"
      % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 10:3-10:26
  * zone = ""

Object 'icinga2.acceleration.net!NotificationTest!service-test-down-2' of type 'Notification':
  % declared in '/opt/icinga2lib/lib.conf.d//test.conf', lines 16:1-16:51
  * __name = "icinga2.acceleration.net!NotificationTest!service-test-down-2"
  * command = "dispatch-service"
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 17:3-17:30
  * command_endpoint = ""
  * host_name = "icinga2.acceleration.net"
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 16:1-16:51
  * interval = 120
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 27:3-27:15
  * name = "service-test-down-2"
  * package = "_etc"
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 16:1-16:51
  * period = "24x7"
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 21:3-21:17
  * service_name = "NotificationTest"
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 16:1-16:51
  * states = [ "Warning", "Critical", "Unknown" ]
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 18:3-18:41
  * templates = [ "service-test-down-2" ]
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 16:1-16:51
  * times
    * begin = 180
      % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 25:3-25:18
    * end = 43200
      % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 26:3-26:17
  * type = "Notification"
  * types = [ "Problem", "Custom", "FlappingStart", "FlappingEnd", "DowntimeStart", "DowntimeEnd", "DowntimeRemoved" ]
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 19:3-20:57
  * user_groups = null
  * users = [ "russ" ]
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 22:3-22:18
  * vars
    * priority = "medium"
      % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 24:3-24:26
  * zone = ""

Object 'icinga2.acceleration.net!NotificationTest!service-test-recovery' of type 'Notification':
  % declared in '/opt/icinga2lib/lib.conf.d//test.conf', lines 29:1-29:53
  * __name = "icinga2.acceleration.net!NotificationTest!service-test-recovery"
  * command = "dispatch-service"
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 30:3-30:30
  * command_endpoint = ""
  * host_name = "icinga2.acceleration.net"
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 29:1-29:53
  * interval = 1
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 37:3-37:14
  * name = "service-test-recovery"
  * package = "_etc"
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 29:1-29:53
  * period = "24x7"
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 34:3-34:17
  * service_name = "NotificationTest"
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 29:1-29:53
  * states = [ "OK" ]
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 31:3-31:17
  * templates = [ "service-test-recovery" ]
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 29:1-29:53
  * times = null
  * type = "Notification"
  * types = [ "Acknowledgement", "Recovery" ]
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 32:3-32:39
  * user_groups = null
  * users = [ "russ" ]
    % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 33:3-33:18
  * vars
    * priority = "medium"
      % = modified in '/opt/icinga2lib/lib.conf.d//test.conf', lines 35:3-35:26
  * zone = ""

Соответствующие ссылки на документы: https://www.icinga.com/docs/icinga2/latest/doc/03-monitoring-basics/#notification-escalations

Перекрестная публикация: https://github.com/Icinga/icinga2/issues/5478


person bobbysmith007    schedule 08.08.2017    source источник


Ответы (1)


Ответ предоставлен разработчиками icinga2 (на github: https://github.com/Icinga/icinga2/issues/5478) заключается в том, что при эскалации уведомлений невозможно отправить одно уведомление о восстановлении из icinga2.

Каждая эскалация является отдельным объектом уведомления, и каждому уведомлению о ПРОБЛЕМЕ будет отправлено сообщение ВОССТАНОВЛЕНИЕ. Уведомление о ВОССТАНОВЛЕНИИ не будет отправлено любому объекту уведомления, который никогда не отправлял уведомление о ПРОБЛЕМЕ (это кажется неправильным, но что угодно).

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

person bobbysmith007    schedule 09.08.2017