mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
feat: add Prometheus metrics for AI Governance cost control (#27490)
## Description Adds Prometheus metrics for AI budget cost control, emitted by the aibridged server under the `cost_control` subsystem (full names are prefixed `coder_ai_gateway_`). - `blocked_requests_total` (counter) — labels: `group_id` - `blocked_users` (gauge) — labels: `group_id` - `unpriced_requests_total` (counter) — labels: `provider`, `model` - `enforcement_duration_seconds` (histogram) — labels: `outcome` ## Changes - Add `GetOverBudgetUsersPerGroup` query (plus dbauthz/dbmetrics/dbmock wiring) to count over-budget users per effective group. - Add a background collector that refreshes the `blocked_users` gauge on an interval, started only when Prometheus is enabled. - Wire `Metrics` through the aibridged server, coderd API, `cli/server.go`, and the enterprise AI gateway handler; recording is nil-safe when metrics are unset. Closes https://linear.app/codercom/issue/AIGOV-296/add-prometheus-metrics-for-cost-control > [!NOTE] > Initially generated by Claude Opus 4.7, modified and reviewed by @ssncferreira
This commit is contained in:
@@ -147,6 +147,28 @@ promhttp_metric_handler_requests_in_flight 1
|
||||
promhttp_metric_handler_requests_total{code="200"} 2
|
||||
promhttp_metric_handler_requests_total{code="500"} 0
|
||||
promhttp_metric_handler_requests_total{code="503"} 0
|
||||
# HELP coder_ai_gateway_cost_control_blocked_requests_total The number of AI requests blocked because the initiator's budget was exceeded.
|
||||
# TYPE coder_ai_gateway_cost_control_blocked_requests_total counter
|
||||
coder_ai_gateway_cost_control_blocked_requests_total{group_id="a1b2c3d4-e5f6-7890-abcd-ef1234567890"} 0
|
||||
# HELP coder_ai_gateway_cost_control_blocked_users The number of users currently over their AI budget.
|
||||
# TYPE coder_ai_gateway_cost_control_blocked_users gauge
|
||||
coder_ai_gateway_cost_control_blocked_users{group_id="a1b2c3d4-e5f6-7890-abcd-ef1234567890"} 0
|
||||
# HELP coder_ai_gateway_cost_control_enforcement_duration_seconds The duration of AI budget enforcement checks, in seconds (outcome: allowed, blocked, error).
|
||||
# TYPE coder_ai_gateway_cost_control_enforcement_duration_seconds histogram
|
||||
coder_ai_gateway_cost_control_enforcement_duration_seconds_bucket{outcome="allowed",le="0.005"} 0
|
||||
coder_ai_gateway_cost_control_enforcement_duration_seconds_bucket{outcome="allowed",le="0.01"} 0
|
||||
coder_ai_gateway_cost_control_enforcement_duration_seconds_bucket{outcome="allowed",le="0.025"} 0
|
||||
coder_ai_gateway_cost_control_enforcement_duration_seconds_bucket{outcome="allowed",le="0.05"} 0
|
||||
coder_ai_gateway_cost_control_enforcement_duration_seconds_bucket{outcome="allowed",le="0.1"} 0
|
||||
coder_ai_gateway_cost_control_enforcement_duration_seconds_bucket{outcome="allowed",le="0.25"} 0
|
||||
coder_ai_gateway_cost_control_enforcement_duration_seconds_bucket{outcome="allowed",le="0.5"} 0
|
||||
coder_ai_gateway_cost_control_enforcement_duration_seconds_bucket{outcome="allowed",le="1"} 0
|
||||
coder_ai_gateway_cost_control_enforcement_duration_seconds_bucket{outcome="allowed",le="+Inf"} 0
|
||||
coder_ai_gateway_cost_control_enforcement_duration_seconds_sum{outcome="allowed"} 0
|
||||
coder_ai_gateway_cost_control_enforcement_duration_seconds_count{outcome="allowed"} 0
|
||||
# HELP coder_ai_gateway_cost_control_unpriced_token_usage_records_total The number of recorded AI token-usage records for which no model price was found (provider: anthropic, openai, copilot).
|
||||
# TYPE coder_ai_gateway_cost_control_unpriced_token_usage_records_total counter
|
||||
coder_ai_gateway_cost_control_unpriced_token_usage_records_total{model="gpt-5-nano",provider="openai"} 0
|
||||
# HELP coder_ai_gateway_injected_tool_invocations_total The number of times an injected MCP tool was invoked by AI Gateway.
|
||||
# TYPE coder_ai_gateway_injected_tool_invocations_total counter
|
||||
coder_ai_gateway_injected_tool_invocations_total{model="gpt-5-nano",name="coder_list_templates",provider="openai",server="https://xxx.pit-1.try.coder.app/api/experimental/mcp/http"} 1
|
||||
|
||||
@@ -41,6 +41,7 @@ var scanDirs = []string{
|
||||
// eliminate the need for this skip list.
|
||||
var skipPaths = []string{
|
||||
"coderd/aibridged/metrics.go",
|
||||
"coderd/aibridgedserver/metrics.go",
|
||||
"enterprise/aibridgeproxyd/metrics.go",
|
||||
"enterprise/scaletest/agentfake/metrics.go",
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user