Advanced Configuration
Metrics and Observability Understand metrics, traces, logs, and profiling support across Pangolin components
Pangolin exposes observability signals across multiple components, but not every component provides the same telemetry surface. This page explains which metrics, traces, logs, and profiling endpoints are available today, how they are exposed, and which collection patterns are recommended for production deployments.
Newt provides the broadest native observability support with Prometheus metrics, OTLP metrics, OTLP traces, health checks, and optional pprof. Gerbil supports metrics through either a Prometheus backend or an OTLP backend. The Pangolin Kubernetes Controller exposes a Prometheus-compatible scrape endpoint and includes additional OTel-backed metric instruments on that endpoint.
This page focuses on Pangolin-native observability. For a community walkthrough that collects Traefik metrics with Prometheus and Grafana, see the community metrics guide .
All currently documented component metrics are listed in the Full Metric Reference .
Capability Matrix
Compare metrics, traces, logs, and profiling support across Pangolin components.
Newt
Native Prometheus metrics, OTLP metrics, OTLP traces, health checks, and optional pprof.
Gerbil
Metrics-only observability using either a Prometheus or OTLP backend.
Kubernetes Controller
Prometheus scraping, health probes, ServiceMonitor examples, and optional pprof.
Component Metrics Traces Logs Profiling newtPrometheus, OTLP OTLP stdout pprof optional gerbilPrometheus or OTLP — stdout — pangolin-kube-controllerPrometheus scrape — stdout pprof optional
Signal What it means Prometheus scrape metrics Pull-based metrics served over HTTP on /metrics OTLP metrics Push-based OpenTelemetry metrics sent to an OTel Collector or compatible backend OTLP traces Distributed traces sent to an OTel Collector or trace backend Application logs stdout, file logs, audit logs, or platform logs Profiling Debug endpoints such as pprof
Use one or more of the following patterns depending on your deployment model. Prometheus scrape mode is the simplest option for local or Kubernetes monitoring. OTLP is useful when you already operate an OpenTelemetry Collector or want to forward telemetry to a managed backend such as Grafana Cloud, Mimir, or Tempo.
Prometheus scrape mode OTel Collector Kubernetes ServiceMonitor Logs to Loki
prometheus.yml (fragment) scrape_configs :
- job_name : newt
static_configs :
- targets : [ " newt:2112 " ]
- job_name : gerbil
metrics_path : /metrics
static_configs :
- targets : [ " gerbil:3003 " ]
- job_name : pangolin-kube-controller
static_configs :
- targets : [ " pangolin-kube-controller:9090 " ]
Newt metrics are not typically enabled in default deployments. Turn them on explicitly and expose the admin address only where you intend to scrape or profile. Available metrics are listed in Newt metrics .
Configuration Environment Variables CLI Args Helm Values
NEWT_METRICS_PROMETHEUS_ENABLED=true
NEWT_METRICS_OTLP_ENABLED=true
NEWT_ADMIN_ADDR=:2112
OTEL_EXPORTER_OTLP_ENDPOINT=otel-collector:4317
OTEL_EXPORTER_OTLP_INSECURE=true
OTEL_METRIC_EXPORT_INTERVAL=15s
NEWT_PPROF_ENABLED=false Signals and endpoints
Prometheus scrape endpoint: /metrics on NEWT_ADMIN_ADDR
Health endpoint: /healthz on the same admin server
OTLP metrics: enabled with NEWT_METRICS_OTLP_ENABLED=true or --otlp=true
OTLP traces: initialized when OTLP export is enabled
Profiling: /debug/pprof/* when NEWT_PPROF_ENABLED=true
The Newt OTLP switch enables the OTLP telemetry pipeline. The current environment variable name contains METRICS, but the implementation also initializes OTLP tracing when OTLP is enabled.
Newt's admin server defaults to a loopback bind address. In containers or Kubernetes, set NEWT_ADMIN_ADDR=:2112 or another non-loopback address only when you intentionally want Prometheus, pprof, or health checks to reach it.
Examples Direct Prometheus OTLP metrics and traces
prometheus.yml (fragment) scrape_configs :
- job_name : newt
static_configs :
- targets : [ " newt:2112 " ]
Gerbil supports metrics only . Choose either a native Prometheus backend or an OTLP metrics backend at runtime. Those backends are mutually exclusive. Available metrics are listed in Gerbil metrics .
Configuration Environment Variables CLI Args
METRICS_ENABLED=true
METRICS_BACKEND=prometheus
METRICS_PATH=/metrics
LISTEN=:3003
# OTel mode
OTEL_METRICS_PROTOCOL=grpc
OTEL_METRICS_ENDPOINT=otel-collector:4317
OTEL_METRICS_INSECURE=true
OTEL_METRICS_EXPORT_INTERVAL=60s
OTEL_METRICS_TIMEOUT=10s Signals and endpoints
Prometheus metrics endpoint: METRICS_PATH, default /metrics
Metrics are served on Gerbil's configured HTTP listen address
The Docker Compose metrics example commonly scrapes gerbil:3003
Health endpoint: /healthz
OTLP metrics: enabled when METRICS_BACKEND=otel
Traces: not supported yet
Profiling: not supported yet
Examples Prometheus scrape OTLP metrics
prometheus.yml (fragment) scrape_configs :
- job_name : gerbil
metrics_path : /metrics
static_configs :
- targets : [ " gerbil:3003 " ] Replace gerbil:3003 with the actual Gerbil HTTP listen address in your deployment.
The controller exposes a Prometheus-compatible /metrics endpoint and standard health probes. It also registers additional OpenTelemetry metric instruments, but those instruments are exported on the same scrape endpoint rather than pushed through OTLP. Available metrics are listed in Controller metrics .
pprof is available only when explicitly enabled via ENABLE_PPROF=true.
Configuration Environment Variables Helm Values
METRICS_ADDR=:9090
DISABLE_LIVEZ=false
ENABLE_PPROF=false Expose the controller metrics endpoint only inside trusted networks or through Kubernetes-native monitoring resources. If TLS or auth is required, terminate it with a Service mesh, Ingress, sidecar, or platform-specific monitoring gateway unless native TLS support is verified.
Endpoints
/metrics on METRICS_ADDR
/healthz and /readyz for readiness
/livez and /health/live for liveness unless DISABLE_LIVEZ=true
/debug/pprof/* when ENABLE_PPROF=true
Representative metrics and Kubernetes examples service-and-servicemonitor.yaml apiVersion : v1
kind : Service
metadata :
name : pangolin-kube-controller
labels :
app : pangolin-kube-controller
spec :
selector :
app : pangolin-kube-controller
ports :
- name : http-metrics
port : 9090
targetPort : 9090
---
apiVersion : monitoring.coreos.com/v1
kind : ServiceMonitor
metadata :
name : pangolin-kube-controller
spec :
selector :
matchLabels :
app : pangolin-kube-controller
endpoints :
- port : http-metrics
path : /metrics
interval : 30s
Newt Gerbil Controller
increase(newt_connection_errors_total[5m]) > 10 histogram_quantile(
0.95,
sum(rate(newt_tunnel_latency_seconds_bucket[5m])) by (le)
) > 1 increase(newt_tunnel_reconnects_total[10m]) > 20
Community Metrics Guide
Traefik and metrics collection with Prometheus and Grafana.
Newt Kubernetes Monitoring
Verified Newt chart values for metrics, Services, and ServiceMonitor resources.
Controller Monitoring Values
Verified chart values for controller Services, ServiceMonitor, PodMonitor, and PrometheusRule resources.
Component Signal Since version Newt Prometheus scrape metrics v1.6.0Newt OTLP metrics v1.6.0Newt OTLP traces v1.6.0Newt pprof v1.10.4Gerbil Prometheus scrape metrics v1.4.0Gerbil OTLP metrics v1.4.0Pangolin Kubernetes Controller Prometheus scrape metrics v0.1.0-alpha.1
The full reference below is grouped by component.
Newt: Prometheus metrics, OTLP metrics, OTLP traces
Gerbil: Prometheus or OTLP metrics
Pangolin Kubernetes Controller: Prometheus-native metrics and additional OTel-backed scrape metrics
Metric names, labels, and defaults can change between component releases.
OpenTelemetry (OTel) Prometheus
OpenTelemetry metric instruments exposed by Newt. Expand each section to see individual metrics with labels, units, emission points, and examples.
Show Site & Build Hide Site & Build Counts Pangolin registration attempts keyed by result.
Show Details Hide Details Unit: 1
Labels: result (success|failure), site_id
Emission path: telemetry.IncSiteRegistration
Example: newt_site_registrations_total{result="success",site_id="abc"} 1
0/1 heartbeat for the active site.
Show Details Hide Details Unit: 1
Labels: site_id
Emission path: state.TelemetryView (callback)
Example: newt_site_online{site_id="self"} 1
Seconds since last Pangolin heartbeat.
Show Details Hide Details Unit: seconds
Labels: site_id
Emission path: TouchHeartbeat (callback)
Example: newt_site_last_heartbeat_seconds{site_id="self"} 3.2
Constant 1 with build metadata labels.
Show Details Hide Details Unit: 1
Labels: version, commit
Emission path: Build info registration
Example: newt_build_info{version="1.2.3",commit="abc123"} 1
Process boot indicator (increments once per process start).
Show Details Hide Details Unit: 1
Labels: —
Emission path: RegisterBuildInfo
Example: newt_restart_count_total 1
Certificate rotation events keyed by result.
Show Details Hide Details Unit: 1
Labels: result
Emission path: IncCertRotation
Example: newt_cert_rotation_total{result="success"} 1
Config reload attempts keyed by result.
Show Details Hide Details Unit: 1
Labels: result
Emission path: telemetry.IncConfigReload
Example: newt_config_reloads_total{result="success"} 1
Duration per config-apply phase keyed by phase and result.
Show Details Hide Details Unit: seconds
Labels: phase, result
Emission path: telemetry.ObserveConfigApply
Example: newt_config_apply_seconds_bucket{phase="peer",result="success",le="0.1"} 3
Show Tunnel Hide Tunnel Active sessions per tunnel (or collapsed).
Show Details Hide Details Unit: 1
Labels: site_id, tunnel_id
Emission path: RegisterStateView
Example: newt_tunnel_sessions{site_id="self",tunnel_id="wgpub"} 2
Traffic per tunnel, direction, and protocol.
Show Details Hide Details Unit: bytes
Labels: tunnel_id, direction (ingress|egress), protocol (tcp|udp)
Emission path: Proxy manager
Example: newt_tunnel_bytes_total{direction="egress",protocol="tcp",tunnel_id="wgpub"} 8192
RTT samples per tunnel/transport.
Show Details Hide Details Unit: seconds
Labels: tunnel_id, transport
Emission path: Health checks
Example: newt_tunnel_latency_seconds_bucket{transport="wireguard",le="0.05",tunnel_id="wgpub"} 4
Reconnect attempts keyed by initiator & reason.
Show Details Hide Details Unit: 1
Labels: tunnel_id, initiator (client|server), reason
Emission path: telemetry.IncReconnect
Example: newt_tunnel_reconnects_total{initiator="client",reason="timeout",tunnel_id="wgpub"} 3
Show Connection & Auth Hide Connection & Auth Auth/WebSocket connection attempts keyed by transport & result.
Show Details Hide Details Unit: 1
Labels: transport, result
Emission path: telemetry.IncConnAttempt
Example: newt_connection_attempts_total{transport="websocket",result="failure"} 2
Connection errors keyed by transport and type.
Show Details Hide Details Unit: 1
Labels: transport, error_type
Emission path: telemetry.IncConnError
Example: newt_connection_errors_total{transport="auth",error_type="auth_failed"} 1
Show WebSocket Hide WebSocket Dial latency for Pangolin WebSocket.
Show Details Hide Details Unit: seconds
Labels: result, transport
Emission path: ObserveWSConnectLatency
Example: newt_websocket_connect_latency_seconds_bucket{result="success",transport="websocket",le="0.5"} 1
WebSocket disconnects keyed by reason.
Show Details Hide Details Unit: 1
Labels: reason, tunnel_id
Emission path: IncWSDisconnect
Example: newt_websocket_disconnects_total{reason="remote_close",tunnel_id="wgpub"} 2
Ping/Pong failures observed by keepalive.
Show Details Hide Details Unit: 1
Labels: reason (e.g., ping_write, pong_timeout)
Emission path: telemetry.IncWSKeepaliveFailure(ctx, "ping_write")
Example: newt_websocket_keepalive_failures_total{reason="ping_write"} 1
Duration of established WS sessions keyed by result.
Show Details Hide Details Unit: seconds
Labels: result (success|error)
Emission path: telemetry.ObserveWSSessionDuration(ctx, time.Since(start).Seconds(), "error")
Example: newt_websocket_session_duration_seconds_bucket{result="error",le="60"} 3
Current WS connection state (0/1).
Show Details Hide Details Unit: 1
Labels: —
Emission path: telemetry.SetWSConnectionState(true|false)
Example: newt_websocket_connected 1
WebSocket reconnect attempts keyed by reason.
Show Details Hide Details Unit: 1
Labels: reason
Emission path: telemetry.IncWSReconnect(ctx, "ping_write")
Example: newt_websocket_reconnects_total{reason="ping_write"} 1
In/out WS messages keyed by direction & type.
Show Details Hide Details Unit: 1
Labels: direction (in|out), msg_type (ping|pong|text|...)
Emission path: IncWSMessage
Example: newt_websocket_messages_total{direction="out",msg_type="ping"} 4
Show Proxy Hide Proxy Active TCP/UDP proxy connections per tunnel/protocol.
Show Details Hide Details Unit: 1
Labels: protocol, tunnel_id
Emission path: Proxy callback
Example: newt_proxy_active_connections{protocol="tcp",tunnel_id="wgpub"} 3
Proxy buffer pool size.
Show Details Hide Details Unit: bytes
Labels: protocol, tunnel_id
Emission path: Proxy callback
Example: newt_proxy_buffer_bytes{protocol="tcp",tunnel_id="wgpub"} 10240
Unflushed async byte backlog.
Show Details Hide Details Unit: bytes
Labels: protocol, tunnel_id
Emission path: Proxy callback
Example: newt_proxy_async_backlog_bytes{protocol="udp",tunnel_id="wgpub"} 4096
Proxy write drops keyed by protocol/tunnel.
Show Details Hide Details Unit: 1
Labels: protocol, tunnel_id
Emission path: IncProxyDrops
Example: newt_proxy_drops_total{protocol="udp",tunnel_id="wgpub"} 2
Proxy accept events keyed by result/reason.
Show Details Hide Details Unit: 1
Labels: tunnel_id, protocol, result, reason
Emission path: telemetry.IncProxyAccept(ctx, tunnelID, "tcp", "failure", "timeout")
Example: newt_proxy_accept_total{protocol="tcp",result="failure",reason="timeout"} 1
Lifecycle events (opened/closed) per connection.
Show Details Hide Details Unit: 1
Labels: tunnel_id, protocol, event (opened|closed)
Emission path: telemetry.IncProxyConnectionEvent(ctx, tunnelID, "tcp", telemetry.ProxyConnectionOpened)
Example: newt_proxy_connections_total{protocol="tcp",event="opened"} 1
Duration of completed proxy connections.
Show Details Hide Details Unit: seconds
Labels: tunnel_id, protocol, result
Emission path: telemetry.ObserveProxyConnectionDuration(ctx, tunnelID, "tcp", "success", seconds)
Example: newt_proxy_connection_duration_seconds_bucket{protocol="tcp",result="success",le="1"} 3
OpenTelemetry (OTel) Prometheus
OpenTelemetry metric instruments exposed by Gerbil. Gerbil supports exactly one metrics backend at runtime: prometheus, otel, or none.
In otel mode, Gerbil pushes metrics to an OTLP collector. The /metrics endpoint is not exposed in this mode.
Show WireGuard Hide WireGuard Operational state of a WireGuard interface.
Show Details Hide Details Unit: 1
Labels: ifname, instance
Emission path: metrics.RecordInterfaceUp
Example: gerbil_wg_interface_up{ifname="wg0",instance="gerbil-1"} 1
Number of configured peers per interface.
Show Details Hide Details Unit: 1
Labels: ifname
Emission path: metrics.RecordPeersTotal
Example: gerbil_wg_peers_total{ifname="wg0"} 5
Current peer connection state.
Show Details Hide Details Unit: 1
Labels: ifname, peer
Emission path: metrics.RecordPeerConnected
Example: gerbil_wg_peer_connected{ifname="wg0",peer="abc"} 1
Number of allowed IPs configured per peer.
Show Details Hide Details Unit: 1
Labels: ifname, peer
Emission path: metrics.RecordAllowedIPsCount
Example: gerbil_allowed_ips_count{ifname="wg0",peer="abc"} 2
Key rotation events.
Show Details Hide Details Unit: 1
Labels: ifname, reason
Emission path: metrics.RecordKeyRotation
Example: gerbil_key_rotation_total{ifname="wg0",reason="scheduled"} 1
WireGuard handshake attempts keyed by result.
Show Details Hide Details Unit: 1
Labels: ifname, peer, result
Emission path: metrics.RecordHandshake
Example: gerbil_wg_handshakes_total{ifname="wg0",peer="abc",result="success"} 1
Distribution of WireGuard handshake latencies.
Show Details Hide Details Unit: seconds
Labels: ifname, peer
Emission path: metrics.RecordHandshakeLatency
Example: gerbil_wg_handshake_latency_seconds_bucket{ifname="wg0",peer="abc",le="0.1"} 3
Observed peer round-trip time.
Show Details Hide Details Unit: seconds
Labels: ifname, peer
Emission path: metrics.RecordPeerRTT
Example: gerbil_wg_peer_rtt_seconds_bucket{ifname="wg0",peer="abc",le="0.05"} 4
Bytes received from a WireGuard peer.
Show Details Hide Details Unit: bytes
Labels: ifname, peer
Emission path: metrics.RecordBytesReceived
Example: gerbil_wg_bytes_received_total{ifname="wg0",peer="abc"} 8192
Bytes transmitted to a WireGuard peer.
Show Details Hide Details Unit: bytes
Labels: ifname, peer
Emission path: metrics.RecordBytesTransmitted
Example: gerbil_wg_bytes_transmitted_total{ifname="wg0",peer="abc"} 16384
Show Relay Hide Relay Number of active UDP relay sessions.
Show Details Hide Details Unit: 1
Labels: ifname
Emission path: metrics.RecordActiveSession / metrics.RecordSession
Example: gerbil_active_sessions{ifname="wg0"} 3
UDP packets processed by relay workers.
Show Details Hide Details Unit: 1
Labels: ifname, type, direction
Emission path: metrics.RecordUDPPacket
Example: gerbil_udp_packets_total{ifname="wg0",type="data",direction="rx"} 42
Size distribution of packets forwarded through the relay.
Show Details Hide Details Unit: bytes
Labels: ifname, type
Emission path: metrics.RecordUDPPacketSize
Example: gerbil_udp_packet_size_bytes_bucket{ifname="wg0",type="data",le="1024"} 7
Hole punch messages processed by result.
Show Details Hide Details Unit: 1
Labels: ifname, result
Emission path: metrics.RecordHolePunchEvent
Example: gerbil_hole_punch_events_total{ifname="wg0",result="success"} 1
Active proxy mappings.
Show Details Hide Details Unit: 1
Labels: ifname
Emission path: metrics.RecordProxyMapping
Example: gerbil_proxy_mapping_active{ifname="wg0"} 4
Sessions rebuilt from communication patterns.
Show Details Hide Details Unit: 1
Labels: ifname
Emission path: metrics.RecordSessionRebuilt
Example: gerbil_session_rebuilt_total{ifname="wg0"} 1
Active communication patterns.
Show Details Hide Details Unit: 1
Labels: ifname
Emission path: metrics.RecordCommPattern
Example: gerbil_comm_pattern_active{ifname="wg0"} 2
Items removed by cleanup routines.
Show Details Hide Details Unit: 1
Labels: ifname, component
Emission path: metrics.RecordProxyCleanupRemoved
Example: gerbil_proxy_cleanup_removed_total{ifname="wg0",component="sessions"} 5
Proxy connection errors.
Show Details Hide Details Unit: 1
Labels: ifname, error_type
Emission path: metrics.RecordProxyConnectionError
Example: gerbil_proxy_connection_errors_total{ifname="wg0",error_type="timeout"} 1
Initial proxy mappings loaded.
Show Details Hide Details Unit: 1
Labels: ifname
Emission path: metrics.RecordProxyInitialMappings
Example: gerbil_proxy_initial_mappings{ifname="wg0"} 8
Proxy mapping updates.
Show Details Hide Details Unit: 1
Labels: ifname
Emission path: metrics.RecordProxyMappingUpdate
Example: gerbil_proxy_mapping_updates_total{ifname="wg0"} 2
Duration of idle cleanup cycles.
Show Details Hide Details Unit: seconds
Labels: ifname, component
Emission path: metrics.RecordProxyIdleCleanupDuration
Example: gerbil_proxy_idle_cleanup_duration_seconds_bucket{ifname="wg0",component="sessions",le="0.1"} 1
Show SNI Proxy Hide SNI Proxy Active SNI proxy connections.
Show Details Hide Details Unit: 1
Labels: —
Emission path: metrics.RecordActiveProxyConnection
Example: gerbil_active_proxy_connections 2
Route lookups keyed by result.
Show Details Hide Details Unit: 1
Labels: result
Emission path: metrics.RecordProxyRouteLookup
Example: gerbil_proxy_route_lookups_total{result="hit"} 6
TLS handshake duration for the SNI proxy.
Show Details Hide Details Unit: seconds
Labels: —
Emission path: metrics.RecordProxyTLSHandshake
Example: gerbil_proxy_tls_handshake_seconds_bucket{le="0.1"} 2
Bytes sent or received by the SNI proxy.
Show Details Hide Details Unit: bytes
Labels: direction
Emission path: metrics.RecordProxyBytesTransmitted
Example: gerbil_proxy_bytes_transmitted_total{direction="egress"} 16384
Connections processed by the SNI proxy.
Show Details Hide Details Unit: 1
Labels: result
Emission path: metrics.RecordSNIConnection
Example: gerbil_sni_connections_total{result="success"} 3
Lifetime distribution of proxied TLS connections.
Show Details Hide Details Unit: seconds
Labels: —
Emission path: metrics.RecordSNIConnectionDuration
Example: gerbil_sni_connection_duration_seconds_bucket{le="10"} 4
Active SNI tunnels.
Show Details Hide Details Unit: 1
Labels: —
Emission path: metrics.RecordSNIActiveConnection
Example: gerbil_sni_active_connections 2
SNI route cache hits and misses.
Show Details Hide Details Unit: 1
Labels: result
Emission path: metrics.RecordSNIRouteCacheHit
Example: gerbil_sni_route_cache_hits_total{result="hit"} 10
SNI route API requests.
Show Details Hide Details Unit: 1
Labels: result
Emission path: metrics.RecordSNIRouteAPIRequest
Example: gerbil_sni_route_api_requests_total{result="success"} 5
Route API call latency.
Show Details Hide Details Unit: seconds
Labels: —
Emission path: metrics.RecordSNIRouteAPILatency
Example: gerbil_sni_route_api_latency_seconds_bucket{le="0.25"} 4
Routes using local overrides.
Show Details Hide Details Unit: 1
Labels: hit
Emission path: metrics.RecordSNILocalOverride
Example: gerbil_sni_local_override_total{hit="true"} 1
PROXY protocol events.
Show Details Hide Details Unit: 1
Labels: event
Emission path: metrics.RecordSNITrustedProxyEvent
Example: gerbil_sni_trusted_proxy_events_total{event="parsed"} 2
PROXY protocol parse failures.
Show Details Hide Details Unit: 1
Labels: —
Emission path: metrics.RecordSNIProxyProtocolParseError
Example: gerbil_sni_proxy_protocol_parse_errors_total 1
Bytes proxied through SNI tunnels.
Show Details Hide Details Unit: bytes
Labels: direction
Emission path: metrics.RecordSNIDataBytes
Example: gerbil_sni_data_bytes_total{direction="ingress"} 4096
SNI tunnel terminations keyed by reason.
Show Details Hide Details Unit: 1
Labels: reason
Emission path: metrics.RecordSNITunnelTermination
Example: gerbil_sni_tunnel_terminations_total{reason="client_close"} 1
Show HTTP API & Peer Management Hide HTTP API & Peer Management HTTP requests to the management API.
Show Details Hide Details Unit: 1
Labels: endpoint, method, status_code
Emission path: metrics.RecordHTTPRequest
Example: gerbil_http_requests_total{endpoint="/peer",method="POST",status_code="200"} 1
HTTP request handling time.
Show Details Hide Details Unit: seconds
Labels: endpoint, method
Emission path: metrics.RecordHTTPRequestDuration
Example: gerbil_http_request_duration_seconds_bucket{endpoint="/peer",method="POST",le="0.1"} 3
Peer lifecycle operations.
Show Details Hide Details Unit: 1
Labels: operation, result
Emission path: metrics.RecordPeerOperation
Example: gerbil_peer_operations_total{operation="add",result="success"} 1
Proxy mapping update API calls.
Show Details Hide Details Unit: 1
Labels: result
Emission path: metrics.RecordProxyMappingUpdateRequest
Example: gerbil_proxy_mapping_update_requests_total{result="success"} 1
Destination update API calls.
Show Details Hide Details Unit: 1
Labels: result
Emission path: metrics.RecordDestinationsUpdateRequest
Example: gerbil_destinations_update_requests_total{result="success"} 1
Show Remote Config & Reporting Hide Remote Config & Reporting Remote configuration fetch attempts.
Show Details Hide Details Unit: 1
Labels: result
Emission path: metrics.RecordRemoteConfigFetch
Example: gerbil_remote_config_fetches_total{result="success"} 1
Bandwidth report transmissions.
Show Details Hide Details Unit: 1
Labels: result
Emission path: metrics.RecordBandwidthReport
Example: gerbil_bandwidth_reports_total{result="success"} 1
Bytes per peer tracked by bandwidth calculation.
Show Details Hide Details Unit: bytes
Labels: peer, direction
Emission path: metrics.RecordPeerBandwidthBytes
Example: gerbil_peer_bandwidth_bytes_total{peer="abc",direction="rx"} 8192
Show System & Operations Hide System & Operations Netlink events processed.
Show Details Hide Details Unit: 1
Labels: event_type
Emission path: metrics.RecordNetlinkEvent
Example: gerbil_netlink_events_total{event_type="link_up"} 1
Netlink or kernel errors.
Show Details Hide Details Unit: 1
Labels: component, error_type
Emission path: metrics.RecordNetlinkError
Example: gerbil_netlink_errors_total{component="wg",error_type="permission"} 1
Duration of reconciliation or sync loops.
Show Details Hide Details Unit: seconds
Labels: component
Emission path: metrics.RecordSyncDuration
Example: gerbil_sync_duration_seconds_bucket{component="remote_config",le="0.5"} 2
Current length of internal work queues.
Show Details Hide Details Unit: 1
Labels: queue
Emission path: metrics.RecordWorkqueueDepth
Example: gerbil_workqueue_depth{queue="relay"} 3
Kernel module load attempts.
Show Details Hide Details Unit: 1
Labels: result
Emission path: metrics.RecordKernelModuleLoad
Example: gerbil_kernel_module_loads_total{result="success"} 1
Firewall rules applied.
Show Details Hide Details Unit: 1
Labels: result, chain
Emission path: metrics.RecordFirewallRuleApplied
Example: gerbil_firewall_rules_applied_total{result="success",chain="FORWARD"} 1
Configuration reloads.
Show Details Hide Details Unit: 1
Labels: result
Emission path: metrics.RecordConfigReload
Example: gerbil_config_reloads_total{result="success"} 1
Process restart count.
Show Details Hide Details Unit: 1
Labels: —
Emission path: metrics.RecordRestart
Example: gerbil_restart_total 1
Authentication or peer validation failures.
Show Details Hide Details Unit: 1
Labels: peer, reason
Emission path: metrics.RecordAuthFailure
Example: gerbil_auth_failures_total{peer="abc",reason="invalid_key"} 1
Access-control denied events.
Show Details Hide Details Unit: 1
Labels: ifname, peer, policy
Emission path: metrics.RecordACLDenied
Example: gerbil_acl_denied_total{ifname="wg0",peer="abc",policy="deny"} 1
Days until certificate expiry.
Show Details Hide Details Unit: days
Labels: cert_name, ifname
Emission path: metrics.RecordCertificateExpiry
Example: gerbil_certificate_expiry_days{cert_name="server",ifname="wg0"} 42
Memory spikes detected by severity.
Show Details Hide Details Unit: 1
Labels: severity
Emission path: metrics.RecordMemorySpike
Example: gerbil_memory_spike_total{severity="warning"} 1
Heap profile files generated.
Show Details Hide Details Unit: 1
Labels: —
Emission path: metrics.RecordHeapProfileWritten
Example: gerbil_heap_profiles_written_total 1
OpenTelemetry (OTel) Prometheus
Additional OpenTelemetry metric instruments exposed by the Pangolin Kubernetes Controller.
The controller exposes Prometheus-native metrics and additional OTel-backed metrics on the same /metrics endpoint.
The OTel-backed series use the pangolin_controller_* prefix.
Show Reconcile Hide Reconcile Duration of each reconcile phase.
Show Details Hide Details Unit: seconds
Labels: phase, result
Label values:
phase: middlewares | routers | serversTransports | services | tcp | udp
result: success | error
Emission path: OTel reconcile phase instrumentation
Example: pangolin_controller_reconcile_phase_duration_seconds_bucket{phase="routers",result="success",le="0.5"} 3
Number of active reconcile routines by phase.
Show Details Hide Details Unit: 1
Labels: phase
Label values: middlewares | routers | serversTransports | services | tcp | udp
Emission path: Parallel reconcile instrumentation
Example: pangolin_controller_active_reconcile_routines{phase="routers"} 1
Controller loop iterations by outcome.
Show Details Hide Details Unit: 1
Labels: outcome
Label values: success | nochange | error
Emission path: Controller loop instrumentation
Example: pangolin_controller_loop_iterations_total{outcome="success"} 10
Show Fetch & Config Hide Fetch & Config Duration of remote fetch cycle HTTP requests.
Show Details Hide Details Unit: seconds
Labels: status_code, status_class
Label values:
status_code: 200 | 304 | 401 | 403 | 404 | 5xx
status_class: 2xx | 3xx | 4xx | 5xx
Emission path: Remote config fetch instrumentation
Example: pangolin_controller_fetch_duration_seconds_bucket{status_code="200",status_class="2xx",le="0.25"} 4
Duration of configuration parsing.
Show Details Hide Details Unit: seconds
Labels: section
Label values: full
Emission path: Config parse instrumentation
Example: pangolin_controller_config_parse_duration_seconds_bucket{section="full",le="0.1"} 2
Show Kubernetes API Hide Kubernetes API Duration of Kubernetes API requests.
Show Details Hide Details Unit: seconds
Labels: verb, resource_kind, result, forced
Label values:
verb: get | create | patch | update | delete | list
resource_kind: IngressRoute | Middleware | TraefikService | ServersTransport | ServersTransportTCP | Service | EndpointSlice
result: success | error | conflict
forced: true | false
Emission path: Kubernetes API request instrumentation
Example: pangolin_controller_k8s_request_duration_seconds_bucket{verb="patch",resource_kind="IngressRoute",result="success",forced="false",le="0.25"} 3
Total Kubernetes API requests.
Show Details Hide Details Unit: 1
Labels: verb, resource_kind, result, forced
Emission path: Kubernetes API request instrumentation
Example: pangolin_controller_k8s_requests_total{verb="patch",resource_kind="IngressRoute",result="success",forced="false"} 1
Retry attempts in the SSA apply loop.
Show Details Hide Details Unit: 1
Labels: reason, operation, resource_kind
Label values:
reason: conflict | transient | timeout
operation: get | create | patch | delete | apply
Emission path: SSA apply retry instrumentation
Example: pangolin_controller_retries_total{reason="conflict",operation="patch",resource_kind="IngressRoute"} 1
Show Garbage Collection Hide Garbage Collection Duration of garbage collection runs.
Show Details Hide Details Unit: seconds
Labels: result
Label values: success | fail | dryrun
Emission path: GC instrumentation
Example: pangolin_controller_gc_run_duration_seconds_bucket{result="success",le="0.5"} 1
Have improvements or a missing metric? Open an issue or PR referencing this page.