• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Icinga: Definition von individuellen host-abhängigen Limits

gehrke

Administrator
Teammitglied
Moin *

Ich mache grad meine ersten Schritte mit Icinga2.

Beim Monitoring der Anzahl der laufenden Prozesse sehe ich, dass meine Server typischerweise eine kleinere Anzahl an Prozessen (~100 - 200) haben als die Desktops mit Gnome (~250 bis 350).

Der standardmäßige Check hat diese Limits definiert, die so ein 08/15-Gnome üblicherweise überschreitet:
*Warnung: 250
*Kritisch: 400

Dies würde ich gern sauber definieren, sprich: andere Grenzwerte für Server- als für Desktopsysteme.
Der Stand mein aktuellen Config funktioniert leider nur temporär - im Abstand von ca. 30 Sekunden werden entweder die gewünschten Limits angewendet oder die Default-Werte.

/etc/icinga2/zones.d/master/services.conf
Code:
apply Service "procs" {
  import "generic-service"
  check_command = "procs"

 if (host.vars.type == "desktop" ) {
   vars.procs_critical = 500
   vars.procs_warning = 350
  } else {
   vars.procs_critical = 300
   vars.procs_warning = 200
  }

 command_endpoint = host.vars.client_endpoint
 assign where host.vars.client_endpoint
}
Den Parameter 'type' gebe ich in der Host-Definition mit:
Code:
object Host "j2.gehrke.local" {
  check_command = "hostalive"
  address = "j2.gehrke.local"
  vars.client_endpoint = name
  vars.os = "Linux"
  vars.type = "desktop"
}

Ich beobachte, dass im Abstand von unter einer Minute unterschiedliche Grenzwerte angelegt werden: Entweder 250.00/400.00 oder 350.00/500.00
Dementsprechend flappt der Status des Services bei identischer Prozesszahl kontinuierlich zwischen OK und Warning.

Bemerkenswert, dass das von mir im else-Bereich definierte Pärchen 200/300 nie zum tragen kommt. Auch nicht bei anderen Hosts, die eine solche Parametrisierung haben:
Code:
  vars.type = "server"
Jemand einen Tipp, woran das liegen kann?
TNX

Glückauf, gehrke
 
Eigentlich würde ich sagen das es so richtig aussieht. Ich bin aber auch nicht der große Held was icinga angeht. Und ich persönlich würde die warn und crit auch eher in den einzelnen hosts definieren, aber wie gesagt...

