Appearance
Overvåking
Lumi eksponerer Prometheus-metrikker fra begge tjenester. Denne guiden dekker scrape-konfigurasjon, nøkkelmetrikker, anbefalte alarmer, og logging.
Metrics-endepunkter
| Tjeneste | Endepunkt | Port | Tilgang |
|---|---|---|---|
| API | /internal/prometheus | 8080 | Intern |
| Dashboard | /api/internal/metrics | 3000 | Intern (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/metricsAlternativt 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/metricsNøkkelmetrikker
API (Kotlin/Ktor — Micrometer)
| Metrikk | Type | Beskrivelse |
|---|---|---|
ktor_http_server_requests_seconds_count | counter | Antall forespørsler (labels: method, route, status) |
ktor_http_server_requests_seconds_bucket | histogram | Latens-distribusjon (for percentiler) |
hikaricp_connections_active | gauge | Aktive DB-tilkoblinger |
hikaricp_connections_max | gauge | Maks DB-pool størrelse |
stats_cache_hits_total | counter | Stats cache-treff (Valkey) |
stats_cache_misses_total | counter | Stats cache-bom |
stats_cache_errors_total | counter | Stats cache-feil |
string_cache_hits_total | counter | String cache-treff (Valkey) |
string_cache_misses_total | counter | String cache-bom |
string_cache_errors_total | counter | String cache-feil |
jvm_memory_used_bytes | gauge | JVM heap-bruk |
jvm_gc_pause_seconds_sum | counter | Total GC-pausetid |
process_uptime_seconds | gauge | Oppetid |
Dashboard (Node.js — prom-client)
| Metrikk | Type | Beskrivelse |
|---|---|---|
nodejs_eventloop_lag_seconds | gauge | Event loop forsinkelse |
nodejs_heap_size_used_bytes | gauge | Heap-bruk |
process_cpu_seconds_total | counter | CPU-bruk |
process_uptime_seconds | gauge | Oppetid |
Anbefalte alarmer
Eksemplene bruker
job="lumi-api"ogjob="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
maximumPoolSizei 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:
- Åpne Grafana → Dashboards → New → Import
- Last opp
grafana-dashboard.json(finnes idocs/deployment/i repoet) - Velg Prometheus-datakilde
- 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": "[email protected]"
}MDC-felt inkludert automatisk:
callId— fraX-Correlation-IdellerX-Request-IdheaderuserId— 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
- Promtail → Loki — Hvis du bruker Grafana Loki for loggaggregering
Loggnivåer
| Nivå | API (logback.xml) | Dashboard (LUMI_LOG_LEVEL) |
|---|---|---|
| ERROR | Uventede feil, ubehandlede exceptions | Samme |
| WARN | Auth-feil, CSRF-avvisninger, rate limiting | Samme |
| INFO | Forespørsler, opprettelser, nøkkelrotasjon | Samme |
| DEBUG | Token refresh, cache-operasjoner | Detaljert request info |
Sett loggnivå via miljøvariabel:
- API: Konfigurer i
logback.xml(root level) - Dashboard:
LUMI_LOG_LEVEL=debug(default:info)
