Metrics & Observability
Metrics and Observability
This guide explains how to expose Prometheus metrics, what metrics exist, and how to build dashboards and alerts for Nexus GSLB.
Enable Prometheus endpoint Add to
/etc/gslb/config.yaml:
metrics:
enablePrometheus: true
listenAddr: "0.0.0.0"
port: 9090
The endpoint is served at
http://<listenAddr>:<port>/metrics and exports
Prometheus text format.
Constant labels
- All metrics include
clusterandnodeconstant labels whencluster.idand/ornode.idare set.
Key metrics (namespace: gslbd)
- DNS
gslbd_dns_requests_total
- GitOps
gslbd_gitops_fetch_total{result}gslbd_gitops_verify_total{result}gslbd_gitops_apply_total{result}gslbd_gitops_last_apply_info{sha,signer}value 1 for last applied commit
- State sync (NATS/JetStream)
gslbd_state_nats_connected(0/1)gslbd_state_nats_published_total{type}gslbd_state_nats_received_total{type}gslbd_state_kv_put_total{bucket,result}gslbd_state_kv_get_total{bucket,result}gslbd_state_merge_lag_ms(histogram)gslbd_state_active_members(gauge)
- Health
gslbd_health_endpoints_total{family}— total endpoints by IP family (v4/v6)gslbd_health_endpoints_healthy{family}— healthy endpoints by familygslbd_pool_members_total{pool_id}— total tracked members per poolgslbd_pool_members_healthy{pool_id}— healthy members per pool; alert when this drops to 0gslbd_health_failover_detection_seconds{direction}(histogram) — Layer 1 failover detection latency per state transition.direction="down"= healthy→unhealthy;direction="up"= recovery. Use this to verify yourcheckIntervalis achieving the detection speed you expect.
- DNS
gslbd_dns_requests_totalgslbd_dns_query_duration_seconds(histogram) — end-to-end DNS handler latency
Scrape configuration example
scrape_configs:
- job_name: 'gslbd'
scrape_interval: 15s
static_configs:
- targets: ['gslbd-hostname:9090']
Grafana dashboard
- Suggested panels:
- DNS RPS:
rate(gslbd_dns_requests_total[1m]). - DNS p99 latency:
histogram_quantile(0.99, sum(rate(gslbd_dns_query_duration_seconds_bucket[5m])) by (le)). - NATS connectivity:
gslbd_state_nats_connected. - Merge lag p95:
histogram_quantile(0.95, sum(rate(gslbd_state_merge_lag_ms_bucket[5m])) by (le,cluster,node)). - Pool health:
gslbd_pool_members_healthyandgslbd_pool_members_totalper pool — heatmap or bar chart. - Failover detection p95:
histogram_quantile(0.95, sum(rate(gslbd_health_failover_detection_seconds_bucket[15m])) by (le, direction))— shows how quickly the daemon is confirming state changes. - Active members over time:
gslbd_state_active_members.
- DNS RPS:
Example alerts
groups:
- name: gslbd
rules:
- alert: GslbdNATSDisconnected
expr: gslbd_state_nats_connected == 0
for: 2m
labels:
severity: warning
annotations:
summary: NATS connection down
- alert: GslbdMergeLagHigh
expr: histogram_quantile(0.95, sum(rate(gslbd_state_merge_lag_ms_bucket[5m])) by (le)) > 2000
for: 5m
labels:
severity: warning
annotations:
summary: High merge lag (p95)
- alert: GslbdActiveMembersZero
expr: gslbd_state_active_members == 0
for: 5m
labels:
severity: critical
annotations:
summary: No active members detected
- alert: GslbdPoolDegraded
expr: gslbd_pool_members_healthy < 1
for: 30s
labels:
severity: critical
annotations:
summary: Pool {{ $labels.pool_id }} has no healthy members; DNS will return no records
- alert: GslbdFailoverDetectionSlow
# Adjust the threshold to 2× your checkInterval. Default checkInterval=10s → threshold=20s.
expr: histogram_quantile(0.95, sum(rate(gslbd_health_failover_detection_seconds_bucket[15m])) by (le, direction)) > 20
for: 10m
labels:
severity: warning
annotations:
summary: Failover detection p95 exceeds expected check interval ({{ $value }}s)
Troubleshooting
- No metrics visible: ensure the server log shows the metrics server started; verify port openness and any firewall.
- Missing labels: ensure
cluster.idandnode.idare set; metrics include them as constant labels.