Skip to content

Commit b3f509a

Browse files
authored
[Instrumentation.GrpcNetClient] Nullable (open-telemetry#1815)
1 parent 9078ceb commit b3f509a

File tree

12 files changed

+61
-57
lines changed

12 files changed

+61
-57
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#nullable enable
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
OpenTelemetry.Instrumentation.GrpcNetClient.GrpcClientTraceInstrumentationOptions
2-
OpenTelemetry.Instrumentation.GrpcNetClient.GrpcClientTraceInstrumentationOptions.EnrichWithHttpRequestMessage.get -> System.Action<System.Diagnostics.Activity, System.Net.Http.HttpRequestMessage>
2+
OpenTelemetry.Instrumentation.GrpcNetClient.GrpcClientTraceInstrumentationOptions.EnrichWithHttpRequestMessage.get -> System.Action<System.Diagnostics.Activity!, System.Net.Http.HttpRequestMessage!>?
33
OpenTelemetry.Instrumentation.GrpcNetClient.GrpcClientTraceInstrumentationOptions.EnrichWithHttpRequestMessage.set -> void
4-
OpenTelemetry.Instrumentation.GrpcNetClient.GrpcClientTraceInstrumentationOptions.EnrichWithHttpResponseMessage.get -> System.Action<System.Diagnostics.Activity, System.Net.Http.HttpResponseMessage>
4+
OpenTelemetry.Instrumentation.GrpcNetClient.GrpcClientTraceInstrumentationOptions.EnrichWithHttpResponseMessage.get -> System.Action<System.Diagnostics.Activity!, System.Net.Http.HttpResponseMessage!>?
55
OpenTelemetry.Instrumentation.GrpcNetClient.GrpcClientTraceInstrumentationOptions.EnrichWithHttpResponseMessage.set -> void
66
OpenTelemetry.Instrumentation.GrpcNetClient.GrpcClientTraceInstrumentationOptions.GrpcClientTraceInstrumentationOptions() -> void
77
OpenTelemetry.Instrumentation.GrpcNetClient.GrpcClientTraceInstrumentationOptions.SuppressDownstreamInstrumentation.get -> bool
88
OpenTelemetry.Instrumentation.GrpcNetClient.GrpcClientTraceInstrumentationOptions.SuppressDownstreamInstrumentation.set -> void
99
OpenTelemetry.Trace.TracerProviderBuilderExtensions
10-
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddGrpcClientInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder builder) -> OpenTelemetry.Trace.TracerProviderBuilder
11-
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddGrpcClientInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder builder, string name, System.Action<OpenTelemetry.Instrumentation.GrpcNetClient.GrpcClientTraceInstrumentationOptions> configure) -> OpenTelemetry.Trace.TracerProviderBuilder
12-
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddGrpcClientInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder builder, System.Action<OpenTelemetry.Instrumentation.GrpcNetClient.GrpcClientTraceInstrumentationOptions> configure) -> OpenTelemetry.Trace.TracerProviderBuilder
10+
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddGrpcClientInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! builder) -> OpenTelemetry.Trace.TracerProviderBuilder!
11+
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddGrpcClientInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! builder, string? name, System.Action<OpenTelemetry.Instrumentation.GrpcNetClient.GrpcClientTraceInstrumentationOptions!>? configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
12+
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddGrpcClientInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! builder, System.Action<OpenTelemetry.Instrumentation.GrpcNetClient.GrpcClientTraceInstrumentationOptions!>? configure) -> OpenTelemetry.Trace.TracerProviderBuilder!

src/OpenTelemetry.Instrumentation.GrpcNetClient/GrpcClientInstrumentation.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ internal sealed class GrpcClientInstrumentation : IDisposable
1616
/// Initializes a new instance of the <see cref="GrpcClientInstrumentation"/> class.
1717
/// </summary>
1818
/// <param name="options">Configuration options for Grpc client instrumentation.</param>
19-
public GrpcClientInstrumentation(GrpcClientTraceInstrumentationOptions options = null)
19+
public GrpcClientInstrumentation(GrpcClientTraceInstrumentationOptions options)
2020
{
2121
this.diagnosticSourceSubscriber = new DiagnosticSourceSubscriber(new GrpcClientDiagnosticListener(options), isEnabledFilter: null, GrpcInstrumentationEventSource.Log.UnknownErrorProcessingEvent);
2222
this.diagnosticSourceSubscriber.Subscribe();

src/OpenTelemetry.Instrumentation.GrpcNetClient/GrpcClientTraceInstrumentationOptions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class GrpcClientTraceInstrumentationOptions
2222
/// <para><see cref="Activity"/>: the activity being enriched.</para>
2323
/// <para><see cref="HttpRequestMessage"/> object from which additional information can be extracted to enrich the activity.</para>
2424
/// </remarks>
25-
public Action<Activity, HttpRequestMessage> EnrichWithHttpRequestMessage { get; set; }
25+
public Action<Activity, HttpRequestMessage>? EnrichWithHttpRequestMessage { get; set; }
2626

2727
/// <summary>
2828
/// Gets or sets an action to enrich an Activity with <see cref="HttpResponseMessage"/>.
@@ -31,5 +31,5 @@ public class GrpcClientTraceInstrumentationOptions
3131
/// <para><see cref="Activity"/>: the activity being enriched.</para>
3232
/// <para><see cref="HttpResponseMessage"/> object from which additional information can be extracted to enrich the activity.</para>
3333
/// </remarks>
34-
public Action<Activity, HttpResponseMessage> EnrichWithHttpResponseMessage { get; set; }
34+
public Action<Activity, HttpResponseMessage>? EnrichWithHttpResponseMessage { get; set; }
3535
}

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

