-
Notifications
You must be signed in to change notification settings - Fork 71
Add support for Filter
and Enrich
for OpenTelemetry activities
#859
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: release/2.7
Are you sure you want to change the base?
Conversation
See couple of comments but I would also suggest waiting for #859 to be merged which would enable the context & options to reside in the abstractions package. |
@thompson-tomo Waiting for what to be merged, sorry? #859 is this PR. |
Ahh my mistake @aradalvand I meant #858 |
I have no idea why the Windows test is failing... Weird. Another update: looks like the main branch is also failing so we're in good company haha: |
test fail maybe a flapper. just kicked again |
may i move this PR onto release/2.7 branch? it might make it easier to coordinate with other otel stuff for us also we can hopefully release preview quicker |
Sure @mtmk feel free to do that. |
* Add RequestReplyMode for JetStream * Add benchmarks
* Add RequestReplyMode for JetStream (nats-io#867)
…t activity context
@mtmk Any idea about the timeout exception in two of the tests? Weird. |
Resolves #857
Several important considerations:
1 dependency added:(Dependency removed)OpenTelemetry.Api
toNATS.Client.Core
— needed for theTracerProviderBuilder.AddNatsInstrumentation
extension method. This makes NATS dependent on the so-called OpenTelemetry API, which is expected. But if you're strongly opposed to this, we could also remove this method. Won't take away much from the core functionality added here which areFilter
andEnrich
.Telemetry.Send*
methods were also used in places without dependency injection available (e.g. theNatsMsg
struct), I couldn't integrateNatsInstrumentationOptions
into theIOptions
system (which would've probably been more ideal) — so I created a staticDefault
property instead, which theAction<NatsInstrumentationOptions>
input parameter effectively configures, and that property is then used by theTelemetry
class.IsInternal
flag toNatsInstrumentationContext
(equivalent to the oldNATS.Net.Internal
activity source name) so that people could easily filter out lower-level communication (e.g. for request-replies), which could be verbose and chatty.Made a number of tangential improvements too (if you disagree with any of them let me know and I could revert them back):
Telemetry
class public — this is the most conventional pattern in .NET (which this same codebase also follows in almost all other places).isRemote: true
toActivityContext.TryParse
— the OpenTelemetry specification states that span contexts extracted from text maps using propagators (e.g.DistributedContextPropagator
) should beisRemote: true
— see this link.NatsMsg<T>.Build
I moved the code for activity creation beforeDeserialize
is called, so that if the user's custom deserializer spawns an activity (which mine does, for example, so this would be useful for me), that's included in the trace. This makes things symmetric with howRequestAsync
andPublishAsync
work as well (they encompasses the ser/de step in their activities).