Skip to content

Overvåking

Lumi eksponerer Prometheus-metrikker fra begge tjenester. Denne guiden dekker scrape-konfigurasjon, nøkkelmetrikker, anbefalte alarmer, og logging.

Metrics-endepunkter

TjenesteEndepunktPortTilgang
API/internal/prometheus8080Intern
Dashboard/api/internal/metrics3000Intern (blokkert for ingress)

Prometheus scrape-konfigurasjon

yaml
scrape_configs:
  - job_name: lumi-api
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_label_app_kubernetes_io_name]
        regex: lumi
        action: keep
      - source_labels: [__meta_kubernetes_pod_label_app_kubernetes_io_component]
        regex: api
        action: keep
      - source_labels: [__meta_kubernetes_namespace]
        target_label: namespace
    metrics_path: /internal/prometheus

  - job_name: lumi-dashboard
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_label_app_kubernetes_io_name]
        regex: lumi
        action: keep
      - source_labels: [__meta_kubernetes_pod_label_app_kubernetes_io_component]
        regex: dashboard
        action: keep
      - source_labels: [__meta_kubernetes_namespace]
        target_label: namespace
    metrics_path: /api/internal/metrics

Alternativt med statisk konfigurasjon (Docker Compose):

yaml
scrape_configs:
  - job_name: lumi-api
    static_configs:
      - targets: ['lumi-api:8080']
    metrics_path: /internal/prometheus

  - job_name: lumi-dashboard
    static_configs:
      - targets: ['lumi-dashboard:3000']
    metrics_path: /api/internal/metrics

Nøkkelmetrikker

API (Kotlin/Ktor — Micrometer)

MetrikkTypeBeskrivelse
ktor_http_server_requests_seconds_countcounterAntall forespørsler (labels: method, route, status)
ktor_http_server_requests_seconds_buckethistogramLatens-distribusjon (for percentiler)
hikaricp_connections_activegaugeAktive DB-tilkoblinger
hikaricp_connections_maxgaugeMaks DB-pool størrelse
stats_cache_hits_totalcounterStats cache-treff (Valkey)
stats_cache_misses_totalcounterStats cache-bom
stats_cache_errors_totalcounterStats cache-feil
string_cache_hits_totalcounterString cache-treff (Valkey)
string_cache_misses_totalcounterString cache-bom
string_cache_errors_totalcounterString cache-feil
jvm_memory_used_bytesgaugeJVM heap-bruk
jvm_gc_pause_seconds_sumcounterTotal GC-pausetid
process_uptime_secondsgaugeOppetid

Dashboard (Node.js — prom-client)

MetrikkTypeBeskrivelse
nodejs_eventloop_lag_secondsgaugeEvent loop forsinkelse
nodejs_heap_size_used_bytesgaugeHeap-bruk
process_cpu_seconds_totalcounterCPU-bruk
process_uptime_secondsgaugeOppetid

Anbefalte alarmer

Eksemplene bruker job="lumi-api" og job="lumi-dashboard". Erstatt med dine egne Prometheus job-navn.

Kritisk

API nede

promql
up{job="lumi-api"} == 0
  • Terskel: 1 minutt
  • Betydning: API-tjenesten svarer ikke på helsesjekk
  • Tiltak: Sjekk pod-status (kubectl get pods), logg (kubectl logs), og events (kubectl describe pod)

Dashboard nede

promql
up{job="lumi-dashboard"} == 0
  • Terskel: 1 minutt
  • Tiltak: Samme som API nede

Advarsel

Høy feilrate (>5% 5xx)

promql
rate(ktor_http_server_requests_seconds_count{job="lumi-api", status=~"5.."}[5m])
  / rate(ktor_http_server_requests_seconds_count{job="lumi-api"}[5m])
  > 0.05
  • Terskel: 5% over 5 minutter
  • Betydning: Mer enn 1 av 20 forespørsler feiler
  • Tiltak: Sjekk API-logg for feilmeldinger. Vanlige årsaker: database nede, konfigurasjonsfeil, minneproblemer

