Turn on metrics
Metrics are off by default. SetOVR_METRICS_PORT on both the web app and the worker, and each serves its metrics at /metrics on that port.
The metrics port is separate from the dashboard’s, so it isn’t exposed through your ingress or load balancer. If the port can’t be used, OVR logs an error and keeps running without metrics.
With Helm, set
metrics.enabled:
networkPolicy.enabled, the chart allows traffic to the metrics port. Set networkPolicy.metrics.from to only allow your monitoring tool.
Collect metrics
Prometheus
With the Prometheus Operator or kube-prometheus-stack, the chart can create the scrape config, alerting rules, and a Grafana dashboard:
Without the Operator, add a scrape job for port
9464 on the web and worker. The chart also adds prometheus.io/scrape annotations to both pods, for setups that discover targets that way. The alerting rules can be added to your rule_files.
Grafana
Import the OVR dashboard and pick your Prometheus data source. It covers build throughput and success rate, queue backlogs, capture times, and worker memory.Datadog
The Datadog Agent collects the metrics with its OpenMetrics check. On Kubernetes, add an autodiscovery annotation to each pod:ovr. namespace, for example ovr.builds_finished.count. Outside Kubernetes, add the same instance to the Agent’s openmetrics.d/conf.yaml.
Other tools
Point any tool that reads Prometheus or OpenMetrics endpoints at port9464 on the web app and the worker, for example Grafana Alloy’s prometheus.scrape or the OpenTelemetry Collector’s prometheus receiver.
Available metrics
Scrape both the web app and the worker. Counters and histograms add up across instances, sosum them. Gauges marked deployment-wide report the same value from every web replica, so use max to avoid counting them more than once.
Builds
Finish reasons
Queues
Snapshots
Workers and web app
Autoscale workers
With Prometheus and KEDA, you can scale workers on the number of snapshot captures waiting to start. This replaces the chart’s default Redis trigger, and works with the defaultround-robin capture queue policy: