You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This document is the complete reference for all OpenTelemetry signals emitted by Visor. Use it to build Grafana dashboards, set up alerts, or debug execution flows.
All metrics use the visor meter and are exported when the OTLP sink is configured with @opentelemetry/exporter-metrics-otlp-http.
Prometheus naming: OTel metric names use dots (e.g., visor.run.total) but Prometheus converts them to underscores (e.g., visor_run_total). The table below shows both forms.
Run Metrics
Metric
Prometheus Name
Type
Unit
Description
visor.run.total
visor_run_total
Counter
1
Total number of visor runs (workflow executions)
visor.run.duration_ms
visor_run_duration_ms
Histogram
ms
Duration of a complete visor run
visor.run.active_checks
visor_run_active_checks
UpDownCounter
1
Number of checks actively running (concurrent gauge)
visor.run.ai_calls
visor_run_ai_calls
Histogram
1
Number of AI calls per visor run
Labels for visor.run.total:
Label
Description
Example
visor.run.source
Entry point that started the run
cli, slack, tui, tui-rerun
visor.run.user_id
User identifier (Slack user ID, etc.)
U01ABC123
visor.run.user_name
User display name
alice
visor.run.workflow
Comma-separated check IDs
security,performance
visor.instance_id
Unique instance identifier
abc123
Labels for visor.run.duration_ms:
Label
Description
Example
visor.run.source
Entry point
cli, slack, tui
visor.run.user_id
User identifier
U01ABC123
visor.run.workflow
Check IDs
security,performance
visor.run.success
Whether the run succeeded
true, false
Check Metrics
Metric
Prometheus Name
Type
Unit
Description
visor.check.duration_ms
visor_check_duration_ms
Histogram
ms
Duration of a single check execution
visor.check.issues
visor_check_issues_total
Counter
1
Number of issues produced by checks
Labels:
Label
Applies To
Description
visor.check.id
Both
Check identifier (e.g., security, overview)
visor.check.group
duration_ms
Check group (default: default)
severity
issues
Issue severity level
Provider Metrics
Metric
Prometheus Name
Type
Unit
Description
visor.provider.duration_ms
visor_provider_duration_ms
Histogram
ms
Duration of provider execution
visor.foreach.item.duration_ms
visor_foreach_item_duration_ms
Histogram
ms
Duration of a single forEach item
Labels:
Label
Applies To
Description
visor.check.id
Both
Check identifier
visor.provider.type
provider.duration_ms
Provider type (ai, command, http, etc.)
visor.foreach.index
foreach.item.duration_ms
Iteration index
visor.foreach.total
foreach.item.duration_ms
Total items in forEach
AI Metrics
Metric
Prometheus Name
Type
Unit
Description
visor.ai_call.total
visor_ai_call_total
Counter
1
Total number of AI provider calls
Labels:
Label
Description
Example
visor.check.id
Check that triggered the AI call
security
visor.ai.model
AI model name
gemini-2.5-flash, claude-sonnet-4-5-20250514
visor.run.source
Entry point
cli, slack
Other Metrics
Metric
Prometheus Name
Type
Unit
Description
visor.fail_if.triggered
visor_fail_if_triggered_total
Counter
1
Times a fail_if condition triggered
visor.diagram.blocks
visor_diagram_blocks_total
Counter
1
Mermaid diagram blocks emitted
Spans
Root Span
Span Name
Description
visor.run
Root span wrapping an entire workflow execution. One per CLI invocation, Slack message, or TUI interaction.
Attributes on visor.run:
Attribute
Description
visor.version
Visor version (from package.json or VISOR_VERSION env)
Attributes for graceful_stop.invoked:mcp.session_id, mcp.server
Attributes for graceful_stop.deadline_shortened:mcp.session_id, graceful_stop.previous_deadline, graceful_stop.new_deadline, graceful_stop.remaining_ms
Attributes for graceful_stop.session_signaled:mcp.session_id, probe.session_id
Attributes for graceful_stop.completed:mcp.session_id, graceful_stop.sessions_signaled
Diagram Events
Event Name
Description
diagram.block
A Mermaid diagram block was emitted
Attributes:check, origin (content/issue), code
State Capture Attributes
When VISOR_TELEMETRY_FULL_CAPTURE=true, additional detailed attributes are captured on check spans:
Check Input Context
Attribute
Description
Max Size
visor.check.input.keys
Comma-separated context variable names
—
visor.check.input.count
Number of context keys
—
visor.check.input.context
Full template context (JSON, sanitized)
10 KB
visor.check.input.pr
PR information subset
1 KB
visor.check.input.outputs
Previous check outputs
5 KB
visor.check.input.env_keys
Environment variable keys available
—
Check Output
Attribute
Description
Max Size
visor.check.output.type
Output type (object, array, string)
—
visor.check.output.length
Array length (if output is array)
—
visor.check.output.preview
Preview of first 10 items
2 KB
visor.check.output
Full serialized output
10 KB
Provider Call Details
Attribute
Description
Max Size
visor.provider.type
Provider type
—
visor.provider.request.model
AI model name
—
visor.provider.request.prompt.length
Prompt character count
—
visor.provider.request.prompt.preview
Prompt preview
500 B
visor.provider.request.prompt
Full prompt (full capture only)
10 KB
visor.provider.response.length
Response character count
—
visor.provider.response.preview
Response preview
500 B
visor.provider.response.content
Full response (full capture only)
10 KB
visor.provider.response.tokens
Token count (if available)
—
Liquid Template Evaluation
Attribute
Description
Max Size
visor.liquid.template
Template source
1 KB
visor.liquid.result
Rendered result
2 KB
visor.liquid.context
Template context
3 KB
Transform JS
Attribute
Description
Max Size
visor.transform.code
JavaScript code
2 KB
visor.transform.input
Input data
2 KB
visor.transform.output
Output data
2 KB
Conditional Evaluation
Attribute
Description
Max Size
visor.condition.expression
Condition expression
500 B
visor.condition.result
Boolean evaluation result
—
visor.condition.context
Evaluation context
2 KB
Routing Decision
Attribute
Description
visor.routing.action
Action: retry, goto, run
visor.routing.target
Target check(s) or event
visor.routing.condition
Routing condition expression
Resource Attributes
The OTel resource is configured with:
Attribute
Value
service.name
visor
service.version
Visor version or dev
deployment.environment
github-actions, ci, or local
Example Queries
Prometheus / Grafana
# Total runs per user (last 24h)
sum by (visor_run_user_id) (increase(visor_run_total[24h]))
# Average run duration by workflow
avg by (visor_run_workflow) (visor_run_duration_ms_sum / visor_run_duration_ms_count)
# AI calls per run (average)
avg(visor_run_ai_calls_sum / visor_run_ai_calls_count)
# AI calls by model (rate)
sum by (visor_ai_model) (rate(visor_ai_call_total[5m]))
# P95 check duration
histogram_quantile(0.95, sum(rate(visor_check_duration_ms_bucket[5m])) by (le, visor_check_id))
# Failed runs rate
sum(rate(visor_run_duration_ms_count{visor_run_success="false"}[5m]))
# Active concurrent checks
visor_run_active_checks
Tempo (TraceQL)
# Find all runs from Slack
{ resource.service.name = "visor" && name = "visor.run" && span.visor.run.source = "slack" }
# Find slow checks (>30s)
{ resource.service.name = "visor" && name =~ "visor.check.*" } | duration > 30s
# Find runs with many AI calls
{ resource.service.name = "visor" && name = "visor.run" && span.visor.run.ai_calls > 10 }
# Find failed routing decisions
{ resource.service.name = "visor" } >> { name = "visor.routing" && span.action = "retry" }