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

.NET 6控制台应用手动上报的MQTT依赖未显示在Application Map

问题:手动上报的MQTT依赖未显示在Application Insights应用地图中

我有一个使用Application Insights的C# .NET 6控制台应用,部分依赖可被自动发现并显示在Application Map中。该应用使用MQTTnet库向MQTT Broker发送消息,由于这类调用未自动显示在Application Map中,我通过以下代码手动调用TrackDependency上报:

var startTime = DateTime.UtcNow;
var timer = System.Diagnostics.Stopwatch.StartNew();
bool success = false;
try
{
    await _mqttClient.PublishAsync(applicationMessage, CancellationToken.None);
    success = true;
}
finally
{
    timer.Stop();
    ApplicationTelemetry.TelemetryClient?.TrackDependency("EventBusTopic", "PublishAsync", null, startTime, timer.Elapsed, success);
}

我已在事务搜索中搜索“Dependency”确认数据已被摄入Application Insights,但该依赖仍未显示在Application Map中。以下是Application Insights的初始化代码:

IServiceCollection services = new ServiceCollection();
ApplicationInsightsServiceOptions options = new ApplicationInsightsServiceOptions();
options.ConnectionString = configuration["ApplicationInsights:ConnectionString"];
services.AddApplicationInsightsTelemetryWorkerService(options);

IServiceProvider serviceProvider = services.BuildServiceProvider();

ApplicationTelemetry.TelemetryClient = serviceProvider.GetRequiredService<TelemetryClient>();

原因分析及解决方案

1. 缺少关联的父操作上下文

Application Map依赖**操作上下文(Operation Context)**来关联依赖调用和发起它的父操作。控制台应用没有Web应用那样自动生成的请求上下文,若未主动创建或传递操作上下文,手动上报的依赖会成为孤立遥测数据,无法被地图识别关联。

解决办法:
在MQTT调用前创建活跃操作上下文,可使用StartOperation生成:

using (var operation = ApplicationTelemetry.TelemetryClient?.StartOperation<DependencyTelemetry>("MQTT Publish"))
{
    if (operation == null) return;
    var timer = System.Diagnostics.Stopwatch.StartNew();
    bool success = false;
    try
    {
        await _mqttClient.PublishAsync(applicationMessage, CancellationToken.None);
        success = true;
        operation.Telemetry.Success = success;
    }
    finally
    {
        timer.Stop();
        operation.Telemetry.Type = "MQTT";
        operation.Telemetry.Name = "PublishAsync";
        operation.Telemetry.Target = "mqtt://your-broker-address:1883"; // 替换为你的Broker地址
        operation.Telemetry.Duration = timer.Elapsed;
    }
}

如果已有父操作(比如其他自动遥测生成的),确保TelemetryClient的ActiveOperationId已正确设置。

2. 依赖遥测字段不符合地图识别规则

Application Map对依赖遥测的Type和Target字段有识别要求:

  • Target为null时,无法识别依赖的目标服务,无法生成地图节点
  • Type使用自定义值(如EventBusTopic)可能不在预识别类别中,地图无法匹配对应的节点类型

解决办法:
调用TrackDependency时传入明确的Target(Broker地址/标识)和标准Type:

ApplicationTelemetry.TelemetryClient?.TrackDependency(
    "MQTT", // 明确依赖类型为MQTT
    "PublishAsync", 
    "mqtt://your-broker-address:1883", // Broker地址作为Target
    startTime, 
    timer.Elapsed, 
    success);

3. 控制台应用缺少根操作上下文

控制台应用默认没有全局根操作,所有依赖遥测没有统一的父节点关联,导致地图无法梳理调用链路。

解决办法:
在应用启动时创建一个根操作作为所有逻辑的父上下文:

// 应用启动入口处
using (var rootOperation = ApplicationTelemetry.TelemetryClient.StartOperation<RequestTelemetry>("ConsoleAppRoot"))
{
    // 执行应用核心业务逻辑,包含MQTT调用
    await RunYourApplicationLogic();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 19:23:25