"description":"Live first-party CLI account telemetry. A last-good snapshot remains visible for up to 20 minutes through a transient fetch miss; its age is shown separately. Not exposed means access is healthy but that credential scope cannot read quota; unavailable means access is unhealthy or the snapshot is stale."
"description":"Live first-party CLI account telemetry. A last-good snapshot remains visible for up to 20 minutes through a transient fetch miss; its age is shown separately. Not exposed means access is healthy but that credential scope cannot read quota; unavailable means access is unhealthy or the snapshot is stale."
"description":"Live first-party CLI account telemetry. A last-good snapshot remains visible for up to 20 minutes through a transient fetch miss; its age is shown separately. Not exposed means access is healthy but that credential scope cannot read quota; unavailable means access is unhealthy or the snapshot is stale."
"description":"Live first-party CLI account telemetry. A last-good snapshot remains visible for up to 20 minutes through a transient fetch miss; its age is shown separately. Not exposed means access is healthy but that credential scope cannot read quota; unavailable means access is unhealthy or the snapshot is stale."
"description":"Live first-party CLI account telemetry. A last-good snapshot remains visible for up to 20 minutes through a transient fetch miss; its age is shown separately. Not exposed means access is healthy but that credential scope cannot read quota; unavailable means access is unhealthy or the snapshot is stale."
"expr":"(sum(increase(switchyard_prompt_tokens_total{model=~\"route/claude/.+\"}[24h])) or on() vector(0)) + (sum(increase(switchyard_cached_tokens_total{model=~\"route/claude/.+\"}[24h])) or on() vector(0)) + (sum(increase(switchyard_cache_creation_tokens_total{model=~\"route/claude/.+\"}[24h])) or on() vector(0)) + (sum(increase(switchyard_completion_tokens_total{model=~\"route/claude/.+\"}[24h])) or on() vector(0))",
"description":"Prompt, cache-read, cache-creation, and completion tokens from Claude calls routed through Switchyard in the last 24 hours. This measures consumption even when Anthropic does not expose the subscription allowance."
"expr":"(sum(increase(switchyard_prompt_tokens_total{model=~\"route/claude/.+\"}[7d])) or on() vector(0)) + (sum(increase(switchyard_cached_tokens_total{model=~\"route/claude/.+\"}[7d])) or on() vector(0)) + (sum(increase(switchyard_cache_creation_tokens_total{model=~\"route/claude/.+\"}[7d])) or on() vector(0)) + (sum(increase(switchyard_completion_tokens_total{model=~\"route/claude/.+\"}[7d])) or on() vector(0))",
"description":"Prompt, cache-read, cache-creation, and completion tokens from Claude calls routed through Switchyard in the last seven days. This is measured locally and does not require a broader Anthropic OAuth scope."
"description":"Live first-party CLI account telemetry. A last-good snapshot remains visible for up to 20 minutes through a transient fetch miss; its age is shown separately. Not exposed means access is healthy but that credential scope cannot read quota; unavailable means access is unhealthy or the snapshot is stale."
"description":"Live first-party CLI account telemetry. A last-good snapshot remains visible for up to 20 minutes through a transient fetch miss; its age is shown separately. Not exposed means access is healthy but that credential scope cannot read quota; unavailable means access is unhealthy or the snapshot is stale."
"description":"Successful client-facing Switchyard responses in the selected range."
},
{
"id":19,
"type":"stat",
"title":"Classifier Fail-Open (Range)",
"datasource":{
"type":"prometheus",
"uid":"atlas-vm"
},
"gridPos":{
"h":4,
"w":6,
"x":12,
"y":24
},
"targets":[
{
"expr":"sum(increase(switchyard_classifier_fail_open_total[$__range])) or on() vector(0)",
"refId":"A"
}
],
"fieldConfig":{
"defaults":{
"color":{
"mode":"thresholds"
},
"mappings":[],
"thresholds":{
"mode":"absolute",
"steps":[
{
"color":"dark-green",
"value":null
},
{
"color":"dark-yellow",
"value":1
},
{
"color":"dark-red",
"value":5
}
]
},
"unit":"none",
"custom":{
"displayMode":"auto"
},
"decimals":0
},
"overrides":[]
},
"options":{
"colorMode":"value",
"graphMode":"area",
"justifyMode":"center",
"reduceOptions":{
"calcs":[
"lastNotNull"
],
"fields":"",
"values":false
},
"textMode":"value"
},
"description":"Local classifier failures that safely fell back to the conservative hosted route."
},
{
"id":20,
"type":"stat",
"title":"Upstream Errors (Range)",
"datasource":{
"type":"prometheus",
"uid":"atlas-vm"
},
"gridPos":{
"h":4,
"w":6,
"x":18,
"y":24
},
"targets":[
{
"expr":"sum(increase(switchyard_errors_total[$__range])) or on() vector(0)",
"refId":"A"
}
],
"fieldConfig":{
"defaults":{
"color":{
"mode":"thresholds"
},
"mappings":[],
"thresholds":{
"mode":"absolute",
"steps":[
{
"color":"dark-green",
"value":null
},
{
"color":"dark-yellow",
"value":1
},
{
"color":"dark-red",
"value":5
}
]
},
"unit":"none",
"custom":{
"displayMode":"auto"
},
"decimals":0
},
"overrides":[]
},
"options":{
"colorMode":"value",
"graphMode":"area",
"justifyMode":"center",
"reduceOptions":{
"calcs":[
"lastNotNull"
],
"fields":"",
"values":false
},
"textMode":"value"
},
"description":"Hosted model attempts that returned errors in the selected range."
},
{
"id":21,
"type":"timeseries",
"title":"Local Classifier Calls",
"datasource":{
"type":"prometheus",
"uid":"atlas-vm"
},
"gridPos":{
"h":8,
"w":8,
"x":0,
"y":28
},
"targets":[
{
"expr":"sum by (outcome) (rate(switchyard_llm_calls_total{selected_model=~\"qwen.*\"}[5m]))",
"refId":"A",
"legendFormat":"{{outcome}}"
}
],
"fieldConfig":{
"defaults":{
"unit":"reqps"
},
"overrides":[]
},
"options":{
"legend":{
"displayMode":"table",
"placement":"bottom"
},
"tooltip":{
"mode":"multi"
}
},
"description":"Local Qwen routing-classifier activity, split by successful and failed calls."
},
{
"id":22,
"type":"timeseries",
"title":"Routing Overhead p95",
"datasource":{
"type":"prometheus",
"uid":"atlas-vm"
},
"gridPos":{
"h":8,
"w":8,
"x":8,
"y":28
},
"targets":[
{
"expr":"histogram_quantile(0.95, sum by (le, algorithm) (rate(switchyard_routing_overhead_ms_bucket[5m])))",
"refId":"A",
"legendFormat":"{{algorithm}}"
}
],
"fieldConfig":{
"defaults":{
"unit":"ms"
},
"overrides":[]
},
"options":{
"legend":{
"displayMode":"table",
"placement":"bottom"
},
"tooltip":{
"mode":"multi"
}
},
"description":"95th percentile time Switchyard spends selecting a model before the upstream call."
},
{
"id":23,
"type":"bargauge",
"title":"Traffic Lanes (Range)",
"datasource":{
"type":"prometheus",
"uid":"atlas-vm"
},
"gridPos":{
"h":8,
"w":8,
"x":16,
"y":28
},
"targets":[
{
"expr":"sort_desc(sum by (lane) (label_replace(increase(switchyard_requests_total{model=~\"(route|worker)/.*\"}[$__range]), \"lane\", \"$1\", \"model\", \"^(route|worker)/.*\")))",
"refId":"A",
"legendFormat":"{{lane}}",
"instant":true
}
],
"fieldConfig":{
"defaults":{
"unit":"short",
"min":0,
"max":null,
"thresholds":{
"mode":"absolute",
"steps":[
{
"color":"dark-green",
"value":null
},
{
"color":"dark-yellow",
"value":50
},
{
"color":"dark-orange",
"value":70
},
{
"color":"dark-red",
"value":85
}
]
}
},
"overrides":[]
},
"options":{
"displayMode":"basic",
"orientation":"horizontal",
"reduceOptions":{
"calcs":[
"lastNotNull"
],
"fields":"",
"values":false
}
},
"description":"Request volume split between interactive route traffic and durable worker traffic.",
"transformations":[
{
"id":"sortBy",
"options":{
"fields":[
"Value"
],
"order":"desc"
}
}
]
},
{
"id":24,
"type":"text",
"title":"Cost Semantics",
"gridPos":{
"h":8,
"w":12,
"x":0,
"y":36
},
"datasource":null,
"options":{
"mode":"markdown",
"content":"Codex and Claude currently run through first-party subscription OAuth lanes, so providers expose quota utilization rather than per-call dollar invoices. This dashboard does not invent API costs from tokens. If a metered API-key lane is added, its provider billing metric should be displayed separately from subscription usage."
}
},
{
"id":25,
"type":"timeseries",
"title":"Hermes Workload CPU (Attribution Proxy)",
"datasource":{
"type":"prometheus",
"uid":"atlas-vm"
},
"gridPos":{
"h":8,
"w":12,
"x":12,
"y":36
},
"targets":[
{
"expr":"sum by (pod, container) (rate(container_cpu_usage_seconds_total{namespace=\"hermes\",pod=~\"hermes-(agent|chat-tenant|switchyard|model-gate).*\",container!=\"\",image!=\"\"}[5m]))",
"refId":"A",
"legendFormat":"{{pod}} \u00b7 {{container}}"
}
],
"fieldConfig":{
"defaults":{
"unit":"cores"
},
"overrides":[]
},
"options":{
"legend":{
"displayMode":"table",
"placement":"right"
},
"tooltip":{
"mode":"multi"
}
},
"description":"Compute use by Hermes pod/container. Switchyard currently exposes model and worker-vs-route attribution, but not tenant-slot token labels; CPU is clearly marked as a proxy rather than token usage."