Skip to main content
HoneyHive exposes Prometheus-format metrics on every application service. This page documents what’s exposed, how to make it discoverable by your existing collection stack, and the headline metrics for each functional area. HoneyHive ships an internal OpenTelemetry Collector and a kube-prometheus-stack that handle in-cluster trace plumbing and bundled dashboards (see Operations Guide). Those components are sized for internal use and aren’t configured to forward hh_* metrics to your observability backend. The expected integration model for that is your platform team’s existing metrics stack: an OpenTelemetry Collector, Prometheus, vmagent, or similar, scrapes HoneyHive’s services and forwards to wherever you collect telemetry today.

What’s exposed

Every HoneyHive application service exposes Prometheus text-format metrics at:
The five services most customers monitor: All five services carry a service_name label on every metric they emit.

Enable ServiceMonitor discovery

The Helm chart ships ServiceMonitor templates for each application service. They are gated by a single flag so installs that don’t run the Prometheus Operator CRDs are unaffected. In your environment’s values.yaml (both control plane and data plane charts), set:
Then helm upgrade as usual. Confirm the resources rendered:
The five services listed in the table above are the ones most customers monitor; the others (controller, notification, dp-backend, pythonmetric) also expose /metrics endpoints and are useful for internal health visibility.
ServiceMonitor is a CRD from the Prometheus Operator. Most Prometheus-compatible scrapers, including vmagent and the OpenTelemetry Collector’s Prometheus receiver via the target_allocator, can discover via ServiceMonitors. If your stack does not use the Prometheus Operator CRDs, leave the flag off and scrape the :9091/metrics endpoints directly using your scraper’s native service discovery.

Pointing your collector at HoneyHive

Two integration shapes cover most environments:
  • Prometheus-Operator CRDs (recommended). If your OpenTelemetry Collector, Prometheus, or vmagent uses the Prometheus Operator’s ServiceMonitor CRD for scrape-target discovery, the resources you enabled above are picked up automatically once your scraper’s serviceMonitorSelector matches the labels in the HoneyHive values. For OpenTelemetry Collector, this is the target_allocator with prometheusCR.enabled: true.
  • Direct Prometheus scrape config. If you don’t use the Operator CRDs, point your collector’s prometheus receiver (or scraper of choice) at HoneyHive’s services directly. Each service is reachable at http://<service>.<namespace>.svc.cluster.local:9091/metrics (see the table above for service names). Kubernetes service discovery filtered by the app.kubernetes.io/* labels HoneyHive sets on each service works equally well.
Either way, the hh_* metrics will appear in whatever backend your collector forwards to: OTLP, Prometheus remote-write, Datadog, etc.

Headline metrics

Each service emits many internal metrics; the tables below list the handful most useful for dashboards and alerts. The full registry for each service is linked at the end of its section if you want to drill in. All series carry a service_name label. Histograms expose _bucket, _count, and _sum series in the usual Prometheus convention; OTLP receivers translate these to OTel histogram data points automatically.

HTTP requests (every service)

Every HoneyHive HTTP service emits the same two HTTP-level metrics via shared middleware. These are the foundation for request-rate, error-rate, and latency-SLO alerts on any endpoint: The route label is the Express route pattern (e.g. /v1/sessions/:session_id or /v1/alerts/:id), not the raw URL: dynamic segments stay parameterized, keeping cardinality bounded. Requests that don’t match any route are recorded as route="unmatched".

Signup, org setup, and admin operations (cp-backend-service)

For account and workspace setup activity, filter hh_http_* by the following route values (under service_name="cp_backend_service"): Example: alert on signup error rate > 1% over 5 minutes:

Ingestion (dp-ingestion-service)

The ingestion service receives SDK events, buffers them, writes them to S3, and publishes to NATS for downstream processing. Headline metrics: Additional metrics covering cache hit ratios, flush behavior, and per-operation S3 and NATS latency are also exported. To see the full list, port-forward to a pod and curl its metrics endpoint:

Trace storage (cp-writer-service)

The writer service consumes from NATS and writes to ClickHouse. S3 writes happen in the ingestion service, not here. Headline metrics: Additional metrics covering NATS batching, buffer flush cadence, retries, and bisect-on-failure behavior are also exported. To see the full list:

Evaluation pipeline (dp-evaluation-service)

The evaluation service pulls jobs off a NATS work queue and processes them. Example: alert on evaluation queue backlog sustained above 1000 pending for 5 minutes:
Example: alert on evaluation job failure rate > 5% over 5 minutes:
Additional annotation-queue lookup metrics (cache hit/miss, filter errors, lookup latency) are also exported. To see the full list:

LLM proxy (dp-llmproxy-service)

The LLM proxy exposes only the standard hh_http_* family. LiteLLM’s native Prometheus instrumentation is intentionally disabled so provider keys and message content never appear in metric labels. Each upstream provider lives at a distinct route, so per-provider error rate and latency fall out of hh_http_* filtered by route. Example: alert on proxy 5xx rate > 10% over 60 seconds:

Contact your HoneyHive support contact if you need help with dashboards, alert thresholds, or recipes for a specific backend.