Skip to content

Commit 41a3371

Browse files
authored
Optimize gRPC client instrumentation for suppress instrumentation (#1904)
* Optimize gRPC client instrumentation for SuppressInstrumentation * Udated unit tests
1 parent c404e19 commit 41a3371

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

src/OpenTelemetry.Instrumentation.GrpcNetClient/Implementation/GrpcClientDiagnosticListener.cs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,22 @@ public GrpcClientDiagnosticListener(GrpcClientInstrumentationOptions options)
4343

4444
public override void OnStartActivity(Activity activity, object payload)
4545
{
46+
// The overall flow of what GrpcClient library does is as below:
47+
// Activity.Start()
48+
// DiagnosticSource.WriteEvent("Start", payload)
49+
// DiagnosticSource.WriteEvent("Stop", payload)
50+
// Activity.Stop()
51+
52+
// This method is in the WriteEvent("Start", payload) path.
53+
// By this time, samplers have already run and
54+
// activity.IsAllDataRequested populated accordingly.
55+
56+
if (Sdk.SuppressInstrumentation)
57+
{
58+
return;
59+
}
60+
61+
// Ensure context propagation irrespective of sampling decision
4662
if (!this.startRequestFetcher.TryFetch(payload, out HttpRequestMessage request) || request == null)
4763
{
4864
GrpcInstrumentationEventSource.Log.NullPayload(nameof(GrpcClientDiagnosticListener), nameof(this.OnStartActivity));
@@ -78,15 +94,15 @@ public override void OnStartActivity(Activity activity, object payload)
7894
HttpRequestMessageContextPropagation.HeaderValueSetter);
7995
}
8096

81-
var grpcMethod = GrpcTagHelper.GetGrpcMethodFromActivity(activity);
97+
if (activity.IsAllDataRequested)
98+
{
99+
ActivityInstrumentationHelper.SetActivitySourceProperty(activity, ActivitySource);
100+
ActivityInstrumentationHelper.SetKindProperty(activity, ActivityKind.Client);
82101

83-
activity.DisplayName = grpcMethod?.Trim('/');
102+
var grpcMethod = GrpcTagHelper.GetGrpcMethodFromActivity(activity);
84103

85-
ActivityInstrumentationHelper.SetActivitySourceProperty(activity, ActivitySource);
86-
ActivityInstrumentationHelper.SetKindProperty(activity, ActivityKind.Client);
104+
activity.DisplayName = grpcMethod?.Trim('/');
87105

88-
if (activity.IsAllDataRequested)
89-
{
90106
activity.SetTag(SemanticConventions.AttributeRpcSystem, GrpcTagHelper.RpcSystemGrpc);
91107

92108
if (GrpcTagHelper.TryParseRpcServiceAndRpcMethod(grpcMethod, out var rpcService, out var rpcMethod))

test/OpenTelemetry.Instrumentation.Grpc.Tests/GrpcTests.client.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
using Microsoft.AspNetCore.Http;
2424
using Moq;
2525
using OpenTelemetry.Instrumentation.GrpcNetClient;
26+
using OpenTelemetry.Instrumentation.GrpcNetClient.Implementation;
2627
using OpenTelemetry.Trace;
2728
using Xunit;
2829

@@ -143,6 +144,7 @@ public void GrpcAndHttpClientInstrumentationIsInvoked(bool shouldEnrich)
143144

144145
ValidateGrpcActivity(grpcSpan);
145146
Assert.Equal($"greet.Greeter/SayHello", grpcSpan.DisplayName);
147+
Assert.Equal(0, grpcSpan.GetTagValue(SemanticConventions.AttributeRpcGrpcStatusCode));
146148
Assert.Equal($"HTTP POST", httpSpan.DisplayName);
147149
Assert.Equal(grpcSpan.SpanId, httpSpan.ParentSpanId);
148150
}
@@ -274,6 +276,7 @@ public void GrpcPropagatesContextWithSuppressInstrumentation()
274276
Assert.Equal($"greet.Greeter/SayHello", serverActivity.DisplayName);
275277
Assert.Equal(clientActivity.TraceId, serverActivity.TraceId);
276278
Assert.Equal(clientActivity.SpanId, serverActivity.ParentSpanId);
279+
Assert.Equal(0, clientActivity.GetTagValue(SemanticConventions.AttributeRpcGrpcStatusCode));
277280
Assert.Contains("item1=value1", serverActivity.GetCustomProperty("BaggageString") as string);
278281
}
279282

@@ -286,11 +289,14 @@ public void Grpc_BadArgs()
286289

287290
private static void ValidateGrpcActivity(Activity activityToValidate)
288291
{
292+
Assert.Equal(GrpcClientDiagnosticListener.ActivitySourceName, activityToValidate.Source.Name);
293+
Assert.Equal(GrpcClientDiagnosticListener.Version.ToString(), activityToValidate.Source.Version);
289294
Assert.Equal(ActivityKind.Client, activityToValidate.Kind);
290295
}
291296

292297
private static void ActivityEnrichment(Activity activity, string method, object obj)
293298
{
299+
Assert.True(activity.IsAllDataRequested);
294300
switch (method)
295301
{
296302
case "OnStartActivity":

0 commit comments

Comments
 (0)