Aller au contenu

Métriques Prometheus

OpenClaw peut exposer des métriques de diagnostic via le plugin officiel OpenClawdiagnostics-prometheus. Il écoute les diagnostics de confiance ainsi que les événements de stabilité de la passerelle émis par le cœur, puis fournit un point de terminaison texte Prometheus à l’adresse suivante :

GET /api/diagnostics/prometheus

Le type de contenu est text/plain; version=0.0.4; charset=utf-8, le format d’exposition standard Prometheus.

Pour les traces, les journaux, le push OTLP et les attributs sémantiques GenAI d’OpenTelemetry, consultez la section Export OpenTelemetry.

  1. Installer le plugin

    Fenêtre de terminal
    openclaw plugins install clawhub:@openclaw/diagnostics-prometheus
  2. Activer le plugin

    {
    plugins: {
    allow: ["diagnostics-prometheus"],
    entries: {
    "diagnostics-prometheus": { enabled: true },
    },
    },
    diagnostics: {
    enabled: true,
    },
    }
  3. Redémarrer le Gateway

    La route HTTP est enregistrée au démarrage du plugin, rechargez donc après l’avoir activé.

  4. Scraping de la route protégée

    Envoyez la même authentification passerelle que vos clients opérateurs utilisent :

    Fenêtre de terminal
    curl -H "Authorization: Bearer $OPENCLAW_GATEWAY_TOKEN" \
    http://127.0.0.1:18789/api/diagnostics/prometheus
  5. Connecter Prometheus

    prometheus.yml
    scrape_configs:
    - job_name: openclaw
    scrape_interval: 30s
    metrics_path: /api/diagnostics/prometheus
    authorization:
    credentials_file: /etc/prometheus/openclaw-gateway-token
    static_configs:
    - targets: ["openclaw-gateway:18789"]

MétriqueTypeLabels
openclaw_run_completed_totalcompteurchannel, model, outcome, provider, trigger
openclaw_run_duration_secondshistogrammechannel, model, outcome, provider, trigger
openclaw_model_call_totalcompteurapi, error_category, model, outcome, provider, transport
openclaw_model_call_duration_secondshistogramapi, error_category, model, outcome, provider, transport
openclaw_model_failover_totalcounterfrom_model, from_provider, lane, reason, suspended, to_model, to_provider
openclaw_model_tokens_totalcompteuragent, channel, model, provider, token_type
openclaw_gen_ai_client_token_usagehistogrammemodel, provider, token_type
openclaw_model_cost_usd_totalcounteragent, channel, model, provider
openclaw_skill_used_totalcompteuractivation, agent, skill, source
openclaw_tool_execution_totalcountererror_category, outcome, params_kind, tool, tool_owner, tool_source
openclaw_tool_execution_duration_secondshistogramerror_category, outcome, params_kind, tool, tool_owner, tool_source
openclaw_tool_execution_blocked_totalcounterdenied_reason, params_kind, tool, tool_owner, tool_source
openclaw_harness_run_totalcompteurchannel, error_category, harness, model, outcome, phase, plugin, provider
openclaw_harness_run_duration_secondshistogramchannel, error_category, harness, model, outcome, phase, plugin, provider
openclaw_webhook_received_totalcompteurchannel, webhook
openclaw_webhook_error_totalcounterchannel, webhook
openclaw_webhook_duration_secondshistogramchannel, webhook
openclaw_message_received_totalcounterchannel, source
openclaw_message_dispatch_started_totalcompteurchannel, source
openclaw_message_dispatch_completed_totalcompteurchannel, outcome, reason, source
openclaw_message_dispatch_duration_secondshistogramchannel, outcome, reason, source
openclaw_message_processed_totalcounterchannel, outcome, reason
openclaw_message_processed_duration_secondshistogrammechannel, outcome, reason
openclaw_message_delivery_started_totalcounterchannel, delivery_kind
openclaw_message_delivery_totalcounterchannel, delivery_kind, error_category, outcome
openclaw_message_delivery_duration_secondshistogrammechannel, delivery_kind, error_category, outcome
openclaw_talk_event_totalcompteurbrain, event_type, mode, provider, transport
openclaw_talk_event_duration_secondshistogrambrain, event_type, mode, provider, transport
openclaw_talk_audio_byteshistogrambrain, event_type, mode, provider, transport
openclaw_queue_lane_sizegaugelane
openclaw_queue_lane_wait_secondshistogrammelane
openclaw_session_state_totalcounterreason, state
openclaw_session_queue_depthgaugestate
openclaw_session_turn_created_totalcompteuragent, channel, trigger
openclaw_session_stuck_totalcompteurreason, state
openclaw_session_stuck_age_secondshistogramreason, state
openclaw_session_recovery_totalcounteraction, active_work_kind, state, status
openclaw_session_recovery_age_secondshistogramaction, active_work_kind, state, status
openclaw_liveness_warning_totalcounterreason
openclaw_liveness_sessionsgaugestate
openclaw_liveness_event_loop_delay_p99_secondshistogramreason
openclaw_liveness_event_loop_delay_max_secondshistogramreason
openclaw_liveness_event_loop_utilization_ratiohistogramreason
openclaw_liveness_cpu_core_ratiohistogramreason
openclaw_payload_large_totalcounteraction, channel, plugin, reason, surface
openclaw_payload_large_byteshistogramaction, channel, plugin, reason, surface
openclaw_memory_bytesjaugekind
openclaw_memory_rss_byteshistogramaucun
openclaw_memory_pressure_totalcounterlevel, reason
openclaw_telemetry_exporter_totalcounterexporter, reason, signal, status
openclaw_prometheus_series_dropped_totalcounteraucun
Étiquettes bornées et de faible cardinalité

