You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.NET Framework控制台应用中配置Cosmos DB SQL API日志到Application Insights?

解决控制台应用中Cosmos DB遥测到Application Insights的问题

首先明确:这个功能并不只支持Web App项目,控制台应用完全可以配置实现,只是Web项目有自动集成的机制,而控制台需要我们手动处理部分逻辑。下面一步步给你讲具体操作:

步骤1:安装必要的NuGet包

你需要确保安装以下几个核心包(可以通过NuGet包管理器或者Package Manager Console安装):

  • Microsoft.Azure.Cosmos(最新稳定版即可)
  • Microsoft.ApplicationInsights(Application Insights核心SDK)
  • Microsoft.ApplicationInsights.DependencyCollector(可选,能更便捷地跟踪依赖调用)

步骤2:正确初始化Application Insights TelemetryClient

控制台应用里的TelemetryClient没有Web应用那样的自动生命周期管理,所以需要手动初始化,并且在程序结束前确保数据发送完成:

using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.Extensibility;

// 推荐用连接字符串(比Instrumentation Key更安全,是当前官方推荐方式)
var telemetryConfig = TelemetryConfiguration.CreateDefault();
telemetryConfig.ConnectionString = "你的Application Insights连接字符串";
// 如果你还在使用Instrumentation Key,也可以这么设置
// telemetryConfig.InstrumentationKey = "你的Instrumentation Key";

var telemetryClient = new TelemetryClient(telemetryConfig);

步骤3:捕获Cosmos DB诊断数据并发送到AI

Cosmos DB的每个操作(查询、创建、更新等)都会返回包含诊断信息的ResponseMessage或迭代器诊断数据,我们可以解析这些数据并转换成Application Insights的遥测事件:

示例:捕获单个写入操作的诊断数据

using Microsoft.Azure.Cosmos;

// 初始化CosmosClient
var cosmosClient = new CosmosClient("你的Cosmos DB连接字符串");
var database = await cosmosClient.CreateDatabaseIfNotExistsAsync("TestDB");
var container = await database.CreateContainerIfNotExistsAsync("TestContainer", "/partitionKey");

// 执行创建项操作
var newItem = new { Id = Guid.NewGuid().ToString(), partitionKey = "test", Name = "Test Item" };
var response = await container.CreateItemAsync(newItem);

// 获取诊断信息
var diagnostics = response.Diagnostics;

// 将关键指标作为自定义事件发送到AI
telemetryClient.TrackEvent("Cosmos DB Write Operation", new Dictionary<string, string>
{
    { "OperationType", "CreateItem" },
    { "RequestCharge", diagnostics.GetTotalRequestCharge().ToString() },
    { "DurationMs", diagnostics.GetTotalElapsedTime().TotalMilliseconds.ToString() },
    { "StatusCode", response.StatusCode.ToString() },
    { "FullDiagnostics", diagnostics.ToString() } // 完整诊断文本,方便排查问题
});

示例:捕获查询操作的诊断数据

var queryIterator = container.GetItemQueryIterator<dynamic>("SELECT * FROM c WHERE c.partitionKey = 'test'");
while (queryIterator.HasMoreResults)
{
    var queryResponse = await queryIterator.ReadNextAsync();
    var diagnostics = queryResponse.Diagnostics;
    
    // 用TrackDependency标记为依赖调用,更符合AI的遥测分类
    telemetryClient.TrackDependency(
        dependencyTypeName: "Cosmos DB",
        name: "Partition Query",
        data: "SELECT * FROM c WHERE c.partitionKey = 'test'",
        startTime: DateTimeOffset.Now,
        duration: diagnostics.GetTotalElapsedTime(),
        success: queryResponse.IsSuccessStatusCode
    );
}

步骤4:确保遥测数据发送成功

控制台应用结束时,一定要调用Flush()并等待一段时间——因为AI SDK是异步发送数据的,直接退出程序会导致数据丢失:

// 在程序退出前执行
telemetryClient.Flush();
// 等待5秒让数据完成发送,生产环境可根据实际情况调整时长
Task.Delay(5000).Wait();

常见坑点提醒

  • 别忘调用Flush():控制台没有Web应用的托管环境,不会自动触发遥测发送,手动调用是必须的。
  • 优先用连接字符串:Instrumentation Key已逐步被官方淘汰,连接字符串支持更多功能且更安全。
  • 用好诊断扩展方法:CosmosDiagnostics提供了GetTotalRequestCharge()、GetTotalElapsedTime()等扩展方法,不用自己解析原始文本就能拿到关键指标。

内容的提问来源于stack exchange,提问作者JohnKoz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:18:14