{
  "slug": "agent-observability-for-reliability",
  "title": "What Should an AI Agent's Observability System Capture?",
  "description": "An operator playbook for instrumenting an AI agent: the trace/span model behind a run, the OpenTelemetry GenAI attributes that name each field, the fields worth capturing per span, and what to redact before any of it gets logged.",
  "kind": "sub",
  "order": 11,
  "target_query": "what should an AI agent's observability system capture",
  "secondary_queries": [
    "OpenTelemetry GenAI semantic conventions",
    "gen_ai attributes agent tracing",
    "agent trace span fields",
    "redact PII agent logs",
    "agent cost per token trace"
  ],
  "tags": [
    "agents",
    "reliability",
    "observability",
    "tracing",
    "opentelemetry",
    "production"
  ],
  "published": "2026-08-31",
  "updated": "2026-08-31",
  "words": 1445,
  "estimated_tokens": 1922,
  "premium": false,
  "rights": {
    "access": "free",
    "note": "Editorial guides are always free and never part of the licensed corpus.",
    "license": "https://changegamer.ai/license.xml",
    "pricing": "https://changegamer.ai/api/pricing.json",
    "payment": "https://changegamer.ai/api/payment.json"
  },
  "license": "https://changegamer.ai/license.xml",
  "citation": "ChangeGamer (2026-08-31). What Should an AI Agent's Observability System Capture?. ChangeGamer. https://changegamer.ai/articles/agent-observability-for-reliability (updated 2026-08-31).",
  "bibtex": "@misc{changegamer_agent_observability_for_reliability, title = {What Should an AI Agent's Observability System Capture?}, publisher = {ChangeGamer}, year = {2026}, url = {https://changegamer.ai/articles/agent-observability-for-reliability}, note = {Updated 2026-08-31}}",
  "canonical": "https://changegamer.ai/articles/agent-observability-for-reliability",
  "markdown": "https://changegamer.ai/articles/agent-observability-for-reliability.md",
  "takeaways": [
    "One agent run corresponds to one trace, identified by a single trace_id, while each individual step inside it — a model request, a tool invocation, a retrieval lookup, a sub-agent handoff — becomes its own span nested under the operation that triggered it.",
    "An observability pipeline built in August 2026 against the current gen_ai.* attribute names is building against a moving target: OpenTelemetry's GenAI SIG only started that vocabulary in April 2024, and it had still not cleared Development status as of July 2026.",
    "A diagnostically useful span carries five distinct fields: a computed dollar cost from its token counts, two separate latency numbers for the step and the run, a redacted tool-call payload, and the specific exception recorded on the span where it actually happened.",
    "The OpenTelemetry GenAI conventions capture full prompt and completion text as span events that ship off by default specifically for PII safety, so a team has to opt in deliberately before that content starts leaving the agent's runtime.",
    "Stored agent traces serve two separate purposes at once: a sampled slice becomes training material for an evaluation dataset, and the same live stream flags a cost spike, an error-rate jump, or a latency regression while it is still happening.",
    "Cost and latency figures pulled from span data are a feedback signal for evaluation and rollout decisions, not just a debugging aid, because a version that passes every functional check can still be too slow or too expensive to promote."
  ],
  "outline": [
    {
      "depth": 2,
      "text": "What is the difference between a trace and a span in an agent run?",
      "anchor": "what-is-the-difference-between-a-trace-and-a-span-in-an-agent-run",
      "url": "https://changegamer.ai/articles/agent-observability-for-reliability#what-is-the-difference-between-a-trace-and-a-span-in-an-agent-run"
    },
    {
      "depth": 2,
      "text": "The gen_ai.* attribute names come from an OpenTelemetry spec that is still Development status",
      "anchor": "the-gen-ai-attribute-names-come-from-an-opentelemetry-spec-that-is-still-development-status",
      "url": "https://changegamer.ai/articles/agent-observability-for-reliability#the-gen-ai-attribute-names-come-from-an-opentelemetry-spec-that-is-still-development-status"
    },
    {
      "depth": 2,
      "text": "Five fields belong on every span",
      "anchor": "five-fields-belong-on-every-span",
      "url": "https://changegamer.ai/articles/agent-observability-for-reliability#five-fields-belong-on-every-span"
    },
    {
      "depth": 2,
      "text": "How should PII be redacted before an agent's trace gets logged?",
      "anchor": "how-should-pii-be-redacted-before-an-agent-s-trace-gets-logged",
      "url": "https://changegamer.ai/articles/agent-observability-for-reliability#how-should-pii-be-redacted-before-an-agent-s-trace-gets-logged"
    },
    {
      "depth": 2,
      "text": "How does a stored trace feed evaluation and incident response?",
      "anchor": "how-does-a-stored-trace-feed-evaluation-and-incident-response",
      "url": "https://changegamer.ai/articles/agent-observability-for-reliability#how-does-a-stored-trace-feed-evaluation-and-incident-response"
    },
    {
      "depth": 2,
      "text": "Tool choice sits downstream of the fields above, not in place of them",
      "anchor": "tool-choice-sits-downstream-of-the-fields-above-not-in-place-of-them",
      "url": "https://changegamer.ai/articles/agent-observability-for-reliability#tool-choice-sits-downstream-of-the-fields-above-not-in-place-of-them"
    }
  ],
  "faq": [
    {
      "question": "Is the OpenTelemetry GenAI semantic convention a finished standard?",
      "answer": "No — as of July 2026 the OpenTelemetry GenAI vocabulary remained at Development status, the successor label to what the spec used to call experimental, just over two years after the GenAI SIG first published it in April 2024; that status means the gen_ai.* attribute names still ship behind a stability opt-in flag and can still change, even though major observability vendors already build against the current names."
    },
    {
      "question": "What replaced the gen_ai.system attribute in OpenTelemetry GenAI tracing?",
      "answer": "The gen_ai.provider.name attribute replaced gen_ai.system as the identifier for which model or vendor produced a given span — values such as openai, anthropic, or aws.bedrock — though gen_ai.system is deprecated rather than removed, so many instrumentation libraries still emit it during the transition and a consuming system should tolerate both names."
    },
    {
      "question": "Should an AI agent's observability system log full prompt and completion text?",
      "answer": "Only if a team opts in deliberately: the OpenTelemetry GenAI conventions define prompt and completion bodies as span events that ship off by default specifically for PII safety, so capturing the full text of every model call requires an explicit configuration change rather than happening automatically once tracing is turned on."
    },
    {
      "question": "What is the difference between a trace and a span in agent observability?",
      "answer": "One trace corresponds to one agent run and carries a single trace_id that travels into every operation the run touches, including handoffs to a sub-agent, while a span corresponds to just one of those individual operations — a model request, a tool invocation, or a retrieval lookup — nested beneath whichever operation triggered it."
    }
  ],
  "body": "Observability gets a single paragraph in the [agent reliability in production](/articles/agent-reliability-in-production) pillar — trace/span structure, an OpenTelemetry status hedge, a five-item field list — compressed alongside eleven other disciplines the pillar treats at survey depth. Everything that paragraph had no room for is the actual subject here: what a trace and a span correspond to on a real run, which gen_ai.* attributes land on each field on the wire, the concrete per-span checklist worth capturing, and what needs redacting before storage. The scope stays bounded to the question in its own heading — what to capture so a team can reconstruct why one specific run did what it did — leaving vendor comparison and eval-harness methodology to a still-planned future cluster instead of pre-empting it here.\n\n## What is the difference between a trace and a span in an agent run?\n\nA trace is the record of one complete agent run, tied to a single stable trace_id that travels into every child operation the run touches, including calls handed off to a sub-agent. A span sits one level down: it records a single operation inside that run — an outbound model request, a call to an external tool, a step that pulls context from a retrieval store, or a handoff to a sub-agent — and nests under its parent so the whole set of spans reconstructs the run's actual shape.\n\nReconstructing that shape is the entire point: given a run that spawned dozens of individual operations, the nested tree is what lets a person work backward from a bad final output to the exact operation that first went wrong, and see what every step leading up to it actually saw and returned along the way.\n\nThe same trace_id threading through every span is also what makes cross-agent debugging possible at all. Without it, a sub-agent's tool calls show up as an unrelated stream of events with no way to tie them back to the parent run that spawned them, which defeats the entire point of tracing a multi-step, branching process rather than a single request.\n\n## The gen_ai.* attribute names come from an OpenTelemetry spec that is still Development status\n\nThe gen_ai.* attribute names come from OpenTelemetry's GenAI Special Interest Group, formed in April 2024 to define a vendor-neutral vocabulary for LLM and agent workloads, and as of July 2026 that vocabulary still carried Development status rather than a finished, stable release. Development status means the attribute names carry a stability opt-in flag (gen_ai_latest_experimental) and can still change before the spec settles — a real caveat worth treating as a live constraint, not a footnote, since an instrumentation choice made in August 2026 may need updating later even though major observability vendors already support the current names. The spec itself has since moved out of OpenTelemetry's main semantic-conventions repository into a dedicated semantic-conventions-genai repository, with the older opentelemetry.io GenAI documentation pages now pointing readers there instead of hosting the attributes directly.\n\nCoverage splits into four areas: client spans for LLM calls and retrieval steps, agent spans for the agent invocations and workflows that wrap them, span events for prompt and completion bodies, and metrics for token-usage and latency histograms. A handful of attribute names matter most in practice: gen_ai.provider.name identifies which model or vendor emitted a given span (openai, anthropic, aws.bedrock), replacing the older gen_ai.system name, which is deprecated but still emitted by many instrumentation libraries during the transition; gen_ai.request.model names the specific model requested; gen_ai.usage.input_tokens and gen_ai.usage.output_tokens record token counts; and gen_ai.tool.name identifies which tool a given span invoked.\n\n## Five fields belong on every span\n\nA span earns its keep once it carries five distinct pieces of information, not just a start and end timestamp:\n\n| Field | What it holds |\n|---|---|\n| Cost | Input and output token counts multiplied by that model's per-token price, computed for this one span |\n| Step latency | Wall-clock duration of this specific operation |\n| Trace latency | Running total for the whole run, so a slow step is visible against the full budget, not in isolation |\n| Redacted payload | What a tool call sent and what it got back, with PII stripped before any of it touches storage |\n| Attached failure | The specific exception object recorded on the span where it actually happened, not a generic error logged once at the top of the run |\n\nRecording a failure on its own span rather than only at the run level is what lets a responder jump straight to the exact step that broke, instead of re-deriving which of a dozen operations actually failed from a single top-level error message.\n\nCost and latency data pulled from spans is not just a debugging aid — it doubles as a feedback signal a release decision should weigh alongside functional correctness, since a candidate version that passes every eval case can still burn more tokens or take longer per task than the version it's meant to replace. A composite identity — which prompt version, which model pin, and which tool-schema hash produced a given span — belongs in that same span data too; deriving and versioning those three fields together is covered in full in [agent rollout and rollback](/articles/agent-rollout-and-rollback) rather than in this operator playbook.\n\n## How should PII be redacted before an agent's trace gets logged?\n\nEvery tool payload an observability pipeline stores should have personally identifiable information stripped out of it — both what a call sent and what came back — before any of it lands in a trace store, and should treat full prompt and completion text as something that ships off by default rather than automatically. The OpenTelemetry GenAI conventions define prompt and completion bodies as span events specifically for this reason — capturing them is an explicit opt-in a team enables deliberately, not a default behavior tracing turns on by itself, precisely because that text is where the highest concentration of sensitive content in a run is most likely to appear. A team that does enable full-text capture should apply the same redaction discipline to it that already applies to tool-call payloads, rather than treating the opt-in as a blanket exemption from redaction.\n\nCredential and secret hygiene inside agent traces is a related but separate problem, outside what this article covers — worth a deliberate policy of its own, but its mechanics belong to a different, security-focused discipline rather than the diagnostic-observability scope here.\n\n## How does a stored trace feed evaluation and incident response?\n\nA stored trace feeds two different disciplines off the same underlying data, with no separate instrumentation required for either. Offline, a curated sample pulled from real runs becomes the fixture set an eval suite grades new candidates against — the actual scoring methodology, benchmarking, and release-gating logic lives in [evaluating AI agents in CI](/articles/evaluating-ai-agents-in-ci), not here. Live, watching that same stream as it's produced catches a rising tool-error rate, an unusual cost outlier, or a creeping latency regression the moment it starts, well before a customer files a complaint about it.\n\nThat same trace store is also the evidence an incident response depends on, which is why it has to be exported or snapshotted before a rollback or restart runs — the full mechanics of that habit, and the failure-class-by-failure-class response it feeds into, are covered in [agent incident response runbooks](/articles/agent-incident-response-runbooks) rather than restated here.\n\n## Tool choice sits downstream of the fields above, not in place of them\n\nNo single tool is required — an agent's observability data can land in any OpenTelemetry-compatible backend, and as of August 2026 the practical decision is framework-agnostic versus framework-native, not a specific product mandate. Langfuse, Arize Phoenix, OpenLLMetry, and Logfire all accept OTLP traffic and work the same regardless of which agent framework produced the traces, which matters if a team runs more than one framework at once or expects to switch later. On the framework-native side, tracing comes pre-wired instead: the OpenAI Agents SDK bundles a trace processor with every agent run out of the box, and LangGraph users get the same tight integration through LangSmith, which can also ingest OTel traces from elsewhere so a team is not locked into one backend exclusively. Picking between them is a tooling decision that sits downstream of the fields above, not a substitute for capturing those fields — a well-chosen backend fed poorly instrumented spans produces exactly the same blind runs as no tracing at all.\n\nGetting the trace/span model, the gen_ai.* fields, and the redaction discipline right closes the one pillar discipline this cluster had left without a dedicated deep-dive; see [agent reliability in production](/articles/agent-reliability-in-production) for how observability sits alongside the other eleven.",
  "cluster": {
    "id": "agent-reliability",
    "title": "Agent reliability in production",
    "description": "How to make an AI agent reliable — tool-calling contracts, structured outputs, retries and idempotency, timeouts, durable execution, guardrails, evaluation in CI, observability, incident response, and rollout.",
    "status": "complete",
    "pillar": {
      "slug": "agent-reliability-in-production",
      "title": "Agent Guardrails and the AI Agent Reliability Playbook",
      "description": "Agent guardrails plus the eleven other disciplines that make an AI agent reliable in production: tool calling, retries, durable execution and rollout.",
      "kind": "pillar",
      "order": 0,
      "html": "https://changegamer.ai/articles/agent-reliability-in-production",
      "markdown": "https://changegamer.ai/articles/agent-reliability-in-production.md",
      "json": "https://changegamer.ai/api/articles/agent-reliability-in-production.json"
    },
    "articles": [
      {
        "slug": "tool-calling-contracts-for-ai-agents",
        "title": "How to Make AI Agent Tool Calling Reliable",
        "description": "An operator playbook for tool-calling contracts: per-provider strict-mode config (OpenAI, Anthropic, Gemini, self-hosted grammars), the full failure-mode-to-fix table, what BFCL actually measures, and how to stop parallel tool calls from breaking a dependency chain.",
        "kind": "sub",
        "order": 1,
        "html": "https://changegamer.ai/articles/tool-calling-contracts-for-ai-agents",
        "markdown": "https://changegamer.ai/articles/tool-calling-contracts-for-ai-agents.md",
        "json": "https://changegamer.ai/api/articles/tool-calling-contracts-for-ai-agents.json"
      },
      {
        "slug": "structured-outputs-vs-tool-calling",
        "title": "Structured Outputs vs Tool Calling: When to Use Each",
        "description": "A decision framework for structured outputs versus tool calling in AI agents, with runnable JSON Schema examples for OpenAI, Anthropic, Gemini, vLLM/SGLang, and llama.cpp, plus mitigation code for truncation, refusal, and grammar-compilation latency.",
        "kind": "sub",
        "order": 2,
        "html": "https://changegamer.ai/articles/structured-outputs-vs-tool-calling",
        "markdown": "https://changegamer.ai/articles/structured-outputs-vs-tool-calling.md",
        "json": "https://changegamer.ai/api/articles/structured-outputs-vs-tool-calling.json"
      },
      {
        "slug": "retries-and-idempotency-for-ai-agents",
        "title": "How to Make AI Agent Retries Idempotent",
        "description": "A deep-dive on retrying agent tool calls safely: the transient-vs-terminal decision, why an agent side effect can fire before a failure signal reaches the caller, idempotency-key mechanics (run ID + step index), the unknown-outcome edge case, and where idempotency keys do not reach.",
        "kind": "sub",
        "order": 3,
        "html": "https://changegamer.ai/articles/retries-and-idempotency-for-ai-agents",
        "markdown": "https://changegamer.ai/articles/retries-and-idempotency-for-ai-agents.md",
        "json": "https://changegamer.ai/api/articles/retries-and-idempotency-for-ai-agents.json"
      },
      {
        "slug": "durable-execution-for-ai-agents",
        "title": "When Do AI Agents Need Durable Execution?",
        "description": "A deep-dive on durable execution for AI agents: the persisted event log, the replay-determinism constraint, the four architectural shapes mapped across ten engines and frameworks, and a decision framework for when a durable execution engine is worth adding at all.",
        "kind": "sub",
        "order": 4,
        "html": "https://changegamer.ai/articles/durable-execution-for-ai-agents",
        "markdown": "https://changegamer.ai/articles/durable-execution-for-ai-agents.md",
        "json": "https://changegamer.ai/api/articles/durable-execution-for-ai-agents.json"
      },
      {
        "slug": "agent-guardrails-for-reliability",
        "title": "How to Design Guardrails for AI Agent Reliability",
        "description": "An operator playbook for reliability guardrails: the three checkpoints (input, output, action), layering cheap checks under slow ones with a fail-closed default, the two-of-three-properties rule for when a tool call needs human approval, and logging every verdict against the run trace ID.",
        "kind": "sub",
        "order": 5,
        "html": "https://changegamer.ai/articles/agent-guardrails-for-reliability",
        "markdown": "https://changegamer.ai/articles/agent-guardrails-for-reliability.md",
        "json": "https://changegamer.ai/api/articles/agent-guardrails-for-reliability.json"
      },
      {
        "slug": "evaluating-ai-agents-in-ci",
        "title": "How to Evaluate AI Agents in CI",
        "description": "An operator playbook for gating an AI agent release in CI: why agent eval needs trajectory-level scoring across the tasks it actually runs, how public benchmarks diverge as proxies, ground-truth vs LLM-as-judge tool-call scoring, and the three-layer test pyramid that keeps CI fast and non-flaky.",
        "kind": "sub",
        "order": 6,
        "html": "https://changegamer.ai/articles/evaluating-ai-agents-in-ci",
        "markdown": "https://changegamer.ai/articles/evaluating-ai-agents-in-ci.md",
        "json": "https://changegamer.ai/api/articles/evaluating-ai-agents-in-ci.json"
      },
      {
        "slug": "agent-rollout-and-rollback",
        "title": "How to Roll Out a New AI Agent Version Safely",
        "description": "An operator playbook for shipping a new agent version without breaking production: in-repo vs. registry prompt storage, a version-numbering comparison, the six-step promotion flow, A/B-test mechanics, the composite-version trace fields, and a rollback drill.",
        "kind": "sub",
        "order": 7,
        "html": "https://changegamer.ai/articles/agent-rollout-and-rollback",
        "markdown": "https://changegamer.ai/articles/agent-rollout-and-rollback.md",
        "json": "https://changegamer.ai/api/articles/agent-rollout-and-rollback.json"
      },
      {
        "slug": "agent-incident-response-runbooks",
        "title": "How to Build an Incident Response Runbook for AI Agent Failures",
        "description": "An operator playbook for the moment an AI agent fails in production: a triage step to classify the failure fast, trace freezing before rollback destroys the evidence, first-response depth on the four failure classes, and a blameless post-mortem that feeds back into guardrails and eval.",
        "kind": "sub",
        "order": 8,
        "html": "https://changegamer.ai/articles/agent-incident-response-runbooks",
        "markdown": "https://changegamer.ai/articles/agent-incident-response-runbooks.md",
        "json": "https://changegamer.ai/api/articles/agent-incident-response-runbooks.json"
      },
      {
        "slug": "timeouts-and-deadlines-for-ai-agents",
        "title": "How to Set Timeouts for AI Agent Tool Calls",
        "description": "A deep-dive on timeout and deadline design for AI agents: sizing LLM-call, tool-call, and sub-agent-hop timeouts differently, allocating a wall-clock budget across a multi-step chain, and propagating a remaining-deadline value from parent to child calls.",
        "kind": "sub",
        "order": 9,
        "html": "https://changegamer.ai/articles/timeouts-and-deadlines-for-ai-agents",
        "markdown": "https://changegamer.ai/articles/timeouts-and-deadlines-for-ai-agents.md",
        "json": "https://changegamer.ai/api/articles/timeouts-and-deadlines-for-ai-agents.json"
      },
      {
        "slug": "circuit-breakers-and-degraded-mode-for-ai-agents",
        "title": "How to Design a Circuit Breaker for AI Agents",
        "description": "A deep-dive on the circuit breaker pattern for AI agents: the Closed/Open/Half-Open state machine with a worked open-source example, where to place a breaker in an agent's call path, and degraded-mode fallback design as its own discipline per dependency type.",
        "kind": "sub",
        "order": 10,
        "html": "https://changegamer.ai/articles/circuit-breakers-and-degraded-mode-for-ai-agents",
        "markdown": "https://changegamer.ai/articles/circuit-breakers-and-degraded-mode-for-ai-agents.md",
        "json": "https://changegamer.ai/api/articles/circuit-breakers-and-degraded-mode-for-ai-agents.json"
      },
      {
        "slug": "agent-observability-for-reliability",
        "title": "What Should an AI Agent's Observability System Capture?",
        "description": "An operator playbook for instrumenting an AI agent: the trace/span model behind a run, the OpenTelemetry GenAI attributes that name each field, the fields worth capturing per span, and what to redact before any of it gets logged.",
        "kind": "sub",
        "order": 11,
        "html": "https://changegamer.ai/articles/agent-observability-for-reliability",
        "markdown": "https://changegamer.ai/articles/agent-observability-for-reliability.md",
        "json": "https://changegamer.ai/api/articles/agent-observability-for-reliability.json"
      },
      {
        "slug": "agent-reliability-production-checklist",
        "title": "The AI Agent Production Reliability Checklist",
        "description": "A go/no-go checklist that turns the agent reliability pillar's twelve-discipline closing list into checkable gates — the specific artifact, header, or trace field that proves each one holds, with a link to whichever sibling article owns its mechanics.",
        "kind": "sub",
        "order": 12,
        "html": "https://changegamer.ai/articles/agent-reliability-production-checklist",
        "markdown": "https://changegamer.ai/articles/agent-reliability-production-checklist.md",
        "json": "https://changegamer.ai/api/articles/agent-reliability-production-checklist.json"
      }
    ]
  },
  "navigation": {
    "pillar": {
      "slug": "agent-reliability-in-production",
      "title": "Agent Guardrails and the AI Agent Reliability Playbook",
      "description": "Agent guardrails plus the eleven other disciplines that make an AI agent reliable in production: tool calling, retries, durable execution and rollout.",
      "kind": "pillar",
      "order": 0,
      "html": "https://changegamer.ai/articles/agent-reliability-in-production",
      "markdown": "https://changegamer.ai/articles/agent-reliability-in-production.md",
      "json": "https://changegamer.ai/api/articles/agent-reliability-in-production.json"
    },
    "previous": {
      "slug": "circuit-breakers-and-degraded-mode-for-ai-agents",
      "title": "How to Design a Circuit Breaker for AI Agents",
      "description": "A deep-dive on the circuit breaker pattern for AI agents: the Closed/Open/Half-Open state machine with a worked open-source example, where to place a breaker in an agent's call path, and degraded-mode fallback design as its own discipline per dependency type.",
      "kind": "sub",
      "order": 10,
      "html": "https://changegamer.ai/articles/circuit-breakers-and-degraded-mode-for-ai-agents",
      "markdown": "https://changegamer.ai/articles/circuit-breakers-and-degraded-mode-for-ai-agents.md",
      "json": "https://changegamer.ai/api/articles/circuit-breakers-and-degraded-mode-for-ai-agents.json"
    },
    "next": {
      "slug": "agent-reliability-production-checklist",
      "title": "The AI Agent Production Reliability Checklist",
      "description": "A go/no-go checklist that turns the agent reliability pillar's twelve-discipline closing list into checkable gates — the specific artifact, header, or trace field that proves each one holds, with a link to whichever sibling article owns its mechanics.",
      "kind": "sub",
      "order": 12,
      "html": "https://changegamer.ai/articles/agent-reliability-production-checklist",
      "markdown": "https://changegamer.ai/articles/agent-reliability-production-checklist.md",
      "json": "https://changegamer.ai/api/articles/agent-reliability-production-checklist.json"
    }
  },
  "resources": [
    {
      "slug": "agent-observability",
      "html": "https://changegamer.ai/resources/agent-observability",
      "markdown": "https://changegamer.ai/resources/agent-observability.md",
      "json": "https://changegamer.ai/api/resources/agent-observability.json"
    }
  ]
}