Skip to main content

Alarmering med Grafana

Grafana Alerting

Applikasjoner pÄ SKIP bruker Grafana for overvÄking av uventede endringer i systemet. NÄr en alarm utlÞses, kan den enten hÄndteres som en kritisk alarm som sendes til flere kanaler, inkludert SMS og e-post, eller som en ikke-kritisk alarm som hÄndteres i kontortiden av produktteamet.

Her er noen nyttige lenker for hÄndtering av alarmer:

Opprette alarmer​

Det fĂžrste steget for Ă„ legge til alarmer for applikasjonen din er Ă„ onboarde appen til SKIP. Grafana brukes kun for applikasjoner pĂ„ SKIP – resten av Kartverket bruker Zabbix. NĂ„r du er onboardet og har deployet appen din til SKIP, kan du be om tilgang til grafana-alerts-repoet.

grafana-alerts-repoet er designet for Ä inneholde alarmene til alle team og hÄndtere utrulling av alarmer til Grafana. Du vil fÄ en fil som inneholder konfigurasjonen av alarmene dine i Terraform. For eksempel kan filen se slik ut:

resource "grafana_folder" "MYTEAMNAME_folder" {
for_each = local.envs
title = "Alerts MYTEAMNAME ${each.key}"
}

module "MYTEAMNAME_alerts_kubernetes" {
source = "../modules/grafana_alert_group"
for_each = local.envs

name = "kube-state-metrics"
env = each.value
runbook_base_url = # URL to document describing each alert
folder_uid = grafana_folder.MYTEAMNAME_folder[each.key].uid
team = {
name = "MYTEAMNAME"
}
alerts = {
KubernetesPodNotHealthy = {
summary = "Kubernetes Pod not healthy (instance {{ $labels.instance }})"
description = "Pod has been in a non-ready state for longer than 15 minutes.\n VALUE = {{ $value }}\n LABELS = {{ $labels }}"
severity = "critical"
for = "15m"
expr = <<EOT
sum by (namespace, pod) (kube_pod_status_phase{phase=~"Pending|Unknown|Failed", namespace=~"nrl-.*"})
EOT
},
# ... more alerts
}
}

I filen over oppretter vi en alarm som overvÄker helsen til en pod i alle nrl-navnerom. Legg merke til expr-feltet, som bruker Prometheus sitt spÞrresprÄk PromQL. Hvis du vil lÊre mer om PromQL, kan du se pÄ dokumentasjonen samt noen eksempler fra Prometheus-dokumentasjonen og eksemplene pÄ awesome prometheus alerts.

Dette er en fil du vil fÄ CODEOWNERS-tilgang til. Det betyr at du og teamet ditt kan oppdatere filen og godkjenne egne endringer uten Ä involvere SKOOP. Teamet ditt forventes Ä holde alarmene pÄ et nivÄ som verifiserer kjÞretilstanden til applikasjonen.

Oppdatering av denne filen i GitHub-repoet vil automatisk rulle ut endringene til Grafana.

Grafana OnCall​

I tillegg til Grafana-alarmer har vi installert Grafana OnCall-pluginen i Grafana. Denne pluginen gir oss muligheten til Ä legge til tidsplaner/vakter og tilpasse eskalering av alarmer. Den gir ogsÄ teamet ditt en oversikt og et system for Ä hÄndtere alarmer.

Oncall Alerts

Integrasjon​

For Ă„ begynne Ă„ bruke Grafana OnCall trenger du en OnCall-integrasjon mot Grafana. Denne integrasjonen vil dukke opp som et kontaktpunkt (contact point) i Grafana, som kan brukes i varslingsregler (notification policies) for Ă„ rute alarmer til integrasjonen din.

Fra integrasjonen kan du legge til ruter og eskaleringskjeder (routes and escalation chains) som bestemmer hvordan integrasjonen varsler teamet. Standardoppsettet er Ä sende alle alarmer til en Slack-kanal, og i tillegg til et teammedlem pÄ vakt eller en delt innboks.

SKIPs Oncall integration

Grafana Contact point for an Oncall integration watchdog

I grafana-alerts-repoet har vi laget en oncall_integration-modul som du kan bruke til Ă„ opprette integrasjonen for teamet ditt.

Ruter​

I en integrasjon har du alltid en standardrute, men du kan ogsÄ ha spesifiserte ruter. En rute bestemmer hvilken eskaleringskjede integrasjonen skal bruke nÄr den mottar en alarm. For eksempel, hvis du har en kritisk app som krever 24/7-alarmering, kan du opprette en rute som sjekker bestemte labels, og hvis de finnes, ruter alarmen til «appdrift»-eskaleringskjeden.

Tidsplaner​

