.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通过自定义标记识别失败请求:
- 进入Dynatrace控制台,找到你的GraphQL服务
- 依次进入「服务设置」→「故障检测」→「请求失败检测」
- 添加新规则:选择「基于请求属性」,设置条件为
graphql.error.message存在,或activity.status等于ERROR - 保存规则后,Dynatrace会将带有这些标记的请求标记为失败,用红色标识显示
4. 补充日志捕获(可选)
若需要在Dynatrace中查看详细错误日志,可配置OpenTelemetry日志导出:
- 安装
OpenTelemetry.Extensions.LoggingNuGet包 - 在Program.cs中配置日志导出:
builder.Logging.AddOpenTelemetry(options => { options.SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("SomeService")); options.AddOtlpExporter(otlpOptions => { otlpOptions.Endpoint = new Uri("http://<你的Dynatrace OTLP端点>"); }); });
- 在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
相关产品推荐
相关产品推荐

