Runbook: OpenMetadataAPIErrors5xx¶
Alerte : OpenMetadataAPIErrors5xx (PrometheusRule, severity critical)
Symptôme :
OpenMetadata API retourne > 5% de 5xx sur 5 min. Le catalog devient inutilisable depuis le cockpit, Superset, Airflow ingestion.
Severity : 🔴 critical
Diagnostic¶
1. Vérifier les pods¶
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
kubectl get pod -n akko -l app.kubernetes.io/name=openmetadata
# Attendu : openmetadata + openmetadata-ingestion + opensearch
2. Logs serveur OpenMetadata¶
kubectl logs -n akko -l app.kubernetes.io/name=openmetadata --tail=200 | grep -iE "error|exception|500"
3. Vérifier OpenSearch (dépendance critique)¶
kubectl get pod -n akko -l app.kubernetes.io/name=opensearch
kubectl exec -n akko svc/akko-opensearch -- curl -s http://localhost:9200/_cluster/health | jq .
# Expected: "status": "green" ou "yellow"; "red" = problème
4. Vérifier PostgreSQL backend¶
Causes fréquentes + fix¶
| Cause | Symptôme logs | Fix |
|---|---|---|
| OpenSearch down | NoNodeAvailableException |
Restart OpenSearch : kubectl rollout restart sts/akko-opensearch |
| Postgres connection pool plein | Connection timed out |
Bump database.connectionPoolSize dans config |
| Heap OOM | OutOfMemoryError: Java heap space |
Bump resources.limits.memory + -Xmx JVM |
| Keycloak token expire en pod-to-pod | 401 Unauthorized sur webhooks |
Vérifier KC_HOSTNAME_BACKCHANNEL_DYNAMIC=true (L04) |
| Mauvaise DB state après upgrade | relation does not exist |
Relancer le job openmetadata-migrate |
| Jetty header too small | HTTP 431 Request Header Too Large |
Set SERVER_MAX_REQUEST_HEADER_SIZE=64KiB (L07) |
Fix d'urgence (< 5 min)¶
Rolling restart serveur OpenMetadata¶
kubectl rollout restart deploy/akko-openmetadata -n akko
kubectl rollout status deploy/akko-openmetadata -n akko --timeout=300s
Vérifier la santé post-restart¶
kubectl port-forward -n akko svc/akko-openmetadata 8585:8585 &
curl -f http://localhost:8585/api/v1/system/version
# Expected: JSON avec {"version":"1.12.x"}
Fix pérenne (R02)¶
L07 — Jetty header size¶
Dans helm/examples/values-dev.yaml ou values-netcup.yaml :
openmetadata:
extraEnvs:
- name: SERVER_MAX_REQUEST_HEADER_SIZE
value: "65536"
- name: SERVER_MAX_RESPONSE_HEADER_SIZE
value: "65536"
L05 — Config figée en DB au bootstrap¶
OpenMetadata store sa config OIDC en DB au premier boot. Les env vars ne
sont PAS ré-appliquées au restart. Pour reconciler, utiliser le Helm hook
post-install om-oidc-job.yaml qui UPDATE les settings à chaque upgrade.
Vérifier son existence :
Migration DB¶
kubectl get job -n akko openmetadata-migrate -o json | jq .status
# Si pas complete, relancer :
kubectl delete job -n akko openmetadata-migrate
helm upgrade akko helm/akko/ -n akko -f ... --set akko-init.openmetadataMigrate.enabled=true
Prévention¶
- Playwright test @authenticated : alice peut ouvrir catalog.
sans re-login - PrometheusRule précoce : alerter à 2% d'erreurs 5xx, pas 5%
- Probe HTTP(s) dédiée :
- Backup DB OpenMetadata via CronJob S8-D
- OpenSearch resources adequate (>= 512Mi limits, anti-affinity)
Lessons learned¶
- L04 — Split-horizon DNS en k3d →
KC_HOSTNAME_BACKCHANNEL_DYNAMIC=true - L05 — Config OpenMetadata en DB ≠ env vars
- L07 — Jetty header 8KiB trop petit pour JWT Keycloak — bump 64KiB
Liens utiles¶
- Services / OpenMetadata
- Keycloak SSO broken — souvent lié
- logs layer :
{namespace="akko", app="openmetadata"} |= "error"