diff --git a/src/HotChocolate/Diagnostics/src/Diagnostics.Core/ActivityEnricherBase.cs b/src/HotChocolate/Diagnostics/src/Diagnostics.Core/ActivityEnricherBase.cs index 4b9e9e29e34..8f276a64d98 100644 --- a/src/HotChocolate/Diagnostics/src/Diagnostics.Core/ActivityEnricherBase.cs +++ b/src/HotChocolate/Diagnostics/src/Diagnostics.Core/ActivityEnricherBase.cs @@ -119,4 +119,20 @@ public virtual void EnrichExecuteOperation( RequestContext context, Activity activity) { } + + public virtual void EnrichDocumentNotFoundInStorage( + RequestContext context, + OperationDocumentId documentId, + Activity activity) + { } + + public virtual void EnrichUntrustedDocumentRejected( + RequestContext context, + Activity activity) + { } + + public virtual void EnrichAddedDocumentToCache( + RequestContext context, + Activity activity) + { } } diff --git a/src/HotChocolate/Diagnostics/src/Diagnostics.Core/SemanticConventions.cs b/src/HotChocolate/Diagnostics/src/Diagnostics.Core/SemanticConventions.cs index a51c1e5d158..8fd7c30ae1c 100644 --- a/src/HotChocolate/Diagnostics/src/Diagnostics.Core/SemanticConventions.cs +++ b/src/HotChocolate/Diagnostics/src/Diagnostics.Core/SemanticConventions.cs @@ -14,16 +14,10 @@ public static class Document // Note: This is not part of the OTEL semantic conventions public const string Body = "graphql.document.body"; - - // Note: This is not part of the OTEL semantic conventions - public const string Valid = "graphql.document.valid"; } public static class Operation { - // Note: This is not part of the OTEL semantic conventions - public const string Id = "graphql.operation.id"; - public const string Name = "graphql.operation.name"; public const string Type = "graphql.operation.type"; @@ -46,7 +40,7 @@ public static class Step public const string Id = "graphql.operation.step.id"; public const string Kind = "graphql.operation.step.kind"; - // Note: This is not part of the OTEL semantic conventions + // Note: This is specific to Fusion public static class KindValues { public const string Operation = "operation"; @@ -85,20 +79,11 @@ public static class Selection public const string Name = "graphql.selection.name"; public const string Path = "graphql.selection.path"; - // Note: This is not part of the OTEL semantic conventions - public const string Hierarchy = "graphql.selection.hierarchy"; - public static class Field { public const string Name = "graphql.selection.field.name"; public const string ParentType = "graphql.selection.field.parent_type"; public const string Coordinate = "graphql.selection.field.coordinate"; - - // Note: This is not part of the OTEL semantic conventions - public const string IsDeprecated = "graphql.selection.field.isDeprecated"; - - // Note: This is not part of the OTEL semantic conventions - public const string Type = "graphql.selection.type"; } } @@ -132,6 +117,12 @@ public static class Operation } } + // Note: This is not part of the OTEL semantic conventions + public static class Errors + { + public const string Count = "graphql.errors.count"; + } + public static class Error { public const string Message = "graphql.error.message"; diff --git a/src/HotChocolate/Diagnostics/src/Diagnostics.Core/Spans/ExecuteRequestSpanBase.cs b/src/HotChocolate/Diagnostics/src/Diagnostics.Core/Spans/ExecuteRequestSpanBase.cs index d3cc3bef269..973d10218fc 100644 --- a/src/HotChocolate/Diagnostics/src/Diagnostics.Core/Spans/ExecuteRequestSpanBase.cs +++ b/src/HotChocolate/Diagnostics/src/Diagnostics.Core/Spans/ExecuteRequestSpanBase.cs @@ -10,7 +10,7 @@ internal abstract class ExecuteRequestSpanBase( Activity activity, RequestContext context, InstrumentationOptionsBase options, - ActivityEnricherBase? enricher, + ActivityEnricherBase enricher, bool shouldDisposeActivity) : SpanBase(activity, shouldDisposeActivity) { public RequestContext Context { get; } = context; @@ -42,6 +42,12 @@ protected override void OnComplete() Activity.SetTag(GraphQL.Document.Body, documentInfo.Document.Print()); } + if (Context.Result is OperationResult result) + { + // This was previously also always set to 0, so I just kept that behavior. + Activity.SetTag(GraphQL.Errors.Count, result.Errors.Count); + } + if (Context.Result is null or OperationResult { Errors: [_, ..] }) { Activity.SetStatus(ActivityStatusCode.Error); @@ -51,6 +57,6 @@ protected override void OnComplete() Activity.SetStatus(ActivityStatusCode.Ok); } - enricher?.EnrichExecuteRequest(Context, Activity); + enricher.EnrichExecuteRequest(Context, Activity); } } diff --git a/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs b/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs index 497d266b1ce..a541bbfa38b 100644 --- a/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs +++ b/src/HotChocolate/Diagnostics/src/Diagnostics/ActivityEnricher.cs @@ -1,6 +1,7 @@ using System.Diagnostics; using GreenDonut; using HotChocolate.Execution; +using HotChocolate.Language; using HotChocolate.Resolvers; namespace HotChocolate.Diagnostics; @@ -46,6 +47,11 @@ public virtual void EnrichBatchDispatchError( Activity activity) { } + public virtual void EnrichAddedOperationToCache( + RequestContext context, + Activity activity) + { } + public virtual void EnrichOnSubscriptionEvent( RequestContext context, ulong subscriptionId, diff --git a/src/HotChocolate/Diagnostics/src/Diagnostics/Listeners/ActivityExecutionDiagnosticListener.cs b/src/HotChocolate/Diagnostics/src/Diagnostics/Listeners/ActivityExecutionDiagnosticListener.cs index 55c052a2e61..23899fd800e 100644 --- a/src/HotChocolate/Diagnostics/src/Diagnostics/Listeners/ActivityExecutionDiagnosticListener.cs +++ b/src/HotChocolate/Diagnostics/src/Diagnostics/Listeners/ActivityExecutionDiagnosticListener.cs @@ -1,6 +1,7 @@ using System.Diagnostics; using HotChocolate.Execution; using HotChocolate.Execution.Instrumentation; +using HotChocolate.Language; using HotChocolate.Resolvers; using Microsoft.AspNetCore.Http; using static HotChocolate.Diagnostics.HotChocolateActivitySource; @@ -312,11 +313,30 @@ public override void RetrievedDocumentFromStorage(RequestContext context) } } + public override void DocumentNotFoundInStorage(RequestContext context, OperationDocumentId documentId) + { + if (context.Features.TryGet(out var span)) + { + span.Activity.AddEvent(new(nameof(DocumentNotFoundInStorage))); + enricher.EnrichDocumentNotFoundInStorage(context, documentId, span.Activity); + } + } + + public override void UntrustedDocumentRejected(RequestContext context) + { + if (context.Features.TryGet(out var span)) + { + span.Activity.AddEvent(new(nameof(UntrustedDocumentRejected))); + enricher.EnrichUntrustedDocumentRejected(context, span.Activity); + } + } + public override void AddedDocumentToCache(RequestContext context) { if (context.Features.TryGet(out var span)) { span.Activity.AddEvent(new(nameof(AddedDocumentToCache))); + enricher.EnrichAddedDocumentToCache(context, span.Activity); } } @@ -325,6 +345,7 @@ public override void AddedOperationToCache(RequestContext context) if (context.Features.TryGet(out var span)) { span.Activity.AddEvent(new(nameof(AddedOperationToCache))); + enricher.EnrichAddedOperationToCache(context, span.Activity); } } diff --git a/src/HotChocolate/Diagnostics/src/Diagnostics/Spans/ExecuteRequestSpan.cs b/src/HotChocolate/Diagnostics/src/Diagnostics/Spans/ExecuteRequestSpan.cs index 8a60d10a264..72c7c869812 100644 --- a/src/HotChocolate/Diagnostics/src/Diagnostics/Spans/ExecuteRequestSpan.cs +++ b/src/HotChocolate/Diagnostics/src/Diagnostics/Spans/ExecuteRequestSpan.cs @@ -8,7 +8,7 @@ internal sealed class ExecuteRequestSpan( Activity activity, RequestContext context, InstrumentationOptionsBase options, - ActivityEnricherBase? enricher, + ActivityEnricherBase enricher, bool shouldDisposeActivity) : ExecuteRequestSpanBase(activity, context, options, enricher, shouldDisposeActivity) { diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/ActivityExecutionDiagnosticListenerTests.cs b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/ActivityExecutionDiagnosticListenerTests.cs index 0afb95988a2..f170cae244d 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/ActivityExecutionDiagnosticListenerTests.cs +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/ActivityExecutionDiagnosticListenerTests.cs @@ -120,6 +120,67 @@ public async Task PersistedOperation_LoadsFromStorage_DefaultScopes() } } + [Fact] + public async Task DocumentNotFoundInStorage_RecordsEvent() + { + using (CaptureActivities(out var activities)) + { + // arrange + var services = new ServiceCollection() + .AddGraphQL() + .AddInstrumentation(o => o.Scopes = ActivityScopes.All) + .AddQueryType() + .UsePersistedOperationPipeline() + .ConfigureSchemaServices( + s => s.AddSingleton(new NoopOperationDocumentStorage())) + .Services + .BuildServiceProvider(); + + var executor = await services.GetRequestExecutorAsync(); + + var request = OperationRequestBuilder.New() + .SetDocumentId("a8c5e2f1d3b4a6e7c9d0f1a2b3c4d5e6") + .Build(); + + // act + await executor.ExecuteAsync(request); + + // assert + activities.MatchSnapshot(); + } + } + + [Fact] + public async Task UntrustedDocumentRejected_RecordsEvent() + { + using (CaptureActivities(out var activities)) + { + // arrange + var services = new ServiceCollection() + .AddGraphQL() + .AddInstrumentation(o => o.Scopes = ActivityScopes.All) + .AddQueryType() + .ModifyRequestOptions(o => o.PersistedOperations.OnlyAllowPersistedDocuments = true) + .UsePersistedOperationPipeline() + .ConfigureSchemaServices( + s => s.AddSingleton(new NoopOperationDocumentStorage())) + .Services + .BuildServiceProvider(); + + var executor = await services.GetRequestExecutorAsync(); + + var request = OperationRequestBuilder.New() + .SetDocument("{ sayHello }") + .Build(); + + // act + await executor.ExecuteAsync(request); + + // assert + activities.MatchSnapshot(); + } + } + [Fact] public async Task ParsingError_InvalidGraphQLDocument_ReportsErrorStatus() { @@ -493,6 +554,20 @@ public string OnFailingMessage([EventMessage] string message) => throw new InvalidOperationException("Subscription event failed."); } + private sealed class NoopOperationDocumentStorage : IOperationDocumentStorage + { + public ValueTask TryReadAsync( + OperationDocumentId documentId, + CancellationToken cancellationToken = default) + => new(default(IOperationDocument)); + + public ValueTask SaveAsync( + OperationDocumentId documentId, + IOperationDocument document, + CancellationToken cancellationToken = default) + => default; + } + private sealed class InMemoryOperationDocumentStorage : IOperationDocumentStorage { private readonly Dictionary _cache = []; diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.AllScopes_IncludesExecuteRequestAndParseDocumentSpans.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.AllScopes_IncludesExecuteRequestAndParseDocumentSpans.snap index 49f7e009662..26a9e72f1e5 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.AllScopes_IncludesExecuteRequestAndParseDocumentSpans.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.AllScopes_IncludesExecuteRequestAndParseDocumentSpans.snap @@ -12,6 +12,10 @@ { "Key": "graphql.document.hash", "Value": "md5:f7e9989fbb67af7fa747a9983313c9e5" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.Allow_Document_To_Be_Captured.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.Allow_Document_To_Be_Captured.snap index 1a00249e432..a9723bbe874 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.Allow_Document_To_Be_Captured.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.Allow_Document_To_Be_Captured.snap @@ -20,6 +20,10 @@ { "Key": "graphql.document.body", "Value": "query SayHelloOperation {\n sayHello\n}" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.Cause_A_Resolver_Error_That_Deletes_The_Whole_Result.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.Cause_A_Resolver_Error_That_Deletes_The_Whole_Result.snap index 6b24042cac8..c3af8a8c1a4 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.Cause_A_Resolver_Error_That_Deletes_The_Whole_Result.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.Cause_A_Resolver_Error_That_Deletes_The_Whole_Result.snap @@ -20,6 +20,10 @@ { "Key": "graphql.document.body", "Value": "query SayHelloOperation {\n causeFatalError\n}" + }, + { + "Key": "graphql.errors.count", + "Value": 1 } ], "event": [ diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.ComplexityAnalysis_Enabled_RecordsCostInSpan.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.ComplexityAnalysis_Enabled_RecordsCostInSpan.snap index 18b75c1afa7..a005bf05d33 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.ComplexityAnalysis_Enabled_RecordsCostInSpan.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.ComplexityAnalysis_Enabled_RecordsCostInSpan.snap @@ -12,6 +12,10 @@ { "Key": "graphql.document.hash", "Value": "md5:f7e9989fbb67af7fa747a9983313c9e5" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.DataLoader_BatchExecution_RecordsBatchSpan.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.DataLoader_BatchExecution_RecordsBatchSpan.snap index 3a1922dc668..837a36fa927 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.DataLoader_BatchExecution_RecordsBatchSpan.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.DataLoader_BatchExecution_RecordsBatchSpan.snap @@ -12,6 +12,10 @@ { "Key": "graphql.document.hash", "Value": "md5:9b20745108c8de5afccc35cd56ead9fc" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.DataLoader_BatchExecution_With_Keys_RecordsBatchSpan.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.DataLoader_BatchExecution_With_Keys_RecordsBatchSpan.snap index f36210d5447..caf0fd8a188 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.DataLoader_BatchExecution_With_Keys_RecordsBatchSpan.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.DataLoader_BatchExecution_With_Keys_RecordsBatchSpan.snap @@ -12,6 +12,10 @@ { "Key": "graphql.document.hash", "Value": "md5:9b20745108c8de5afccc35cd56ead9fc" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.DocumentCache_SecondExecution_RecordsCacheHitEvent.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.DocumentCache_SecondExecution_RecordsCacheHitEvent.snap index e6b686d9426..6bcfb388d85 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.DocumentCache_SecondExecution_RecordsCacheHitEvent.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.DocumentCache_SecondExecution_RecordsCacheHitEvent.snap @@ -12,6 +12,10 @@ { "Key": "graphql.document.hash", "Value": "md5:f7e9989fbb67af7fa747a9983313c9e5" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.DocumentNotFoundInStorage_RecordsEvent.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.DocumentNotFoundInStorage_RecordsEvent.snap new file mode 100644 index 00000000000..2ac2accfde8 --- /dev/null +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.DocumentNotFoundInStorage_RecordsEvent.snap @@ -0,0 +1,21 @@ +{ + "activities": [ + { + "OperationName": "GraphQL Operation", + "DisplayName": "GraphQL Operation", + "Status": "Error", + "tags": [ + { + "Key": "graphql.errors.count", + "Value": 1 + } + ], + "event": [ + { + "Name": "DocumentNotFoundInStorage", + "Tags": [] + } + ] + } + ] +} diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.Ensure_That_The_Validation_Activity_Has_An_Error_Status.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.Ensure_That_The_Validation_Activity_Has_An_Error_Status.snap index 16d3fd1d1f8..98cc2455ee4 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.Ensure_That_The_Validation_Activity_Has_An_Error_Status.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.Ensure_That_The_Validation_Activity_Has_An_Error_Status.snap @@ -12,6 +12,10 @@ { "Key": "graphql.document.body", "Value": "query SayHelloOperation {\n sayHello_\n}" + }, + { + "Key": "graphql.errors.count", + "Value": 1 } ], "event": [], diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.ParsingError_InvalidGraphQLDocument_ReportsErrorStatus.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.ParsingError_InvalidGraphQLDocument_ReportsErrorStatus.snap index aec02c711c2..e8efaf306c2 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.ParsingError_InvalidGraphQLDocument_ReportsErrorStatus.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.ParsingError_InvalidGraphQLDocument_ReportsErrorStatus.snap @@ -8,6 +8,10 @@ { "Key": "graphql.document.hash", "Value": "md5:bb507ba78696fc3c6ff3a17fb06784d5" + }, + { + "Key": "graphql.errors.count", + "Value": 1 } ], "event": [ diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.ResolverError_AtRootLevel_MarksOperationAsError.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.ResolverError_AtRootLevel_MarksOperationAsError.snap index 6031fca24ee..591ee9c573c 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.ResolverError_AtRootLevel_MarksOperationAsError.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.ResolverError_AtRootLevel_MarksOperationAsError.snap @@ -16,6 +16,10 @@ { "Key": "graphql.document.body", "Value": "{\n causeFatalError\n}" + }, + { + "Key": "graphql.errors.count", + "Value": 1 } ], "event": [ diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.ResolverError_DeepInTree_MarksNestedFieldAsError.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.ResolverError_DeepInTree_MarksNestedFieldAsError.snap index dd5f4d13d99..87a16dadb9b 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.ResolverError_DeepInTree_MarksNestedFieldAsError.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.ResolverError_DeepInTree_MarksNestedFieldAsError.snap @@ -12,6 +12,10 @@ { "Key": "graphql.document.body", "Value": "{\n deep {\n deeper {\n deeps {\n deeper {\n causeFatalError\n }\n }\n }\n }\n}" + }, + { + "Key": "graphql.errors.count", + "Value": 1 } ], "event": [], diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.SubscriptionEventError_Records_Subscription_Event_Error.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.SubscriptionEventError_Records_Subscription_Event_Error.snap index f96698c579d..cfd86e3b007 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.SubscriptionEventError_Records_Subscription_Event_Error.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.SubscriptionEventError_Records_Subscription_Event_Error.snap @@ -177,7 +177,7 @@ }, { "Key": "exception.stacktrace", - "Value": "System.InvalidOperationException: Subscription event failed.\n at HotChocolate.Diagnostics.ActivityExecutionDiagnosticListenerTests.SimpleSubscription.OnFailingMessage(String message) in ActivityExecutionDiagnosticListenerTests.cs:line 493\n at lambda_method(Closure, IResolverContext)\n at HotChocolate.Types.Helpers.FieldMiddlewareCompiler.<>c__DisplayClass9_0.<b__0>d.MoveNext() in FieldMiddlewareCompiler.cs:line 127\n--- End of stack trace from previous location ---\n at HotChocolate.Execution.Processing.Tasks.ResolverTask.ExecuteResolverPipelineAsync(CancellationToken cancellationToken) in ResolverTask.Execute.cs:line 135\n at HotChocolate.Execution.Processing.Tasks.ResolverTask.TryExecuteAsync(CancellationToken cancellationToken) in ResolverTask.Execute.cs:line 81" + "Value": "System.InvalidOperationException: Subscription event failed.\n at HotChocolate.Diagnostics.ActivityExecutionDiagnosticListenerTests.SimpleSubscription.OnFailingMessage(String message) in ActivityExecutionDiagnosticListenerTests.cs:line 554\n at lambda_method(Closure, IResolverContext)\n at HotChocolate.Types.Helpers.FieldMiddlewareCompiler.<>c__DisplayClass9_0.<b__0>d.MoveNext() in FieldMiddlewareCompiler.cs:line 127\n--- End of stack trace from previous location ---\n at HotChocolate.Execution.Processing.Tasks.ResolverTask.ExecuteResolverPipelineAsync(CancellationToken cancellationToken) in ResolverTask.Execute.cs:line 135\n at HotChocolate.Execution.Processing.Tasks.ResolverTask.TryExecuteAsync(CancellationToken cancellationToken) in ResolverTask.Execute.cs:line 81" }, { "Key": "exception.type", diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.UntrustedDocumentRejected_RecordsEvent.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.UntrustedDocumentRejected_RecordsEvent.snap new file mode 100644 index 00000000000..79183640227 --- /dev/null +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.UntrustedDocumentRejected_RecordsEvent.snap @@ -0,0 +1,21 @@ +{ + "activities": [ + { + "OperationName": "GraphQL Operation", + "DisplayName": "GraphQL Operation", + "Status": "Error", + "tags": [ + { + "Key": "graphql.errors.count", + "Value": 1 + } + ], + "event": [ + { + "Name": "UntrustedDocumentRejected", + "Tags": [] + } + ] + } + ] +} diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.ValidationError_UnknownField_ReportsErrorStatus.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.ValidationError_UnknownField_ReportsErrorStatus.snap index c0dc8f03d3c..37f19b96595 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.ValidationError_UnknownField_ReportsErrorStatus.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.ValidationError_UnknownField_ReportsErrorStatus.snap @@ -8,6 +8,10 @@ { "Key": "graphql.document.hash", "Value": "md5:1526f207d516803b71eb8a0db419b57b" + }, + { + "Key": "graphql.errors.count", + "Value": 1 } ], "event": [], diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.VariableCoercion_WithAllScopes_RecordsCoercionSpan.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.VariableCoercion_WithAllScopes_RecordsCoercionSpan.snap index e9d8d435d16..a8a858f7f66 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.VariableCoercion_WithAllScopes_RecordsCoercionSpan.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityExecutionDiagnosticListenerTests.VariableCoercion_WithAllScopes_RecordsCoercionSpan.snap @@ -12,6 +12,10 @@ { "Key": "graphql.document.hash", "Value": "md5:c46cf8c9811934ddea095f10ee722dc4" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Get_SingleRequest_GetHeroName.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Get_SingleRequest_GetHeroName.snap index 549d391b410..9dd55c0e636 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Get_SingleRequest_GetHeroName.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Get_SingleRequest_GetHeroName.snap @@ -43,6 +43,10 @@ { "Key": "graphql.document.hash", "Value": "md5:acb8d5d513c260b3cef3e3a12b0e29af" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_Add_Variables_To_Http_Activity.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_Add_Variables_To_Http_Activity.snap index f0a0844464d..9258b54fb98 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_Add_Variables_To_Http_Activity.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_Add_Variables_To_Http_Activity.snap @@ -51,6 +51,10 @@ { "Key": "graphql.document.hash", "Value": "md5:cc68dfd8c0c54a586a03c35296c5d1f9" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_Ensure_List_Path_Is_Correctly_Built.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_Ensure_List_Path_Is_Correctly_Built.snap index a4c809a7deb..140af3da26a 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_Ensure_List_Path_Is_Correctly_Built.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_Ensure_List_Path_Is_Correctly_Built.snap @@ -47,6 +47,10 @@ { "Key": "graphql.document.hash", "Value": "md5:668e9631148921208d08dbb69513fa8e" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_SingleRequest_GetHeroName.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_SingleRequest_GetHeroName.snap index 5735177229f..6c4d0734597 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_SingleRequest_GetHeroName.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_SingleRequest_GetHeroName.snap @@ -47,6 +47,10 @@ { "Key": "graphql.document.hash", "Value": "md5:acb8d5d513c260b3cef3e3a12b0e29af" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_SingleRequest_GetHeroName_Default.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_SingleRequest_GetHeroName_Default.snap index 007fefef81a..14efd5445b8 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_SingleRequest_GetHeroName_Default.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_SingleRequest_GetHeroName_Default.snap @@ -32,6 +32,10 @@ { "Key": "graphql.document.hash", "Value": "md5:acb8d5d513c260b3cef3e3a12b0e29af" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_Variables_Are_Not_Automatically_Added_To_Activities.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_Variables_Are_Not_Automatically_Added_To_Activities.snap index 357e78284ce..f8c30060353 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_Variables_Are_Not_Automatically_Added_To_Activities.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_Variables_Are_Not_Automatically_Added_To_Activities.snap @@ -47,6 +47,10 @@ { "Key": "graphql.document.hash", "Value": "md5:cc68dfd8c0c54a586a03c35296c5d1f9" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_With_Extensions_Map.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_With_Extensions_Map.snap index 66aac757f7e..212b8197d7f 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_With_Extensions_Map.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.Http_Post_With_Extensions_Map.snap @@ -51,6 +51,10 @@ { "Key": "graphql.document.hash", "Value": "md5:cc68dfd8c0c54a586a03c35296c5d1f9" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.RequestDetails_All_IncludesAllDetails.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.RequestDetails_All_IncludesAllDetails.snap index 3ae9d85ab7e..40eb6d8cbf6 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.RequestDetails_All_IncludesAllDetails.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.RequestDetails_All_IncludesAllDetails.snap @@ -63,6 +63,10 @@ { "Key": "graphql.document.hash", "Value": "md5:9335388c19fd2e230b6294a596d13a93" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.RequestDetails_Default_IncludesIdHashOperationNameExtensions.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.RequestDetails_Default_IncludesIdHashOperationNameExtensions.snap index 62db38168d3..ecd9233bcb1 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.RequestDetails_Default_IncludesIdHashOperationNameExtensions.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.RequestDetails_Default_IncludesIdHashOperationNameExtensions.snap @@ -55,6 +55,10 @@ { "Key": "graphql.document.hash", "Value": "md5:06731ff10fea3ec8e9b2aabceee6ddd9" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.RequestDetails_DocumentOnly_IncludesDocumentTag.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.RequestDetails_DocumentOnly_IncludesDocumentTag.snap index a8ba3e91332..ba5160a8df0 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.RequestDetails_DocumentOnly_IncludesDocumentTag.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.RequestDetails_DocumentOnly_IncludesDocumentTag.snap @@ -43,6 +43,10 @@ { "Key": "graphql.document.hash", "Value": "md5:acb8d5d513c260b3cef3e3a12b0e29af" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.RequestDetails_None_ExcludesAllDetails.snap b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.RequestDetails_None_ExcludesAllDetails.snap index d79cffdd6df..0c5648eec31 100644 --- a/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.RequestDetails_None_ExcludesAllDetails.snap +++ b/src/HotChocolate/Diagnostics/test/Diagnostics.Tests/__snapshots__/ActivityServerDiagnosticListenerTests.RequestDetails_None_ExcludesAllDetails.snap @@ -39,6 +39,10 @@ { "Key": "graphql.document.hash", "Value": "md5:9335388c19fd2e230b6294a596d13a93" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Fusion/src/Fusion.Diagnostics/FusionActivityEnricher.cs b/src/HotChocolate/Fusion/src/Fusion.Diagnostics/FusionActivityEnricher.cs index 8a430c4b744..8646c7c5f56 100644 --- a/src/HotChocolate/Fusion/src/Fusion.Diagnostics/FusionActivityEnricher.cs +++ b/src/HotChocolate/Fusion/src/Fusion.Diagnostics/FusionActivityEnricher.cs @@ -3,6 +3,7 @@ using HotChocolate.Execution; using HotChocolate.Fusion.Execution; using HotChocolate.Fusion.Execution.Nodes; +using HotChocolate.Language; namespace HotChocolate.Fusion.Diagnostics; @@ -66,6 +67,13 @@ public virtual void EnrichOnSubscriptionEvent( { } + public virtual void EnrichAddedOperationPlanToCache( + RequestContext context, + string operationPlanId, + Activity activity) + { + } + public virtual void EnrichSubscriptionEventError( OperationPlanContext context, ExecutionNode node, diff --git a/src/HotChocolate/Fusion/src/Fusion.Diagnostics/Listeners/FusionActivityExecutionDiagnosticEventListener.cs b/src/HotChocolate/Fusion/src/Fusion.Diagnostics/Listeners/FusionActivityExecutionDiagnosticEventListener.cs index 71224d39a04..56c1ea4c8ce 100644 --- a/src/HotChocolate/Fusion/src/Fusion.Diagnostics/Listeners/FusionActivityExecutionDiagnosticEventListener.cs +++ b/src/HotChocolate/Fusion/src/Fusion.Diagnostics/Listeners/FusionActivityExecutionDiagnosticEventListener.cs @@ -3,6 +3,7 @@ using HotChocolate.Execution; using HotChocolate.Fusion.Execution; using HotChocolate.Fusion.Execution.Nodes; +using HotChocolate.Language; using Microsoft.AspNetCore.Http; using static HotChocolate.Fusion.Diagnostics.HotChocolateFusionActivitySource; @@ -328,11 +329,30 @@ public override void RetrievedDocumentFromStorage(RequestContext context) } } + public override void DocumentNotFoundInStorage(RequestContext context, OperationDocumentId documentId) + { + if (context.Features.TryGet(out var span)) + { + span.Activity.AddEvent(new(nameof(DocumentNotFoundInStorage))); + enricher.EnrichDocumentNotFoundInStorage(context, documentId, span.Activity); + } + } + + public override void UntrustedDocumentRejected(RequestContext context) + { + if (context.Features.TryGet(out var span)) + { + span.Activity.AddEvent(new(nameof(UntrustedDocumentRejected))); + enricher.EnrichUntrustedDocumentRejected(context, span.Activity); + } + } + public override void AddedDocumentToCache(RequestContext context) { if (context.Features.TryGet(out var span)) { span.Activity.AddEvent(new(nameof(AddedDocumentToCache))); + enricher.EnrichAddedDocumentToCache(context, span.Activity); } } @@ -341,6 +361,7 @@ public override void AddedOperationPlanToCache(RequestContext context, string op if (context.Features.TryGet(out var span)) { span.Activity.AddEvent(new(nameof(AddedOperationPlanToCache))); + enricher.EnrichAddedOperationPlanToCache(context, operationPlanId, span.Activity); } } diff --git a/src/HotChocolate/Fusion/src/Fusion.Diagnostics/Spans/ExecuteRequestSpan.cs b/src/HotChocolate/Fusion/src/Fusion.Diagnostics/Spans/ExecuteRequestSpan.cs index ab6e528af29..9aefcafe36a 100644 --- a/src/HotChocolate/Fusion/src/Fusion.Diagnostics/Spans/ExecuteRequestSpan.cs +++ b/src/HotChocolate/Fusion/src/Fusion.Diagnostics/Spans/ExecuteRequestSpan.cs @@ -8,7 +8,7 @@ internal sealed class ExecuteRequestSpan( Activity activity, RequestContext context, InstrumentationOptionsBase options, - ActivityEnricherBase? enricher, + ActivityEnricherBase enricher, bool shouldDisposeActivity) : ExecuteRequestSpanBase(activity, context, options, enricher, shouldDisposeActivity) { diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/ActivityTestHelper.cs b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/ActivityTestHelper.cs index f975dab1525..bdb82461165 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/ActivityTestHelper.cs +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/ActivityTestHelper.cs @@ -92,7 +92,7 @@ private static void SerializeActivity(Activity activity) data["OperationName"] = activity.OperationName; data["DisplayName"] = activity.DisplayName; data["Status"] = activity.Status; - data["tags"] = activity.Tags; + data["tags"] = activity.TagObjects; data["event"] = activity.Events.Select(t => new { t.Name, diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/FusionActivityExecutionDiagnosticListenerTests.cs b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/FusionActivityExecutionDiagnosticListenerTests.cs index 848b1658fc7..49564e36d89 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/FusionActivityExecutionDiagnosticListenerTests.cs +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/FusionActivityExecutionDiagnosticListenerTests.cs @@ -247,6 +247,75 @@ public async Task PersistedOperation_LoadsFromStorage_DefaultScopes() } } + [Fact] + public async Task DocumentNotFoundInStorage_RecordsEvent() + { + using (CaptureActivities(out var activities)) + { + // arrange + using var server1 = CreateSourceSchema( + "a", + b => b.AddQueryType()); + + using var gateway = await CreateCompositeSchemaAsync( + [ + ("a", server1) + ], + configureGatewayBuilder: b => b + .AddInstrumentation(o => o.Scopes = FusionActivityScopes.All) + .ConfigureSchemaServices( + (_, s) => s.AddSingleton(new NoopOperationDocumentStorage())) + .UsePersistedOperationPipeline()); + + var executor = await gateway.Services.GetRequestExecutorAsync(); + + var request = OperationRequestBuilder.New() + .SetDocumentId("a8c5e2f1d3b4a6e7c9d0f1a2b3c4d5e6") + .Build(); + + // act + await executor.ExecuteAsync(request); + + // assert + activities.MatchSnapshot(); + } + } + + [Fact] + public async Task UntrustedDocumentRejected_RecordsEvent() + { + using (CaptureActivities(out var activities)) + { + // arrange + using var server1 = CreateSourceSchema( + "a", + b => b.AddQueryType()); + + using var gateway = await CreateCompositeSchemaAsync( + [ + ("a", server1) + ], + configureGatewayBuilder: b => b + .AddInstrumentation(o => o.Scopes = FusionActivityScopes.All) + .ModifyRequestOptions(o => o.PersistedOperations.OnlyAllowPersistedDocuments = true) + .ConfigureSchemaServices( + (_, s) => s.AddSingleton(new NoopOperationDocumentStorage())) + .UsePersistedOperationPipeline()); + + var executor = await gateway.Services.GetRequestExecutorAsync(); + + var request = OperationRequestBuilder.New() + .SetDocument("{ sayHello }") + .Build(); + + // act + await executor.ExecuteAsync(request); + + // assert + activities.MatchSnapshot(); + } + } + [Fact] public async Task ParsingError_InvalidGraphQLDocument_ReportsErrorStatus() { @@ -731,6 +800,20 @@ public string OnFailingMessage([EventMessage] string message) => throw new InvalidOperationException("Subscription event failed."); } + private sealed class NoopOperationDocumentStorage : IOperationDocumentStorage + { + public ValueTask TryReadAsync( + OperationDocumentId documentId, + CancellationToken cancellationToken = default) + => new(default(IOperationDocument)); + + public ValueTask SaveAsync( + OperationDocumentId documentId, + IOperationDocument document, + CancellationToken cancellationToken = default) + => default; + } + private sealed class InMemoryOperationDocumentStorage : IOperationDocumentStorage { private readonly Dictionary _cache = []; diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.AllScopes_IncludesAllSpans.snap b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.AllScopes_IncludesAllSpans.snap index bae9f3fb95b..0d6838102cd 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.AllScopes_IncludesAllSpans.snap +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.AllScopes_IncludesAllSpans.snap @@ -12,6 +12,10 @@ { "Key": "graphql.document.hash", "Value": "md5:f7e9989fbb67af7fa747a9983313c9e5" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.Allow_Document_To_Be_Captured.snap b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.Allow_Document_To_Be_Captured.snap index b1b30bde9f6..d33a5a59753 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.Allow_Document_To_Be_Captured.snap +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.Allow_Document_To_Be_Captured.snap @@ -20,6 +20,10 @@ { "Key": "graphql.document.body", "Value": "query SayHelloOperation {\n sayHello\n}" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.Cause_A_Resolver_Error_That_Deletes_The_Whole_Result.snap b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.Cause_A_Resolver_Error_That_Deletes_The_Whole_Result.snap index fc34bb96640..74951ea8e4e 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.Cause_A_Resolver_Error_That_Deletes_The_Whole_Result.snap +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.Cause_A_Resolver_Error_That_Deletes_The_Whole_Result.snap @@ -20,6 +20,10 @@ { "Key": "graphql.document.body", "Value": "query SayHelloOperation {\n causeFatalError\n}" + }, + { + "Key": "graphql.errors.count", + "Value": 1 } ], "event": [ diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.DocumentCache_SecondExecution_RecordsCacheHitEvent.snap b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.DocumentCache_SecondExecution_RecordsCacheHitEvent.snap index 02a3e0724c8..654f63bfaea 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.DocumentCache_SecondExecution_RecordsCacheHitEvent.snap +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.DocumentCache_SecondExecution_RecordsCacheHitEvent.snap @@ -12,6 +12,10 @@ { "Key": "graphql.document.hash", "Value": "md5:f7e9989fbb67af7fa747a9983313c9e5" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.DocumentNotFoundInStorage_RecordsEvent.snap b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.DocumentNotFoundInStorage_RecordsEvent.snap new file mode 100644 index 00000000000..2ac2accfde8 --- /dev/null +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.DocumentNotFoundInStorage_RecordsEvent.snap @@ -0,0 +1,21 @@ +{ + "activities": [ + { + "OperationName": "GraphQL Operation", + "DisplayName": "GraphQL Operation", + "Status": "Error", + "tags": [ + { + "Key": "graphql.errors.count", + "Value": 1 + } + ], + "event": [ + { + "Name": "DocumentNotFoundInStorage", + "Tags": [] + } + ] + } + ] +} diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.Ensure_That_The_Validation_Activity_Has_An_Error_Status.snap b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.Ensure_That_The_Validation_Activity_Has_An_Error_Status.snap index 5312732e3a8..2e41cc4023c 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.Ensure_That_The_Validation_Activity_Has_An_Error_Status.snap +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.Ensure_That_The_Validation_Activity_Has_An_Error_Status.snap @@ -12,6 +12,10 @@ { "Key": "graphql.document.body", "Value": "query SayHelloOperation {\n sayHello_\n}" + }, + { + "Key": "graphql.errors.count", + "Value": 1 } ], "event": [], diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.MultipleSources_SourceSchemaResolverError_RecordsDeeplyNestedError.snap b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.MultipleSources_SourceSchemaResolverError_RecordsDeeplyNestedError.snap index c1133be6d47..85cfbb5647c 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.MultipleSources_SourceSchemaResolverError_RecordsDeeplyNestedError.snap +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.MultipleSources_SourceSchemaResolverError_RecordsDeeplyNestedError.snap @@ -16,6 +16,10 @@ { "Key": "graphql.document.body", "Value": "{\n sayHello\n deepB {\n deeperB {\n causeFatalError\n }\n }\n}" + }, + { + "Key": "graphql.errors.count", + "Value": 2 } ], "event": [ diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.ParsingError_InvalidGraphQLDocument_ReportsErrorStatus.snap b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.ParsingError_InvalidGraphQLDocument_ReportsErrorStatus.snap index 405ebcecca0..ad1d5945b6f 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.ParsingError_InvalidGraphQLDocument_ReportsErrorStatus.snap +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.ParsingError_InvalidGraphQLDocument_ReportsErrorStatus.snap @@ -8,6 +8,10 @@ { "Key": "graphql.document.hash", "Value": "md5:bb507ba78696fc3c6ff3a17fb06784d5" + }, + { + "Key": "graphql.errors.count", + "Value": 1 } ], "event": [ diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.Source_Schema_Transport_Error.snap b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.Source_Schema_Transport_Error.snap index ac6c1561f23..be124b5110f 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.Source_Schema_Transport_Error.snap +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.Source_Schema_Transport_Error.snap @@ -16,6 +16,10 @@ { "Key": "graphql.document.body", "Value": "{\n sayHello\n}" + }, + { + "Key": "graphql.errors.count", + "Value": 1 } ], "event": [ diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.Track_Events_Of_A_Query_With_Multiple_Sources.snap b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.Track_Events_Of_A_Query_With_Multiple_Sources.snap index 5622c3eb3eb..c8b0a9cb715 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.Track_Events_Of_A_Query_With_Multiple_Sources.snap +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.Track_Events_Of_A_Query_With_Multiple_Sources.snap @@ -12,6 +12,10 @@ { "Key": "graphql.document.hash", "Value": "md5:073bf7696c078e52587c88890ef21bbe" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.UntrustedDocumentRejected_RecordsEvent.snap b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.UntrustedDocumentRejected_RecordsEvent.snap new file mode 100644 index 00000000000..79183640227 --- /dev/null +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.UntrustedDocumentRejected_RecordsEvent.snap @@ -0,0 +1,21 @@ +{ + "activities": [ + { + "OperationName": "GraphQL Operation", + "DisplayName": "GraphQL Operation", + "Status": "Error", + "tags": [ + { + "Key": "graphql.errors.count", + "Value": 1 + } + ], + "event": [ + { + "Name": "UntrustedDocumentRejected", + "Tags": [] + } + ] + } + ] +} diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.ValidationError_UnknownField_ReportsErrorStatus.snap b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.ValidationError_UnknownField_ReportsErrorStatus.snap index 469d64a23ed..d228b891f62 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.ValidationError_UnknownField_ReportsErrorStatus.snap +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityExecutionDiagnosticListenerTests.ValidationError_UnknownField_ReportsErrorStatus.snap @@ -8,6 +8,10 @@ { "Key": "graphql.document.hash", "Value": "md5:1526f207d516803b71eb8a0db419b57b" + }, + { + "Key": "graphql.errors.count", + "Value": 1 } ], "event": [], diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Get_Single_Request.snap b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Get_Single_Request.snap index f8fdfd74dab..987ea9ba51a 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Get_Single_Request.snap +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Get_Single_Request.snap @@ -43,6 +43,10 @@ { "Key": "graphql.document.hash", "Value": "md5:f7e9989fbb67af7fa747a9983313c9e5" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Post_Add_Variables_To_Http_Activity.snap b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Post_Add_Variables_To_Http_Activity.snap index 4df6cdc30a5..b38acc12761 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Post_Add_Variables_To_Http_Activity.snap +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Post_Add_Variables_To_Http_Activity.snap @@ -51,6 +51,10 @@ { "Key": "graphql.document.hash", "Value": "md5:c46cf8c9811934ddea095f10ee722dc4" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Post_Single_Request.snap b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Post_Single_Request.snap index 6c53faa340e..70981523134 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Post_Single_Request.snap +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Post_Single_Request.snap @@ -47,6 +47,10 @@ { "Key": "graphql.document.hash", "Value": "md5:f7e9989fbb67af7fa747a9983313c9e5" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Post_Single_Request_Default.snap b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Post_Single_Request_Default.snap index 018779474b5..a5489ca38e6 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Post_Single_Request_Default.snap +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Post_Single_Request_Default.snap @@ -32,6 +32,10 @@ { "Key": "graphql.document.hash", "Value": "md5:f7e9989fbb67af7fa747a9983313c9e5" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Post_Variables_Are_Not_Automatically_Added_To_Activities.snap b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Post_Variables_Are_Not_Automatically_Added_To_Activities.snap index ebe1a3f0c69..6160b3d6b1c 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Post_Variables_Are_Not_Automatically_Added_To_Activities.snap +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Post_Variables_Are_Not_Automatically_Added_To_Activities.snap @@ -47,6 +47,10 @@ { "Key": "graphql.document.hash", "Value": "md5:c46cf8c9811934ddea095f10ee722dc4" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Post_With_Extensions_Map.snap b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Post_With_Extensions_Map.snap index 29caf9b4f5b..99ea58b3415 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Post_With_Extensions_Map.snap +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.Http_Post_With_Extensions_Map.snap @@ -51,6 +51,10 @@ { "Key": "graphql.document.hash", "Value": "md5:c46cf8c9811934ddea095f10ee722dc4" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.RequestDetails_All_IncludesAllDetails.snap b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.RequestDetails_All_IncludesAllDetails.snap index 2a3b4873336..66272f5f7b1 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.RequestDetails_All_IncludesAllDetails.snap +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.RequestDetails_All_IncludesAllDetails.snap @@ -63,6 +63,10 @@ { "Key": "graphql.document.hash", "Value": "md5:111e40f921c6c6a35bc7eb0e3873630e" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.RequestDetails_Default_IncludesIdHashOperationNameExtensions.snap b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.RequestDetails_Default_IncludesIdHashOperationNameExtensions.snap index d1ca26442d2..6e187453d67 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.RequestDetails_Default_IncludesIdHashOperationNameExtensions.snap +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.RequestDetails_Default_IncludesIdHashOperationNameExtensions.snap @@ -55,6 +55,10 @@ { "Key": "graphql.document.hash", "Value": "md5:cf203f646caf64f424638bd2f09e490a" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.RequestDetails_DocumentOnly_IncludesDocumentTag.snap b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.RequestDetails_DocumentOnly_IncludesDocumentTag.snap index f51d4ecacc7..6dbc1f0a880 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.RequestDetails_DocumentOnly_IncludesDocumentTag.snap +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.RequestDetails_DocumentOnly_IncludesDocumentTag.snap @@ -43,6 +43,10 @@ { "Key": "graphql.document.hash", "Value": "md5:f7e9989fbb67af7fa747a9983313c9e5" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [ diff --git a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.RequestDetails_None_ExcludesAllDetails.snap b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.RequestDetails_None_ExcludesAllDetails.snap index 835497a7399..7556cd38a76 100644 --- a/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.RequestDetails_None_ExcludesAllDetails.snap +++ b/src/HotChocolate/Fusion/test/Fusion.Diagnostics.Tests/__snapshots__/FusionActivityServerDiagnosticListenerTests.RequestDetails_None_ExcludesAllDetails.snap @@ -39,6 +39,10 @@ { "Key": "graphql.document.hash", "Value": "md5:111e40f921c6c6a35bc7eb0e3873630e" + }, + { + "Key": "graphql.errors.count", + "Value": 0 } ], "event": [