| title | Use OpenTelemetry and activity traces |
|---|---|
| description | Configure OpenTelemetry tracing and metrics in Data API builder. |
| author | seesharprun |
| ms.author | sidandrews |
| ms.reviewer | jerrynixon |
| ms.service | data-api-builder |
| ms.topic | how-to |
| ms.date | 01/23/2026 |
Data API builder (DAB) supports OpenTelemetry for distributed tracing and metrics, enabling you to monitor and diagnose behavior across REST, GraphQL, database operations, and internal middleware.
- Existing DAB configuration file.
- Running OpenTelemetry collector or backend (for example, Azure Monitor or Jaeger).
- Data API builder CLI. Install the CLI
Use dab add-telemetry to add OpenTelemetry settings to your config.
-
Ensure you have a configuration file. If you need to create one, run:
dab init \ --database-type mssql \ --connection-string "<sql-connection-string>" -
Add OpenTelemetry settings to your configuration file.
dab add-telemetry \ -c dab-config.json \ --otel-enabled true \ --otel-endpoint "http://localhost:4317" \ --otel-protocol "grpc" \ --otel-service-name "dab"dab add-telemetry ^ -c dab-config.json ^ --otel-enabled true ^ --otel-endpoint "http://localhost:4317" ^ --otel-protocol "grpc" ^ --otel-service-name "dab"
-
Start DAB.
dab start
-
Open your OpenTelemetry backend or collector UI.
-
Confirm that traces and metrics are arriving for REST, GraphQL, or database calls.
Note
The .NET Aspire dashboard is an ideal part of the developer loop. It includes built-in views for OpenTelemetry traces and metrics.
DAB creates OpenTelemetry "activities" for:
- Incoming HTTP requests (REST endpoints)
- GraphQL operations
- Database queries (per entity)
- Internal middleware steps (for example, request handling, error tracking)
Each activity includes detailed tags (metadata), such as:
http.method,http.url,http.querystring,status.codeaction.type(CRUD, GraphQL operation)user.role,user-agentdata-source.type,data-source.nameapi.type(REST or GraphQL)
Errors and exceptions are also traced with detailed info.
DAB emits OpenTelemetry metrics such as:
- Total Requests: Counter, labeled by HTTP method, status, endpoint, and API type.
- Errors: Counter, labeled by error type, HTTP method, status, endpoint, and API type.
- Request Duration: Histogram (in milliseconds), labeled by HTTP method, status, endpoint, and API type.
- Active Requests: Up/down counter for concurrent requests.
Metrics use the .NET Meter API and OpenTelemetry SDK.
Add an open-telemetry section under runtime.telemetry in your config file.
{
"runtime": {
"telemetry": {
"open-telemetry": {
"enabled": true,
"endpoint": "http://otel-collector:4317",
"service-name": "dab",
"exporter-protocol": "grpc"
}
}
}
}Configure OpenTelemetry via dab add-telemetry.
--otel-enabled--otel-endpoint--otel-protocol--otel-service-name--otel-headers
dab add-telemetry \
-c dab-config.json \
--otel-enabled true \
--otel-endpoint "http://localhost:4317" \
--otel-protocol "grpc" \
--otel-service-name "dab"dab add-telemetry ^
-c dab-config.json ^
--otel-enabled true ^
--otel-endpoint "http://localhost:4317" ^
--otel-protocol "grpc" ^
--otel-service-name "dab"Note
OpenTelemetry options aren't available on dab configure.
{
"runtime": {
"telemetry": {
"open-telemetry": {
"enabled": true,
"endpoint": "http://localhost:4317",
"service-name": "dab",
"exporter-protocol": "grpc"
}
}
}
}Telemetry is exported via .NET OpenTelemetry SDK to your configured back end such as Azure Monitor or Jaeger. Ensure your back end is running and reachable at the specified endpoint. You can use any OpenTelemetry-compatible back end for visualization.
The OpenTelemetry SDK controls export timing. It exports traces when activities complete. It exports metrics on a periodic interval configured by the SDK. If you don't set an interval, the SDK uses its default.
Note
Ephemeral containers that shut down quickly can exit before exports complete. Allow a graceful shutdown window and avoid aggressive termination so pending telemetry can flush.
- Traces and metrics cover all REST, GraphQL, and database operations
- Middleware and error handlers also emit telemetry
- Context is propagated through requests