Skip to content

Commit 75604ab

Browse files
authored
Added call options (#18)
New options for ClientTracingConfiguration: * WaitForReady * FallbackCancellationToken
1 parent 204ba6b commit 75604ab

File tree

8 files changed

+62
-9
lines changed

8 files changed

+62
-9
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ A `ClientTracingInterceptor` also has default settings, which you can override b
101101
- `WithStreaming()`: Logs to the client span whenever a message is sent or a response is received. *Note:* This package supports streaming but has not been rigorously tested. If you come across any issues, please let us know.
102102
- `WithVerbosity()`: Logs to the client span additional events, such as call started, message sent, headers received, response received, and call complete. Default only logs if a call is cancelled.
103103
- `WithTracedAttributes(params ClientRequestAttribute[] attrs)`: Sets tags on the client span in case you want to track information about the RPC call.
104+
- `WithWaitForReady()`: Enables WaitForReady on all RPC calls.
105+
- `WithFallbackCancellationToken(CancellationToken cancellationToken)`: Sets the cancellation token if the RPC call hasn't defined one.
104106

105107
### Example
106108
```csharp
@@ -119,6 +121,8 @@ ClientTracingInterceptor tracingInterceptor = new ClientTracingInterceptor
119121
.WithOperationName(new CustomOperationNameConstructor())
120122
.WithTracingAttributes(ClientTracingConfiguration.RequestAttribute.AllCallOptions,
121123
ClientTracingConfiguration.ClientRequestAttribute.Headers)
124+
.WithWaitForReady()
125+
.WithFallbackCancellationToken(cancellationToken)
122126
.Build();
123127
```
124128

src/OpenTracing.Contrib.Grpc/Configuration/ClientTracingConfiguration.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using System.Threading;
23
using OpenTracing.Contrib.Grpc.OperationNameConstructor;
34

45
namespace OpenTracing.Contrib.Grpc.Configuration
@@ -17,16 +18,20 @@ public enum RequestAttribute
1718
}
1819

1920
public ISet<RequestAttribute> TracedAttributes { get; }
21+
public bool WaitForReady { get; }
22+
public CancellationToken FallbackCancellationToken { get; }
2023

2124
internal ClientTracingConfiguration(ITracer tracer) : base(tracer)
2225
{
2326
TracedAttributes = new HashSet<RequestAttribute>();
2427
}
2528

26-
internal ClientTracingConfiguration(ITracer tracer, IOperationNameConstructor operationNameConstructor, bool streaming, bool verbose, ISet<RequestAttribute> tracedAttributes)
29+
internal ClientTracingConfiguration(ITracer tracer, IOperationNameConstructor operationNameConstructor, bool streaming, bool verbose, ISet<RequestAttribute> tracedAttributes, bool waitForReady, CancellationToken fallbackCancellationToken)
2730
: base(tracer, operationNameConstructor, streaming, verbose)
2831
{
2932
TracedAttributes = tracedAttributes ?? new HashSet<RequestAttribute>();
33+
WaitForReady = waitForReady;
34+
FallbackCancellationToken = fallbackCancellationToken;
3035
}
3136
}
3237
}

src/OpenTracing.Contrib.Grpc/Configuration/ServerTracingConfiguration.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ internal ServerTracingConfiguration(ITracer tracer) : base(tracer)
2020
TracedAttributes = new HashSet<RequestAttribute>();
2121
}
2222

23-
internal ServerTracingConfiguration(ITracer tracer, IOperationNameConstructor operationNameConstructor, bool streaming, bool verbose, ISet<RequestAttribute> tracedAttributes)
23+
internal ServerTracingConfiguration(ITracer tracer, IOperationNameConstructor operationNameConstructor, bool streaming, bool verbose, ISet<RequestAttribute> tracedAttributes)
2424
: base(tracer, operationNameConstructor, streaming, verbose)
2525
{
2626
TracedAttributes = tracedAttributes ?? new HashSet<RequestAttribute>();

src/OpenTracing.Contrib.Grpc/Extensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public static ISpan SetException(this ISpan span, Exception ex)
1818
{LogFields.ErrorObject, ex},
1919

2020
// Those fields will be removed once Configration.WithExpandExceptionLogs is implemented
21-
{LogFields.ErrorKind, ex.GetType().Name},
21+
{LogFields.ErrorKind, ex.GetType().Name},
2222
{LogFields.Message, ex.Message},
2323
{LogFields.Stack, ex.StackTrace}
2424
});

src/OpenTracing.Contrib.Grpc/GrpcTraceLogger.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55

