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

.NET 6.0独立函数中Application Insights的operation_ParentId异常问题

.NET 6独立模式Azure函数与Application Insights追踪关联问题

我当前使用带HTTP触发器的.NET 6.0独立模式Azure函数。由于Activity未被自动填充,我添加了中间件,基于W3C的traceparent标头创建Activity。按照微软文档,期望Application Insights的operation_ParentId直接关联到日志所在Activity的ParentSpanId,但实际不符,具体情况:

  • 应用A发送请求,traceparent = 00-3abe9f15e940badc5f1521e6eb1eb411-bfd30439c918c783-00
  • 在应用B的中间件中,启动Activity并记录日志,验证该Activity的ParentId等于上述traceparent值,ParentSpanId等于bfd30439c918c783,代码如下:
using var requestActivity = new Activity(context.FunctionDefinition.Name);

requestActivity.SetParentId(traceParent);

requestActivity.Start();

_logger.LogInformation("Invoking '{Name}'", context.FunctionDefinition.Name);
  • 在Application Insights中,OperationId符合预期等于W3C的trace-id(3abe9f15e940badc5f1521e6eb1eb411),但operation_ParentId是一个从未见过的Span,既不是requestActivity.SpanId也不是requestActivity.ParentSpanId。

疑问:Application Insights在日志时不使用当前的Activity吗?

应用配置代码

var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults(worker =>
    {
        worker.UseMiddleware<TracingMiddleware>();
    })
    .ConfigureServices(collection =>
    {
    })
    .ConfigureLogging(x=>x.AddApplicationInsights())
    .Build();

host.Run();

中间件函数代码

public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next)
{
    using var requestActivity = new Activity(context.FunctionDefinition.Name);

    SetParentId(context, requestActivity);

    requestActivity.Start();

    _logger.LogInformation("Invoking '{Name}'", context.FunctionDefinition.Name);
    var t = Activity.Current;
    
    System.Console.WriteLine();
    System.Console.WriteLine($"Activity.TraceId: {t.TraceId}");
    System.Console.WriteLine($"Activity.ParentId: {t.ParentId}");
    System.Console.WriteLine($"Activity.SpanId: {t.SpanId}");

    await next(context);

    var statusCode = (context.Items != null)
        ? context.GetHttpResponseData()?.StatusCode
        : System.Net.HttpStatusCode.OK;
    _logger.LogInformation(
        "Executed '{Name}', Result {Result}, Duration = {Duration}ms",
        context.FunctionDefinition.Name,
        statusCode,
        (DateTime.UtcNow - requestActivity.StartTimeUtc).TotalMilliseconds);

    requestActivity.Stop();
}

更新

  • Application Insights在独立模式函数中仍未完全适配,部分值可能丢失(如操作名称),但可通过Application Insights SDK(如ITelemetryInitializer)统一补充这些值。
  • 关于HTTP Span的差异:执行HTTP调用时,相关库可能会启动新的子Activity,这就是出现意外父Span的原因。负责协调追踪信息自动传递的类是DistributedContextPropagator。我曾修改过它以消除子Activity的额外层级,但最终恢复了默认设置——因为Application Insights更适配默认配置,相比追踪语句的完美对齐,获取良好的应用概览(如应用程序地图)优先级更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:31:04