# Troubleshooting

## I'm seeing duplicate spans

This is expected when both eBPF and SDK instrumentation are active for the same service. Each source captures the same LLM call independently — you'll see one span from eBPF and one from the SDK. Both are correct; cost is not double-counted. When groundcover detects an SDK span for the same call, eBPF cost and token data is excluded from aggregations.

***

## I don't see AI data

Work through the path you're using.

### AI coding-tool integrations (Claude Code, Claude Cowork, Codex)

AI Observability shows GenAI **traces** — spans with `gen_ai.*` attributes. The Claude Code, Claude Cowork, and Codex data-source integrations ship tool-usage telemetry (logs, plus metrics for Claude Code), not GenAI traces, so they don't appear here. See [AI Tools Observability](/integrations/data-sources/ai-tools-observability.md) for where to find the data.

### eBPF Path

* **Unsupported provider.** eBPF auto-detects OpenAI, Anthropic, and AWS Bedrock only. Calls to Vertex AI, Azure OpenAI, Cohere, or a self-hosted model appear as regular HTTP spans, not in AI Observability. Check [Supported Providers](/capabilities/ai-observability.md#supported-providers) for the current list. If your provider isn't listed, add [SDK instrumentation](/use-groundcover/ai-observability.md#sdk-instrumentation) instead, or [contact us](https://www.groundcover.com/contact) to request eBPF support for your provider.
* **API gateway or proxy in the path.** If your service calls a cloud-hosted gateway (OpenRouter, Azure OpenAI Service, LiteLLM Cloud) instead of OpenAI, Anthropic, or AWS Bedrock directly, eBPF doesn't recognize the hostname and the call appears as regular HTTP. Self-hosted proxies (LiteLLM, Portkey running in your cluster) are not affected — eBPF sees both hops. To get GenAI visibility through an unsupported gateway, add SDK instrumentation to your calling service. [Contact us](https://www.groundcover.com/contact) to request native support for your gateway.
* **Sensor version.** eBPF provider support ships in sensor releases. Check that you're running a current version — [Installation & Updating](/getting-started/installation-and-updating.md).

### SDK Path

* **Missing required attributes.** Your SDK must emit `gen_ai.operation.name` for spans to appear in AI Observability. Valid values: `chat`, `text_completion`, `embeddings`, `invoke_agent`, `execute_tool`, `create_agent`. See [required attributes](/use-groundcover/ai-observability.md#sdk-full-visibility) and use the [**Data Sources**](https://app.groundcover.com/data-sources) page for setup instructions specific to your SDK.
* **OTel exporter not configured.** Confirm your service's OTLP exporter points to groundcover's collector endpoint. The [**Data Sources**](https://app.groundcover.com/data-sources) page has your endpoint and setup steps.
* **SDK not listed.** Check the [**Data Sources**](https://app.groundcover.com/data-sources) page for supported SDKs. If yours isn't listed, [contact us](https://www.groundcover.com/contact) — we're actively expanding SDK support.

***

## Spans Disappeared

Check whether a kill-switch rule is active in [Traces Pipeline Settings](https://app.groundcover.com/settings/traces-pipeline). A `set(drop, true)` rule on `protocol_type == "gen_ai"` drops all GenAI spans before storage. See [Disable GenAI Data Collection](/use-groundcover/ai-observability/privacy-controls.md#disable-genai-data-collection).

***

## No Content in Spans

* **eBPF:** Content is captured automatically. If it's missing, check for a content-reduction or kill-switch rule in [Traces Pipeline Settings](https://app.groundcover.com/settings/traces-pipeline).
* **SDK:** Check whether `OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT=false` is set in your environment. With this flag off, spans arrive with all performance metadata but no content. Remove it or set it to `true` to restore content capture. See [Metadata-Only Mode](/use-groundcover/ai-observability/privacy-controls.md#metadata-only-mode) for details.

***

## Cost Shows Unpriced

The `gc.llm_cost.status` attribute shows `unpriced` when groundcover doesn't have pricing for the model in its pricing table. This typically happens with newly released models, fine-tuned models, or custom model names. Cost will populate automatically once the pricing table is updated. See [groundcover Enrichment](/use-groundcover/ai-observability/attributes.md#groundcover-enrichment) for details.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.groundcover.com/use-groundcover/ai-observability/troubleshooting.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