66
namespace OpenTracing.Contrib.Grpc
77
{
8-
internal class GrpcTraceLogger<TRequest, TResponse>
9-
where TRequest : class
8+
internal class GrpcTraceLogger<TRequest, TResponse>
9+
where TRequest : class
1010
where TResponse : class
1111
{
1212
private readonly ISpan _span;

src/OpenTracing.Contrib.Grpc/Handler/InterceptedClientHandler.cs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,39 @@ public InterceptedClientHandler(ClientTracingConfiguration configuration, Client
2323
{
2424
_configuration = configuration;
2525
_context = context;
26-
if (context.Options.Headers == null)
26+
27+
var callOptions = ApplyConfigToCallOptions(_context.Options);
28+
if (!Equals(callOptions, context.Options))
2729
{
28-
_context = new ClientInterceptorContext<TRequest, TResponse>(context.Method, context.Host,
29-
context.Options.WithHeaders(new Metadata())); // Add empty metadata to options
30+
_context = new ClientInterceptorContext<TRequest, TResponse>(context.Method, context.Host, callOptions);
3031
}
3132

3233
var span = InitializeSpanWithHeaders();
3334
_logger = new GrpcTraceLogger<TRequest, TResponse>(span, configuration);
3435
_configuration.Tracer.Inject(span.Context, BuiltinFormats.HttpHeaders, new MetadataCarrier(_context.Options.Headers));
3536
}
3637

38+
private CallOptions ApplyConfigToCallOptions(CallOptions callOptions)
39+
{
40+
if (callOptions.Headers == null)
41+
{
42+
// Add empty metadata to options:
43+
callOptions = callOptions.WithHeaders(new Metadata());
44+
}
45+
46+
if (_configuration.WaitForReady && callOptions.IsWaitForReady != _configuration.WaitForReady)
47+
{
48+
callOptions = callOptions.WithWaitForReady();
49+
}
50+
51+
if (_configuration.FallbackCancellationToken != default && callOptions.CancellationToken != _configuration.FallbackCancellationToken)
52+
{
53+
callOptions = callOptions.WithCancellationToken(_configuration.FallbackCancellationToken);
54+
}
55+
56+
return callOptions;
57+
}
58+
3759
private ISpan InitializeSpanWithHeaders()
3860
{
3961
var operationName = _configuration.OperationNameConstructor.ConstructOperationName(_context.Method);

src/OpenTracing.Contrib.Grpc/Interceptors/ClientTracingInterceptor.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using OpenTracing.Contrib.Grpc.Configuration;
55
using OpenTracing.Contrib.Grpc.Handler;
66
using System.Collections.Generic;
7+
using System.Threading;
78
using OpenTracing.Contrib.Grpc.OperationNameConstructor;
89

910
namespace OpenTracing.Contrib.Grpc.Interceptors
@@ -61,6 +62,8 @@ public class Builder
6162
private bool _streaming;
6263
private bool _verbose;
6364
private ISet<ClientTracingConfiguration.RequestAttribute> _tracedAttributes;
65+
private bool _waitForReady;
66+
private CancellationToken _cancellationToken;
6467

6568
public Builder(ITracer tracer)
6669
{
@@ -103,9 +106,27 @@ public Builder WithTracedAttributes(params ClientTracingConfiguration.RequestAtt
103106
return this;
104107
}
105108

109+
/// <summary>
110+
/// Enables WaitForReady call option for all calls.
111+
/// </summary>
112+
/// <returns>this Builder configured to be verbose</returns>
113+
public Builder WithWaitForReady()
114+
{
115+
_waitForReady = true;
116+
return this;
117+
}
118+
119+
/// <param name="cancellationToken">The cancellation token to set for all RPCs if none was set.</param>
120+
/// <returns>this Builder configured to be verbose</returns>
121+
public Builder WithFallbackCancellationToken(CancellationToken cancellationToken)
122+
{
123+
_cancellationToken = cancellationToken;
124+
return this;
125+
}
126+
106127
public ClientTracingInterceptor Build()
107128
{
108-
var configuration = new ClientTracingConfiguration(_tracer, _operationNameConstructor, _streaming, _verbose, _tracedAttributes);
129+
var configuration = new ClientTracingConfiguration(_tracer, _operationNameConstructor, _streaming, _verbose, _tracedAttributes, _waitForReady, _cancellationToken);
109130
return new ClientTracingInterceptor(configuration);
110131
}
111132
}

test/OpenTracing.Contrib.Grpc.Test/Program.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ private static async Task MainAsync()
4949
.WithStreaming()
5050
.WithVerbosity()
5151
.WithTracedAttributes(ClientTracingConfiguration.RequestAttribute.AllCallOptions, ClientTracingConfiguration.RequestAttribute.Headers)
52+
.WithWaitForReady()
5253
.Build();
5354

5455
var client = new Phone.PhoneClient(new Channel("localhost:8011", ChannelCredentials.Insecure).Intercept(tracingInterceptor));

0 commit comments

Comments
 (0)