Lines changed: 37 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
using System.Diagnostics;
5-
#if NET6_0_OR_GREATER
65
using System.Diagnostics.CodeAnalysis;
7-
#endif
86
using System.Reflection;
97
using OpenTelemetry.Context.Propagation;
108
using OpenTelemetry.Internal;
@@ -16,7 +14,7 @@ internal sealed class GrpcClientDiagnosticListener : ListenerHandler
1614
{
1715
internal static readonly Assembly Assembly = typeof(GrpcClientDiagnosticListener).Assembly;
1816
internal static readonly AssemblyName AssemblyName = Assembly.GetName();
19-
internal static readonly string ActivitySourceName = AssemblyName.Name;
17+
internal static readonly string ActivitySourceName = AssemblyName.Name!;
2018
internal static readonly string Version = Assembly.GetPackageVersion();
2119
internal static readonly ActivitySource ActivitySource = new(ActivitySourceName, Version);
2220

@@ -34,26 +32,27 @@ public GrpcClientDiagnosticListener(GrpcClientTraceInstrumentationOptions option
3432
this.options = options;
3533
}
3634

37-
public override void OnEventWritten(string name, object payload)
35+
public override void OnEventWritten(string name, object? payload)
3836
{
37+
var activity = Activity.Current!;
3938
switch (name)
4039
{
4140
case OnStartEvent:
4241
{
43-
this.OnStartActivity(Activity.Current, payload);
42+
this.OnStartActivity(activity, payload);
4443
}
4544

4645
break;
4746
case OnStopEvent:
4847
{
49-
this.OnStopActivity(Activity.Current, payload);
48+
this.OnStopActivity(activity, payload);
5049
}
5150

5251
break;
5352
}
5453
}
5554

56-
public void OnStartActivity(Activity activity, object payload)
55+
public void OnStartActivity(Activity activity, object? payload)
5756
{
5857
// The overall flow of what GrpcClient library does is as below:
5958
// Activity.Start()
@@ -71,7 +70,7 @@ public void OnStartActivity(Activity activity, object payload)
7170
}
7271

7372
// Ensure context propagation irrespective of sampling decision
74-
if (!TryFetchRequest(payload, out HttpRequestMessage request))
73+
if (!TryFetchRequest(payload, out HttpRequestMessage? request))
7574
{
7675
GrpcInstrumentationEventSource.Log.NullPayload(nameof(GrpcClientDiagnosticListener), nameof(this.OnStartActivity));
7776
return;
@@ -113,31 +112,39 @@ public void OnStartActivity(Activity activity, object payload)
113112

114113
var grpcMethod = GrpcTagHelper.GetGrpcMethodFromActivity(activity);
115114

116-
activity.DisplayName = grpcMethod?.Trim('/');
117-
118-
activity.SetTag(SemanticConventions.AttributeRpcSystem, GrpcTagHelper.RpcSystemGrpc);
119-
120-
if (GrpcTagHelper.TryParseRpcServiceAndRpcMethod(grpcMethod, out var rpcService, out var rpcMethod))
115+
if (grpcMethod != null)
121116
{
122-
activity.SetTag(SemanticConventions.AttributeRpcService, rpcService);
123-
activity.SetTag(SemanticConventions.AttributeRpcMethod, rpcMethod);
117+
activity.DisplayName = grpcMethod.Trim('/');
124118

125-
// Remove the grpc.method tag added by the gRPC .NET library
126-
activity.SetTag(GrpcTagHelper.GrpcMethodTagName, null);
119+
if (GrpcTagHelper.TryParseRpcServiceAndRpcMethod(grpcMethod, out var rpcService, out var rpcMethod))
120+
{
121+
activity.SetTag(SemanticConventions.AttributeRpcService, rpcService);
122+
activity.SetTag(SemanticConventions.AttributeRpcMethod, rpcMethod);
123+
124+
// Remove the grpc.method tag added by the gRPC .NET library
125+
activity.SetTag(GrpcTagHelper.GrpcMethodTagName, null);
126+
}
127127
}
128128

129-
var uriHostNameType = Uri.CheckHostName(request.RequestUri.Host);
129+
activity.SetTag(SemanticConventions.AttributeRpcSystem, GrpcTagHelper.RpcSystemGrpc);
130130

131-
if (uriHostNameType == UriHostNameType.IPv4 || uriHostNameType == UriHostNameType.IPv6)
132-
{
133-
activity.SetTag(SemanticConventions.AttributeServerSocketAddress, request.RequestUri.Host);
134-
}
135-
else
131+
var requestUri = request.RequestUri;
132+
133+
if (requestUri != null)
136134
{
137-
activity.SetTag(SemanticConventions.AttributeServerAddress, request.RequestUri.Host);
138-
}
135+
var uriHostNameType = Uri.CheckHostName(requestUri.Host);
139136

140-
activity.SetTag(SemanticConventions.AttributeServerPort, request.RequestUri.Port);
137+
if (uriHostNameType == UriHostNameType.IPv4 || uriHostNameType == UriHostNameType.IPv6)
138+
{
139+
activity.SetTag(SemanticConventions.AttributeServerSocketAddress, requestUri.Host);
140+
}
141+
else
142+
{
143+
activity.SetTag(SemanticConventions.AttributeServerAddress, requestUri.Host);
144+
}
145+
146+
activity.SetTag(SemanticConventions.AttributeServerPort, requestUri.Port);
147+
}
141148

142149
try
143150
{
@@ -154,11 +161,11 @@ public void OnStartActivity(Activity activity, object payload)
154161
#if NET6_0_OR_GREATER
155162
[UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "The event source guarantees that top level properties are preserved")]
156163
#endif
157-
static bool TryFetchRequest(object payload, out HttpRequestMessage request)
164+
static bool TryFetchRequest(object? payload, [NotNullWhen(true)] out HttpRequestMessage? request)
158165
=> StartRequestFetcher.TryFetch(payload, out request) && request != null;
159166
}
160167