Treg responstid (p95 >2s)

promql
histogram_quantile(0.95, sum(rate(ktor_http_server_requests_seconds_bucket{job="lumi-api"}[5m])) by (le))
  > 2
  • Terskel: p95 > 2 sekunder over 5 minutter
  • Betydning: 5% av forespørslene tar mer enn 2 sekunder
  • Tiltak: Sjekk DB connection pool, cache hit rate, og GC-pauser

DB connection pool nær kapasitet (>80%)

promql
hikaricp_connections_active{job="lumi-api"}
  / hikaricp_connections_max{job="lumi-api"}
  > 0.8
  • Terskel: 80% over 5 minutter
  • Betydning: Databasen nærmer seg tilkoblingsgrensen
  • Tiltak: Vurder å øke maximumPoolSize i HikariCP-konfigurasjonen, eller undersøk trege queries

Cache-feil

promql
(rate(stats_cache_errors_total{job="lumi-api"}[5m]) + rate(string_cache_errors_total{job="lumi-api"}[5m])) > 0
  • Terskel: Enhver feil
  • Betydning: Valkey/Redis-tilkobling feiler
  • Tiltak: Sjekk Valkey-status og nettverkstilkobling

Merk

Dashboard-tjenesten (Node.js) har kun standard prom-client-metrikker (event loop, heap, GC). Egendefinerte metrikker (sesjoner, auth-feil, server function-latens) er ikke instrumentert i v1. Vurder å legge til disse ved behov.

Grafana dashboard

En ferdig dashboard-fil kan importeres direkte i Grafana:

  1. Åpne Grafana → DashboardsNewImport
  2. Last opp grafana-dashboard.json (finnes i docs/deployment/ i repoet)
  3. Velg Prometheus-datakilde
  4. Klikk Import

Dashboardet inkluderer 4 rader: Oversikt, Latency, Infrastruktur, og Lumi-spesifikke metrikker.

Logging

API (Kotlin)

Structured JSON logging via Logstash encoder. Alle loggmeldinger skrives til stdout som JSON:

json
{
  "timestamp": "2026-04-02T12:00:00.000Z",
  "level": "INFO",
  "logger": "no.lumi.routes.SetupRoutes",
  "message": "Created organization slug=my-company",
  "service": "lumi-api",
  "callId": "abc-123",
  "userId": "user@example.com"
}

MDC-felt inkludert automatisk:

  • callId — fra X-Correlation-Id eller X-Request-Id header
  • userId — fra autentisert bruker

Dashboard (Node.js)

Structured JSON logging via pino:

json
{
  "level": 30,
  "time": "2026-04-02T12:00:00.000Z",
  "service": "lumi-dashboard",
  "msg": "OIDC token refresh failed",
  "err": { "type": "TokenError", "message": "..." }
}

Logg-shipping

Begge tjenester skriver til stdout. Anbefalt oppsett:

  • Fluentd / Fluent Bit — Kubernetes DaemonSet som samler stdout-logger
  • Vector — Moderne alternativ til Fluentd
  • PromtailLoki — Hvis du bruker Grafana Loki for loggaggregering

Loggnivåer

NivåAPI (logback.xml)Dashboard (LUMI_LOG_LEVEL)
ERRORUventede feil, ubehandlede exceptionsSamme
WARNAuth-feil, CSRF-avvisninger, rate limitingSamme
INFOForespørsler, opprettelser, nøkkelrotasjonSamme
DEBUGToken refresh, cache-operasjonerDetaljert request info

Sett loggnivå via miljøvariabel:

  • API: Konfigurer i logback.xml (root level)
  • Dashboard: LUMI_LOG_LEVEL=debug (default: info)

Lumi Analytics — bygget på navikt/lumi (MIT-lisens)