Skip to content

Metrics & Dashboards

OpenTelemetry Metrics & Traces

New in v2.0

Native OpenTelemetry support is available in the v2 API.

Native OpenTelemetry Support

Locust 2.x includes native OpenTelemetry support, which the operator can configure automatically. This provides both metrics and distributed tracing without requiring the metrics exporter sidecar.

Configuring OTel

Enable OpenTelemetry in your LocustTest CR:

apiVersion: locust.io/v2
kind: LocustTest
metadata:
  name: otel-test
spec:
  image: locustio/locust:2.43.3
  master:
    command: "--locustfile /lotest/src/test.py --host https://example.com"
  worker:
    command: "--locustfile /lotest/src/test.py"
    replicas: 5
  observability:
    openTelemetry:
      enabled: true
      endpoint: "http://otel-collector.monitoring:4317"
      protocol: "grpc"

See Advanced Topics - OpenTelemetry for detailed configuration options.

OTel Collector Setup

For a complete observability setup, deploy an OTel Collector. Example configuration:

# otel-collector-config.yaml
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318

exporters:
  prometheus:
    endpoint: 0.0.0.0:8889
  otlphttp:
    endpoint: http://jaeger-collector:4318
    tls:
      insecure: true

service:
  pipelines:
    metrics:
      receivers: [otlp]
      exporters: [prometheus]
    traces:
      receivers: [otlp]
      exporters: [otlphttp]

Tip

The Helm chart includes an optional OTel Collector deployment. Enable it with otelCollector.enabled: true.


Operator Metrics

The Go operator can expose controller-runtime metrics (disabled by default). When enabled, metrics are served on the configured port (default: 8080):

MetricDescription
controller_runtime_reconcile_totalTotal reconciliations
controller_runtime_reconcile_errors_totalReconciliation errors
controller_runtime_reconcile_time_secondsReconciliation duration
workqueue_depthCurrent queue depth
workqueue_adds_totalItems added to queue

These metrics can be scraped by Prometheus using the standard /metrics endpoint on the operator pod.

Enabling Operator Metrics

Enable metrics in your Helm values:

metrics:
  enabled: true

Then configure Prometheus to scrape the operator:

scrape_configs:
  - job_name: 'locust-operator'
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_label_app_kubernetes_io_name]
        action: keep
        regex: locust-k8s-operator
      - source_labels: [__address__]
        action: replace
        regex: ([^:]+)(?::\d+)?
        replacement: $1:8080
        target_label: __address__

ServiceMonitor (Prometheus Operator)

If using the Prometheus Operator, create a ServiceMonitor to automatically discover and scrape operator metrics:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: locust-operator-metrics
  namespace: locust-operator-system
  labels:
    app.kubernetes.io/name: locust-k8s-operator
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: locust-k8s-operator
  endpoints:
    - port: metrics
      path: /metrics
      interval: 30s

Ensure Helm values have:

metrics:
  enabled: true
  secure: false  # HTTP metrics

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: locust-operator-metrics
  namespace: locust-operator-system
  labels:
    app.kubernetes.io/name: locust-k8s-operator
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: locust-k8s-operator
  endpoints:
    - port: metrics
      path: /metrics
      interval: 30s
      scheme: https
      bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
      tlsConfig:
        insecureSkipVerify: true  # For development only

Ensure Helm values have:

metrics:
  enabled: true
  secure: true  # Enable HTTPS metrics (default: false)

Production TLS

For production, use cert-manager to manage TLS certificates instead of insecureSkipVerify: true. See the operator's config/prometheus/ directory for examples.

Operator Metrics Queries

Useful PromQL queries for operator monitoring:

# Reconciliation rate (per second)
rate(controller_runtime_reconcile_total[5m])

# Reconciliation error rate
rate(controller_runtime_reconcile_errors_total[5m])

# Average reconciliation duration
rate(controller_runtime_reconcile_time_seconds_sum[5m]) 
  / rate(controller_runtime_reconcile_time_seconds_count[5m])

# Current workqueue depth
workqueue_depth

# Queue processing rate
rate(workqueue_adds_total[5m])

Locust Test Metrics

Two Metrics Approaches - Choose One

The operator provides two mutually exclusive methods for collecting Locust test metrics:

1. Prometheus Exporter Sidecar (default, v1 & v2 API)

  • Uses containersol/locust_exporter sidecar on port 9646
  • Exposes Prometheus-formatted metrics
  • Works with Prometheus scraping
  • Documented in this section below

2. Native OpenTelemetry (v2 API only)

When OTel is enabled, the exporter sidecar is NOT deployed. All Prometheus exporter documentation below only applies to non-OTel mode.

Metrics Exporter Sidecar (Non-OTel Mode)

When OpenTelemetry is not enabled, the operator automatically injects a Prometheus metrics exporter sidecar into the Locust master pod. This exporter scrapes Locust's built-in stats endpoint and exposes metrics in Prometheus format.

What the Operator Creates Automatically:

  1. Metrics Exporter Sidecar Container:
  2. Image: containersol/locust_exporter:v0.5.0
  3. Port: 9646
  4. Path: /metrics

  5. Kubernetes Service: <test-name>-master

  6. Includes metrics port 9646
  7. Provides stable DNS endpoint

  8. Pod Annotations (for Prometheus auto-discovery):

    prometheus.io/scrape: "true"
    prometheus.io/path: "/metrics"
    prometheus.io/port: "9646"
    

No manual setup required - the operator handles everything.

Available Locust Metrics

The exporter provides these key metrics from Locust:

MetricTypeDescription
locust_requests_totalCounterTotal number of requests
locust_requests_current_rpsGaugeCurrent requests per second
locust_requests_current_fail_per_secGaugeCurrent failures per second
locust_requests_avg_response_timeGaugeAverage response time (ms)
locust_requests_min_response_timeGaugeMinimum response time (ms)
locust_requests_max_response_timeGaugeMaximum response time (ms)
locust_requests_avg_content_lengthGaugeAverage response size (bytes)
locust_usersGaugeCurrent number of simulated users
locust_errorsCounterTotal errors by type

For the complete list, see the locust_exporter documentation.

Locust Metrics Queries

Useful PromQL queries for load test monitoring:

# Total request rate across all endpoints
sum(rate(locust_requests_total[1m]))

# Error rate
sum(rate(locust_errors[1m]))

# Average response time
avg(locust_requests_avg_response_time)

# Max response time (locust_exporter exposes gauges, not histograms)
max(locust_requests_max_response_time)

# Current active users
sum(locust_users)

# Request rate by endpoint
sum(rate(locust_requests_total[1m])) by (name, method)

# Error percentage
100 * sum(rate(locust_errors[1m])) 
  / sum(rate(locust_requests_total[1m]))

Integration Examples

The metrics are automatically exposed by the operator-created Service and pod annotations. Simply configure your monitoring tools to discover them:

Prometheus: Configure Kubernetes service discovery to scrape pods with prometheus.io/scrape: "true" annotation. The operator adds these annotations automatically - no manual configuration of individual tests needed.

Grafana: Connect to your Prometheus datasource and create dashboards using the PromQL queries above. Import panels from existing Locust dashboard examples.

NewRelic: Deploy a Prometheus agent configured to scrape Kubernetes pods with prometheus.io/scrape: true and forward metrics to NewRelic. See Issue #118 for production deployment patterns.

DataDog: Configure the DataDog agent's Prometheus integration to auto-discover and scrape pods with prometheus.io/* annotations. The DataDog agent automatically finds operator-created test pods.

Production Deployment

For large-scale deployments, see Issue #118 which documents production patterns used with thousands of tests in NewRelic and DataDog environments.