This page lists every standard metric and span attribute that Dynatrace can ingest for GenAI workloads, grouped by where the data comes from.
OpenTelemetry-native metrics: First-class OTel metric instruments (gen_ai.client.*, gen_ai.server.*, gen_ai.workflow.*, gen_ai.invoke_agent.*, gen_ai.execute_tool.*) emitted directly by your instrumentation (Traceloop SDK, OneAgent, or other OTel/OpenLLMetry-based SDKs). Dynatrace ingests these as-is, and doesn't calculate them.
Dynatrace span-derived visualizations: Built by Dynatrace directly from gen_ai.* span attributes. No separate metric instrument is emitted for these;
AI Observability computes tiles, filters, and breakdowns straight from the span data.
Vendor-native metrics: These are sent directly by the AI platform or gateway (Amazon Bedrock, Azure OpenAI, NVIDIA NIM, Kong AI Gateway), either as provider-specific span attributes or as their own metrics.
Other OTel or third-party sources: These are metrics that you derive yourself (for example, by parsing inference-server or application logs) and then forward to Dynatrace.
All signals are ingestible and queryable via DQL. Some signals are visualized in tiles, as noted in the tables.
OpenTelemetry's GenAI semantic conventions call every property (as documented in this section) an "attribute," including the ones attached to metric data points. Once ingested into Dynatrace, properties on metrics become dimensions; only span, log, and resource properties keep the "attribute" name. The tables on this page use a single Attribute column for both, since most properties here start life as span attributes. In cases where a property is also usable as a metric dimension, this is called out directly in its row (for example, in the Type or Description cell).
These are the standard OpenTelemetry semantic-convention metrics for GenAI clients. They are metric instruments, not span attributes; your instrumentation must be configured to emit them. Possible configuration options include, for example, Traceloop's should_enrich_metrics=True or a custom OTel MeterProvider. If a metric that already has a tile is missing, that tile shows empty or zeroed values without an error.
The Requirement level column in the per-metric attribute tables below is stricter than the upstream OTel semantic conventions. gen_ai.request.model and gen_ai.response.model are marked Required here because
AI Observability needs both to populate the model filter, prompts table, and overview charts. OTel semconv classifies them as "conditionally required" and "recommended" respectively.
| Metric | Instrument type | Unit | Description | Visualization |
|---|---|---|---|---|
Histogram |
| Number of input and output tokens used. | Shows cost tiles, with token usage split by type | |
Histogram |
| GenAI operation duration. | Shows latency charts (p99, mean) | |
Histogram |
| Time to receive the first chunk, measured from when the client issues the generation request to when the first chunk is received in the response stream. Only emitted for streaming calls. | Visualization not available | |
Histogram |
| Time per output chunk, recorded for each chunk received after the first one, measured from the end of the previous chunk to the end of the current chunk. Only emitted for streaming calls. | Visualization not available |
gen_ai.client.token.usage | Attribute | Requirement level | Value type | Description | Example values |
|---|---|---|---|---|
| Required | string | The name of the operation being performed. |
|
| Required | string | The GenAI provider identified by the instrumentation. |
|
| Required | string | The type of token being counted. This splits the cost tile lanes. |
|
| Required | string | The model a request is being made to. |
|
| Required | string | The model that generated the response. |
|
If this metric is missing, all cost tiles show $0 with no visible error.
If the gen_ai.token.type attribute is missing, the tiles show an undifferentiated cost total instead of separate input/output lanes.
gen_ai.client.operation.duration | Attribute | Requirement level | Value type | Description | Example values |
|---|---|---|---|---|
| Required | string | The name of the operation being performed. |
|
| Conditionally required | string | Error class the operation ended with, if it errored. |
|
| Conditionally required | string | The GenAI provider identified by the instrumentation. |
|
| Required | string | The model a request is being made to. |
|
| Required | string | The model that generated the response. |
|
If this metric is missing, all latency tiles show as empty, with no error surfaced.
gen_ai.client.operation.time_to_first_chunk | Attribute | Requirement level | Value type | Description | Example values |
|---|---|---|---|---|
| Required | string | The name of the operation being performed. |
|
| Required | string | The GenAI provider identified by the instrumentation. |
|
| Required | string | The model a request is being made to, if available. |
|
| Conditionally required | int | GenAI server port, if |
|
| Required | string | The model that generated the response. |
|
| Recommended | string | GenAI server address. |
|
gen_ai.client.operation.time_per_output_chunk | Attribute | Requirement level | Value type | Description | Example values |
|---|---|---|---|---|
| Required | string | The name of the operation being performed. |
|
| Required | string | The GenAI provider identified by the instrumentation. |
|
| Required | string | The model a request is being made to, if available. |
|
| Conditionally required | int | GenAI server port, if |
|
| Required | string | The model that generated the response. |
|
| Recommended | string | GenAI server address. |
|
These metrics describe the operational behavior of GenAI model servers (functional and performance metrics), rather than the client's view of an operation. They're most relevant for self-hosted or gateway-fronted model servers.
| Metric | Instrument type | Unit | Description | Visualization |
|---|---|---|---|---|
Histogram |
| Generative AI server request duration, such as time-to-last-byte or last output token. | Visualization not available | |
Histogram |
| Time to generate the first token of the response, for streaming requests. | Visualization not available | |
Histogram |
| Time per output token generated after the first token, for successful responses. | Visualization not available |
All three Gen AI model server metrics share this attribute set:
| Attribute | Requirement level | Value type | Description | Example values |
|---|---|---|---|---|
| Required | string | The name of the operation being performed. |
|
| Required | string | The GenAI provider identified by the client or server instrumentation. |
|
| Conditionally required | string | Error class the operation ended with, if it errored. Applies to |
|
| Required | string | The model a request is being made to, if available. |
|
| Conditionally required | int | GenAI server port, if |
|
| Required | string | The model that generated the response. |
|
| Recommended | string | GenAI server address. |
|
These metrics measure orchestration boundaries above a single model call: a full workflow, a single agent invocation, or a single tool execution.
When instrumentation can only observe a single provider-facing client call, use gen_ai.client.operation.duration instead.
| Metric | Instrument type | Unit | Description | Status |
|---|---|---|---|---|
Histogram |
| End-to-end duration of a workflow execution, from application code initiating the workflow to the workflow completing. | Visualization not available | |
Histogram |
| End-to-end duration of a single in-process agent invocation, from invocation start until the agent emits its last response chunk or errors. | Visualization not available | |
Histogram |
| Duration of a single tool execution. | Visualization not available |
gen_ai.workflow.duration | Attribute | Requirement level | Value type | Description | Example values |
|---|---|---|---|---|
| Conditionally required | string | Error class the operation ended with, if it errored. |
|
| Conditionally required | string | Human-readable workflow name provided by the application, if available. |
|
gen_ai.invoke_agent.duration | Attribute | Requirement level | Value type | Description | Example values |
|---|---|---|---|---|
| Conditionally required | string | Error class the operation ended with, if it errored. |
|
| Conditionally required | string | Human-readable name of the invoked GenAI agent, when available. |
|
| Recommended | string | The model configured for the agent, if applicable. |
|
gen_ai.execute_tool.duration | Attribute | Requirement level | Value type | Description | Example values |
|---|---|---|---|---|
| Required | string | Name of the tool used by the agent. |
|
| Conditionally required | string | Error class the operation ended with, if it errored. |
|
| Conditionally required | string | Human-readable name of the agent executing the tool, when applicable. |
|
| Recommended | string | Type of the tool used by the agent, if available. |
|
These attributes are set directly on spans by your instrumentation. Dynatrace computes the following tiles, filters, and breakdowns straight from them; there's no separate metric instrument behind these visualizations.
AI Observability visualizes the following attributes, which are set directly on spans and exist alongside the general OTel/Dynatrace fields service.name, span.status_code, and duration.
Requirement levels reflect what
AI Observability needs to render correctly, which is stricter than the upstream OpenTelemetry semantic conventions for GenAI spans. Attributes marked Required here are mandatory for the app to show data; missing any of them leaves filters, tiles, or table columns empty.
| Attribute | Requirement level | Visualization |
|---|---|---|
| Required | Shows provider filter, service explorer table |
| General OTel resource attribute, not GenAI-specific. | Shows service filter, service explorer table |
| Required | Shows operation breakdown, trace analysis |
| Required | Shows prompts table, distributed tracing |
| Required | Shows model filter, overview charts |
| Required | Shows prompts table, cost tile fallback when the |
| General OTel span field, not GenAI-specific. | Shows service health tile (success/failure rate) |
| General OTel span field, not GenAI-specific. | Shows average and p50/p90 latency in the Explorer per-service and per-model tables |
| Conditionally required | Shows agent vs. LLM distinction, agent filter |
| Conditionally required | Shows groups spans into conversation threads in the prompts view |
| Required | Shows prompts table content |
For agent-specific and provider-specific span attributes, see Additional span attributes and Vendor-native metrics and attributes.
For the full attribute list, required vs. optional levels per view, and provider-specific attributes, see Semantic Conventions for GenAI agent and framework spans.
The OTel GenAI semantic conventions define more gen_ai.* span attributes that apply across providers than the ones
AI Observability currently visualizes, see Core span attributes. None of these additional span attributes have a dedicated tile yet, but they're ingestible and queryable via DQL if your instrumentation sets them. For provider-specific attributes (OpenAI, AWS Bedrock, Azure AI Foundry), see the matching vendor under Vendor-native metrics and attributes.
Requirement levels follow Semantic Conventions for GenAI spans.
| Attribute | Requirement level | Description |
|---|---|---|
| Recommended | Maximum number of tokens requested. |
| Recommended | Sampling temperature for the request. Visualized in the Model versioning and A/B testing dashboard, but not in the custom app pages. |
| Recommended | The |
| Recommended | Sequences that stop generation, if requested. |
| Conditionally required | Seed used for deterministic sampling, if included in the request. |
| Conditionally required | Number of response choices requested, if available and not |
| Recommended | Unique identifier for the response. |
| Recommended | Reasons the model stopped generating, per choice. |
| Recommended | Input tokens served from a prompt cache. Distinct from the Bedrock-specific |
| Recommended | Input tokens used to write to a prompt cache. |
| Conditionally required | Error class the operation ended with, if it errored. Same field also used as an attribute on the GenAI client metrics. For more information, see GenAI client metrics. |
Set on spans for agent invocations. See Semantic Conventions for GenAI agent and framework spans for the full specification.
This is done in addition to the already-visualized gen_ai.agent.name and gen_ai.input.messages/gen_ai.output.messages, see Core span attributes
| Attribute | Requirement level | Description |
|---|---|---|
| Conditionally required | Provider-assigned stable identifier of the agent (not a transient in-memory instance ID), if applicable. |
| Conditionally required | Free-form description of the agent, if provided by the application. |
| Conditionally required | Version of the agent, if provided by the application. |
| Conditionally required | Identifier of the data source used for RAG, if applicable. |
| Conditionally required | Content type requested from the model (for example |
| Opt-in | System message or instructions given to the model, separate from the chat history. |
| Opt-in | Tool definitions available to the agent. |
This page lists only what
AI Observability currently visualizes.
Vendors and gateways expose far more native metrics and attributes; for each vendor's complete signal set, reference the vendor documentation as linked in the relevant section.
For the full list of AI platforms and gateways that Dynatrace integrates with, see AI Observability integrations.
For a high-level overview, see Which metrics are available?.
AI Observability visualizes the following metrics and attributes.
| Metric or attribute | Type | Used for |
|---|---|---|
| Span attribute | Guardrail overview cards, contextual grounding score |
| Span attribute (metric dimension) | Splits grounding vs. relevance guardrail tiles |
| Metric (counter) | Cache-read/write token savings, distinct from the span attribute |
See Amazon Bedrock Guardrails for the full guardrail feature set.
Dynatrace also ingests the OTel semantic-convention attributes aws.bedrock.guardrail.id (required) and aws.bedrock.knowledge_base.id (recommended), set when gen_ai.provider.name is aws.bedrock. (For more information, see AWS Bedrock semantic conventions.) These are distinct from the gen_ai.bedrock.guardrail.* attributes and aren't used by a tile today.
AI Observability visualizes the following metrics and attributes.
| Metric or attribute | Type | Used for |
|---|---|---|
| Span attribute | Guardrail overview cards |
| Span attribute | Guardrail overview cards |
See Content filtering for Azure OpenAI for the full set of filter categories and severity levels.
Dynatrace also ingests the OTel semantic-convention attribute azure.resource_provider.namespace (recommended), set when gen_ai.provider.name is azure.ai.inference. For more information, see Azure AI Inference semantic conventions. It identifies the Azure Resource Provider Namespace (Microsoft.CognitiveServices for Azure AI Inference operations) and isn't used by a tile today.
The ready-made Azure AI Foundry dashboard covers cost, latency, and token totals only. It doesn't add content-filter tiles beyond the custom app tiles.
NVIDIA NIM inference servers expose their own Prometheus-compatible metrics covering request latency, throughput, token counts, and GPU utilization. There's no dedicated NIM tile in the custom app pages, but the ready-made NVIDIA dashboard visualizes a subset directly:
| Metric | Used for |
|---|---|
| Token usage and cost-estimate tiles |
| Average and p99 request-latency tiles |
| Time-to-first-token tile |
| Throughput tile |
| GPU cache utilization tile |
| In-flight request count |
| Request-volume tile |
Standalone vLLM deployments expose this same metric set, since NIM proxies vLLM's own metrics without renaming or wrapping them.
See NVIDIA NIM observability reference for the full Prometheus metric set.
Gemini and Vertex AI return safety ratings on each response: the safetyRatings array has a harm category, probability, and blocked flag per category, plus a finishReason of SAFETY when a response is blocked.
Neither the custom app pages nor the ready-made Gemini/Vertex AI dashboard visualize safety ratings yet. To do this, you need to forward them to Dynatrace and query via DQL. The ready-made dashboard does cover the same generic cost, latency, and token tiles as the other vendor dashboards.
Kong AI Gateway exposes its own AI Gateway observability signals covering token usage, cost, and latency across LLM traffic. There's no dedicated Kong tile in the custom app pages, but the ready-made Kong dashboard visualizes:
| Metric | Used for |
|---|---|
| Request-volume tiles by provider and model |
| Token usage and cost tiles, split by |
| Average and p99 provider-latency tiles |
| Gateway-side latency by service and route |
See Kong AI Gateway observability for the full signal reference.
Dynatrace also ingests the following OTel semantic-convention attributes, set when gen_ai.provider.name is openai. For more information, see OpenAI semantic conventions. None of them are used by a tile today.
| Attribute | Requirement level | Description |
|---|---|---|
| Recommended | Which OpenAI API served the request, for example |
| Conditionally required | The service tier requested, if included and not |
| Conditionally required | The service tier used for the response, if included. |
| Recommended | Fingerprint tracking any change in the GenAI environment that generated the response. |
The ready-made OpenAI dashboard follows the same pattern as Bedrock and Azure OpenAI's cost/latency/token tiles, built entirely on standard gen_ai.client.token.usage, gen_ai.token.type, and gen_ai.prompt.caching.
In addition to the vendor-specific dashboards, Dynatrace provides the following ready-made dashboards within the
AI Observability Additional use cases tiles.
gen_ai.* span attributes (gen_ai.request.temperature, gen_ai.usage.input_tokens/output_tokens with fallback to the deprecated gen_ai.usage.prompt_tokens/completion_tokens). It doesn't use the gen_ai.client.token.usage or gen_ai.client.operation.duration metrics.fetch bizevents, event.type == "gen_ai.auditing") rather than spans or metrics, for data-governance and compliance reporting.Some instrumentation libraries don't emit gen_ai.* names natively.
These need a normalization step before
AI Observability can read them.
llm.model_name, llm.token_count.*, and so on). Normalize it to gen_ai.* using an OTel Collector transform processor or Dynatrace OpenPipeline. OpenInference example provides the full attribute mapping and known gaps (for example, guardrail details beyond the validator name aren't yet translated).gen_ai.* naming automatically, so use consistent naming and dimensions if you want them to appear alongside standard views.