# API success ratesum(rate(cftunnel_cloudflare_api_calls_total{status="success"}[5m]))/sum(rate(cftunnel_cloudflare_api_calls_total[5m]))# API latency P99histogram_quantile(0.99,sum(rate(cftunnel_cloudflare_api_duration_seconds_bucket[5m]))by(le,method))# API errors by typesum(rate(cftunnel_cloudflare_api_errors_total[5m]))by(method,error_type)
# Reconciliations per second by controllersum(rate(controller_runtime_reconcile_total[5m]))by(controller)# Error ratesum(rate(controller_runtime_reconcile_errors_total[5m]))by(controller)# Error percentagesum(rate(controller_runtime_reconcile_errors_total[5m]))by(controller)/sum(rate(controller_runtime_reconcile_total[5m]))by(controller)*100
# Queue depth (should be low)workqueue_depth{name=~".*gateway.*|.*httproute.*"}# Average time in queuesum(workqueue_queue_duration_seconds_sum)by(name)/sum(workqueue_queue_duration_seconds_count)by(name)# Processing timesum(workqueue_work_duration_seconds_sum)by(name)/sum(workqueue_work_duration_seconds_count)by(name)
{"title":"Cloudflare Tunnel Gateway Controller","panels":[{"title":"Routes Synced","type":"stat","gridPos":{"x":0,"y":0,"w":6,"h":4},"targets":[{"expr":"sum(cftunnel_synced_routes) by (type)","legendFormat":"{{ type }}"}]},{"title":"Ingress Rules","type":"stat","gridPos":{"x":6,"y":0,"w":6,"h":4},"targets":[{"expr":"cftunnel_ingress_rules"}]},{"title":"Failed Backend Refs","type":"stat","gridPos":{"x":12,"y":0,"w":6,"h":4},"targets":[{"expr":"sum(cftunnel_failed_backend_refs)","legendFormat":"failed"}],"fieldConfig":{"defaults":{"thresholds":{"steps":[{"value":0,"color":"green"},{"value":1,"color":"red"}]}}}},{"title":"Sync Duration (P95)","type":"timeseries","gridPos":{"x":0,"y":4,"w":12,"h":8},"targets":[{"expr":"histogram_quantile(0.95, sum(rate(cftunnel_sync_duration_seconds_bucket[5m])) by (le))","legendFormat":"p95"},{"expr":"histogram_quantile(0.50, sum(rate(cftunnel_sync_duration_seconds_bucket[5m])) by (le))","legendFormat":"p50"}],"fieldConfig":{"defaults":{"unit":"s"}}},{"title":"Cloudflare API Latency","type":"timeseries","gridPos":{"x":12,"y":4,"w":12,"h":8},"targets":[{"expr":"histogram_quantile(0.99, sum(rate(cftunnel_cloudflare_api_duration_seconds_bucket[5m])) by (le, method))","legendFormat":"p99 {{ method }}"}],"fieldConfig":{"defaults":{"unit":"s"}}},{"title":"API Calls/sec","type":"timeseries","gridPos":{"x":0,"y":12,"w":12,"h":8},"targets":[{"expr":"sum(rate(cftunnel_cloudflare_api_calls_total[5m])) by (method, status)","legendFormat":"{{ method }} ({{ status }})"}]},{"title":"Sync Errors/sec","type":"timeseries","gridPos":{"x":12,"y":12,"w":12,"h":8},"targets":[{"expr":"sum(rate(cftunnel_sync_errors_total[5m])) by (error_type)","legendFormat":"{{ error_type }}"}]},{"title":"Reconciliations/sec","type":"timeseries","gridPos":{"x":0,"y":20,"w":12,"h":8},"targets":[{"expr":"sum(rate(controller_runtime_reconcile_total[5m])) by (controller)","legendFormat":"{{ controller }}"}]},{"title":"Reconciliation Latency","type":"timeseries","gridPos":{"x":12,"y":20,"w":12,"h":8},"targets":[{"expr":"histogram_quantile(0.95, sum(rate(controller_runtime_reconcile_time_seconds_bucket[5m])) by (le, controller))","legendFormat":"p95 {{ controller }}"}],"fieldConfig":{"defaults":{"unit":"s"}}},{"title":"Queue Depth","type":"timeseries","gridPos":{"x":0,"y":28,"w":12,"h":8},"targets":[{"expr":"workqueue_depth","legendFormat":"{{ name }}"}]},{"title":"Memory Usage","type":"stat","gridPos":{"x":12,"y":28,"w":6,"h":4},"targets":[{"expr":"process_resident_memory_bytes{job=\"cloudflare-tunnel-gateway-controller\"}"}],"fieldConfig":{"defaults":{"unit":"bytes"}}},{"title":"Goroutines","type":"stat","gridPos":{"x":18,"y":28,"w":6,"h":4},"targets":[{"expr":"go_goroutines{job=\"cloudflare-tunnel-gateway-controller\"}"}]}]}