Les étiquettes Prometheus restent bornées et de faible cardinalité. L’exportateur n’émet pas d’identifiants de diagnostic bruts tels que runId, sessionKey, sessionId, callId, toolCallId, les ID de message, les ID de chat ou les ID de requête de fournisseur.

Les valeurs des étiquettes sont masquées et doivent correspondre à la politique de caractères de faible cardinalité d’OpenClaw. Les valeurs qui ne respectent pas la politique sont remplacées par unknown, other ou none, selon la métrique. Les étiquettes qui ressemblent à des clés de session d’agent délimitées sont également remplacées par unknown.

Limite de série et comptabilité des dépassements

L’exporteur limite les séries chronologiques retenues en mémoire à 2048 séries, tous compteurs, jauges et histogrammes combinés. Les nouvelles séries dépassant cette limite sont ignorées, et openclaw_prometheus_series_dropped_total augmente de un à chaque fois.

Surveillez ce compteur comme un signal fort indiquant qu’un attribut en amont fuit des valeurs à forte cardinalité. L’exporteur ne relève jamais automatiquement la limite ; s’il augmente, corrigez la source plutôt que de désactiver la limite.

Ce qui n'apparaît jamais dans la sortie Prometheus
  • texte de l’invite, texte de la réponse, entrées du tool, sorties du tool, invites système
  • transcriptions de conversation, charges audio, identifiants d’appel, identifiants de salle, jetons de transfert, identifiants de tour et identifiants de session bruts
  • identifiants de demande de fournisseur bruts (uniquement des hachages bornés, le cas échéant, sur les spans — jamais sur les métriques)
  • clés de session et identifiants de session
  • noms d’hôte, chemins de fichiers, valeurs secrètes
# Tokens per minute, split by provider
sum by (provider) (rate(openclaw_model_tokens_total[1m]))
# Spend (USD) over the last hour, by model
sum by (model) (increase(openclaw_model_cost_usd_total[1h]))
# 95th percentile model run duration
histogram_quantile(
0.95,
sum by (le, provider, model)
(rate(openclaw_run_duration_seconds_bucket[5m]))
)
# Queue wait time SLO (95p under 2s)
histogram_quantile(
0.95,
sum by (le, lane) (rate(openclaw_queue_lane_wait_seconds_bucket[5m]))
) < 2
# Skill usage, split by bounded source
sum by (skill, source) (increase(openclaw_skill_used_total[24h]))
# Dropped Prometheus series (cardinality alarm)
increase(openclaw_prometheus_series_dropped_total[15m]) > 0

Choisir entre l’exportation Prometheus et OpenTelemetry

Section intitulée « Choisir entre l’exportation Prometheus et OpenTelemetry »

OpenClaw prend en charge les deux surfaces indépendamment. Vous pouvez en exécuter une, les deux, ou aucune.

  • modèle Pull : Prometheus récupère /api/diagnostics/prometheus.
  • Aucun collecteur externe requis.
  • Authentifié via l’authentification normale du Gateway.
  • La surface contient uniquement des métriques (pas de traces ni de journaux).
  • Idéal pour les piles déjà standardisées sur Prometheus + Grafana.
Corps de réponse vide
  • Vérifiez diagnostics.enabled: true dans la configuration.
  • Confirmez que le plugin est activé et chargé avec openclaw plugins list --enabled.
  • Générez du trafic ; les compteurs et les histogrammes n’émettent des lignes qu’après au moins un événement.
401 / non autorisé

Le point de terminaison nécessite la portée d’opérateur du Gateway (auth: "gateway" avec gatewayRuntimeScopeSurface: "trusted-operator"). Utilisez le même jeton ou mot de passe que Prometheus utilise pour toute autre route d’opérateur du Gateway. Il n’y a pas de mode public non authentifié.

`openclaw_prometheus_series_dropped_total` augmente

Un nouvel attribut dépasse la limite de 2048 séries. Inspectez les métriques récentes pour trouver un label avec une cardinalité inattendument élevée et corrigez-le à la source. L’exporteur abandonne intentionnellement les nouvelles séries au lieu de réécrire silencieusement les labels.

Prometheus affiche des séries obsolètes après un redémarrage

Le plugin ne conserve l’état qu’en mémoire. Après un redémarrage du Gateway, les compteurs sont réinitialisés à zéro et les jauges redémarrent à leur prochaine valeur rapportée. Utilisez le PromQL rate() et increase() pour gérer les réinitialisations proprement.