Was Du mal gucken könntest: Bei
if (host.vars.type == "desktop" ) {
würde ich mal das Leerzeichen vor der schließenden runden Klammer raus nehmen.
 
OP
gehrke

gehrke

Administrator
Teammitglied
Das Leerzeichen habe ich entfernt - das war es nicht.
TNX
 
Check mal ob deine Variable "host.vars.type" überhaupt richtig erkannt wird.
icinga2 object list --type Host
Damit solltest Du den Rückgabewert sehen können, wenn Du im richtigen Host-Abschnitt guckst.
Ansonsten verwundert mich deine Aussage zu den wechselnden Werten bzw den Zeiten in denen das geschieht. Die meisten Ereignisse werden alle 5 Minuten abgefragt, einige minütlich, aber das die Werte dazwischen geändert werden? Sehr merkwürdig. "systemctl reload icinga2" hast Du nach jeder Änderung der Konfiguration ausgeführt? Und Du siehst auch in icingaweb (der grafischen Oberfläche per Browser) das während des Countdowns die Werte sich ändern?
 
OP
gehrke

gehrke

Administrator
Teammitglied
Geier0815 schrieb:
Check mal ob deine Variable "host.vars.type" überhaupt richtig erkannt wird.
icinga2 object list --type Host
Damit solltest Du den Rückgabewert sehen können, wenn Du im richtigen Host-Abschnitt guckst.
Ah, jetzt kommen wir der Sache schon näher. Via CLI hineinzuschauen, so weit war ich bislang noch nicht. Das dürfte sehr hilfreich sein.
TNX
Code:
# icinga2 object list --name j2.gehrke.local
Object 'j2.gehrke.local' of type 'Zone':
  % declared in '/etc/icinga2/zones.conf', lines 23:1-23:30
  * __name = "j2.gehrke.local"
  * endpoints = [ "j2.gehrke.local" ]
    % = modified in '/etc/icinga2/zones.conf', lines 24:9-24:42
  * global = false
  * name = "j2.gehrke.local"
  * package = "_etc"
  * parent = "master"
    % = modified in '/etc/icinga2/zones.conf', lines 25:9-25:25
  * source_location
    * first_column = 1
    * first_line = 23
    * last_column = 30
    * last_line = 23
    * path = "/etc/icinga2/zones.conf"
  * templates = [ "j2.gehrke.local" ]
    % = modified in '/etc/icinga2/zones.conf', lines 23:1-23:30
  * type = "Zone"
  * zone = ""

Object 'j2.gehrke.local' of type 'Endpoint':
  % declared in '/etc/icinga2/zones.conf', lines 21:1-21:34
  * __name = "j2.gehrke.local"
  * host = ""
  * log_duration = 86400
  * name = "j2.gehrke.local"
  * package = "_etc"
  * port = "5665"
  * source_location
    * first_column = 1
    * first_line = 21
    * last_column = 34
    * last_line = 21
    * path = "/etc/icinga2/zones.conf"
  * templates = [ "j2.gehrke.local" ]
    % = modified in '/etc/icinga2/zones.conf', lines 21:1-21:34
  * type = "Endpoint"
  * zone = ""

Object 'j2.gehrke.local' of type 'Host':
  % declared in '/etc/icinga2/zones.d/master/hosts.conf', lines 1:0-1:29
  * __name = "j2.gehrke.local"
  * action_url = ""
  * address = "j2.gehrke.local"
    % = modified in '/etc/icinga2/zones.d/master/hosts.conf', lines 3:3-3:30
  * address6 = ""
  * check_command = "hostalive"
    % = modified in '/etc/icinga2/zones.d/master/hosts.conf', lines 2:3-2:29
  * check_interval = 300
  * check_period = ""
  * check_timeout = null
  * command_endpoint = ""
  * display_name = "j2.gehrke.local"
  * enable_active_checks = true
  * enable_event_handler = true
  * enable_flapping = false
  * enable_notifications = true
  * enable_passive_checks = true
  * enable_perfdata = true
  * event_command = ""
  * flapping_threshold = 0
  * flapping_threshold_high = 30
  * flapping_threshold_low = 25
  * groups = [ ]
  * icon_image = ""
  * icon_image_alt = ""
  * max_check_attempts = 3
  * name = "j2.gehrke.local"
  * notes = ""
  * notes_url = ""
  * package = "_etc"
  * retry_interval = 60
  * source_location
    * first_column = 0
    * first_line = 1
    * last_column = 29
    * last_line = 1
    * path = "/etc/icinga2/zones.d/master/hosts.conf"
  * templates = [ "j2.gehrke.local" ]
    % = modified in '/etc/icinga2/zones.d/master/hosts.conf', lines 1:0-1:29
  * type = "Host"
  * vars
    * client_endpoint = "j2.gehrke.local"
      % = modified in '/etc/icinga2/zones.d/master/hosts.conf', lines 4:3-4:29
    * os = "Linux"
      % = modified in '/etc/icinga2/zones.d/master/hosts.conf', lines 5:3-5:19
    * type = "desktop"
      % = modified in '/etc/icinga2/zones.d/master/hosts.conf', lines 6:3-6:23
  * volatile = false
  * zone = "master"
Geier0815 schrieb:
Ansonsten verwundert mich deine Aussage zu den wechselnden Werten bzw den Zeiten in denen das geschieht. Die meisten Ereignisse werden alle 5 Minuten abgefragt, einige minütlich, aber das die Werte dazwischen geändert werden? Sehr merkwürdig. "systemctl reload icinga2" hast Du nach jeder Änderung der Konfiguration ausgeführt? Und Du siehst auch in icingaweb (der grafischen Oberfläche per Browser) das während des Countdowns die Werte sich ändern?
Reload nach jeder Änderung, ja. Wie oben erwähnt, war ich bislang noch gar nicht so weit, via CLI auf Icinga und den Status zuzugreifen - insofern rührte meine Beobachtung bis dato ausschließlich von icingaweb.
 
OP
gehrke

gehrke

Administrator
Teammitglied
Bin noch nicht wirklich weiter gekommen, aber das debug.log zeigt das, was ich beschrieben habe:
Code:
# tail -f /var/log/icinga2/debug.log | grep 'j2' | grep "perfdata = 'procs"
[2020-12-17 19:26:02 +0100] debug/IdoMysqlConnection: Query: UPDATE icinga_servicestatus SET acknowledgement_type = '0',  active_checks_enabled = '1',  check_command = 'procs',  check_source = 'j2.gehrke.local',  check_type = '0',  current_check_attempt = '1',  current_notification_number = '0',  current_state = '0',  endpoint_object_id = 319,  event_handler_enabled = '1',  execution_time = '0.030935',  flap_detection_enabled = '0',  has_been_checked = '1',  instance_id = 1,  is_flapping = '0',  is_reachable = '1',  last_check = FROM_UNIXTIME(1608229561),  last_hard_state = '0',  last_hard_state_change = FROM_UNIXTIME(1608229561),  last_state_change = FROM_UNIXTIME(1608229561),  last_time_critical = FROM_UNIXTIME(1607862767),  last_time_ok = FROM_UNIXTIME(1608229561),  last_time_unknown = FROM_UNIXTIME(1608227467),  last_time_warning = FROM_UNIXTIME(1608229532),  latency = '0',  long_output = '',  max_check_attempts = '5',  next_check = FROM_UNIXTIME(1608229618),  normal_check_interval = '1',  notifications_enabled = '1',  original_attributes = 'null',  output = 'PROCS OK: 285 processes ',  passive_checks_enabled = '1',  percent_state_change = '99',  perfdata = 'procs=285;350;500;0;',  problem_has_been_acknowledged = '0',  process_performance_data = '1',  retry_check_interval = '0.500000',  scheduled_downtime_depth = '0',  service_object_id = 404,  should_be_scheduled = '1',  state_type = '1',  status_update_time = FROM_UNIXTIME(1608229561) WHERE service_object_id = 404

[2020-12-17 19:26:33 +0100] debug/IdoMysqlConnection: Query: UPDATE icinga_servicestatus SET acknowledgement_type = '0',  active_checks_enabled = '1',  check_command = 'procs',  check_source = 'j2.gehrke.local',  check_type = '0',  current_check_attempt = '1',  current_notification_number = '0',  current_state = '1',  endpoint_object_id = 319,  event_handler_enabled = '1',  execution_time = '0.030845',  flap_detection_enabled = '0',  has_been_checked = '1',  instance_id = 1,  is_flapping = '0',  is_reachable = '1',  last_check = FROM_UNIXTIME(1608229592),  last_hard_state = '0',  last_hard_state_change = FROM_UNIXTIME(1608229561),  last_state_change = FROM_UNIXTIME(1608229592),  last_time_critical = FROM_UNIXTIME(1607862767),  last_time_ok = FROM_UNIXTIME(1608229561),  last_time_unknown = FROM_UNIXTIME(1608227467),  last_time_warning = FROM_UNIXTIME(1608229592),  latency = '0.000592',  long_output = '',  max_check_attempts = '5',  next_check = FROM_UNIXTIME(1608229621),  normal_check_interval = '1',  notifications_enabled = '1',  original_attributes = 'null',  output = 'PROCS WARNING: 289 processes ',  passive_checks_enabled = '1',  percent_state_change = '99',  perfdata = 'procs=289;250;400;0;',  problem_has_been_acknowledged = '0',  process_performance_data = '1',  retry_check_interval = '0.500000',  scheduled_downtime_depth = '0',  service_object_id = 404,  should_be_scheduled = '1',  state_type = '0',  status_update_time = FROM_UNIXTIME(1608229592) WHERE service_object_id = 404

Verkürzt:
Zuerst werden die Limits 350;500 angelegt, 31 Sekunden später 250;400.
Bei 289 Prozessen bleibt die erste Variante grün, die zweite wird gelb.
 
OP
gehrke

gehrke

Administrator
Teammitglied
Bin immer noch nicht dahinter gestiegen, wo die Grenzwerte überschrieben werden.

Habe die Config umgestellt und vereinfacht, nun werden die Grenzwerte über Templates für den Host definiert. Das erscheint einfacher und eleganter, zumal auf diesem Wege weitere Funktionalitäten mit wenig Aufwand abgebildet werden können:
Code:
# cat /etc/icinga2/conf.d/templates.conf 
template Host "generic-host" {
  max_check_attempts = 3
  check_interval = 1m
  retry_interval = 30s

  check_command = "hostalive"
}

template Host "linux-server" {
  import "generic-host"

  vars.os = "Linux"
  vars.type = "server"
  vars.procs_critical = 300
  vars.procs_warning = 200
}
template Host "linux-desktop" {
  import "generic-host"

  vars.os = "Linux"
  vars.type = "desktop"
  vars.procs_critical = 500
  vars.procs_warning = 350
}
[...]
Code:
# cat /etc/icinga2/zones.d/master/services.conf
[...]
apply Service "procs" {
  import "generic-service"

  check_command = "procs"

  command_endpoint = host.vars.client_endpoint
  assign where host.vars.client_endpoint
}
Code:
# cat /etc/icinga2/zones.d/master/hosts.conf 
object Host "j2.gehrke.local" {
  import "linux-desktop"

  address = "j2.gehrke.local"
  vars.client_endpoint = name
}
[...]
Sieht IMHO einfacher aus und funktioniert prima, aber ändert leider gar nichts an meinem Problem: Alle 30 Sekuden werden unverändert andere Grenzwerte angelegt. :???:
 
OP
gehrke

gehrke

Administrator
Teammitglied
Es liegt zumindest nicht an der statischen Konfiguration. Eine kontinuierliche Abfrage alle 15 Sekunden zeigt keinerlei Veränderung bei den Grenzwerten, die richtig gesetzt sind:
Code:
# watch -n 15 "date; icinga2  object list --name j2.gehrke.local | grep 'procs_'"
So 27. Dez 08:53:54 CET 2020
    * procs_critical = 500
    * procs_warning = 350
Bleibt das Flapping bei der Anzeige von icingaweb2 und die Ausgaben im debug.log.
Beides springt immer wieder kurzzeitig auf 250.00/400.00. Für beide Werte finden sich keine Hinweise in der Config:
Code:
# grep -r '400' /etc/icinga2/*
<leer>
Das scheinen also Default-Werte aus dem Code zu sein.
 
OP
gehrke

gehrke

Administrator
Teammitglied
Zumindest habe ich schon mal jemanden gefunden, der exakt das selbe Problem hat:
https://monitoring-portal.org/t/procs-warning-and-critical/4072

Nur leider keine Lösung...
 
Oben