diff --git a/java/ai.md b/java/ai.md index 867df248d3..29eeaec897 100644 --- a/java/ai.md +++ b/java/ai.md @@ -228,3 +228,43 @@ In CDS QL queries, elements of type `Vector` are excluded from the select list b ::: CAP Java supports multiple [vector functions](./working-with-cql/query-api.md#vector-functions) that allow you to compute vector embeddings, similarity, and distance directly in the database. + +## Tracing Agents +###### tracing-agents + +When a CAP Agent handles a request, CAP Java emits a hierarchy of OpenTelemetry spans that follow the request from the inbound A2A request through each LLM round-trip down to the individual tool executions. The span attributes follow the [OpenTelemetry GenAI semantic conventions](https://opentelemetry.io/docs/specs/semconv/gen-ai/) (`gen_ai.*`), so traces are directly consumable by standard observability backends (for example SAP Cloud Logging, Dynatrace, or Jaeger) without custom mapping. + +### Span Hierarchy + +A single agent request produces the following nested spans. When the agent is exposed via the [A2A protocol adapter](#agents), the inbound A2A request span wraps the `invoke_agent` span: + +| Span name | Span kind | Description | +| ---------------------- | ---------- | --------------------------------------------------------------------------------------------- | +| `invoke_agent ` | `INTERNAL` | One span per agent invocation, covering all LLM round-trips triggered by tool calls. | +| `chat ` | `CLIENT` | One child span per LLM call. | +| `execute_tool ` | `INTERNAL` | One child span per tool call, between the LLM response requesting the tool and its result. | + +```txt +SendMessage // inbound A2A request span (SERVER), via the A2A adapter + └─ invoke_agent TravelService // gen_ai.agent.name, gen_ai.conversation.id, cds.ai.service.method + ├─ chat anthropic--claude-4.6-sonnet // gen_ai.request.model, gen_ai.usage.input_tokens/output_tokens, ... + ├─ execute_tool describe // gen_ai.tool.call.name, gen_ai.tool.call.outcome + ├─ execute_tool query + └─ chat anthropic--claude-4.6-sonnet // follow-up round-trip after the tool results +``` + +These are standard OpenTelemetry spans, emitted through CAP's OpenTelemetry instrumentation. See [CAP Instrumentation](./operating-applications/observability#cap-instrumentation) for how to set up the required infrastructure and enable the individual span loggers — including the `Agent`, `ChatModel`, and `ToolExecution` loggers for the spans described here. + +### Span Attributes + +The spans carry the following `gen_ai.*` attributes (omitted when the corresponding value is not available): + +| Span | Attributes | +| --------------- | -------------------------------------------------------------------------------------------------------------------------------------- | +| `invoke_agent` | `gen_ai.operation.name`, `gen_ai.agent.name`, `gen_ai.conversation.id`, `cds.ai.service.method`, `cds.ai.agent.outcome` | +| `chat` | `gen_ai.operation.name`, `gen_ai.provider.name`, `gen_ai.request.model`, `gen_ai.request.temperature`, `gen_ai.request.top_p`, `gen_ai.request.max_tokens`, `gen_ai.response.model`, `gen_ai.response.id`, `gen_ai.response.finish_reasons`, `gen_ai.usage.input_tokens`, `gen_ai.usage.output_tokens` | +| `execute_tool` | `gen_ai.operation.name`, `gen_ai.tool.call.name`, `gen_ai.tool.call.id`, `gen_ai.tool.call.outcome`, `gen_ai.tool.call.arguments`*, `gen_ai.tool.call.result`* | + +Errors are recorded on the affected span, and any tool spans still open when an invocation fails are closed and marked with outcome `error`. + +* Tool-call arguments and results are potentially sensitive and are only recorded when the [`cds.security.logPotentiallySensitive`](./developing-applications/properties#cds-security-logpotentiallysensitive) setting is enabled. By default they are omitted. diff --git a/java/operating-applications/observability.md b/java/operating-applications/observability.md index d34adb8cb1..b94434d11b 100644 --- a/java/operating-applications/observability.md +++ b/java/operating-applications/observability.md @@ -504,6 +504,10 @@ By default, instrumentation for CAP-specific components is disabled, so that no | `com.sap.cds.otel.span.CQN` | `INFO` | Spans for executed CQN statement. | | `com.sap.cds.otel.span.OutboxCollector` | `INFO` | Spans for execution of the transactional outbox collector. | | `com.sap.cds.otel.span.DraftGarbageCollection` | `INFO` | Spans for execution of the draft garbage collection. | +| `com.sap.cds.otel.span.ChatModel` | `INFO` | Spans for individual LLM chat model calls (AI integration). | +| `com.sap.cds.otel.span.Agent` | `INFO` | Spans for AI agent invocations (AI integration). | +| `com.sap.cds.otel.span.ToolExecution` | `INFO` | Spans for tool executions during an agent invocation (AI integration). | +| `com.sap.cds.otel.span.McpServer` | `INFO` | Spans for inbound MCP server requests. | | `com.sap.cds.otel.span.RequestContext` | `DEBUG` | Spans for each Request Context. | | `com.sap.cds.otel.span.ChangeSetContext` | `DEBUG` | Spans for each ChangeSet Context. | | `com.sap.cds.otel.span.Emit` | `DEBUG` | Spans for dispatching events in the CAP runtime. |