OpenParable
Skip to content
← Back to skills

Archestra Dev Observability

DevOps & Security
archestra-dev-observability

Archestra Dev Observability is an Agent Skill for devops & security published in the archestra-ai/archestra repository on GitHub: a SKILL.md instruction file an AI agent can load to do this task.

Use when changing Archestra tracing, metrics, OpenTelemetry, Tempo, Grafana, Prometheus, LLM/MCP spans, observability labels, or local observability setup.

View on GitHub ↗
QUICK START

How to use this skill

Bring this guide into your coding agent with a prompt tailored to the tool you use.

  1. Open your project in Codex.
  2. Copy and paste the prompt below.
  3. Review files and risks before approving any action.
Prompt to paste
Inspect the Agent Skill at https://github.com/archestra-ai/archestra/blob/HEAD/.claude/skills/archestra-dev-observability/SKILL.md and all supporting files. Report provenance, permissions, scripts, dependencies, and security risks. Propose an exact installation into .agents/skills/archestra-dev-observability, but wait for my approval before writing files or running scripts.

Copying this prompt does not install or run the skill. Review third-party files before use.

Archestra Observability

Use this skill before changing tracing, metrics, span naming, metric labels, or local observability setup.

Run commands from platform/ unless specifically instructed otherwise.

Naming new attributes and metrics

Before introducing any new span attribute or metric name, look it up — do not coin a name from intuition.

  • Span attributes: search the OTEL semantic-convention registry and use the existing attribute verbatim if one fits. Registry: https://opentelemetry.io/docs/specs/semconv/registry/attributes/gen-ai/ (wider set: https://opentelemetry.io/docs/specs/semconv/registry/attributes/). Example: prompt-cache tokens are gen_ai.usage.cache_read.input_tokens and gen_ai.usage.cache_creation.input_tokens, not a custom archestra.usage.*. Only use an archestra.* name when nothing in the registry fits, and say why in a comment.
  • "Not yet stable" is not a reason to avoid a standard name. The whole gen_ai.* namespace is Development-stability, including the gen_ai.usage.* attributes already emitted here — match that bar, don't custom-namespace to dodge it.
  • Metrics: match the existing llm_* / prom-client family and label names in metrics/; don't introduce a new metric style. Add a label value to an existing metric only if it won't change what current aggregates mean — otherwise add a dedicated metric (cache tokens use a separate llm_cache_tokens_total, not new type values on llm_tokens_total).

Local setup

tilt trigger observability
docker compose -f dev/docker-compose.observability.yml up -d

tilt trigger observability starts the full observability stack: Tempo, OTEL Collector, Prometheus, and Grafana.

The docker-compose command is an alternative local setup with pre-configured datasources.

Local URLs

  • Tempo API: http://localhost:3200/.
  • Grafana: http://localhost:3002/.
  • Prometheus: http://localhost:9090/.
  • Backend metrics: http://localhost:9050/metrics.

Tracing

  • Follow OTEL GenAI Semantic Conventions (see "Naming new attributes and metrics" — check the registry before adding any attribute): https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-agent-spans/.
  • LLM spans use gen_ai.agent.id, gen_ai.agent.name, gen_ai.provider.name, gen_ai.request.model, gen_ai.operation.name, and archestra.agent.label.<key> for dynamic agent labels.
  • MCP spans use gen_ai.tool.name and mcp.server.name.
  • Team metadata uses the custom archestra.<scope>.team.* namespace (no OTEL registry equivalent), where scope is the principal the teams belong to — agent (the executing agent's teams) or user (the requesting user's teams). archestra.<scope>.team.ids / .names are array-valued (a principal can belong to multiple teams), and archestra.<scope>.team.label.<key> carries team labels merged per key across the principal's teams. Set via setTeamAttributes(span, teams, scope) in observability/tracing/attributes.ts; agent teams come from AgentTeamModel.getTeamLabelInfoForAgent and user teams from TeamModel.getTeamLabelInfoForUser, resolved once per request.
  • Session tracking uses gen_ai.conversation.id from the X-Archestra-Session-Id header.
  • Span names are chat {model}, generate_content {model}, and execute_tool {tool_name}.
  • Agent label keys are fetched from the database on startup and included as resource attributes.
  • Traces are stored in Grafana Tempo.
  • User identity is tracked with archestra.user.id, archestra.user.email, and archestra.user.name when available.
  • LLM spans include archestra.cost in USD and gen_ai.usage.total_tokens.

Metrics

  • Prometheus metrics llm_request_duration_seconds and llm_tokens_total include agent_id, agent_name, agent_type, external_agent_id, and dynamic agent labels as dimensions.
  • agent_id is internal.
  • external_agent_id comes from the client-provided header and is used for agent execution metrics.
  • MCP metrics include agent_id, agent_name, and agent_type.
  • Metrics are reinitialized on startup with current label keys from the database.