Owner and workspace
These come from the request, not from attributes. No attribute can change them.service.name, gen_ai.agent.name, and user.id never decide the owner. See How trace attribution works.
Resource attributes
Session, visitor, skill, and eval
No attribute sets an agent version. Traces and the SDK’s session records name the agent, not a version. To compare versions, record the version in an eval experiment’s
config.
Span type and model
The SDK’s
update(model=..., provider=...) writes gen_ai.request.model and gen_ai.provider.name.
Tokens
All token counts are integers. Atlan stores four separate counts, so cached tokens are never counted twice.
Every input key except
atlan.usage.input_tokens is read as the whole prompt, cached tokens included. Atlan subtracts the cache-read and cache-write counts from it to get fresh input. atlan.usage.input_tokens is read as fresh input already. The SDK’s usage={"input_tokens": ...} writes gen_ai.usage.input_tokens, so pass the whole prompt count there.
A span’s usage.input_tokens, read back through the API with fields=usage, is the fresh count.
Cost
A cost you record is kept only when Atlan cannot price the call itself. When the span has a model and at least one token count, Atlan prices it at your organization’s rates and replaces the recorded cost. If no rate applies, the call is Unpriced at zero. See How cost is calculated.
Example
One model-call span from an OpenTelemetry producer, shown as OTLP JSON attributes:llm call in session ticket-4821, with 4,000 fresh input tokens, 8,000 cache-read tokens, and 600 output tokens, then prices it.
Related
- How trace attribution works: Owner, workspace, and what Atlan never infers.
- Create spans for agent run: Set these values with the SDK.
- Trace limits and privacy: Size limits, content policy, and deletion.