skip to Main Content

I am looking into how the app insights work with different types of dependencies. I have a question on using the AppInsights ASP Net Core sdk with Messaging Service Bus sdk.

How can I capture messages to service bus while sending or receiving using this sdk in dependency? I understand that this is not something we would like to log all the time and I will make it configurable.

Thanks

2

Answers


  1. Chosen as BEST ANSWER

    Adding my approach as an answer here as it is too long to comment.

            var telemetry = new DependencyTelemetry(
                "Azure Service Bus",
                _serviceBusClient.FullyQualifiedNamespace,
                "ServiceBusReceiver.Receive",
                string.Empty
            );
            using var operation =
                _telemetryClient.StartOperation(telemetry);
            try
            {
                var receivedMessage = await _serviceBusReceiver.ReceiveMessageAsync();
                if (receivedMessage?.Body is not null)
                {
                    message = receivedMessage.Body.ToString();
                    telemetry.Data = message;
                    // do something
                }
                telemetry.Success = true;
                //Consider set telemetry duration
            }
            catch (Exception e)
            {
                // log exception
                _telemetryClient.TrackException(e);
                telemetry.Success = false;
                throw;
            }
            finally
            {
                _telemetryClient.TrackTrace("Done");
                _telemetryClient.StopOperation(operation);
            }
    

    Thanks to @Peter Bons


  2. You can create your own sender and implement the desired logic inside the SendMessageAsync method:

    public class TelemetryEnabledServiceBusSender : ServiceBusSender
    {
        private readonly TelemetryClient telemetryClient;
    
        internal TelemetryEnabledServiceBusSender(ServiceBusClient client, string topic, TelemetryClient telemetryClient) : base(client, topic)
        {
            this.telemetryClient = telemetryClient;
        }
    
        public override async Task SendMessageAsync(ServiceBusMessage message, CancellationToken cancellationToken = default)
        {
            telemetryClient.TrackTrace(message.Body.ToString());
    
            await base.SendMessageAsync(message, cancellationToken);
        }
    }
    

    use it like this:

    var serviceBusSender = new TelemetryEnabledServiceBusSender(serviceBusClient, serviceBusData.Topic, telemetryClient);
    await serviceBusSender.SendMessageAsync(message);
    

    Logging processed messages is even simpler and can be done using the ServiceBusProcessor

    serviceBusProcessor.ProcessMessageAsync += ProcessMessageAsync;
    
    ...
    
    private async Task ProcessMessageAsync(ProcessMessageEventArgs arg)
    {
        telemetryClient.TrackTrace(arg.Message.Body.ToString());
    
        ...
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search