Skip to content

Using NatsRequestReplyMode.Direct screws up OpenTelemetry traces #862

@aradalvand

Description

@aradalvand

Observed behavior

Using NatsRequestReplyMode.Direct screws up traces.

var natsClient = new NatsClient(opts: new()
{
	Name = "NATS Client",
	Url = primarySettings!.NatsAddress.ToString(),
	RequestReplyMode = NatsRequestReplyMode.Direct,
});

Expected behavior

My suspicion is that it might be due to the following:

if (Opts.RequestReplyMode == NatsRequestReplyMode.Direct)
{
using var rt = _replyTaskFactory.CreateReplyTask(replySerializer, replyOpts.Timeout);
requestSerializer ??= Opts.SerializerRegistry.GetSerializer<TRequest>();
await PublishAsync(subject, data, headers, rt.Subject, requestSerializer, requestOpts, cancellationToken).ConfigureAwait(false);
return await rt.GetResultAsync(cancellationToken).ConfigureAwait(false);
}
await using var sub1 = await CreateRequestSubAsync<TRequest, TReply>(subject, data, headers, requestSerializer, replySerializer, requestOpts, replyOpts, cancellationToken)
.ConfigureAwait(false);
await foreach (var msg in sub1.Msgs.ReadAllAsync(cancellationToken).ConfigureAwait(false))
{
return msg;
}
throw new NatsNoReplyException();

sub1.Msgs.ReadAllAsync (which is invoked when RequestReplyMode = SharedInbox) disposes activity instances after receiving a response:

while (_inner.TryRead(out var msg))
{
msg.Headers?.Activity?.Dispose();
yield return msg;
}

We might have to do something similar in the RequestReplyMode = Direct case?

Server and client version

Server: v2.11.0
Client: v2.6.0

Host environment

No response

Steps to reproduce

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingnats.netotelOpenTelemetry

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions