Azure Cosmos DB SDK observability
APPLIES TO: NoSQL
The Azure Cosmos DB .NET and Java SDKs support distributed tracing to help you monitor your applications. Tracing the flow of requests is helpful in debugging, analyzing latency and performance, and gathering diagnostics. Instrument tracing for your applications using OpenTelemetry, which is vendor-neutral and has a set of semantic conventions to ensure a standardized data format regardless of your chosen exporter, or use the Application Insights SDK or Azure Monitor OpenTelemetry Distro.
Get started
Distributed tracing is available in the following SDKs:
SDK | Supported version | Notes |
---|---|---|
.NET v3 SDK | >= 3.36.0 |
This feature is available in both preview and non-preview versions. For non-preview versions, it's off by default. You can enable tracing by setting DisableDistributedTracing = false in CosmosClientOptions.CosmosClientTelemetryOptions . |
.NET v3 SDK preview | >= 3.33.0-preview |
This feature is available in both preview and non-preview versions. For preview versions, it's on by default. You can disable tracing by setting DisableDistributedTracing = true in CosmosClientOptions.CosmosClientTelemetryOptions . |
Java v4 SDK | >= 4.43.0 |
Trace attributes
Azure Cosmos DB traces follow the OpenTelemetry database specification and also provide several custom attributes. You can see different attributes depending on the operation of your request, and these attributes are core attributes for all requests.
Attribute | Type | Description |
---|---|---|
net.peer.name |
string | Azure Cosmos DB host name. |
db.name |
string | Azure Cosmos DB database name. |
db.system |
string | Identifier for the database service. Is cosmosdb for all requests. |
db.operation |
string | Operation name, ex. CreateItemAsync . |
db.cosmosdb.container |
string | Azure Cosmos DB container name. |
db.cosmosdb.client_id |
string | Identifier representing a unique client instance. |
db.cosmosdb.operation_type |
string | Operation type, ex. Create . |
db.cosmosdb.connection_mode |
string | Client connection mode. Either direct or gateway . |
db.cosmosdb.status_code |
int | Status code for the request. |
db.cosmosdb.sub_status_code |
int | Sub status code for the request. |
db.cosmosdb.request_charge |
double | RUs consumed for the operation. |
db.cosmosdb.regions_contacted |
string | List of regions contacted in the Azure Cosmos DB account. |
user_agent.original |
string | Full user-agent string generated by the Azure Cosmos DB SDK. |
Gather diagnostics
If you configured logs in your trace provider, you can automatically get diagnostics for Azure Cosmos DB requests that failed or had high latency. These logs can help you diagnose failed and slow requests without requiring any custom code to capture them.
In addition to getting diagnostic logs for failed requests, you can configure different latency thresholds for when to collect diagnostics from successful requests. The default values are 100 ms for point operations and 500 ms for non point operations. These thresholds can be adjusted through client options.
CosmosClientOptions options = new CosmosClientOptions()
{
CosmosClientTelemetryOptions = new CosmosClientTelemetryOptions()
{
DisableDistributedTracing = false,
CosmosThresholdOptions = new CosmosThresholdOptions()
{
PointOperationLatencyThreshold = TimeSpan.FromMilliseconds(100),
NonPointOperationLatencyThreshold = TimeSpan.FromMilliseconds(500)
}
},
};
You can configure the log level to control which diagnostics logs you receive.
Log Level | Description |
---|---|
Error | Logs for errors only. |
Warning | Logs for errors and high latency requests based on configured thresholds. |
Information | There are no specific information level logs. Logs in this level are the same as using Warning. |
Depending on your application environment, there are different ways to configure the log level. Here's a sample configuration in appSettings.json
:
{
"Logging": {
"LogLevel": {
"Azure-Cosmos-Operation-Request-Diagnostics": "Information"
}
}
}
Configure OpenTelemetry
To use OpenTelemetry with the Azure Cosmos DB SDKs, add the Azure.Cosmos.Operation
source to your trace provider. OpenTelemetry is compatible with many exporters that can ingest your data. The following sample uses the Azure Monitor OpenTelemetry Exporter
, but you can choose to configure any exporter you wish. Depending on your chosen exporter, you might see a delay ingesting data of up to a few minutes.
Tip
If you use the Azure.Monitor.OpenTelemetry.Exporter
package, ensure you're using version >= 1.0.0-beta.11
.
If you're using ASP.NET Core and Azure Monitor, we recommend using the Azure Monitor OpenTelemetry Distro instead.
This sample shows how to configure OpenTelemetry for a .NET console app. See the complete sample on GitHub.
ResourceBuilder resource = ResourceBuilder.CreateDefault().AddService(
serviceName: serviceName,
serviceVersion: "1.0.0");
// Set up logging to forward logs to chosen exporter
using ILoggerFactory loggerFactory
= LoggerFactory.Create(builder => builder
.AddConfiguration(configuration.GetSection("Logging"))
.AddOpenTelemetry(options =>
{
options.IncludeFormattedMessage = true;
options.SetResourceBuilder(resource);
options.AddAzureMonitorLogExporter(o => o.ConnectionString = aiConnectionString); // Set up exporter of your choice
}));
/*.AddFilter(level => level == LogLevel.Error) // Filter is irrespective of event type or event name*/
AzureEventSourceLogForwarder logforwader = new AzureEventSourceLogForwarder(loggerFactory);
logforwader.Start();
// Configure OpenTelemetry trace provider
AppContext.SetSwitch("Azure.Experimental.EnableActivitySource", true);
_traceProvider = Sdk.CreateTracerProviderBuilder()
.AddSource("Azure.Cosmos.Operation", // Cosmos DB source for operation level telemetry
"Sample.Application")
.AddAzureMonitorTraceExporter(o => o.ConnectionString = aiConnectionString) // Set up exporter of your choice
.AddHttpClientInstrumentation() // Added to capture HTTP telemetry
.SetResourceBuilder(resource)
.Build();
Configure the Application Insights SDK
There are many different ways to configure Application Insights depending on the language your application is written in and your compute environment. For more information, see the Application Insights documentation. Ingestion of data into Application Insights can take up to a few minutes.
Note
Use version >= 2.22.0-beta2
of the Application Insights package for your target .NET environment.
The following sample shows how to configure Application Insights for a .NET console app. See the complete sample on GitHub.
IServiceCollection services = new ServiceCollection();
services.AddApplicationInsightsTelemetryWorkerService((ApplicationInsightsServiceOptions options) => options.ConnectionString = aiConnectionString);
IServiceProvider serviceProvider = services.BuildServiceProvider();
telemetryClient = serviceProvider.GetRequiredService<TelemetryClient>();
Once trace data is ingested into Application Insights, you can visualize it in the Azure portal to understand the request flow in your application. Here's an example of trace data from a cross partition query in the transaction search in the left navigation of the Azure portal.