Bruk ved etablering eller forbedring av observability i syfo-budstikka: Micrometer-metrikker og PrometheusMeterRegistry i Ktor, MicrometerMetrics-plugin, /internal/isalive|isready|prometheus, strukturert JSON-logging med trace_id/callId, korrelasjons-ID (Nav-Callid/x_request_id), OpenTelemetry-tracing, PromQL/LogQL, Grafana-dashboards og Prometheus-alerts i NAIS — eller når noen sier /observability-setup.
Installation
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Bruk ved etablering eller forbedring av observability i syfo-budstikka: Micrometer-metrikker og PrometheusMeterRegistry i Ktor, MicrometerMetrics-plugin, /internal/isalive|isready|prometheus, strukturert JSON-logging med trace_id/callId, korrelasjons-ID (Nav-Callid/x_request_id), OpenTelemetry-tracing, PromQL/LogQL, Grafana-dashboards og Prometheus-alerts i NAIS — eller når noen sier /observability-setup.
Observability i syfo-budstikka
Ktor 3.x på Netty, pakke no.nav.syfo, kjører i NAIS. Hold hovedreglene her korte — bruk references/ for fullstendige eksempler.
Metrikker forteller hva som skjer
Logger forklarer hvorfor det skjedde
Traces viser hvor i flyten det skjedde
Verifiser alltid eksisterende oppsett i repoet før du legger til nye målepunkter, labels eller varsler
Arbeidsflyt
Les NAIS-manifestet, src/main/resources/application.yaml, logback.xml og build.gradle.kts/gradle/libs.versions.toml for eksisterende observability-oppsett.
Finn etablerte mønstre for MicrometerMetrics, MeterRegistry-injeksjon (Koin), CallId/CallLogging, MDC-felt og health-routes.
Verifiser hvilke endepunkter NAIS faktisk scraper og prober mot: /internal/isalive, /internal/isready, /internal/prometheus (eller /internal/metrics). Stiene i koden må matche manifestet.
Start med standardmetrikker (Ktor HTTP-server + JVM) og utvid med domenemetrikker som gir operativ verdi.
Legg til dashboards og varsler først når metrikkene og label-settet er stabile.
Metrikker i Ktor (Micrometer)
Ktor har ingen Actuator. Opprett PrometheusMeterRegistry selv, installer MicrometerMetrics-pluginen, og eksponer registry-scrapet på en intern route. Hent samme registry videre via Koin der du måler domenehendelser.
MicrometerMetrics gir automatisk ktor_http_server_requests_seconds (count/sum/bucket) med tags for route, method og status.
Bruk distributionStatisticConfig med percentilesHistogram(true) hvis du trenger p95/p99 fra Prometheus.
liveness (/internal/isalive) skal være enkel og bare svare på om prosessen bør restartes. readiness (/internal/isready) skal avhenge av faktiske avhengigheter (Postgres-pool, Kafka-consumer) — men hold logikken lett.
Se references/micrometer.md for Counter/Timer/Gauge/DistributionSummary, Koin-injeksjon, domene- og Kafka-metrikker.
Navngivning for metrikker og labels
Metrikker
Bruk snake_case (Prometheus-konvensjon; Micrometer punkt-navn blir automatisk snake_case)
Bruk enhetssuffiks når det er relevant: _seconds, _bytes
Countere skal ha suffikset _total
Bruk navn som beskriver domenet, ikke camelCase eller miljøspesifikke navn
NAIS-label-konvensjoner
NAIS legger automatisk på et sett labels. Ikke dupliser disse på egne metrikker — bruk dem i queries, dashboards og varsler:
app — applikasjonsnavn fra NAIS-manifestet (syfo-budstikka)
team / namespace — eierskap og Kubernetes-namespace, brukes til alert-ruting
Foretrekk normaliserte route-verdier (/api/oppgaver/{id}), ikke ekspanderte path-parametre
Hver unik label-kombinasjon er en ny tidsserie: legg bare til labels som faktisk brukes i dashboards, varsler eller feilsøking
Korrelasjons-ID i NAV-stacken
Korrelasjons-ID lar deg følge en forespørsel på tvers av tjenester, Kafka-meldinger og logger. Repoet bruker allerede CallId/CallLogging (se kotlin-ktor-skillen) — bygg videre på det, ikke parallelt.
Headers
Nav-Callid — NAV-konvensjon; les inn og propager på alle utgående HTTP-kall og Kafka-headere
X-Request-Id / X-Correlation-ID — aksepter som fallback for eksterne integrasjoner
W3C traceparent — settes automatisk av OpenTelemetry-agenten i NAIS
Legg callId og trace_id på MDC slik at logback-encoderen automatisk får dem på alle logger i request-scope. Med OpenTelemetry-agenten kan du hente aktiv trace:
Inkluder trace_id, span_id og callId i loggene slik at Loki kan korrelere med Tempo (klikkbare trace-IDer i Grafana).
Logging og tracing
Logg strukturert JSON til stdout — NAIS-loki henter automatisk. Ikke skriv til fil.
Bruk logstash-logback-encoder med LogstashEncoder/net.logstash.logback.encoder i logback.xml; legg domenedata som strukturerte felt via StructuredArguments.kv(...), ikke via streng-interpolasjon.
Ikke bruk logging som erstatning for metrikker — metrikker svarer på frekvens, volum og varighet.
Bruk tracing for request-kjeder, Kafka-flyt og kall mot Postgres eller eksterne tjenester. Aktiver OpenTelemetry auto-instrumentation i NAIS før du legger til manuelle spans.
JSON-format for NAIS-loki
Én JSON-linje per logg på stdout. Felter Loki parser og indekserer:
Minimumsfelt: @timestamp, level, message. Legg domenedata i top-level felt (ikke nøstet under context). Automatiske Loki-labels (app, namespace, cluster, container, pod, stream) skal ikke dupliseres i payloaden. Aldri fnr, aktør-id, tokens eller andre særlige kategorier personopplysninger i loggen.
Grafana-dashboards for syfo-budstikka
Appen bør ha ett dashboard med disse panelene som baseline. Bruk app, namespace og cluster som template-variabler.