En OnCall-tidsplan er en samling av «vakter» (shifts). Kort fortalt betyr dette at du kan tildele en person til en vakt, og den personen vil motta alle alarmer sendt til OnCall-integrasjonen i lÞpet av vakten sin. I grafana-alerts-repoet kan du bruke oncall_team-modulen til Ä opprette bÄde en tidsplan og en eskaleringskjede.

Oncall Schedule

Eskaleringskjeder​

Eskaleringskjeder (escalation chains) er instruksjoner til Grafana OnCall om hvordan du skal varsles nÄr den tilkoblede integrasjonen mottar en alarm. Standardoppsettet her er Ä kontakte den tildelte personen pÄ den angitte mÄten i OnCall.

Eskaleringskjeden nedenfor vil kontakte personen som har en tildelt vakt i tidsplanen, pÄ den mÄten de har satt i OnCall. Vanligvis e-post eller Slack-omtaler.

Escalation Chain

I OnCall → Users → rediger bruker kan du bestemme hvordan du vil at eskaleringskjeden skal kontakte deg.

Edit user

Terraform​

Et typisk Grafana OnCall-oppsett for et team ser slik ut:

module "team_oncall" {
source = "../modules/oncall_team"
team_name = "team"
use_schedule = true
}

module "team_integration" {
source = "../modules/oncall_integration"
integration_name = "team"
slack_channel_name = "grafana-oncall" //Not required, replace with your own
vaktlag_enabled = false
default_escalation_chain_id = module.team_oncall.team_escalation_chain_id
}
note

Slack-kanalen mÄ allerede eksistere i Grafana.

Hvis du vil bruke forhÄndsdefinerte brukere i stedet for en tidsplan, mÄ brukerne allerede eksistere i OnCall.

Varslingsregler​

Du mÄ ogsÄ konfigurere varslingsregler (notification policies) for Ä bruke integrasjonen din. Terraform aktiverer ikke kontaktpunktet for integrasjonen ennÄ, sÄ dette mÄ gjÞres manuelt fÞr du legger det til i Terraform (gjÞr dette ved Ä navigere til integrasjonen din og aktivere kontaktpunktet). Legg til kode her.

Eksempel:

policy {
contact_point = "watchdog"
group_by = ["cluster", "alertname"]
matcher {
label = "team"
match = "="
value = "Vaktlag"
}
}

24/7-alarmering​

NÄr du har konfigurert et sett med alarmer, kan det hende du Þnsker at de skal overvÄkes 24/7. Kartverket tilbyr en lÞsning for dette i form av «Vaktlaget». Vaktlaget er et team bestÄende av ulike personer i IT-drift som har en spesialavtale som gjÞr at de kan varsles og fÞlge opp nÄr en alarm utlÞses utenfor normal arbeidstid.

Det fÞrste steget for Ä fÄ alarmene dine onboardet til vaktlaget er Ä vedlikeholde et sett med alarmer som kun utlÞses ved alvorlige driftsforstyrrelser. Husk at en alarm som utlÞses potensielt kan vekke folk midt pÄ natten, sÄ det er avgjÞrende at dette settet med alarmer ikke inneholder ikke-kritiske eller ustabile alarmer. Disse alarmene bÞr gis alvorlighetsgrad «critical» for Ä skille dem fra andre alarmer.

NÄr du har gjort dette, mÄ du kontakte vaktlaget for Ä diskutere alarmene du Þnsker Ä onboarde. De vil vurdere hva som er viktig nok til Ä bli onboardet, og dere ender opp med et sett alarmer som er en god balanse mellom Ä sikre stabiliteten i systemene vÄre og Ä ivareta den mentale helsen til personene pÄ vaktplanen.

Etter at du har diskutert med vaktlaget, kan du kontakte SKOOP i #gen-skoop for Ä fÄ alarmintegrasjonen din koblet over. NÄr dette er gjort, vil alle alarmer merket med env=prod og severity=critical bli sendt til vaktlaget etter fÞlgende tidsplan:

  • Alarmene sendes til Slack-kanalen din hele dagen
  • Alarmene sendes til appdrift som e-post, SMS og telefonsamtale mellom kl. 07 og 22
  • Alarmene sendes til infrastrukturdrift som e-post, SMS og telefonsamtale mellom kl. 22 og 07

Du kan ogsÄ opprette en pull request i grafana-alerts med vaktlag-eskaleringskjeden lagt til integrasjonen din:

module "skip" {
source = "../modules/oncall_integration"
integration_name = "skip"
slack_channel_name = "grafana-oncall" //Not required, replace with your own
vaktlag_enabled = true
vaktlag_escalation_chain_id = module.vaktlag.appdrift_escalation_chain_id
default_escalation_chain_id = module.skip.team_escalation_chain_id
}

NÄr du senere legger til flere alarmer pÄ kritisk nivÄ, mÄ du ogsÄ diskutere med vaktlaget slik at de kan godkjenne de nye alarmene fÞr de legges til.