161-
public void OnStopActivity(Activity activity, object payload)
168+
public void OnStopActivity(Activity activity, object? payload)
162169
{
163170
if (activity.IsAllDataRequested)
164171
{
@@ -177,7 +184,7 @@ public void OnStopActivity(Activity activity, object payload)
177184
// Remove the grpc.status_code tag added by the gRPC .NET library
178185
activity.SetTag(GrpcTagHelper.GrpcStatusCodeTagName, null);
179186

180-
if (TryFetchResponse(payload, out HttpResponseMessage response))
187+
if (TryFetchResponse(payload, out HttpResponseMessage? response))
181188
{
182189
try
183190
{
@@ -195,7 +202,7 @@ public void OnStopActivity(Activity activity, object payload)
195202
#if NET6_0_OR_GREATER
196203
[UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "The event source guarantees that top level properties are preserved")]
197204
#endif
198-
static bool TryFetchResponse(object payload, out HttpResponseMessage response)
205+
static bool TryFetchResponse(object? payload, [NotNullWhen(true)] out HttpResponseMessage? response)
199206
=> StopResponseFetcher.TryFetch(payload, out response) && response != null;
200207
}
201208
}

src/OpenTelemetry.Instrumentation.GrpcNetClient/OpenTelemetry.Instrumentation.GrpcNetClient.csproj

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
<MinVerTagPrefix>Instrumentation.GrpcNetClient-</MinVerTagPrefix>
88

99
<ImplicitUsings>enable</ImplicitUsings>
10-
<!-- this is temporary. will remove in future PR. -->
11-
<Nullable>disable</Nullable>
1210
</PropertyGroup>
1311

1412
<!--Do not run Package Baseline Validation as this package has never released a stable version.

src/OpenTelemetry.Instrumentation.GrpcNetClient/TracerProviderBuilderExtensions.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public static TracerProviderBuilder AddGrpcClientInstrumentation(this TracerProv
3131
/// <returns>The instance of <see cref="TracerProviderBuilder"/> to chain the calls.</returns>
3232
public static TracerProviderBuilder AddGrpcClientInstrumentation(
3333
this TracerProviderBuilder builder,
34-
Action<GrpcClientTraceInstrumentationOptions> configure)
34+
Action<GrpcClientTraceInstrumentationOptions>? configure)
3535
=> AddGrpcClientInstrumentation(builder, name: null, configure);
3636

3737
/// <summary>
@@ -43,8 +43,8 @@ public static TracerProviderBuilder AddGrpcClientInstrumentation(
4343
/// <returns>The instance of <see cref="TracerProviderBuilder"/> to chain the calls.</returns>
4444
public static TracerProviderBuilder AddGrpcClientInstrumentation(
4545
this TracerProviderBuilder builder,
46-
string name,
47-
Action<GrpcClientTraceInstrumentationOptions> configure)
46+
string? name,
47+
Action<GrpcClientTraceInstrumentationOptions>? configure)
4848
{
4949
Guard.ThrowIfNull(builder);
5050

test/OpenTelemetry.Instrumentation.GrpcNetClient.Tests/GrpcServer.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class GrpcServer<TService> : IDisposable
1515
{
1616
private static readonly Random GlobalRandom = new();
1717

18-
private readonly IHost host;
18+
private readonly IHost? host;
1919

2020
public GrpcServer()
2121
{
@@ -38,7 +38,7 @@ public GrpcServer()
3838
catch (IOException)
3939
{
4040
retryCount--;
41-
this.host.Dispose();
41+
this.host?.Dispose();
4242
}
4343
}
4444
}
@@ -47,8 +47,8 @@ public GrpcServer()
4747

4848
public void Dispose()
4949
{
50-
this.host.StopAsync(TimeSpan.FromSeconds(5)).GetAwaiter().GetResult();
51-
this.host.Dispose();
50+
this.host?.StopAsync(TimeSpan.FromSeconds(5)).GetAwaiter().GetResult();
51+
this.host?.Dispose();
5252
GC.SuppressFinalize(this);
5353
}
5454

test/OpenTelemetry.Instrumentation.GrpcNetClient.Tests/GrpcTestHelpers/ClientTestHelpers.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace OpenTelemetry.Instrumentation.Grpc.Tests.GrpcTestHelpers;
1212

1313
internal static class ClientTestHelpers
1414
{
15-
public static HttpClient CreateTestClient(Func<HttpRequestMessage, Task<HttpResponseMessage>> sendAsync, Uri baseAddress = null)
15+
public static HttpClient CreateTestClient(Func<HttpRequestMessage, Task<HttpResponseMessage>> sendAsync, Uri? baseAddress = null)
1616
{
1717
var handler = TestHttpMessageHandler.Create(sendAsync);
1818
var httpClient = new HttpClient(handler);
@@ -21,13 +21,13 @@ public static HttpClient CreateTestClient(Func<HttpRequestMessage, Task<HttpResp
2121
return httpClient;
2222
}
2323

24-
public static Task<StreamContent> CreateResponseContent<TResponse>(TResponse response, ICompressionProvider compressionProvider = null)
24+
public static Task<StreamContent> CreateResponseContent<TResponse>(TResponse response, ICompressionProvider? compressionProvider = null)
2525
where TResponse : IMessage<TResponse>
2626
{
2727
return CreateResponseContentCore(new[] { response }, compressionProvider);
2828
}
2929

30-
public static async Task WriteResponseAsync<TResponse>(Stream ms, TResponse response, ICompressionProvider compressionProvider)
30+
public static async Task WriteResponseAsync<TResponse>(Stream ms, TResponse response, ICompressionProvider? compressionProvider)
3131
where TResponse : IMessage<TResponse>
3232
{
3333
var compress = false;
@@ -59,7 +59,7 @@ public static async Task WriteResponseAsync<TResponse>(Stream ms, TResponse resp
5959
#endif
6060
}
6161

62-
private static async Task<StreamContent> CreateResponseContentCore<TResponse>(TResponse[] responses, ICompressionProvider compressionProvider)
62+
private static async Task<StreamContent> CreateResponseContentCore<TResponse>(TResponse[] responses, ICompressionProvider? compressionProvider)
6363
where TResponse : IMessage<TResponse>
6464
{
6565
var ms = new MemoryStream();

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -428,8 +428,8 @@ public void AddGrpcClientInstrumentationNamedOptionsSupported()
428428
[Fact]
429429
public void Grpc_BadArgs()
430430
{
431-
TracerProviderBuilder builder = null;
432-
Assert.Throws<ArgumentNullException>(() => builder.AddGrpcClientInstrumentation());
431+
TracerProviderBuilder? builder = null;
432+
Assert.Throws<ArgumentNullException>(() => builder!.AddGrpcClientInstrumentation());
433433
}
434434

435435
private static void ValidateGrpcActivity(Activity activityToValidate)

0 commit comments

Comments
 (0)