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

.NET/C#中GraphQL集成Dynatrace日志追踪及异常标识咨询

问题描述

我用.NET/C#实现了GraphQL服务,希望在Dynatrace中捕获所有日志和追踪信息。当前的问题是:当GraphQL查询或突变执行失败时,接口仍返回200 OK状态码并附带错误信息,但我希望这类异常能在Dynatrace的主请求中以红色错误标识呈现,方便快速识别失败请求。

我正在探索如何通过Dynatrace获取GraphQL主服务中故障的详细信息,以下是我的当前配置:

已安装的NuGet包

  • OpenTelemetry.Exporter.OpenTelemetryProtocol
  • OpenTelemetry.Extensions.Hosting
  • OpenTelemetry.Instrumentation.AspNetCore
  • OpenTelemetry.Instrumentation.Http

Program.cs 代码

builder
    .Services
    .AddOpenTelemetry()
    .WithTracing(tracingBuilder =>
    {
        tracingBuilder
            .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("SomeService"))
            .AddAspNetCoreInstrumentation()
            .AddHttpClientInstrumentation()
            .AddHotChocolateInstrumentation();
    });

GraphQL 配置

.AddInstrumentation(x =>
{
    x.Scopes = HotChocolate.Diagnostics.ActivityScopes.All;
    x.IncludeDocument = true;
    x.IncludeDataLoaderKeys = true;
});

解决方案

要让Dynatrace识别GraphQL内部错误并标记主请求为失败,核心是让OpenTelemetry追踪感知GraphQL执行错误,并将错误状态关联到主请求的Activity上,具体实现步骤如下:

1. 扩展HotChocolate Instrumentation捕获错误状态

默认的HotChocolate Instrumentation不会自动将GraphQL错误同步到主请求的Activity中,需要自定义错误处理逻辑:

.AddHotChocolateInstrumentation(options =>
{
    options.Scopes = HotChocolate.Diagnostics.ActivityScopes.All;
    options.IncludeDocument = true;
    options.IncludeDataLoaderKeys = true;
    
    // 监听GraphQL请求错误,更新主请求Activity的状态
    options.OnRequestError = (context, error) =>
    {
        // 获取AspNetCore主请求对应的Activity
        var mainActivity = Activity.Current?.Parent ?? Activity.Current;
        if (mainActivity != null)
        {
            // 标记Activity为错误状态
            mainActivity.SetStatus(ActivityStatusCode.Error);
            // 添加错误详情标签,方便Dynatrace识别
            mainActivity.AddTag("graphql.error.message", error.Message);
            mainActivity.AddTag("graphql.error.code", error.Code);
        }
    };
});

2. 配置OTLP Exporter同步数据到Dynatrace

确保OpenTelemetry将追踪数据发送到Dynatrace的OTLP端点,在WithTracing中添加Exporter配置:

tracingBuilder.AddOtlpExporter(options =>
{
    options.Endpoint = new Uri("http://<你的Dynatrace OTLP端点>");
    // 若需认证,添加API Token头
    // options.Headers = "Authorization=Api-Token <你的Dynatrace Token>";
});

3. 在Dynatrace中配置故障检测规则

由于主请求返回200 OK,需要让Dynatrace通过自定义标记识别失败请求:

  1. 进入Dynatrace控制台,找到你的GraphQL服务
  2. 依次进入「服务设置」→「故障检测」→「请求失败检测」
  3. 添加新规则:选择「基于请求属性」,设置条件为graphql.error.message存在,或activity.status等于ERROR
  4. 保存规则后,Dynatrace会将带有这些标记的请求标记为失败,用红色标识显示

4. 补充日志捕获(可选)

若需要在Dynatrace中查看详细错误日志,可配置OpenTelemetry日志导出:

  1. 安装OpenTelemetry.Extensions.Logging NuGet包
  2. 在Program.cs中配置日志导出:
builder.Logging.AddOpenTelemetry(options =>
{
    options.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("SomeService"));
    options.AddOtlpExporter(otlpOptions =>
    {
        otlpOptions.Endpoint = new Uri("http://<你的Dynatrace OTLP端点>");
    });
});
  1. 在GraphQL错误处理中记录日志:
options.OnRequestError = (context, error) =>
{
    var logger = context.Services.GetRequiredService<ILogger<YourGraphQLService>>();
    logger.LogError(error, "GraphQL执行失败,查询文档:{Document}", context.Request.Query);
    
    // 保留之前的Activity状态更新逻辑
    var mainActivity = Activity.Current?.Parent ?? Activity.Current;
    if (mainActivity != null)
    {
        mainActivity.SetStatus(ActivityStatusCode.Error);
        mainActivity.AddTag("graphql.error.message", error.Message);
        mainActivity.AddTag("graphql.error.code", error.Code);
    }
};

完成以上配置后,GraphQL内部执行出错时,主请求会被标记为错误状态,Dynatrace会识别并高亮显示失败请求,同时你能在追踪和日志中查看完整的错误详情。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:10:19