From f4dfcf0afe0e11bb31bff48448d8b1b628039e80 Mon Sep 17 00:00:00 2001 From: Rena88 Date: Thu, 7 Dec 2023 15:42:53 +0500 Subject: [PATCH 01/40] =?UTF-8?q?=D0=9D=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D1=88=D0=BE=D0=B9=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Byndyusoft.Net.RabbitMq.sln.DotSettings | 1 + .../RabbitMqClientActivitySource.Events.cs | 34 +++++++++---------- .../RabbitMqClientActivitySource.cs | 4 +-- 3 files changed, 18 insertions(+), 21 deletions(-) diff --git a/Byndyusoft.Net.RabbitMq.sln.DotSettings b/Byndyusoft.Net.RabbitMq.sln.DotSettings index 90c809e..4137982 100644 --- a/Byndyusoft.Net.RabbitMq.sln.DotSettings +++ b/Byndyusoft.Net.RabbitMq.sln.DotSettings @@ -1,3 +1,4 @@  True + True True \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs index 3f22bb1..ceb5611 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs @@ -68,30 +68,28 @@ public void MessageConsumed(Activity? activity, ReceivedRabbitMqMessage _, Consu private ActivityTagsCollection GetReturnedMessageEventTags(ReturnedRabbitMqMessage message) { - var tags = new ActivityTagsCollection(); - - tags.Add("amqp.message.exchange", message.Exchange ?? string.Empty); - tags.Add("amqp.message.routing_key", message.RoutingKey); - tags.Add("amqp.message.return_reason", message.ReturnReason); - tags.Add("amqp.message.content", - message.Content.ReadAsStringAsync().GetAwaiter().GetResult()); - tags.Add("amqp.message.properties", - JsonSerializer.Serialize(message.Properties, _activitySource._options)); + var tags = new ActivityTagsCollection + { + { "amqp.message.exchange", message.Exchange ?? string.Empty }, + { "amqp.message.routing_key", message.RoutingKey }, + { "amqp.message.return_reason", message.ReturnReason }, + { "amqp.message.content", message.Content.ReadAsStringAsync().GetAwaiter().GetResult() }, + { "amqp.message.properties", JsonSerializer.Serialize(message.Properties, _activitySource._options) } + }; return tags; } private ActivityTagsCollection GetPublishedMessageEventTags(RabbitMqMessage message) { - var tags = new ActivityTagsCollection(); - - tags.Add("amqp.message.exchange", message.Exchange ?? string.Empty); - tags.Add("amqp.message.routing_key", message.RoutingKey); - tags.Add("amqp.message.mandatory", message.Mandatory); - tags.Add("amqp.message.content", - message.Content.ReadAsStringAsync().GetAwaiter().GetResult()); - tags.Add("amqp.message.properties", - JsonSerializer.Serialize(message.Properties, _activitySource._options)); + var tags = new ActivityTagsCollection + { + { "amqp.message.exchange", message.Exchange ?? string.Empty }, + { "amqp.message.routing_key", message.RoutingKey }, + { "amqp.message.mandatory", message.Mandatory }, + { "amqp.message.content", message.Content.ReadAsStringAsync().GetAwaiter().GetResult() }, + { "amqp.message.properties", JsonSerializer.Serialize(message.Properties, _activitySource._options) } + }; return tags; } diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs index 1b008d1..a79ecdf 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs @@ -52,7 +52,6 @@ private static void StopActivity(Activity? activity) return; activity.SetStatus(ActivityStatusCode.Ok); - activity.SetTag("otel.status_code", "OK"); activity.Dispose(); } @@ -75,8 +74,7 @@ private static void SetException(Activity? activity, Exception exception, bool e var activityEvent = new ActivityEvent("exception", tags: tags); activity.AddEvent(activityEvent); activity.SetTag("error", "true"); - activity.SetTag("otel.status_code", "ERROR"); - activity.SetTag("otel.status_description", exception.Message); + activity.SetStatus(ActivityStatusCode.Error, exception.Message); activity.Dispose(); } From 3a1fbfe9859a1c72d6f1668b7276a2280df8a71c Mon Sep 17 00:00:00 2001 From: Rena88 Date: Thu, 7 Dec 2023 16:08:37 +0500 Subject: [PATCH 02/40] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BE=D0=BF=D1=86=D0=B8=D0=B8=20=D1=82=D1=80=D0=B5?= =?UTF-8?q?=D0=B9=D1=81=D0=B8=D0=BD=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Byndyusoft.Messaging.RabbitMq.Core.csproj | 2 +- .../Settings/RabbitMqTracingOptions.cs | 9 +++++++++ ...yndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj | 5 +++++ .../RabbitMqClientTracerProviderBuilderExtensions.cs | 12 +++++++++++- 4 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Settings/RabbitMqTracingOptions.cs diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj b/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj index 919f391..ff2dec1 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;netstandard2.1 diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Settings/RabbitMqTracingOptions.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Settings/RabbitMqTracingOptions.cs new file mode 100644 index 0000000..3c34d10 --- /dev/null +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Settings/RabbitMqTracingOptions.cs @@ -0,0 +1,9 @@ +namespace Byndyusoft.Messaging.RabbitMq.Settings +{ + public class RabbitMqTracingOptions + { + public bool LogEventsInTrace { get; set; } = false; + + public bool LogEventsInLog { get; set; } = true; + } +} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj index a09bcc0..9e24d54 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj @@ -6,6 +6,11 @@ Byndyusoft.Messaging.RabbitMq.OpenTelemetry + + + + + diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs index 95f5175..ed28770 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs @@ -1,7 +1,10 @@ // ReSharper disable CheckNamespace +using System; using Byndyusoft.Messaging.RabbitMq.Diagnostics; +using Byndyusoft.Messaging.RabbitMq.Settings; using Byndyusoft.Messaging.RabbitMq.Utils; +using Microsoft.Extensions.DependencyInjection; namespace OpenTelemetry.Trace { @@ -13,10 +16,17 @@ public static class RabbitMqClientTracerProviderBuilderExtensions /// /// Subscribes to the RabbitMqClient activity source to enable OpenTelemetry tracing. /// - public static TracerProviderBuilder AddRabbitMqClientInstrumentation(this TracerProviderBuilder builder) + public static TracerProviderBuilder AddRabbitMqClientInstrumentation( + this TracerProviderBuilder builder, + Action? configureTracingOptions = null) { Preconditions.CheckNotNull(builder, nameof(builder)); + if (configureTracingOptions != null) + { + builder.ConfigureServices(services => services.Configure(configureTracingOptions)); + } + return builder.AddSource(RabbitMqClientActivitySource.Name); } } From 867bf466658df38d867fb3f2c4ab921a0d56adfc Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Fri, 8 Dec 2023 16:45:12 +0500 Subject: [PATCH 03/40] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20DiagnosticListener?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RabbitMqClientActivitySource.cs | 3 +- .../Diagnostics/RabbitMqDiagnosticListener.cs | 197 ++++++++++++++++++ .../Settings/RabbitMqTracingOptions.cs | 4 +- 3 files changed, 199 insertions(+), 5 deletions(-) create mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqDiagnosticListener.cs diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs index a79ecdf..331307d 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs @@ -55,6 +55,7 @@ private static void StopActivity(Activity? activity) activity.Dispose(); } + // TODO Убрать escape private static void SetException(Activity? activity, Exception exception, bool escaped = true) { Preconditions.CheckNotNull(exception, nameof(exception)); @@ -62,8 +63,6 @@ private static void SetException(Activity? activity, Exception exception, bool e if (activity is null) return; - activity.SetStatus(ActivityStatusCode.Error, exception.Message); - var tags = new ActivityTagsCollection { {"exception.type", exception.GetType().FullName}, diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqDiagnosticListener.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqDiagnosticListener.cs new file mode 100644 index 0000000..3dd436c --- /dev/null +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqDiagnosticListener.cs @@ -0,0 +1,197 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Threading; +using Byndyusoft.Messaging.RabbitMq.Utils; + +namespace Byndyusoft.Messaging.RabbitMq.Diagnostics +{ + internal sealed class DiagnosticSourceSubscriber : IDisposable, IObserver + { + private readonly List _listenerSubscriptions; + private readonly Func _handlerFactory; + private readonly Func _diagnosticSourceFilter; + private readonly Func? _isEnabledFilter; + private long _disposed; + private IDisposable? _allSourcesSubscription; + + public DiagnosticSourceSubscriber( + ListenerHandler handler, + Func? isEnabledFilter) + : this(_ => handler, value => handler.SourceName == value.Name, isEnabledFilter) + { + } + + public DiagnosticSourceSubscriber( + Func handlerFactory, + Func diagnosticSourceFilter, + Func? isEnabledFilter) + { + Preconditions.CheckNotNull(handlerFactory, "Handler Factory is null"); + + _listenerSubscriptions = new List(); + _handlerFactory = handlerFactory; + _diagnosticSourceFilter = diagnosticSourceFilter; + _isEnabledFilter = isEnabledFilter; + } + + public void Subscribe() + { + _allSourcesSubscription ??= DiagnosticListener.AllListeners.Subscribe(this); + } + + public void OnNext(DiagnosticListener value) + { + if (Interlocked.Read(ref _disposed) == 0 && _diagnosticSourceFilter(value)) + { + var handler = _handlerFactory(value.Name); + var listener = new DiagnosticSourceListener(handler); + var subscription = _isEnabledFilter == null + ? value.Subscribe(listener) + : value.Subscribe(listener, _isEnabledFilter); + + lock (_listenerSubscriptions) + { + _listenerSubscriptions.Add(subscription); + } + } + } + + public void OnCompleted() + { + } + + public void OnError(Exception error) + { + } + + /// + public void Dispose() + { + if (Interlocked.CompareExchange(ref _disposed, 1, 0) == 1) + { + return; + } + + lock (_listenerSubscriptions) + { + foreach (var listenerSubscription in _listenerSubscriptions) + { + listenerSubscription?.Dispose(); + } + + _listenerSubscriptions.Clear(); + } + + _allSourcesSubscription?.Dispose(); + _allSourcesSubscription = null; + } + } + + internal sealed class DiagnosticSourceListener : IObserver> + { + private readonly ListenerHandler _handler; + + public DiagnosticSourceListener(ListenerHandler handler) + { + Preconditions.CheckNotNull(handler, "Handler is null"); + + _handler = handler; + } + + public void OnCompleted() + { + } + + public void OnError(Exception error) + { + } + + public void OnNext(KeyValuePair value) + { + if (_handler.SupportsNullActivity == false && Activity.Current == null) + { + return; + } + + try + { + _handler.OnEventWritten(value.Key, value.Value); + } + catch (Exception) + { + // ignored + } + } + } + + /// + /// ListenerHandler base class. + /// + public abstract class ListenerHandler + { + /// + /// Initializes a new instance of the class. + /// + /// The name of the . + protected ListenerHandler(string sourceName) + { + SourceName = sourceName; + SupportsNullActivity = false; + } + + /// + /// Gets the name of the . + /// + public string SourceName { get; } + + /// + /// Gets a value indicating whether the supports NULL . + /// + public virtual bool SupportsNullActivity { get; } + + /// + /// Method called for an event which does not have 'Start', 'Stop' or 'Exception' as suffix. + /// + /// Custom name. + /// An object that represent the value being passed as a payload for the event. + public virtual void OnEventWritten(string name, object? payload) + { + } + } + + public class RabbitMqSourceSubscriber : IDisposable + { + private readonly Func _isEnabled = (_, _, _) => true; + + private readonly DiagnosticSourceSubscriber _diagnosticSourceSubscriber; + + public RabbitMqSourceSubscriber(RabbitMqListener rabbitMqListener) + { + _diagnosticSourceSubscriber = new DiagnosticSourceSubscriber(rabbitMqListener, _isEnabled); + _diagnosticSourceSubscriber.Subscribe(); + } + + /// + public void Dispose() + { + this._diagnosticSourceSubscriber?.Dispose(); + } + } + + public class RabbitMqListener : ListenerHandler + { + private const string DiagnosticSourceName = "Byndyusoft.RabbitMq"; + + public RabbitMqListener() + : base(DiagnosticSourceName) + { + } + + public override bool SupportsNullActivity => true; + + public override void OnEventWritten(string name, object? payload) + { + } + } +} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Settings/RabbitMqTracingOptions.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Settings/RabbitMqTracingOptions.cs index 3c34d10..a96a4bb 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Settings/RabbitMqTracingOptions.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Settings/RabbitMqTracingOptions.cs @@ -2,8 +2,6 @@ namespace Byndyusoft.Messaging.RabbitMq.Settings { public class RabbitMqTracingOptions { - public bool LogEventsInTrace { get; set; } = false; - - public bool LogEventsInLog { get; set; } = true; + public bool LogEvents { get; set; } = false; } } \ No newline at end of file From cdc1c4f9de3c8c4b2e679de11db69aa9a2ed34dd Mon Sep 17 00:00:00 2001 From: Rena88 Date: Mon, 11 Dec 2023 15:36:18 +0500 Subject: [PATCH 04/40] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D1=81=D0=BB=D1=83=D1=88=D0=B0=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D0=B9=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BB=D0=BE=D0=B3=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Byndyusoft.Messaging.RabbitMq.Core.csproj | 3 +- .../Base/DiagnosticSourceListener.cs | 44 ++++ .../Base/DiagnosticSourceSubscriber.cs | 90 ++++++++ .../Diagnostics/Base/ListenerHandler.cs | 39 ++++ .../Diagnostics/Builders/EventItemBuilder.cs | 103 +++++++++ .../Diagnostics/Consts/EventNames.cs | 11 + .../Diagnostics/EventItem.cs | 18 ++ .../Diagnostics/RabbitMqDiagnosticListener.cs | 197 ------------------ .../Diagnostics/RabbitMqListener.cs | 88 ++++++++ .../Diagnostics/RabbitMqSourceSubscriber.cs | 24 +++ 10 files changed, 419 insertions(+), 198 deletions(-) create mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Base/DiagnosticSourceListener.cs create mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Base/DiagnosticSourceSubscriber.cs create mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Base/ListenerHandler.cs create mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Builders/EventItemBuilder.cs create mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Consts/EventNames.cs create mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/EventItem.cs delete mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqDiagnosticListener.cs create mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqListener.cs create mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqSourceSubscriber.cs diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj b/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj index ff2dec1..7da2f72 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;netstandard2.1 @@ -7,6 +7,7 @@ + diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Base/DiagnosticSourceListener.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Base/DiagnosticSourceListener.cs new file mode 100644 index 0000000..b30ff25 --- /dev/null +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Base/DiagnosticSourceListener.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using Byndyusoft.Messaging.RabbitMq.Utils; + +namespace Byndyusoft.Messaging.RabbitMq.Diagnostics.Base +{ + internal sealed class DiagnosticSourceListener : IObserver> + { + private readonly ListenerHandler _handler; + + public DiagnosticSourceListener(ListenerHandler handler) + { + Preconditions.CheckNotNull(handler, "Handler is null"); + + _handler = handler; + } + + public void OnCompleted() + { + } + + public void OnError(Exception error) + { + } + + public void OnNext(KeyValuePair value) + { + if (_handler.SupportsNullActivity == false && Activity.Current == null) + { + return; + } + + try + { + _handler.OnEventWritten(value.Key, value.Value); + } + catch (Exception) + { + // ignored + } + } + } +} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Base/DiagnosticSourceSubscriber.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Base/DiagnosticSourceSubscriber.cs new file mode 100644 index 0000000..33dd129 --- /dev/null +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Base/DiagnosticSourceSubscriber.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Threading; +using Byndyusoft.Messaging.RabbitMq.Utils; + +namespace Byndyusoft.Messaging.RabbitMq.Diagnostics.Base +{ + internal sealed class DiagnosticSourceSubscriber : IDisposable, IObserver + { + private readonly List _listenerSubscriptions; + private readonly Func _handlerFactory; + private readonly Func _diagnosticSourceFilter; + private readonly Func? _isEnabledFilter; + private long _disposed; + private IDisposable? _allSourcesSubscription; + + public DiagnosticSourceSubscriber( + ListenerHandler handler, + Func? isEnabledFilter) + : this(_ => handler, value => handler.SourceName == value.Name, isEnabledFilter) + { + } + + public DiagnosticSourceSubscriber( + Func handlerFactory, + Func diagnosticSourceFilter, + Func? isEnabledFilter) + { + Preconditions.CheckNotNull(handlerFactory, "Handler Factory is null"); + + _listenerSubscriptions = new List(); + _handlerFactory = handlerFactory; + _diagnosticSourceFilter = diagnosticSourceFilter; + _isEnabledFilter = isEnabledFilter; + } + + public void Subscribe() + { + _allSourcesSubscription ??= DiagnosticListener.AllListeners.Subscribe(this); + } + + public void OnNext(DiagnosticListener value) + { + if (Interlocked.Read(ref _disposed) == 0 && _diagnosticSourceFilter(value)) + { + var handler = _handlerFactory(value.Name); + var listener = new DiagnosticSourceListener(handler); + var subscription = _isEnabledFilter == null + ? value.Subscribe(listener) + : value.Subscribe(listener, _isEnabledFilter); + + lock (_listenerSubscriptions) + { + _listenerSubscriptions.Add(subscription); + } + } + } + + public void OnCompleted() + { + } + + public void OnError(Exception error) + { + } + + /// + public void Dispose() + { + if (Interlocked.CompareExchange(ref _disposed, 1, 0) == 1) + { + return; + } + + lock (_listenerSubscriptions) + { + foreach (var listenerSubscription in _listenerSubscriptions) + { + listenerSubscription?.Dispose(); + } + + _listenerSubscriptions.Clear(); + } + + _allSourcesSubscription?.Dispose(); + _allSourcesSubscription = null; + } + } +} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Base/ListenerHandler.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Base/ListenerHandler.cs new file mode 100644 index 0000000..7d7703f --- /dev/null +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Base/ListenerHandler.cs @@ -0,0 +1,39 @@ +using System.Diagnostics; + +namespace Byndyusoft.Messaging.RabbitMq.Diagnostics.Base +{ + /// + /// ListenerHandler base class. + /// + public abstract class ListenerHandler + { + /// + /// Initializes a new instance of the class. + /// + /// The name of the . + protected ListenerHandler(string sourceName) + { + SourceName = sourceName; + SupportsNullActivity = false; + } + + /// + /// Gets the name of the . + /// + public string SourceName { get; } + + /// + /// Gets a value indicating whether the supports NULL . + /// + public virtual bool SupportsNullActivity { get; } + + /// + /// Method called for an event which does not have 'Start', 'Stop' or 'Exception' as suffix. + /// + /// Custom name. + /// An object that represent the value being passed as a payload for the event. + public virtual void OnEventWritten(string name, object? payload) + { + } + } +} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Builders/EventItemBuilder.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Builders/EventItemBuilder.cs new file mode 100644 index 0000000..2dcd9ce --- /dev/null +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Builders/EventItemBuilder.cs @@ -0,0 +1,103 @@ +using Byndyusoft.Messaging.RabbitMq.Serialization; + +namespace Byndyusoft.Messaging.RabbitMq.Diagnostics.Builders +{ + public class EventItemBuilder + { + private const string ExchangeDescription = "Exchange"; + private const string RoutingKeyDescription = "RoutingKey"; + private const string QueueDescription = "Queue"; + private const string ContentDescription = "RoutingKey"; + private const string PropertiesDescription = "RoutingKey"; + + public static EventItem[]? BuildFromMessagePublishing(object? payload, RabbitMqDiagnosticsOptions options) + { + if (payload is not RabbitMqMessage message) + return null; + + var eventItems = new EventItem[] + { + new("amqp.message.exchange", message.Exchange ?? string.Empty, ExchangeDescription), + new("amqp.message.routing_key", message.RoutingKey, RoutingKeyDescription), + new("amqp.message.mandatory", message.Mandatory, "Mandatory"), + new("amqp.message.content", message.Content.ReadAsStringAsync().GetAwaiter().GetResult(), ContentDescription), + new("amqp.message.properties", JsonSerializer.Serialize(message.Properties, options), PropertiesDescription) + }; + + return eventItems; + } + + public static EventItem[]? BuildFromMessageReturned(object? payload, RabbitMqDiagnosticsOptions options) + { + if (payload is not ReturnedRabbitMqMessage message) + return null; + + var eventItems = new EventItem[] + { + new("amqp.message.exchange", message.Exchange ?? string.Empty, ExchangeDescription), + new("amqp.message.routing_key", message.RoutingKey, RoutingKeyDescription), + new("amqp.message.return_reason", message.ReturnReason, "ReturnReason"), + new("amqp.message.content", message.Content.ReadAsStringAsync().GetAwaiter().GetResult(), + ContentDescription), + new("amqp.message.properties", JsonSerializer.Serialize(message.Properties, options), + PropertiesDescription) + }; + + return eventItems; + } + + public static EventItem[]? BuildFromMessageGot(object? payload, RabbitMqDiagnosticsOptions options) + { + return BuildFromMessageConsuming(payload, options); + } + + public static EventItem[]? BuildFromMessageReplied(object? payload, RabbitMqDiagnosticsOptions options) + { + return BuildFromMessageConsuming(payload, options); + } + + public static EventItem[]? BuildFromMessageConsumed(object? payload, RabbitMqDiagnosticsOptions options) + { + if (payload is not ConsumeResult result) + return null; + + var eventItems = new EventItem[] + { + new("result", result.GetDescription(), "Result") + }; + + return eventItems; + } + + private static EventItem[]? BuildFromMessageConsuming(object? payload, RabbitMqDiagnosticsOptions options) + { + if (payload is null) + { + return new EventItem[] + { + new("amqp.message", null, "Message") + }; + } + + if (payload is not ReceivedRabbitMqMessage message) + return null; + + var eventItems = new EventItem[] + { + new("amqp.message.content", message.Content.ReadAsStringAsync().GetAwaiter().GetResult(), + ContentDescription), + new("amqp.message.exchange", message.Exchange, ExchangeDescription), + new("amqp.message.queue", message.Queue, QueueDescription), + new("amqp.message.routing_key", message.RoutingKey, RoutingKeyDescription), + new("amqp.message.delivery_tag", message.DeliveryTag, "DeliveryTag"), + new("amqp.message.redelivered", message.Redelivered, "Redelivered"), + new("amqp.message.consumer_tag", message.ConsumerTag, "ConsumerTag"), + new("amqp.message.retry_count", message.RetryCount, "RetryCount"), + new("amqp.message.properties", JsonSerializer.Serialize(message.Properties, options), + PropertiesDescription) + }; + + return eventItems; + } + } +} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Consts/EventNames.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Consts/EventNames.cs new file mode 100644 index 0000000..a60a405 --- /dev/null +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Consts/EventNames.cs @@ -0,0 +1,11 @@ +namespace Byndyusoft.Messaging.RabbitMq.Diagnostics.Consts +{ + public class EventNames + { + public static string MessagePublishing = "Byndyusoft.RabbitMq.Message.Publishing"; + public static string MessageReturned = "Byndyusoft.RabbitMq.Message.Returned"; + public static string MessageGot = "Byndyusoft.RabbitMq.Message.Got"; + public static string MessageReplied = "Byndyusoft.RabbitMq.Message.Got"; + public static string MessageConsumed = "Byndyusoft.RabbitMq.Message.Got"; + } +} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/EventItem.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/EventItem.cs new file mode 100644 index 0000000..2f677bb --- /dev/null +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/EventItem.cs @@ -0,0 +1,18 @@ +namespace Byndyusoft.Messaging.RabbitMq.Diagnostics +{ + public class EventItem + { + public string Name { get; } + + public object? Value { get; } + + public string Description { get; } + + public EventItem(string name, object? value, string description) + { + Name = name; + Value = value; + Description = description; + } + } +} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqDiagnosticListener.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqDiagnosticListener.cs deleted file mode 100644 index 3dd436c..0000000 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqDiagnosticListener.cs +++ /dev/null @@ -1,197 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Threading; -using Byndyusoft.Messaging.RabbitMq.Utils; - -namespace Byndyusoft.Messaging.RabbitMq.Diagnostics -{ - internal sealed class DiagnosticSourceSubscriber : IDisposable, IObserver - { - private readonly List _listenerSubscriptions; - private readonly Func _handlerFactory; - private readonly Func _diagnosticSourceFilter; - private readonly Func? _isEnabledFilter; - private long _disposed; - private IDisposable? _allSourcesSubscription; - - public DiagnosticSourceSubscriber( - ListenerHandler handler, - Func? isEnabledFilter) - : this(_ => handler, value => handler.SourceName == value.Name, isEnabledFilter) - { - } - - public DiagnosticSourceSubscriber( - Func handlerFactory, - Func diagnosticSourceFilter, - Func? isEnabledFilter) - { - Preconditions.CheckNotNull(handlerFactory, "Handler Factory is null"); - - _listenerSubscriptions = new List(); - _handlerFactory = handlerFactory; - _diagnosticSourceFilter = diagnosticSourceFilter; - _isEnabledFilter = isEnabledFilter; - } - - public void Subscribe() - { - _allSourcesSubscription ??= DiagnosticListener.AllListeners.Subscribe(this); - } - - public void OnNext(DiagnosticListener value) - { - if (Interlocked.Read(ref _disposed) == 0 && _diagnosticSourceFilter(value)) - { - var handler = _handlerFactory(value.Name); - var listener = new DiagnosticSourceListener(handler); - var subscription = _isEnabledFilter == null - ? value.Subscribe(listener) - : value.Subscribe(listener, _isEnabledFilter); - - lock (_listenerSubscriptions) - { - _listenerSubscriptions.Add(subscription); - } - } - } - - public void OnCompleted() - { - } - - public void OnError(Exception error) - { - } - - /// - public void Dispose() - { - if (Interlocked.CompareExchange(ref _disposed, 1, 0) == 1) - { - return; - } - - lock (_listenerSubscriptions) - { - foreach (var listenerSubscription in _listenerSubscriptions) - { - listenerSubscription?.Dispose(); - } - - _listenerSubscriptions.Clear(); - } - - _allSourcesSubscription?.Dispose(); - _allSourcesSubscription = null; - } - } - - internal sealed class DiagnosticSourceListener : IObserver> - { - private readonly ListenerHandler _handler; - - public DiagnosticSourceListener(ListenerHandler handler) - { - Preconditions.CheckNotNull(handler, "Handler is null"); - - _handler = handler; - } - - public void OnCompleted() - { - } - - public void OnError(Exception error) - { - } - - public void OnNext(KeyValuePair value) - { - if (_handler.SupportsNullActivity == false && Activity.Current == null) - { - return; - } - - try - { - _handler.OnEventWritten(value.Key, value.Value); - } - catch (Exception) - { - // ignored - } - } - } - - /// - /// ListenerHandler base class. - /// - public abstract class ListenerHandler - { - /// - /// Initializes a new instance of the class. - /// - /// The name of the . - protected ListenerHandler(string sourceName) - { - SourceName = sourceName; - SupportsNullActivity = false; - } - - /// - /// Gets the name of the . - /// - public string SourceName { get; } - - /// - /// Gets a value indicating whether the supports NULL . - /// - public virtual bool SupportsNullActivity { get; } - - /// - /// Method called for an event which does not have 'Start', 'Stop' or 'Exception' as suffix. - /// - /// Custom name. - /// An object that represent the value being passed as a payload for the event. - public virtual void OnEventWritten(string name, object? payload) - { - } - } - - public class RabbitMqSourceSubscriber : IDisposable - { - private readonly Func _isEnabled = (_, _, _) => true; - - private readonly DiagnosticSourceSubscriber _diagnosticSourceSubscriber; - - public RabbitMqSourceSubscriber(RabbitMqListener rabbitMqListener) - { - _diagnosticSourceSubscriber = new DiagnosticSourceSubscriber(rabbitMqListener, _isEnabled); - _diagnosticSourceSubscriber.Subscribe(); - } - - /// - public void Dispose() - { - this._diagnosticSourceSubscriber?.Dispose(); - } - } - - public class RabbitMqListener : ListenerHandler - { - private const string DiagnosticSourceName = "Byndyusoft.RabbitMq"; - - public RabbitMqListener() - : base(DiagnosticSourceName) - { - } - - public override bool SupportsNullActivity => true; - - public override void OnEventWritten(string name, object? payload) - { - } - } -} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqListener.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqListener.cs new file mode 100644 index 0000000..94bd0c3 --- /dev/null +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqListener.cs @@ -0,0 +1,88 @@ +using System.Collections.Generic; +using System.Text; +using Byndyusoft.Messaging.RabbitMq.Diagnostics.Base; +using Byndyusoft.Messaging.RabbitMq.Diagnostics.Builders; +using Byndyusoft.Messaging.RabbitMq.Diagnostics.Consts; +using Microsoft.Extensions.Logging; + +namespace Byndyusoft.Messaging.RabbitMq.Diagnostics +{ + public class RabbitMqListener : ListenerHandler + { + private readonly ILogger _logger; + private readonly RabbitMqClientCoreOptions _options; + private const string DiagnosticSourceName = "Byndyusoft.RabbitMq"; + + public RabbitMqListener( + ILogger logger, + RabbitMqClientCoreOptions options) + : base(DiagnosticSourceName) + { + _logger = logger; + _options = options; + } + + public override bool SupportsNullActivity => true; + + public override void OnEventWritten(string name, object? payload) + { + if (name.Equals(EventNames.MessagePublishing)) + OnMessagePublishing(payload); + else if (name.Equals(EventNames.MessageReturned)) + OnMessageReturned(payload); + else if (name.Equals(EventNames.MessageGot)) + OnMessageGot(payload); + else if (name.Equals(EventNames.MessageReplied)) + OnMessageReplied(payload); + else if (name.Equals(EventNames.MessageConsumed)) + OnMessageConsumed(payload); + } + + private void OnMessagePublishing(object? payload) + { + var eventItems = EventItemBuilder.BuildFromMessagePublishing(payload, _options.DiagnosticsOptions); + Log(eventItems, "Message publishing"); + } + + private void OnMessageReturned(object? payload) + { + var eventItems = EventItemBuilder.BuildFromMessageReturned(payload, _options.DiagnosticsOptions); + Log(eventItems, "Message returned"); + } + + private void OnMessageGot(object? payload) + { + var eventItems = EventItemBuilder.BuildFromMessageGot(payload, _options.DiagnosticsOptions); + Log(eventItems, "Message got"); + } + + private void OnMessageReplied(object? payload) + { + var eventItems = EventItemBuilder.BuildFromMessageReplied(payload, _options.DiagnosticsOptions); + Log(eventItems, "Message got"); + } + + private void OnMessageConsumed(object? payload) + { + var eventItems = EventItemBuilder.BuildFromMessageConsumed(payload, _options.DiagnosticsOptions); + Log(eventItems, "Message consumed"); + } + + private void Log(EventItem[]? eventItems, string logPrefix) + { + if (eventItems is null) + return; + + var messageBuilder = new StringBuilder($"{logPrefix}: "); + var parameters = new List(); + foreach (var formattedContextItem in eventItems) + { + var itemName = formattedContextItem.Name.Replace('.', '_'); + messageBuilder.Append($"{formattedContextItem.Description} = {{{itemName}}}; "); + parameters.Add(formattedContextItem.Value); + } + + _logger.LogInformation(messageBuilder.ToString(), parameters.ToArray()); + } + } +} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqSourceSubscriber.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqSourceSubscriber.cs new file mode 100644 index 0000000..42867e4 --- /dev/null +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqSourceSubscriber.cs @@ -0,0 +1,24 @@ +using System; +using Byndyusoft.Messaging.RabbitMq.Diagnostics.Base; + +namespace Byndyusoft.Messaging.RabbitMq.Diagnostics +{ + public class RabbitMqSourceSubscriber : IDisposable + { + private readonly Func _isEnabled = (_, _, _) => true; + + private readonly DiagnosticSourceSubscriber _diagnosticSourceSubscriber; + + public RabbitMqSourceSubscriber(RabbitMqListener rabbitMqListener) + { + _diagnosticSourceSubscriber = new DiagnosticSourceSubscriber(rabbitMqListener, _isEnabled); + _diagnosticSourceSubscriber.Subscribe(); + } + + /// + public void Dispose() + { + _diagnosticSourceSubscriber.Dispose(); + } + } +} \ No newline at end of file From 9c9035774380732f7c1d53ec8afb6072e332ef54 Mon Sep 17 00:00:00 2001 From: Rena88 Date: Mon, 11 Dec 2023 15:41:39 +0500 Subject: [PATCH 05/40] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B8=20=D1=80=D0=B5=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8E=20=D0=B4=D0=BB=D1=8F=20=D0=B8=D0=BD=D1=81=D1=82?= =?UTF-8?q?=D1=80=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...riber.cs => RabbitMqLogInstrumentation.cs} | 6 ++--- ...itMqListener.cs => RabbitMqLogListener.cs} | 8 +++---- ...MqClientTracerProviderBuilderExtensions.cs | 22 +++++++++++++++++++ 3 files changed, 29 insertions(+), 7 deletions(-) rename src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/{RabbitMqSourceSubscriber.cs => RabbitMqLogInstrumentation.cs} (75%) rename src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/{RabbitMqListener.cs => RabbitMqLogListener.cs} (93%) diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqSourceSubscriber.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogInstrumentation.cs similarity index 75% rename from src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqSourceSubscriber.cs rename to src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogInstrumentation.cs index 42867e4..941d756 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqSourceSubscriber.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogInstrumentation.cs @@ -3,15 +3,15 @@ namespace Byndyusoft.Messaging.RabbitMq.Diagnostics { - public class RabbitMqSourceSubscriber : IDisposable + public class RabbitMqLogInstrumentation : IDisposable { private readonly Func _isEnabled = (_, _, _) => true; private readonly DiagnosticSourceSubscriber _diagnosticSourceSubscriber; - public RabbitMqSourceSubscriber(RabbitMqListener rabbitMqListener) + public RabbitMqLogInstrumentation(RabbitMqLogListener rabbitMqLogListener) { - _diagnosticSourceSubscriber = new DiagnosticSourceSubscriber(rabbitMqListener, _isEnabled); + _diagnosticSourceSubscriber = new DiagnosticSourceSubscriber(rabbitMqLogListener, _isEnabled); _diagnosticSourceSubscriber.Subscribe(); } diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqListener.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogListener.cs similarity index 93% rename from src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqListener.cs rename to src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogListener.cs index 94bd0c3..e9b0a4c 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqListener.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogListener.cs @@ -7,14 +7,14 @@ namespace Byndyusoft.Messaging.RabbitMq.Diagnostics { - public class RabbitMqListener : ListenerHandler + public class RabbitMqLogListener : ListenerHandler { - private readonly ILogger _logger; + private readonly ILogger _logger; private readonly RabbitMqClientCoreOptions _options; private const string DiagnosticSourceName = "Byndyusoft.RabbitMq"; - public RabbitMqListener( - ILogger logger, + public RabbitMqLogListener( + ILogger logger, RabbitMqClientCoreOptions options) : base(DiagnosticSourceName) { diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs index ed28770..ef946d8 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs @@ -1,10 +1,15 @@ // ReSharper disable CheckNamespace using System; +using System.Net; +using System.Xml.Linq; +using Byndyusoft.Messaging.RabbitMq; using Byndyusoft.Messaging.RabbitMq.Diagnostics; using Byndyusoft.Messaging.RabbitMq.Settings; using Byndyusoft.Messaging.RabbitMq.Utils; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; namespace OpenTelemetry.Trace { @@ -29,5 +34,22 @@ public static TracerProviderBuilder AddRabbitMqClientInstrumentation( return builder.AddSource(RabbitMqClientActivitySource.Name); } + + /// + /// Subscribes to the RabbitMqClient activity source to enable log tracing. + /// + public static TracerProviderBuilder AddRabbitMqClientLogInstrumentation( + this TracerProviderBuilder builder) + { + Preconditions.CheckNotNull(builder, nameof(builder)); + + return builder.AddInstrumentation(sp => + { + var logger = sp.GetRequiredService>(); + var options = sp.GetRequiredService>(); + var listener = new RabbitMqLogListener(logger, options.Value); + return new RabbitMqLogInstrumentation(listener); + }); + } } } \ No newline at end of file From 64098a1e322ea3516cc8078c11306f9569bb3f2c Mon Sep 17 00:00:00 2001 From: Rena88 Date: Mon, 11 Dec 2023 15:45:05 +0500 Subject: [PATCH 06/40] =?UTF-8?q?=D0=98=D0=B7=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D1=81=D1=8F=20=D0=BE=D1=82=20=D0=B2=D0=BE=D1=80=D0=BD?= =?UTF-8?q?=D0=B8=D0=BD=D0=B3=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/HostedServices/QueueInstallerHostedService.cs | 2 ++ src/Byndyusoft.Messaging.RabbitMq.Abstractions/ConsumeResult.cs | 1 - .../Topology/QueueOptionsExtensions.cs | 1 + .../RabbitMqClientTracerProviderBuilderExtensions.cs | 2 -- 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/example/HostedServices/QueueInstallerHostedService.cs b/example/HostedServices/QueueInstallerHostedService.cs index a3a31fe..5c395b0 100644 --- a/example/HostedServices/QueueInstallerHostedService.cs +++ b/example/HostedServices/QueueInstallerHostedService.cs @@ -27,6 +27,8 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) { Console.WriteLine($"Retry count {message.RetryCount}"); + // TODO Expression is alway true. Возможно, проверка не нужна + // ReSharper disable once ConditionIsAlwaysTrueOrFalse if (message.RetryCount >= 0) return Task.FromResult(ConsumeResult.Retry); diff --git a/src/Byndyusoft.Messaging.RabbitMq.Abstractions/ConsumeResult.cs b/src/Byndyusoft.Messaging.RabbitMq.Abstractions/ConsumeResult.cs index d06a856..cf953d1 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Abstractions/ConsumeResult.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Abstractions/ConsumeResult.cs @@ -1,5 +1,4 @@ using System; -using System.Net.Http; namespace Byndyusoft.Messaging.RabbitMq { diff --git a/src/Byndyusoft.Messaging.RabbitMq.Abstractions/Topology/QueueOptionsExtensions.cs b/src/Byndyusoft.Messaging.RabbitMq.Abstractions/Topology/QueueOptionsExtensions.cs index 7181645..4d0840d 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Abstractions/Topology/QueueOptionsExtensions.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Abstractions/Topology/QueueOptionsExtensions.cs @@ -2,6 +2,7 @@ using Byndyusoft.Messaging.RabbitMq.Topology; using Byndyusoft.Messaging.RabbitMq.Utils; +// ReSharper disable once CheckNamespace namespace Byndyusoft.Messaging.RabbitMq { /// diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs index ef946d8..5d803f8 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs @@ -1,8 +1,6 @@ // ReSharper disable CheckNamespace using System; -using System.Net; -using System.Xml.Linq; using Byndyusoft.Messaging.RabbitMq; using Byndyusoft.Messaging.RabbitMq.Diagnostics; using Byndyusoft.Messaging.RabbitMq.Settings; From 7b32ba849fba7179212ddca227ef51f38b4aeeae Mon Sep 17 00:00:00 2001 From: Rena88 Date: Mon, 11 Dec 2023 16:14:25 +0500 Subject: [PATCH 07/40] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D1=83=20?= =?UTF-8?q?=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Diagnostics/Consts/DiagnosticNames.cs | 7 +++++++ .../RabbitMqClientActivitySource.Events.cs | 17 +++++++++++++++++ .../Diagnostics/RabbitMqLogListener.cs | 3 +-- 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Consts/DiagnosticNames.cs diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Consts/DiagnosticNames.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Consts/DiagnosticNames.cs new file mode 100644 index 0000000..03f6599 --- /dev/null +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Consts/DiagnosticNames.cs @@ -0,0 +1,7 @@ +namespace Byndyusoft.Messaging.RabbitMq.Diagnostics.Consts +{ + public class DiagnosticNames + { + public static string RabbitMq = "Byndyusoft.RabbitMq"; + } +} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs index ceb5611..f46890f 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs @@ -1,4 +1,5 @@ using System.Diagnostics; +using Byndyusoft.Messaging.RabbitMq.Diagnostics.Consts; using Byndyusoft.Messaging.RabbitMq.Serialization; namespace Byndyusoft.Messaging.RabbitMq.Diagnostics @@ -8,6 +9,7 @@ public partial class RabbitMqClientActivitySource public class RabbitMqClientActivitySourceEvents { private readonly RabbitMqClientActivitySource _activitySource; + private static readonly DiagnosticListener EventLogger = new(DiagnosticNames.RabbitMq); public RabbitMqClientActivitySourceEvents(RabbitMqClientActivitySource activitySource) { @@ -16,6 +18,9 @@ public RabbitMqClientActivitySourceEvents(RabbitMqClientActivitySource activityS public void MessagePublishing(Activity? activity, RabbitMqMessage message) { + if (EventLogger.IsEnabled(EventNames.MessagePublishing)) + EventLogger.Write(EventNames.MessagePublishing, message); + if (activity is null) return; @@ -26,6 +31,9 @@ public void MessagePublishing(Activity? activity, RabbitMqMessage message) public void MessageReturned(Activity? activity, ReturnedRabbitMqMessage message) { + if (EventLogger.IsEnabled(EventNames.MessageReturned)) + EventLogger.Write(EventNames.MessageReturned, message); + if (activity is null) return; @@ -36,6 +44,9 @@ public void MessageReturned(Activity? activity, ReturnedRabbitMqMessage message) public void MessageGot(Activity? activity, ReceivedRabbitMqMessage? message) { + if (EventLogger.IsEnabled(EventNames.MessageGot)) + EventLogger.Write(EventNames.MessageGot, message); + if (activity is null) return; @@ -48,6 +59,9 @@ public void MessageGot(Activity? activity, ReceivedRabbitMqMessage? message) public void MessageReplied(Activity? activity, ReceivedRabbitMqMessage message) { + if (EventLogger.IsEnabled(EventNames.MessageReplied)) + EventLogger.Write(EventNames.MessageReplied, message); + if (activity is null) return; @@ -58,6 +72,9 @@ public void MessageReplied(Activity? activity, ReceivedRabbitMqMessage message) public void MessageConsumed(Activity? activity, ReceivedRabbitMqMessage _, ConsumeResult result) { + if (EventLogger.IsEnabled(EventNames.MessageConsumed)) + EventLogger.Write(EventNames.MessageConsumed, result); + if (activity is null) return; diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogListener.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogListener.cs index e9b0a4c..09a5efb 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogListener.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogListener.cs @@ -11,12 +11,11 @@ public class RabbitMqLogListener : ListenerHandler { private readonly ILogger _logger; private readonly RabbitMqClientCoreOptions _options; - private const string DiagnosticSourceName = "Byndyusoft.RabbitMq"; public RabbitMqLogListener( ILogger logger, RabbitMqClientCoreOptions options) - : base(DiagnosticSourceName) + : base(DiagnosticNames.RabbitMq) { _logger = logger; _options = options; From 95f6cb436b716dabf04122c914d1320ecbdf9e75 Mon Sep 17 00:00:00 2001 From: Rena88 Date: Tue, 12 Dec 2023 12:57:42 +0500 Subject: [PATCH 08/40] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D1=83?= =?UTF-8?q?=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D0=B9=20=D0=B2=20=D0=BE?= =?UTF-8?q?=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=83=D1=8E=20=D0=B8=D0=BD?= =?UTF-8?q?=D1=81=D1=82=D1=80=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Byndyusoft.Messaging.RabbitMq.Core.csproj | 2 +- .../RabbitMqActivityInstrumentation.cs | 24 +++++ .../Diagnostics/RabbitMqActivityListener.cs | 98 +++++++++++++++++++ .../RabbitMqClientActivitySource.Events.cs | 97 ------------------ .../RabbitMqClientActivitySource.cs | 9 +- .../Diagnostics/RabbitMqLogInstrumentation.cs | 4 +- .../Diagnostics/RabbitMqLogListener.cs | 10 +- .../RabbitMqClientCore.cs | 2 +- ...MqClientTracerProviderBuilderExtensions.cs | 9 +- ...bbitMqClientServiceCollectionExtensions.cs | 7 +- 10 files changed, 142 insertions(+), 120 deletions(-) create mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqActivityInstrumentation.cs create mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqActivityListener.cs diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj b/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj index 7da2f72..f5794f0 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj @@ -7,7 +7,7 @@ - + diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqActivityInstrumentation.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqActivityInstrumentation.cs new file mode 100644 index 0000000..560df3c --- /dev/null +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqActivityInstrumentation.cs @@ -0,0 +1,24 @@ +using System; +using Byndyusoft.Messaging.RabbitMq.Diagnostics.Base; + +namespace Byndyusoft.Messaging.RabbitMq.Diagnostics +{ + public class RabbitMqActivityInstrumentation : IDisposable + { + private readonly Func _isEnabled = (_, _, _) => true; + + private readonly DiagnosticSourceSubscriber _diagnosticSourceSubscriber; + + public RabbitMqActivityInstrumentation(RabbitMqActivityListener listener) + { + _diagnosticSourceSubscriber = new DiagnosticSourceSubscriber(listener, _isEnabled); + _diagnosticSourceSubscriber.Subscribe(); + } + + /// + public void Dispose() + { + _diagnosticSourceSubscriber.Dispose(); + } + } +} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqActivityListener.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqActivityListener.cs new file mode 100644 index 0000000..20a7fdb --- /dev/null +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqActivityListener.cs @@ -0,0 +1,98 @@ +using System.Diagnostics; +using Byndyusoft.Messaging.RabbitMq.Diagnostics.Base; +using Byndyusoft.Messaging.RabbitMq.Diagnostics.Builders; +using Byndyusoft.Messaging.RabbitMq.Diagnostics.Consts; + +namespace Byndyusoft.Messaging.RabbitMq.Diagnostics +{ + public class RabbitMqActivityListener : ListenerHandler + { + private readonly RabbitMqClientCoreOptions _options; + + public RabbitMqActivityListener( + RabbitMqClientCoreOptions options) + : base(DiagnosticNames.RabbitMq) + { + _options = options; + } + + public override bool SupportsNullActivity => true; + + public override void OnEventWritten(string name, object? payload) + { + if (name.Equals(EventNames.MessagePublishing)) + OnMessagePublishing(payload); + else if (name.Equals(EventNames.MessageReturned)) + OnMessageReturned(payload); + else if (name.Equals(EventNames.MessageGot)) + OnMessageGot(payload); + else if (name.Equals(EventNames.MessageReplied)) + OnMessageReplied(payload); + else if (name.Equals(EventNames.MessageConsumed)) + OnMessageConsumed(payload); + } + + private void OnMessagePublishing(object? payload) + { + var activity = Activity.Current; + if (activity is null) + return; + + var eventItems = EventItemBuilder.BuildFromMessagePublishing(payload, _options.DiagnosticsOptions); + LogEvent(activity, eventItems, "message.publishing"); + } + + private void OnMessageReturned(object? payload) + { + var activity = Activity.Current; + if (activity is null) + return; + + var eventItems = EventItemBuilder.BuildFromMessageReturned(payload, _options.DiagnosticsOptions); + LogEvent(activity, eventItems, "message.returned"); + } + + private void OnMessageGot(object? payload) + { + var activity = Activity.Current; + if (activity is null) + return; + + var eventItems = EventItemBuilder.BuildFromMessageGot(payload, _options.DiagnosticsOptions); + LogEvent(activity, eventItems, "message.got"); + } + + private void OnMessageReplied(object? payload) + { + var activity = Activity.Current; + if (activity is null) + return; + + var eventItems = EventItemBuilder.BuildFromMessageReplied(payload, _options.DiagnosticsOptions); + LogEvent(activity, eventItems, "message.replied"); + } + + private void OnMessageConsumed(object? payload) + { + var activity = Activity.Current; + if (activity is null) + return; + + var eventItems = EventItemBuilder.BuildFromMessageConsumed(payload, _options.DiagnosticsOptions); + LogEvent(activity, eventItems, "message.consumed"); + } + + private void LogEvent(Activity activity, EventItem[]? eventItems, string eventName) + { + if (eventItems is null) + return; + + var tags = new ActivityTagsCollection(); + foreach (var eventItem in eventItems) + tags.Add(eventItem.Name, eventItem.Value); + + var activityEvent = new ActivityEvent(eventName, tags: tags); + activity.AddEvent(activityEvent); + } + } +} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs index f46890f..fa69a03 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs @@ -1,6 +1,5 @@ using System.Diagnostics; using Byndyusoft.Messaging.RabbitMq.Diagnostics.Consts; -using Byndyusoft.Messaging.RabbitMq.Serialization; namespace Byndyusoft.Messaging.RabbitMq.Diagnostics { @@ -8,132 +7,36 @@ public partial class RabbitMqClientActivitySource { public class RabbitMqClientActivitySourceEvents { - private readonly RabbitMqClientActivitySource _activitySource; private static readonly DiagnosticListener EventLogger = new(DiagnosticNames.RabbitMq); - public RabbitMqClientActivitySourceEvents(RabbitMqClientActivitySource activitySource) - { - _activitySource = activitySource; - } - public void MessagePublishing(Activity? activity, RabbitMqMessage message) { if (EventLogger.IsEnabled(EventNames.MessagePublishing)) EventLogger.Write(EventNames.MessagePublishing, message); - - if (activity is null) - return; - - var tags = GetPublishedMessageEventTags(message); - var activityEvent = new ActivityEvent("message.publishing", tags: tags); - activity.AddEvent(activityEvent); } public void MessageReturned(Activity? activity, ReturnedRabbitMqMessage message) { if (EventLogger.IsEnabled(EventNames.MessageReturned)) EventLogger.Write(EventNames.MessageReturned, message); - - if (activity is null) - return; - - var tags = GetReturnedMessageEventTags(message); - var activityEvent = new ActivityEvent("message.returned", tags: tags); - activity.AddEvent(activityEvent); } public void MessageGot(Activity? activity, ReceivedRabbitMqMessage? message) { if (EventLogger.IsEnabled(EventNames.MessageGot)) EventLogger.Write(EventNames.MessageGot, message); - - if (activity is null) - return; - - ActivityContextPropagation.ExtractContext(activity, message?.Headers); - - var tags = GetConsumedMessageEventTags(message); - var activityEvent = new ActivityEvent("message.got", tags: tags); - activity.AddEvent(activityEvent); } public void MessageReplied(Activity? activity, ReceivedRabbitMqMessage message) { if (EventLogger.IsEnabled(EventNames.MessageReplied)) EventLogger.Write(EventNames.MessageReplied, message); - - if (activity is null) - return; - - var tags = GetConsumedMessageEventTags(message); - var activityEvent = new ActivityEvent("message.replied", tags: tags); - activity.AddEvent(activityEvent); } public void MessageConsumed(Activity? activity, ReceivedRabbitMqMessage _, ConsumeResult result) { if (EventLogger.IsEnabled(EventNames.MessageConsumed)) EventLogger.Write(EventNames.MessageConsumed, result); - - if (activity is null) - return; - - var tags = new ActivityTagsCollection {{"result", result.GetDescription()}}; - var activityEvent = new ActivityEvent("message.consumed", tags: tags); - activity.AddEvent(activityEvent); - } - - private ActivityTagsCollection GetReturnedMessageEventTags(ReturnedRabbitMqMessage message) - { - var tags = new ActivityTagsCollection - { - { "amqp.message.exchange", message.Exchange ?? string.Empty }, - { "amqp.message.routing_key", message.RoutingKey }, - { "amqp.message.return_reason", message.ReturnReason }, - { "amqp.message.content", message.Content.ReadAsStringAsync().GetAwaiter().GetResult() }, - { "amqp.message.properties", JsonSerializer.Serialize(message.Properties, _activitySource._options) } - }; - - return tags; - } - - private ActivityTagsCollection GetPublishedMessageEventTags(RabbitMqMessage message) - { - var tags = new ActivityTagsCollection - { - { "amqp.message.exchange", message.Exchange ?? string.Empty }, - { "amqp.message.routing_key", message.RoutingKey }, - { "amqp.message.mandatory", message.Mandatory }, - { "amqp.message.content", message.Content.ReadAsStringAsync().GetAwaiter().GetResult() }, - { "amqp.message.properties", JsonSerializer.Serialize(message.Properties, _activitySource._options) } - }; - - return tags; - } - - private ActivityTagsCollection GetConsumedMessageEventTags(ReceivedRabbitMqMessage? message) - { - var tags = new ActivityTagsCollection(); - - if (message is null) - { - tags.Add("amqp.message", "null"); - } - else - { - tags.Add("amqp.message.content", message.Content.ReadAsStringAsync().GetAwaiter().GetResult()); - tags.Add("amqp.message.exchange", message.Exchange); - tags.Add("amqp.message.queue", message.Queue); - tags.Add("amqp.message.routing_key", message.RoutingKey); - tags.Add("amqp.message.delivery_tag", message.DeliveryTag); - tags.Add("amqp.message.redelivered", message.Redelivered); - tags.Add("amqp.message.consumer_tag", message.ConsumerTag); - tags.Add("amqp.message.retry_count", message.RetryCount); - tags.Add("amqp.message.properties", - JsonSerializer.Serialize(message.Properties, _activitySource._options)); - } - - return tags; } } } diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs index 331307d..96e7503 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs @@ -13,18 +13,13 @@ public partial class RabbitMqClientActivitySource private static readonly string? Version = typeof(RabbitMqClientActivitySource) .GetCustomAttribute()?.Version; - private readonly RabbitMqDiagnosticsOptions _options; - private readonly ActivitySource _source; - public RabbitMqClientActivitySource(RabbitMqDiagnosticsOptions options) + public RabbitMqClientActivitySource() { - Preconditions.CheckNotNull(options, nameof(options)); - _source = new ActivitySource(Name, Version); - _options = options; - Events = new RabbitMqClientActivitySourceEvents(this); + Events = new RabbitMqClientActivitySourceEvents(); Activities = new RabbitMqClientActivitySourceActivities(this); } diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogInstrumentation.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogInstrumentation.cs index 941d756..d7bf870 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogInstrumentation.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogInstrumentation.cs @@ -9,9 +9,9 @@ public class RabbitMqLogInstrumentation : IDisposable private readonly DiagnosticSourceSubscriber _diagnosticSourceSubscriber; - public RabbitMqLogInstrumentation(RabbitMqLogListener rabbitMqLogListener) + public RabbitMqLogInstrumentation(RabbitMqLogListener listener) { - _diagnosticSourceSubscriber = new DiagnosticSourceSubscriber(rabbitMqLogListener, _isEnabled); + _diagnosticSourceSubscriber = new DiagnosticSourceSubscriber(listener, _isEnabled); _diagnosticSourceSubscriber.Subscribe(); } diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogListener.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogListener.cs index 09a5efb..acf1df4 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogListener.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogListener.cs @@ -58,7 +58,7 @@ private void OnMessageGot(object? payload) private void OnMessageReplied(object? payload) { var eventItems = EventItemBuilder.BuildFromMessageReplied(payload, _options.DiagnosticsOptions); - Log(eventItems, "Message got"); + Log(eventItems, "Message replied"); } private void OnMessageConsumed(object? payload) @@ -74,11 +74,11 @@ private void Log(EventItem[]? eventItems, string logPrefix) var messageBuilder = new StringBuilder($"{logPrefix}: "); var parameters = new List(); - foreach (var formattedContextItem in eventItems) + foreach (var eventItem in eventItems) { - var itemName = formattedContextItem.Name.Replace('.', '_'); - messageBuilder.Append($"{formattedContextItem.Description} = {{{itemName}}}; "); - parameters.Add(formattedContextItem.Value); + var itemName = eventItem.Name.Replace('.', '_'); + messageBuilder.Append($"{eventItem.Description} = {{{itemName}}}; "); + parameters.Add(eventItem.Value); } _logger.LogInformation(messageBuilder.ToString(), parameters.ToArray()); diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/RabbitMqClientCore.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/RabbitMqClientCore.cs index 4ec7ee8..8cf7a33 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/RabbitMqClientCore.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/RabbitMqClientCore.cs @@ -31,7 +31,7 @@ protected RabbitMqClientCore(IRabbitMqClientHandler handler, RabbitMqClientCoreO _options = options; _handler = handler; _handler.MessageReturned += OnMessageReturned; - _activitySource = new RabbitMqClientActivitySource(options.DiagnosticsOptions); + _activitySource = new RabbitMqClientActivitySource(); _disposeHandler = disposeHandler; _rpcClient = new RabbitMqRpcClient(_handler, options); } diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs index 5d803f8..a973243 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs @@ -30,7 +30,14 @@ public static TracerProviderBuilder AddRabbitMqClientInstrumentation( builder.ConfigureServices(services => services.Configure(configureTracingOptions)); } - return builder.AddSource(RabbitMqClientActivitySource.Name); + return builder + .AddSource(RabbitMqClientActivitySource.Name) + .AddInstrumentation(sp => + { + var options = sp.GetRequiredService>(); + var listener = new RabbitMqActivityListener(options.Value); + return new RabbitMqActivityInstrumentation(listener); + }); } /// diff --git a/src/Byndyusoft.Messaging.RabbitMq/DependencyInjection/InMemoryRabbitMqClientServiceCollectionExtensions.cs b/src/Byndyusoft.Messaging.RabbitMq/DependencyInjection/InMemoryRabbitMqClientServiceCollectionExtensions.cs index 21646ba..cca34ad 100644 --- a/src/Byndyusoft.Messaging.RabbitMq/DependencyInjection/InMemoryRabbitMqClientServiceCollectionExtensions.cs +++ b/src/Byndyusoft.Messaging.RabbitMq/DependencyInjection/InMemoryRabbitMqClientServiceCollectionExtensions.cs @@ -4,7 +4,6 @@ using Byndyusoft.Messaging.RabbitMq.InMemory; using Byndyusoft.Messaging.RabbitMq.Utils; using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Options; // ReSharper disable once CheckNamespace namespace Microsoft.Extensions.DependencyInjection @@ -23,11 +22,7 @@ public static IServiceCollection AddInMemoryRabbitMqClient(this IServiceCollecti { services.Configure(setupOptions); - services.AddSingleton(sp => - { - var clientOptions = sp.GetRequiredService>(); - return new RabbitMqClientActivitySource(clientOptions.Value.DiagnosticsOptions); - }); + services.AddSingleton(_ => new RabbitMqClientActivitySource()); services.TryAddSingleton(); services.TryAddSingleton(); From a4e970f189ec78f76d83850eb6cf894663b08bc1 Mon Sep 17 00:00:00 2001 From: Rena88 Date: Tue, 12 Dec 2023 13:00:10 +0500 Subject: [PATCH 09/40] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20activity=20=D0=B2=D0=BE=20=D0=B2=D1=81?= =?UTF-8?q?=D0=B5=D1=85=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D1=8F=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RabbitMqClientActivitySource.Events.cs | 10 +++++----- .../Diagnostics/RabbitMqClientActivitySource.cs | 6 ++---- .../RabbitMqClientCore.cs | 14 +++++++------- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs index fa69a03..4c5869f 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs @@ -9,31 +9,31 @@ public class RabbitMqClientActivitySourceEvents { private static readonly DiagnosticListener EventLogger = new(DiagnosticNames.RabbitMq); - public void MessagePublishing(Activity? activity, RabbitMqMessage message) + public void MessagePublishing(RabbitMqMessage message) { if (EventLogger.IsEnabled(EventNames.MessagePublishing)) EventLogger.Write(EventNames.MessagePublishing, message); } - public void MessageReturned(Activity? activity, ReturnedRabbitMqMessage message) + public void MessageReturned(ReturnedRabbitMqMessage message) { if (EventLogger.IsEnabled(EventNames.MessageReturned)) EventLogger.Write(EventNames.MessageReturned, message); } - public void MessageGot(Activity? activity, ReceivedRabbitMqMessage? message) + public void MessageGot(ReceivedRabbitMqMessage? message) { if (EventLogger.IsEnabled(EventNames.MessageGot)) EventLogger.Write(EventNames.MessageGot, message); } - public void MessageReplied(Activity? activity, ReceivedRabbitMqMessage message) + public void MessageReplied(ReceivedRabbitMqMessage message) { if (EventLogger.IsEnabled(EventNames.MessageReplied)) EventLogger.Write(EventNames.MessageReplied, message); } - public void MessageConsumed(Activity? activity, ReceivedRabbitMqMessage _, ConsumeResult result) + public void MessageConsumed(ConsumeResult result) { if (EventLogger.IsEnabled(EventNames.MessageConsumed)) EventLogger.Write(EventNames.MessageConsumed, result); diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs index 96e7503..2451d47 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs @@ -50,8 +50,7 @@ private static void StopActivity(Activity? activity) activity.Dispose(); } - // TODO Убрать escape - private static void SetException(Activity? activity, Exception exception, bool escaped = true) + private static void SetException(Activity? activity, Exception exception) { Preconditions.CheckNotNull(exception, nameof(exception)); @@ -62,8 +61,7 @@ private static void SetException(Activity? activity, Exception exception, bool e { {"exception.type", exception.GetType().FullName}, {"exception.message", exception.Message}, - {"exception.stacktrace", exception.ToString()}, - {"exception.escaped", escaped} + {"exception.stacktrace", exception.ToString()} }; var activityEvent = new ActivityEvent("exception", tags: tags); activity.AddEvent(activityEvent); diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/RabbitMqClientCore.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/RabbitMqClientCore.cs index 8cf7a33..54c5d11 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/RabbitMqClientCore.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/RabbitMqClientCore.cs @@ -58,7 +58,7 @@ public RabbitMqClientCoreOptions Options { var message = await _handler.GetMessageAsync(queueName, cancellationToken) .ConfigureAwait(false); - _activitySource.Events.MessageGot(activity, message); + _activitySource.Events.MessageGot(message); return message; }); } @@ -92,7 +92,7 @@ public async Task PublishMessageAsync(RabbitMqMessage message, await _activitySource.ExecuteAsync(activity, async () => { - _activitySource.Events.MessagePublishing(activity, message); + _activitySource.Events.MessagePublishing(message); await _handler.PublishMessageAsync(message, cancellationToken).ConfigureAwait(false); }); } @@ -220,10 +220,10 @@ public async Task MakeRpc(RabbitMqMessage message, return await _activitySource.ExecuteAsync(activity, async () => { - _activitySource.Events.MessagePublishing(activity, message); + _activitySource.Events.MessagePublishing(message); var response = await _rpcClient.MakeRpc(message, cancellationToken) .ConfigureAwait(false); - _activitySource.Events.MessageReplied(activity, response); + _activitySource.Events.MessageReplied(response); return response; }).ConfigureAwait(false); } @@ -251,11 +251,11 @@ async Task OnMessageHandler(ReceivedRabbitMqMessage messag var activity = _activitySource.Activities.StartConsume(_handler.Endpoint, message); return await _activitySource.ExecuteAsync(activity, async () => { - _activitySource.Events.MessageGot(activity, message); + _activitySource.Events.MessageGot(message); try { var consumeResult = await consumer.OnMessage(message, ct).ConfigureAwait(false); - _activitySource.Events.MessageConsumed(activity, message, consumeResult); + _activitySource.Events.MessageConsumed(consumeResult); return await ProcessConsumeResultAsync(message, consumeResult, ct); } catch (Exception exception) @@ -334,7 +334,7 @@ private async ValueTask OnMessageReturned(ReturnedRabbitMqMessage message, Cance await _activitySource.ExecuteAsync(activity, async () => { - _activitySource.Events.MessageReturned(activity, message); + _activitySource.Events.MessageReturned(message); var task = MessageReturned?.Invoke(message, cancellationToken); if (task is not null) From fb88fb01f38368cb0cbdca89d93600d65756bd0f Mon Sep 17 00:00:00 2001 From: Rena88 Date: Tue, 12 Dec 2023 13:49:29 +0500 Subject: [PATCH 10/40] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B0=D0=BB=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D0=BA=D1=83=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=B0-=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Example.ConsoleApp.csproj | 6 +++-- example/Program.cs | 23 ++++++++----------- ...MqClientTracerProviderBuilderExtensions.cs | 2 +- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/example/Example.ConsoleApp.csproj b/example/Example.ConsoleApp.csproj index d35afc9..ffbd476 100644 --- a/example/Example.ConsoleApp.csproj +++ b/example/Example.ConsoleApp.csproj @@ -9,9 +9,11 @@ - + - + + + diff --git a/example/Program.cs b/example/Program.cs index 96ada61..135fe00 100644 --- a/example/Program.cs +++ b/example/Program.cs @@ -17,19 +17,6 @@ public static class Program public static async Task Main(string[] args) { - using var tracerProvider = Sdk.CreateTracerProviderBuilder() - .SetResourceBuilder(ResourceBuilder.CreateDefault() - .AddService("Byndyusoft.Net.RabbitMq")) - .SetSampler(new AlwaysOnSampler()) - .AddSource(ActivitySource.Name) - .AddJaegerExporter(jaeger => - { - jaeger.AgentHost = "localhost"; - jaeger.AgentPort = 6831; - }) - .AddRabbitMqClientInstrumentation() - .Build(); - await CreateHostBuilder(args).RunConsoleAsync(); } @@ -44,6 +31,16 @@ private static IHostBuilder CreateHostBuilder(string[] args) .ConfigureAppConfiguration(configuration => { configuration.AddJsonFile("appsettings.json", true); }) .ConfigureServices((_, services) => { + services.AddOpenTelemetry() + .WithTracing(builder => builder + .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("Byndyusoft.Net.RabbitMq")) + .AddJaegerExporter(jaeger => + { + jaeger.AgentHost = "localhost"; + jaeger.AgentPort = 6831; + }) + .AddRabbitMqClientInstrumentation() + .AddRabbitMqClientLogInstrumentation()); services.AddRabbitMqRpc(); services.AddSingleton(); services.AddRpcService(); diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs index a973243..e7ab2e7 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs @@ -50,8 +50,8 @@ public static TracerProviderBuilder AddRabbitMqClientLogInstrumentation( return builder.AddInstrumentation(sp => { - var logger = sp.GetRequiredService>(); var options = sp.GetRequiredService>(); + var logger = sp.GetRequiredService>(); var listener = new RabbitMqLogListener(logger, options.Value); return new RabbitMqLogInstrumentation(listener); }); From ab07777bb211082435af04e17065994fa56b8ccb Mon Sep 17 00:00:00 2001 From: Rena88 Date: Tue, 12 Dec 2023 15:15:39 +0500 Subject: [PATCH 11/40] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D1=83=20=D0=B2=20=D0=BE?= =?UTF-8?q?=D0=B4=D0=B8=D0=BD=20=D1=84=D0=B0=D0=B9=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Program.cs | 8 +- .../RabbitMqClientCoreOptions.cs | 7 - .../RabbitMqActivityInstrumentation.cs | 24 ---- .../Diagnostics/RabbitMqActivityListener.cs | 98 -------------- ...entation.cs => RabbitMqInstrumentation.cs} | 4 +- .../Diagnostics/RabbitMqListener.cs | 120 ++++++++++++++++++ .../Diagnostics/RabbitMqLogListener.cs | 87 ------------- .../Settings/RabbitMqTracingOptions.cs | 14 +- ...MqClientTracerProviderBuilderExtensions.cs | 25 +--- 9 files changed, 144 insertions(+), 243 deletions(-) delete mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqActivityInstrumentation.cs delete mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqActivityListener.cs rename src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/{RabbitMqLogInstrumentation.cs => RabbitMqInstrumentation.cs} (82%) create mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqListener.cs delete mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogListener.cs diff --git a/example/Program.cs b/example/Program.cs index 135fe00..3ad4960 100644 --- a/example/Program.cs +++ b/example/Program.cs @@ -5,7 +5,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; -using OpenTelemetry; using OpenTelemetry.Resources; using OpenTelemetry.Trace; @@ -39,8 +38,11 @@ private static IHostBuilder CreateHostBuilder(string[] args) jaeger.AgentHost = "localhost"; jaeger.AgentPort = 6831; }) - .AddRabbitMqClientInstrumentation() - .AddRabbitMqClientLogInstrumentation()); + .AddRabbitMqClientInstrumentation(o => + { + o.LogEventsInTrace = true; + o.LogEventsInLogs = true; + })); services.AddRabbitMqRpc(); services.AddSingleton(); services.AddRpcService(); diff --git a/src/Byndyusoft.Messaging.RabbitMq.Abstractions/RabbitMqClientCoreOptions.cs b/src/Byndyusoft.Messaging.RabbitMq.Abstractions/RabbitMqClientCoreOptions.cs index 78b5b64..f8b2506 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Abstractions/RabbitMqClientCoreOptions.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Abstractions/RabbitMqClientCoreOptions.cs @@ -8,7 +8,6 @@ namespace Byndyusoft.Messaging.RabbitMq { public class RabbitMqClientCoreOptions { - private RabbitMqDiagnosticsOptions _diagnosticsOptions = new(); private QueueNamingConventions _namingConventions = new(); public string ApplicationName { get; set; } = @@ -20,12 +19,6 @@ public QueueNamingConventions NamingConventions set => _namingConventions = Preconditions.CheckNotNull(value, nameof(NamingConventions)); } - public RabbitMqDiagnosticsOptions DiagnosticsOptions - { - get => _diagnosticsOptions; - set => _diagnosticsOptions = Preconditions.CheckNotNull(value, nameof(RabbitMqDiagnosticsOptions)); - } - public TimeSpan? RpcLivenessCheckPeriod { get; set; } = TimeSpan.FromMinutes(1); public TimeSpan? RpcIdleLifetime { get; set; } = null; diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqActivityInstrumentation.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqActivityInstrumentation.cs deleted file mode 100644 index 560df3c..0000000 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqActivityInstrumentation.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using Byndyusoft.Messaging.RabbitMq.Diagnostics.Base; - -namespace Byndyusoft.Messaging.RabbitMq.Diagnostics -{ - public class RabbitMqActivityInstrumentation : IDisposable - { - private readonly Func _isEnabled = (_, _, _) => true; - - private readonly DiagnosticSourceSubscriber _diagnosticSourceSubscriber; - - public RabbitMqActivityInstrumentation(RabbitMqActivityListener listener) - { - _diagnosticSourceSubscriber = new DiagnosticSourceSubscriber(listener, _isEnabled); - _diagnosticSourceSubscriber.Subscribe(); - } - - /// - public void Dispose() - { - _diagnosticSourceSubscriber.Dispose(); - } - } -} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqActivityListener.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqActivityListener.cs deleted file mode 100644 index 20a7fdb..0000000 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqActivityListener.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System.Diagnostics; -using Byndyusoft.Messaging.RabbitMq.Diagnostics.Base; -using Byndyusoft.Messaging.RabbitMq.Diagnostics.Builders; -using Byndyusoft.Messaging.RabbitMq.Diagnostics.Consts; - -namespace Byndyusoft.Messaging.RabbitMq.Diagnostics -{ - public class RabbitMqActivityListener : ListenerHandler - { - private readonly RabbitMqClientCoreOptions _options; - - public RabbitMqActivityListener( - RabbitMqClientCoreOptions options) - : base(DiagnosticNames.RabbitMq) - { - _options = options; - } - - public override bool SupportsNullActivity => true; - - public override void OnEventWritten(string name, object? payload) - { - if (name.Equals(EventNames.MessagePublishing)) - OnMessagePublishing(payload); - else if (name.Equals(EventNames.MessageReturned)) - OnMessageReturned(payload); - else if (name.Equals(EventNames.MessageGot)) - OnMessageGot(payload); - else if (name.Equals(EventNames.MessageReplied)) - OnMessageReplied(payload); - else if (name.Equals(EventNames.MessageConsumed)) - OnMessageConsumed(payload); - } - - private void OnMessagePublishing(object? payload) - { - var activity = Activity.Current; - if (activity is null) - return; - - var eventItems = EventItemBuilder.BuildFromMessagePublishing(payload, _options.DiagnosticsOptions); - LogEvent(activity, eventItems, "message.publishing"); - } - - private void OnMessageReturned(object? payload) - { - var activity = Activity.Current; - if (activity is null) - return; - - var eventItems = EventItemBuilder.BuildFromMessageReturned(payload, _options.DiagnosticsOptions); - LogEvent(activity, eventItems, "message.returned"); - } - - private void OnMessageGot(object? payload) - { - var activity = Activity.Current; - if (activity is null) - return; - - var eventItems = EventItemBuilder.BuildFromMessageGot(payload, _options.DiagnosticsOptions); - LogEvent(activity, eventItems, "message.got"); - } - - private void OnMessageReplied(object? payload) - { - var activity = Activity.Current; - if (activity is null) - return; - - var eventItems = EventItemBuilder.BuildFromMessageReplied(payload, _options.DiagnosticsOptions); - LogEvent(activity, eventItems, "message.replied"); - } - - private void OnMessageConsumed(object? payload) - { - var activity = Activity.Current; - if (activity is null) - return; - - var eventItems = EventItemBuilder.BuildFromMessageConsumed(payload, _options.DiagnosticsOptions); - LogEvent(activity, eventItems, "message.consumed"); - } - - private void LogEvent(Activity activity, EventItem[]? eventItems, string eventName) - { - if (eventItems is null) - return; - - var tags = new ActivityTagsCollection(); - foreach (var eventItem in eventItems) - tags.Add(eventItem.Name, eventItem.Value); - - var activityEvent = new ActivityEvent(eventName, tags: tags); - activity.AddEvent(activityEvent); - } - } -} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogInstrumentation.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqInstrumentation.cs similarity index 82% rename from src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogInstrumentation.cs rename to src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqInstrumentation.cs index d7bf870..f8e1f5f 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogInstrumentation.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqInstrumentation.cs @@ -3,13 +3,13 @@ namespace Byndyusoft.Messaging.RabbitMq.Diagnostics { - public class RabbitMqLogInstrumentation : IDisposable + public class RabbitMqInstrumentation : IDisposable { private readonly Func _isEnabled = (_, _, _) => true; private readonly DiagnosticSourceSubscriber _diagnosticSourceSubscriber; - public RabbitMqLogInstrumentation(RabbitMqLogListener listener) + public RabbitMqInstrumentation(RabbitMqListener listener) { _diagnosticSourceSubscriber = new DiagnosticSourceSubscriber(listener, _isEnabled); _diagnosticSourceSubscriber.Subscribe(); diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqListener.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqListener.cs new file mode 100644 index 0000000..b60ec37 --- /dev/null +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqListener.cs @@ -0,0 +1,120 @@ +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; +using Byndyusoft.Messaging.RabbitMq.Diagnostics.Base; +using Byndyusoft.Messaging.RabbitMq.Diagnostics.Builders; +using Byndyusoft.Messaging.RabbitMq.Diagnostics.Consts; +using Byndyusoft.Messaging.RabbitMq.Settings; +using Microsoft.Extensions.Logging; + +namespace Byndyusoft.Messaging.RabbitMq.Diagnostics +{ + public class RabbitMqListener : ListenerHandler + { + private readonly ILogger _logger; + private readonly RabbitMqTracingOptions _options; + + public RabbitMqListener( + ILogger logger, + RabbitMqTracingOptions options) + : base(DiagnosticNames.RabbitMq) + { + _logger = logger; + _options = options; + } + + public override bool SupportsNullActivity => true; + + public override void OnEventWritten(string name, object? payload) + { + var activity = Activity.Current; + if (IsProcessingNeeded(activity) == false) + return; + + if (name.Equals(EventNames.MessagePublishing)) + OnMessagePublishing(activity, payload); + else if (name.Equals(EventNames.MessageReturned)) + OnMessageReturned(activity, payload); + else if (name.Equals(EventNames.MessageGot)) + OnMessageGot(activity, payload); + else if (name.Equals(EventNames.MessageReplied)) + OnMessageReplied(activity, payload); + else if (name.Equals(EventNames.MessageConsumed)) + OnMessageConsumed(activity, payload); + } + + private bool IsProcessingNeeded(Activity? activity) + { + if (_options.LogEventsInLogs) + return true; + + return activity is not null && _options.LogEventsInTrace; + } + + private void OnMessagePublishing(Activity? activity, object? payload) + { + var eventItems = EventItemBuilder.BuildFromMessagePublishing(payload, _options.DiagnosticsOptions); + Log(activity, eventItems, "message.publishing"); + } + + private void OnMessageReturned(Activity? activity, object? payload) + { + var eventItems = EventItemBuilder.BuildFromMessageReturned(payload, _options.DiagnosticsOptions); + Log(activity, eventItems, "message.returned"); + } + + private void OnMessageGot(Activity? activity, object? payload) + { + var eventItems = EventItemBuilder.BuildFromMessageGot(payload, _options.DiagnosticsOptions); + Log(activity, eventItems, "message.got"); + } + + private void OnMessageReplied(Activity? activity, object? payload) + { + var eventItems = EventItemBuilder.BuildFromMessageReplied(payload, _options.DiagnosticsOptions); + Log(activity, eventItems, "message.replied"); + } + + private void OnMessageConsumed(Activity? activity, object? payload) + { + var eventItems = EventItemBuilder.BuildFromMessageConsumed(payload, _options.DiagnosticsOptions); + Log(activity, eventItems, "message.consumed"); + } + + private void Log(Activity? activity, EventItem[]? eventItems, string eventName) + { + if (eventItems is null) + return; + + if (activity is not null && _options.LogEventsInTrace) + LogEventInTrace(activity, eventItems, eventName); + + if (_options.LogEventsInLogs) + LogEventInLog(eventItems, eventName); + } + + private void LogEventInTrace(Activity activity, EventItem[] eventItems, string eventName) + { + var tags = new ActivityTagsCollection(); + foreach (var eventItem in eventItems) + tags.Add(eventItem.Name, eventItem.Value); + + var activityEvent = new ActivityEvent(eventName, tags: tags); + activity.AddEvent(activityEvent); + } + + private void LogEventInLog(EventItem[] eventItems, string logPrefix) + { + var messageBuilder = new StringBuilder($"{logPrefix}: "); + var parameters = new List(); + foreach (var eventItem in eventItems) + { + var itemName = eventItem.Name.Replace('.', '_'); + messageBuilder.Append($"{eventItem.Description} = {{{itemName}}}; "); + parameters.Add(eventItem.Value); + } + + _logger.LogInformation(messageBuilder.ToString(), parameters.ToArray()); + } + } +} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogListener.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogListener.cs deleted file mode 100644 index acf1df4..0000000 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqLogListener.cs +++ /dev/null @@ -1,87 +0,0 @@ -using System.Collections.Generic; -using System.Text; -using Byndyusoft.Messaging.RabbitMq.Diagnostics.Base; -using Byndyusoft.Messaging.RabbitMq.Diagnostics.Builders; -using Byndyusoft.Messaging.RabbitMq.Diagnostics.Consts; -using Microsoft.Extensions.Logging; - -namespace Byndyusoft.Messaging.RabbitMq.Diagnostics -{ - public class RabbitMqLogListener : ListenerHandler - { - private readonly ILogger _logger; - private readonly RabbitMqClientCoreOptions _options; - - public RabbitMqLogListener( - ILogger logger, - RabbitMqClientCoreOptions options) - : base(DiagnosticNames.RabbitMq) - { - _logger = logger; - _options = options; - } - - public override bool SupportsNullActivity => true; - - public override void OnEventWritten(string name, object? payload) - { - if (name.Equals(EventNames.MessagePublishing)) - OnMessagePublishing(payload); - else if (name.Equals(EventNames.MessageReturned)) - OnMessageReturned(payload); - else if (name.Equals(EventNames.MessageGot)) - OnMessageGot(payload); - else if (name.Equals(EventNames.MessageReplied)) - OnMessageReplied(payload); - else if (name.Equals(EventNames.MessageConsumed)) - OnMessageConsumed(payload); - } - - private void OnMessagePublishing(object? payload) - { - var eventItems = EventItemBuilder.BuildFromMessagePublishing(payload, _options.DiagnosticsOptions); - Log(eventItems, "Message publishing"); - } - - private void OnMessageReturned(object? payload) - { - var eventItems = EventItemBuilder.BuildFromMessageReturned(payload, _options.DiagnosticsOptions); - Log(eventItems, "Message returned"); - } - - private void OnMessageGot(object? payload) - { - var eventItems = EventItemBuilder.BuildFromMessageGot(payload, _options.DiagnosticsOptions); - Log(eventItems, "Message got"); - } - - private void OnMessageReplied(object? payload) - { - var eventItems = EventItemBuilder.BuildFromMessageReplied(payload, _options.DiagnosticsOptions); - Log(eventItems, "Message replied"); - } - - private void OnMessageConsumed(object? payload) - { - var eventItems = EventItemBuilder.BuildFromMessageConsumed(payload, _options.DiagnosticsOptions); - Log(eventItems, "Message consumed"); - } - - private void Log(EventItem[]? eventItems, string logPrefix) - { - if (eventItems is null) - return; - - var messageBuilder = new StringBuilder($"{logPrefix}: "); - var parameters = new List(); - foreach (var eventItem in eventItems) - { - var itemName = eventItem.Name.Replace('.', '_'); - messageBuilder.Append($"{eventItem.Description} = {{{itemName}}}; "); - parameters.Add(eventItem.Value); - } - - _logger.LogInformation(messageBuilder.ToString(), parameters.ToArray()); - } - } -} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Settings/RabbitMqTracingOptions.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Settings/RabbitMqTracingOptions.cs index a96a4bb..cf5d45e 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Settings/RabbitMqTracingOptions.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Settings/RabbitMqTracingOptions.cs @@ -1,7 +1,19 @@ +using Byndyusoft.Messaging.RabbitMq.Utils; + namespace Byndyusoft.Messaging.RabbitMq.Settings { public class RabbitMqTracingOptions { - public bool LogEvents { get; set; } = false; + private RabbitMqDiagnosticsOptions _diagnosticsOptions = new(); + + public RabbitMqDiagnosticsOptions DiagnosticsOptions + { + get => _diagnosticsOptions; + set => _diagnosticsOptions = Preconditions.CheckNotNull(value, nameof(RabbitMqDiagnosticsOptions)); + } + + public bool LogEventsInTrace { get; set; } = false; + + public bool LogEventsInLogs { get; set; } = true; } } \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs index e7ab2e7..c08976d 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs @@ -1,7 +1,6 @@ // ReSharper disable CheckNamespace using System; -using Byndyusoft.Messaging.RabbitMq; using Byndyusoft.Messaging.RabbitMq.Diagnostics; using Byndyusoft.Messaging.RabbitMq.Settings; using Byndyusoft.Messaging.RabbitMq.Utils; @@ -34,27 +33,11 @@ public static TracerProviderBuilder AddRabbitMqClientInstrumentation( .AddSource(RabbitMqClientActivitySource.Name) .AddInstrumentation(sp => { - var options = sp.GetRequiredService>(); - var listener = new RabbitMqActivityListener(options.Value); - return new RabbitMqActivityInstrumentation(listener); + var logger = sp.GetRequiredService>(); + var options = sp.GetRequiredService>(); + var listener = new RabbitMqListener(logger, options.Value); + return new RabbitMqInstrumentation(listener); }); } - - /// - /// Subscribes to the RabbitMqClient activity source to enable log tracing. - /// - public static TracerProviderBuilder AddRabbitMqClientLogInstrumentation( - this TracerProviderBuilder builder) - { - Preconditions.CheckNotNull(builder, nameof(builder)); - - return builder.AddInstrumentation(sp => - { - var options = sp.GetRequiredService>(); - var logger = sp.GetRequiredService>(); - var listener = new RabbitMqLogListener(logger, options.Value); - return new RabbitMqLogInstrumentation(listener); - }); - } } } \ No newline at end of file From 188773b624aa58b620489d67ff75c65b14449ccb Mon Sep 17 00:00:00 2001 From: Rena88 Date: Tue, 12 Dec 2023 15:20:10 +0500 Subject: [PATCH 12/40] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20Ev?= =?UTF-8?q?entItemBuilder?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Diagnostics/Builders/EventItemBuilder.cs | 103 ------------------ .../Diagnostics/RabbitMqListener.cs | 98 ++++++++++++++++- 2 files changed, 92 insertions(+), 109 deletions(-) delete mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Builders/EventItemBuilder.cs diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Builders/EventItemBuilder.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Builders/EventItemBuilder.cs deleted file mode 100644 index 2dcd9ce..0000000 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Builders/EventItemBuilder.cs +++ /dev/null @@ -1,103 +0,0 @@ -using Byndyusoft.Messaging.RabbitMq.Serialization; - -namespace Byndyusoft.Messaging.RabbitMq.Diagnostics.Builders -{ - public class EventItemBuilder - { - private const string ExchangeDescription = "Exchange"; - private const string RoutingKeyDescription = "RoutingKey"; - private const string QueueDescription = "Queue"; - private const string ContentDescription = "RoutingKey"; - private const string PropertiesDescription = "RoutingKey"; - - public static EventItem[]? BuildFromMessagePublishing(object? payload, RabbitMqDiagnosticsOptions options) - { - if (payload is not RabbitMqMessage message) - return null; - - var eventItems = new EventItem[] - { - new("amqp.message.exchange", message.Exchange ?? string.Empty, ExchangeDescription), - new("amqp.message.routing_key", message.RoutingKey, RoutingKeyDescription), - new("amqp.message.mandatory", message.Mandatory, "Mandatory"), - new("amqp.message.content", message.Content.ReadAsStringAsync().GetAwaiter().GetResult(), ContentDescription), - new("amqp.message.properties", JsonSerializer.Serialize(message.Properties, options), PropertiesDescription) - }; - - return eventItems; - } - - public static EventItem[]? BuildFromMessageReturned(object? payload, RabbitMqDiagnosticsOptions options) - { - if (payload is not ReturnedRabbitMqMessage message) - return null; - - var eventItems = new EventItem[] - { - new("amqp.message.exchange", message.Exchange ?? string.Empty, ExchangeDescription), - new("amqp.message.routing_key", message.RoutingKey, RoutingKeyDescription), - new("amqp.message.return_reason", message.ReturnReason, "ReturnReason"), - new("amqp.message.content", message.Content.ReadAsStringAsync().GetAwaiter().GetResult(), - ContentDescription), - new("amqp.message.properties", JsonSerializer.Serialize(message.Properties, options), - PropertiesDescription) - }; - - return eventItems; - } - - public static EventItem[]? BuildFromMessageGot(object? payload, RabbitMqDiagnosticsOptions options) - { - return BuildFromMessageConsuming(payload, options); - } - - public static EventItem[]? BuildFromMessageReplied(object? payload, RabbitMqDiagnosticsOptions options) - { - return BuildFromMessageConsuming(payload, options); - } - - public static EventItem[]? BuildFromMessageConsumed(object? payload, RabbitMqDiagnosticsOptions options) - { - if (payload is not ConsumeResult result) - return null; - - var eventItems = new EventItem[] - { - new("result", result.GetDescription(), "Result") - }; - - return eventItems; - } - - private static EventItem[]? BuildFromMessageConsuming(object? payload, RabbitMqDiagnosticsOptions options) - { - if (payload is null) - { - return new EventItem[] - { - new("amqp.message", null, "Message") - }; - } - - if (payload is not ReceivedRabbitMqMessage message) - return null; - - var eventItems = new EventItem[] - { - new("amqp.message.content", message.Content.ReadAsStringAsync().GetAwaiter().GetResult(), - ContentDescription), - new("amqp.message.exchange", message.Exchange, ExchangeDescription), - new("amqp.message.queue", message.Queue, QueueDescription), - new("amqp.message.routing_key", message.RoutingKey, RoutingKeyDescription), - new("amqp.message.delivery_tag", message.DeliveryTag, "DeliveryTag"), - new("amqp.message.redelivered", message.Redelivered, "Redelivered"), - new("amqp.message.consumer_tag", message.ConsumerTag, "ConsumerTag"), - new("amqp.message.retry_count", message.RetryCount, "RetryCount"), - new("amqp.message.properties", JsonSerializer.Serialize(message.Properties, options), - PropertiesDescription) - }; - - return eventItems; - } - } -} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqListener.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqListener.cs index b60ec37..6e5b1fd 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqListener.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqListener.cs @@ -2,8 +2,8 @@ using System.Diagnostics; using System.Text; using Byndyusoft.Messaging.RabbitMq.Diagnostics.Base; -using Byndyusoft.Messaging.RabbitMq.Diagnostics.Builders; using Byndyusoft.Messaging.RabbitMq.Diagnostics.Consts; +using Byndyusoft.Messaging.RabbitMq.Serialization; using Byndyusoft.Messaging.RabbitMq.Settings; using Microsoft.Extensions.Logging; @@ -11,6 +11,12 @@ namespace Byndyusoft.Messaging.RabbitMq.Diagnostics { public class RabbitMqListener : ListenerHandler { + private const string ExchangeDescription = "Exchange"; + private const string RoutingKeyDescription = "RoutingKey"; + private const string QueueDescription = "Queue"; + private const string ContentDescription = "RoutingKey"; + private const string PropertiesDescription = "RoutingKey"; + private readonly ILogger _logger; private readonly RabbitMqTracingOptions _options; @@ -53,31 +59,98 @@ private bool IsProcessingNeeded(Activity? activity) private void OnMessagePublishing(Activity? activity, object? payload) { - var eventItems = EventItemBuilder.BuildFromMessagePublishing(payload, _options.DiagnosticsOptions); + var eventItems = BuildMessagePublishingEventItems(payload, _options.DiagnosticsOptions); Log(activity, eventItems, "message.publishing"); } + private EventItem[]? BuildMessagePublishingEventItems(object? payload, RabbitMqDiagnosticsOptions options) + { + if (payload is not RabbitMqMessage message) + return null; + + var eventItems = new EventItem[] + { + new("amqp.message.exchange", message.Exchange ?? string.Empty, ExchangeDescription), + new("amqp.message.routing_key", message.RoutingKey, RoutingKeyDescription), + new("amqp.message.mandatory", message.Mandatory, "Mandatory"), + new("amqp.message.content", message.Content.ReadAsStringAsync().GetAwaiter().GetResult(), ContentDescription), + new("amqp.message.properties", JsonSerializer.Serialize(message.Properties, options), PropertiesDescription) + }; + + return eventItems; + } + private void OnMessageReturned(Activity? activity, object? payload) { - var eventItems = EventItemBuilder.BuildFromMessageReturned(payload, _options.DiagnosticsOptions); + var eventItems = BuildMessageReturnedEventItems(payload, _options.DiagnosticsOptions); Log(activity, eventItems, "message.returned"); } + private EventItem[]? BuildMessageReturnedEventItems(object? payload, RabbitMqDiagnosticsOptions options) + { + if (payload is not ReturnedRabbitMqMessage message) + return null; + + var eventItems = new EventItem[] + { + new("amqp.message.exchange", message.Exchange ?? string.Empty, ExchangeDescription), + new("amqp.message.routing_key", message.RoutingKey, RoutingKeyDescription), + new("amqp.message.return_reason", message.ReturnReason, "ReturnReason"), + new("amqp.message.content", message.Content.ReadAsStringAsync().GetAwaiter().GetResult(), + ContentDescription), + new("amqp.message.properties", JsonSerializer.Serialize(message.Properties, options), + PropertiesDescription) + }; + + return eventItems; + } + private void OnMessageGot(Activity? activity, object? payload) { - var eventItems = EventItemBuilder.BuildFromMessageGot(payload, _options.DiagnosticsOptions); + var eventItems = BuildMessageConsumingEventItems(payload, _options.DiagnosticsOptions); Log(activity, eventItems, "message.got"); } + private EventItem[]? BuildMessageConsumingEventItems(object? payload, RabbitMqDiagnosticsOptions options) + { + if (payload is null) + { + return new EventItem[] + { + new("amqp.message", null, "Message") + }; + } + + if (payload is not ReceivedRabbitMqMessage message) + return null; + + var eventItems = new EventItem[] + { + new("amqp.message.content", message.Content.ReadAsStringAsync().GetAwaiter().GetResult(), + ContentDescription), + new("amqp.message.exchange", message.Exchange, ExchangeDescription), + new("amqp.message.queue", message.Queue, QueueDescription), + new("amqp.message.routing_key", message.RoutingKey, RoutingKeyDescription), + new("amqp.message.delivery_tag", message.DeliveryTag, "DeliveryTag"), + new("amqp.message.redelivered", message.Redelivered, "Redelivered"), + new("amqp.message.consumer_tag", message.ConsumerTag, "ConsumerTag"), + new("amqp.message.retry_count", message.RetryCount, "RetryCount"), + new("amqp.message.properties", JsonSerializer.Serialize(message.Properties, options), + PropertiesDescription) + }; + + return eventItems; + } + private void OnMessageReplied(Activity? activity, object? payload) { - var eventItems = EventItemBuilder.BuildFromMessageReplied(payload, _options.DiagnosticsOptions); + var eventItems = BuildMessageConsumingEventItems(payload, _options.DiagnosticsOptions); Log(activity, eventItems, "message.replied"); } private void OnMessageConsumed(Activity? activity, object? payload) { - var eventItems = EventItemBuilder.BuildFromMessageConsumed(payload, _options.DiagnosticsOptions); + var eventItems = BuildMessageConsumedEventItems(payload); Log(activity, eventItems, "message.consumed"); } @@ -116,5 +189,18 @@ private void LogEventInLog(EventItem[] eventItems, string logPrefix) _logger.LogInformation(messageBuilder.ToString(), parameters.ToArray()); } + + private EventItem[]? BuildMessageConsumedEventItems(object? payload) + { + if (payload is not ConsumeResult result) + return null; + + var eventItems = new EventItem[] + { + new("result", result.GetDescription(), "Result") + }; + + return eventItems; + } } } \ No newline at end of file From 4c5494f4c90043004a954ce8979a00a7aa62ce59 Mon Sep 17 00:00:00 2001 From: Rena88 Date: Tue, 12 Dec 2023 15:29:01 +0500 Subject: [PATCH 13/40] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=20=D0=B2=D1=81=D0=B5=20=D0=BD=D1=83=D0=B6=D0=BD=D0=BE?= =?UTF-8?q?=D0=B5=20=D0=B2=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=20=D1=81?= =?UTF-8?q?=20OpenTelemetry=20+=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20S?= =?UTF-8?q?upportsNullActivity=20(=D0=BD=D0=B5=20=D0=BD=D1=83=D0=B6=D0=BD?= =?UTF-8?q?=D0=BE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Byndyusoft.Messaging.RabbitMq.Core.csproj | 5 ++--- .../Base/DiagnosticSourceListener.cs | 8 +------- .../Base/DiagnosticSourceSubscriber.cs | 2 +- .../Base/ListenerHandler.cs | 10 +--------- ...Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj | 3 ++- .../RabbitMqClientTracerProviderBuilderExtensions.cs | 3 ++- .../RabbitMqInstrumentation.cs | 4 ++-- .../RabbitMqListener.cs | 11 +++++------ .../Serialization/JsonSerializer.cs | 4 +++- .../Serialization/StringLimitStream.cs | 2 +- .../Settings}/RabbitMqDiagnosticsOptions.cs | 2 +- .../Settings/RabbitMqTracingOptions.cs | 2 +- 12 files changed, 22 insertions(+), 34 deletions(-) rename src/{Byndyusoft.Messaging.RabbitMq.Core/Diagnostics => Byndyusoft.Messaging.RabbitMq.OpenTelemetry}/Base/DiagnosticSourceListener.cs (79%) rename src/{Byndyusoft.Messaging.RabbitMq.Core/Diagnostics => Byndyusoft.Messaging.RabbitMq.OpenTelemetry}/Base/DiagnosticSourceSubscriber.cs (98%) rename src/{Byndyusoft.Messaging.RabbitMq.Core/Diagnostics => Byndyusoft.Messaging.RabbitMq.OpenTelemetry}/Base/ListenerHandler.cs (74%) rename src/{Byndyusoft.Messaging.RabbitMq.Core/Diagnostics => Byndyusoft.Messaging.RabbitMq.OpenTelemetry}/RabbitMqInstrumentation.cs (85%) rename src/{Byndyusoft.Messaging.RabbitMq.Core/Diagnostics => Byndyusoft.Messaging.RabbitMq.OpenTelemetry}/RabbitMqListener.cs (96%) rename src/{Byndyusoft.Messaging.RabbitMq.Core => Byndyusoft.Messaging.RabbitMq.OpenTelemetry}/Serialization/JsonSerializer.cs (77%) rename src/{Byndyusoft.Messaging.RabbitMq.Core => Byndyusoft.Messaging.RabbitMq.OpenTelemetry}/Serialization/StringLimitStream.cs (97%) rename src/{Byndyusoft.Messaging.RabbitMq.Abstractions => Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings}/RabbitMqDiagnosticsOptions.cs (94%) rename src/{Byndyusoft.Messaging.RabbitMq.Core => Byndyusoft.Messaging.RabbitMq.OpenTelemetry}/Settings/RabbitMqTracingOptions.cs (89%) diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj b/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj index f5794f0..4cef2db 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj @@ -7,9 +7,8 @@ - - - + + diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Base/DiagnosticSourceListener.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Base/DiagnosticSourceListener.cs similarity index 79% rename from src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Base/DiagnosticSourceListener.cs rename to src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Base/DiagnosticSourceListener.cs index b30ff25..c3ad4e7 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Base/DiagnosticSourceListener.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Base/DiagnosticSourceListener.cs @@ -1,9 +1,8 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using Byndyusoft.Messaging.RabbitMq.Utils; -namespace Byndyusoft.Messaging.RabbitMq.Diagnostics.Base +namespace Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Base { internal sealed class DiagnosticSourceListener : IObserver> { @@ -26,11 +25,6 @@ public void OnError(Exception error) public void OnNext(KeyValuePair value) { - if (_handler.SupportsNullActivity == false && Activity.Current == null) - { - return; - } - try { _handler.OnEventWritten(value.Key, value.Value); diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Base/DiagnosticSourceSubscriber.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Base/DiagnosticSourceSubscriber.cs similarity index 98% rename from src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Base/DiagnosticSourceSubscriber.cs rename to src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Base/DiagnosticSourceSubscriber.cs index 33dd129..7f9d104 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Base/DiagnosticSourceSubscriber.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Base/DiagnosticSourceSubscriber.cs @@ -4,7 +4,7 @@ using System.Threading; using Byndyusoft.Messaging.RabbitMq.Utils; -namespace Byndyusoft.Messaging.RabbitMq.Diagnostics.Base +namespace Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Base { internal sealed class DiagnosticSourceSubscriber : IDisposable, IObserver { diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Base/ListenerHandler.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Base/ListenerHandler.cs similarity index 74% rename from src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Base/ListenerHandler.cs rename to src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Base/ListenerHandler.cs index 7d7703f..a59ddff 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Base/ListenerHandler.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Base/ListenerHandler.cs @@ -1,6 +1,4 @@ -using System.Diagnostics; - -namespace Byndyusoft.Messaging.RabbitMq.Diagnostics.Base +namespace Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Base { /// /// ListenerHandler base class. @@ -14,7 +12,6 @@ public abstract class ListenerHandler protected ListenerHandler(string sourceName) { SourceName = sourceName; - SupportsNullActivity = false; } /// @@ -22,11 +19,6 @@ protected ListenerHandler(string sourceName) /// public string SourceName { get; } - /// - /// Gets a value indicating whether the supports NULL . - /// - public virtual bool SupportsNullActivity { get; } - /// /// Method called for an event which does not have 'Start', 'Stop' or 'Exception' as suffix. /// diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj index 9e24d54..ec88dc9 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj @@ -7,8 +7,9 @@ - + + diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs index c08976d..fb8f061 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqClientTracerProviderBuilderExtensions.cs @@ -2,7 +2,8 @@ using System; using Byndyusoft.Messaging.RabbitMq.Diagnostics; -using Byndyusoft.Messaging.RabbitMq.Settings; +using Byndyusoft.Messaging.RabbitMq.OpenTelemetry; +using Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Settings; using Byndyusoft.Messaging.RabbitMq.Utils; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqInstrumentation.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqInstrumentation.cs similarity index 85% rename from src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqInstrumentation.cs rename to src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqInstrumentation.cs index f8e1f5f..243fe22 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqInstrumentation.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqInstrumentation.cs @@ -1,7 +1,7 @@ using System; -using Byndyusoft.Messaging.RabbitMq.Diagnostics.Base; +using Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Base; -namespace Byndyusoft.Messaging.RabbitMq.Diagnostics +namespace Byndyusoft.Messaging.RabbitMq.OpenTelemetry { public class RabbitMqInstrumentation : IDisposable { diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqListener.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs similarity index 96% rename from src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqListener.cs rename to src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs index 6e5b1fd..5fa6a7c 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqListener.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs @@ -1,13 +1,14 @@ using System.Collections.Generic; using System.Diagnostics; using System.Text; -using Byndyusoft.Messaging.RabbitMq.Diagnostics.Base; +using Byndyusoft.Messaging.RabbitMq.Diagnostics; using Byndyusoft.Messaging.RabbitMq.Diagnostics.Consts; -using Byndyusoft.Messaging.RabbitMq.Serialization; -using Byndyusoft.Messaging.RabbitMq.Settings; +using Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Base; +using Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Serialization; +using Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Settings; using Microsoft.Extensions.Logging; -namespace Byndyusoft.Messaging.RabbitMq.Diagnostics +namespace Byndyusoft.Messaging.RabbitMq.OpenTelemetry { public class RabbitMqListener : ListenerHandler { @@ -29,8 +30,6 @@ public RabbitMqListener( _options = options; } - public override bool SupportsNullActivity => true; - public override void OnEventWritten(string name, object? payload) { var activity = Activity.Current; diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Serialization/JsonSerializer.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Serialization/JsonSerializer.cs similarity index 77% rename from src/Byndyusoft.Messaging.RabbitMq.Core/Serialization/JsonSerializer.cs rename to src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Serialization/JsonSerializer.cs index 28501b3..f708e16 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Serialization/JsonSerializer.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Serialization/JsonSerializer.cs @@ -1,4 +1,6 @@ -namespace Byndyusoft.Messaging.RabbitMq.Serialization +using Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Settings; + +namespace Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Serialization { internal static class JsonSerializer { diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Serialization/StringLimitStream.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Serialization/StringLimitStream.cs similarity index 97% rename from src/Byndyusoft.Messaging.RabbitMq.Core/Serialization/StringLimitStream.cs rename to src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Serialization/StringLimitStream.cs index ce4d4f6..045ae84 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Serialization/StringLimitStream.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Serialization/StringLimitStream.cs @@ -3,7 +3,7 @@ using System.IO; using System.Text; -namespace Byndyusoft.Messaging.RabbitMq.Serialization +namespace Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Serialization { [ExcludeFromCodeCoverage] internal class StringLimitStream : Stream diff --git a/src/Byndyusoft.Messaging.RabbitMq.Abstractions/RabbitMqDiagnosticsOptions.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqDiagnosticsOptions.cs similarity index 94% rename from src/Byndyusoft.Messaging.RabbitMq.Abstractions/RabbitMqDiagnosticsOptions.cs rename to src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqDiagnosticsOptions.cs index a8ccb69..e1b743a 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Abstractions/RabbitMqDiagnosticsOptions.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqDiagnosticsOptions.cs @@ -2,7 +2,7 @@ using System.Text.Json.Serialization; using Byndyusoft.Messaging.RabbitMq.Utils; -namespace Byndyusoft.Messaging.RabbitMq +namespace Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Settings { public class RabbitMqDiagnosticsOptions { diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Settings/RabbitMqTracingOptions.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqTracingOptions.cs similarity index 89% rename from src/Byndyusoft.Messaging.RabbitMq.Core/Settings/RabbitMqTracingOptions.cs rename to src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqTracingOptions.cs index cf5d45e..9525b31 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Settings/RabbitMqTracingOptions.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqTracingOptions.cs @@ -1,6 +1,6 @@ using Byndyusoft.Messaging.RabbitMq.Utils; -namespace Byndyusoft.Messaging.RabbitMq.Settings +namespace Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Settings { public class RabbitMqTracingOptions { From cda5b0a6062ca11eced6242d08b73e8b33ead0a2 Mon Sep 17 00:00:00 2001 From: Rena88 Date: Tue, 12 Dec 2023 15:38:49 +0500 Subject: [PATCH 14/40] =?UTF-8?q?=D0=92=D1=8B=D0=BD=D0=B5=D1=81=20=D0=B2?= =?UTF-8?q?=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C=D0=BD=D1=83=D1=8E=20?= =?UTF-8?q?=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D1=83=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BF=D0=B8=D1=81=D1=8C=20=D0=B8=D1=81=D0=BA=D0=BB=D1=8E?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Diagnostics/Consts/EventNames.cs | 5 +- .../RabbitMqClientActivitySource.Events.cs | 3 -- .../RabbitMqClientActivitySource.cs | 13 ++--- .../RabbitMqListener.cs | 53 ++++++++++++++----- .../Settings/RabbitMqTracingOptions.cs | 2 + 5 files changed, 50 insertions(+), 26 deletions(-) diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Consts/EventNames.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Consts/EventNames.cs index a60a405..7d8d732 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Consts/EventNames.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Consts/EventNames.cs @@ -5,7 +5,8 @@ public class EventNames public static string MessagePublishing = "Byndyusoft.RabbitMq.Message.Publishing"; public static string MessageReturned = "Byndyusoft.RabbitMq.Message.Returned"; public static string MessageGot = "Byndyusoft.RabbitMq.Message.Got"; - public static string MessageReplied = "Byndyusoft.RabbitMq.Message.Got"; - public static string MessageConsumed = "Byndyusoft.RabbitMq.Message.Got"; + public static string MessageReplied = "Byndyusoft.RabbitMq.Message.Replied"; + public static string MessageConsumed = "Byndyusoft.RabbitMq.Message.Consumed"; + public static string UnhandledException = "Byndyusoft.RabbitMq.UnhandledException"; } } \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs index 4c5869f..683ad44 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs @@ -1,4 +1,3 @@ -using System.Diagnostics; using Byndyusoft.Messaging.RabbitMq.Diagnostics.Consts; namespace Byndyusoft.Messaging.RabbitMq.Diagnostics @@ -7,8 +6,6 @@ public partial class RabbitMqClientActivitySource { public class RabbitMqClientActivitySourceEvents { - private static readonly DiagnosticListener EventLogger = new(DiagnosticNames.RabbitMq); - public void MessagePublishing(RabbitMqMessage message) { if (EventLogger.IsEnabled(EventNames.MessagePublishing)) diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs index 2451d47..4c04598 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs @@ -2,6 +2,7 @@ using System.Diagnostics; using System.Reflection; using System.Threading.Tasks; +using Byndyusoft.Messaging.RabbitMq.Diagnostics.Consts; using Byndyusoft.Messaging.RabbitMq.Utils; namespace Byndyusoft.Messaging.RabbitMq.Diagnostics @@ -10,6 +11,8 @@ public partial class RabbitMqClientActivitySource { public static readonly string Name = typeof(RabbitMqClientActivitySource).Assembly.GetName().Name; + private static readonly DiagnosticListener EventLogger = new(DiagnosticNames.RabbitMq); + private static readonly string? Version = typeof(RabbitMqClientActivitySource) .GetCustomAttribute()?.Version; @@ -53,18 +56,12 @@ private static void StopActivity(Activity? activity) private static void SetException(Activity? activity, Exception exception) { Preconditions.CheckNotNull(exception, nameof(exception)); + if (EventLogger.IsEnabled(EventNames.UnhandledException)) + EventLogger.Write(EventNames.UnhandledException, exception); if (activity is null) return; - var tags = new ActivityTagsCollection - { - {"exception.type", exception.GetType().FullName}, - {"exception.message", exception.Message}, - {"exception.stacktrace", exception.ToString()} - }; - var activityEvent = new ActivityEvent("exception", tags: tags); - activity.AddEvent(activityEvent); activity.SetTag("error", "true"); activity.SetStatus(ActivityStatusCode.Error, exception.Message); activity.Dispose(); diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs index 5fa6a7c..0024a83 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Diagnostics; using System.Text; @@ -46,6 +47,8 @@ public override void OnEventWritten(string name, object? payload) OnMessageReplied(activity, payload); else if (name.Equals(EventNames.MessageConsumed)) OnMessageConsumed(activity, payload); + else if (name.Equals(EventNames.UnhandledException)) + OnUnhandledException(activity, payload); } private bool IsProcessingNeeded(Activity? activity) @@ -153,6 +156,43 @@ private void OnMessageConsumed(Activity? activity, object? payload) Log(activity, eventItems, "message.consumed"); } + private EventItem[]? BuildMessageConsumedEventItems(object? payload) + { + if (payload is not ConsumeResult result) + return null; + + var eventItems = new EventItem[] + { + new("result", result.GetDescription(), "Result") + }; + + return eventItems; + } + + private void OnUnhandledException(Activity? activity, object? payload) + { + if (_options.RecordExceptions == false) + return; + + var eventItems = BuildUnhandledExceptionEventItems(payload); + Log(activity, eventItems, "exception"); + } + + private EventItem[]? BuildUnhandledExceptionEventItems(object? payload) + { + if (payload is not Exception exception) + return null; + + var eventItems = new EventItem[] + { + new("exception.type", exception.GetType().FullName, "Type"), + new("exception.message", exception.Message, "Message"), + new("exception.stacktrace", exception.ToString(), "StackTrace") + }; + + return eventItems; + } + private void Log(Activity? activity, EventItem[]? eventItems, string eventName) { if (eventItems is null) @@ -188,18 +228,5 @@ private void LogEventInLog(EventItem[] eventItems, string logPrefix) _logger.LogInformation(messageBuilder.ToString(), parameters.ToArray()); } - - private EventItem[]? BuildMessageConsumedEventItems(object? payload) - { - if (payload is not ConsumeResult result) - return null; - - var eventItems = new EventItem[] - { - new("result", result.GetDescription(), "Result") - }; - - return eventItems; - } } } \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqTracingOptions.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqTracingOptions.cs index 9525b31..9e4b2ce 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqTracingOptions.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqTracingOptions.cs @@ -15,5 +15,7 @@ public RabbitMqDiagnosticsOptions DiagnosticsOptions public bool LogEventsInTrace { get; set; } = false; public bool LogEventsInLogs { get; set; } = true; + + public bool RecordExceptions { get; set; } = true; } } \ No newline at end of file From 1954fc04336367c65ce1773f6a531630a5079cb6 Mon Sep 17 00:00:00 2001 From: Rena88 Date: Tue, 12 Dec 2023 17:30:58 +0500 Subject: [PATCH 15/40] =?UTF-8?q?=D0=A2=D0=B5=D1=81=D1=82=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Program.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/example/Program.cs b/example/Program.cs index 3ad4960..86b3f00 100644 --- a/example/Program.cs +++ b/example/Program.cs @@ -42,6 +42,7 @@ private static IHostBuilder CreateHostBuilder(string[] args) { o.LogEventsInTrace = true; o.LogEventsInLogs = true; + o.RecordExceptions = true; })); services.AddRabbitMqRpc(); services.AddSingleton(); From c314fa3051774de31561907115907c869f05de18 Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Wed, 13 Dec 2023 13:41:31 +0500 Subject: [PATCH 16/40] =?UTF-8?q?=D0=A4=D0=BE=D1=80=D0=BC=D0=B0=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20csproj=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ft.Messaging.RabbitMq.OpenTelemetry.csproj | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj index ec88dc9..0b51a78 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj @@ -1,19 +1,19 @@ - - netstandard2.0;netstandard2.1 - Byndyusoft.Messaging.RabbitMq.OpenTelemetry - Byndyusoft.Messaging.RabbitMq.OpenTelemetry - + + netstandard2.0;netstandard2.1 + Byndyusoft.Messaging.RabbitMq.OpenTelemetry + Byndyusoft.Messaging.RabbitMq.OpenTelemetry + - - - + + + - + - - - + + + - + \ No newline at end of file From ba4e0cb84bddf7609d396ca74cc4374a84e09c07 Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Mon, 25 Dec 2023 14:04:53 +0500 Subject: [PATCH 17/40] =?UTF-8?q?=D0=92=D1=8B=D0=BD=D0=B5=D1=81=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D1=83=20=D1=81=D0=BE=D0=B1?= =?UTF-8?q?=D1=8B=D1=82=D0=B8=D0=B9=20=D0=B2=20=D0=BE=D1=82=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RabbitMqClientActivitySource.Events.cs | 40 ---------------- .../RabbitMqClientActivitySource.cs | 9 +--- .../RabbitMqClientEvents.Events.cs | 47 +++++++++++++++++++ .../RabbitMqClientCore.cs | 14 +++--- 4 files changed, 55 insertions(+), 55 deletions(-) delete mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs create mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientEvents.Events.cs diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs deleted file mode 100644 index 683ad44..0000000 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs +++ /dev/null @@ -1,40 +0,0 @@ -using Byndyusoft.Messaging.RabbitMq.Diagnostics.Consts; - -namespace Byndyusoft.Messaging.RabbitMq.Diagnostics -{ - public partial class RabbitMqClientActivitySource - { - public class RabbitMqClientActivitySourceEvents - { - public void MessagePublishing(RabbitMqMessage message) - { - if (EventLogger.IsEnabled(EventNames.MessagePublishing)) - EventLogger.Write(EventNames.MessagePublishing, message); - } - - public void MessageReturned(ReturnedRabbitMqMessage message) - { - if (EventLogger.IsEnabled(EventNames.MessageReturned)) - EventLogger.Write(EventNames.MessageReturned, message); - } - - public void MessageGot(ReceivedRabbitMqMessage? message) - { - if (EventLogger.IsEnabled(EventNames.MessageGot)) - EventLogger.Write(EventNames.MessageGot, message); - } - - public void MessageReplied(ReceivedRabbitMqMessage message) - { - if (EventLogger.IsEnabled(EventNames.MessageReplied)) - EventLogger.Write(EventNames.MessageReplied, message); - } - - public void MessageConsumed(ConsumeResult result) - { - if (EventLogger.IsEnabled(EventNames.MessageConsumed)) - EventLogger.Write(EventNames.MessageConsumed, result); - } - } - } -} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs index 4c04598..975d941 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs @@ -2,7 +2,6 @@ using System.Diagnostics; using System.Reflection; using System.Threading.Tasks; -using Byndyusoft.Messaging.RabbitMq.Diagnostics.Consts; using Byndyusoft.Messaging.RabbitMq.Utils; namespace Byndyusoft.Messaging.RabbitMq.Diagnostics @@ -11,8 +10,6 @@ public partial class RabbitMqClientActivitySource { public static readonly string Name = typeof(RabbitMqClientActivitySource).Assembly.GetName().Name; - private static readonly DiagnosticListener EventLogger = new(DiagnosticNames.RabbitMq); - private static readonly string? Version = typeof(RabbitMqClientActivitySource) .GetCustomAttribute()?.Version; @@ -22,14 +19,11 @@ public RabbitMqClientActivitySource() { _source = new ActivitySource(Name, Version); - Events = new RabbitMqClientActivitySourceEvents(); Activities = new RabbitMqClientActivitySourceActivities(this); } public RabbitMqClientActivitySourceActivities Activities { get; } - public RabbitMqClientActivitySourceEvents Events { get; } - private Activity? StartActivity(string name, RabbitMqEndpoint endpoint, ActivityKind kind) { Preconditions.CheckNotNull(name, nameof(name)); @@ -56,8 +50,7 @@ private static void StopActivity(Activity? activity) private static void SetException(Activity? activity, Exception exception) { Preconditions.CheckNotNull(exception, nameof(exception)); - if (EventLogger.IsEnabled(EventNames.UnhandledException)) - EventLogger.Write(EventNames.UnhandledException, exception); + RabbitMqClientEvents.OnUnhandledException(exception); if (activity is null) return; diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientEvents.Events.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientEvents.Events.cs new file mode 100644 index 0000000..4122b8e --- /dev/null +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientEvents.Events.cs @@ -0,0 +1,47 @@ +using System; +using System.Diagnostics; +using Byndyusoft.Messaging.RabbitMq.Diagnostics.Consts; + +namespace Byndyusoft.Messaging.RabbitMq.Diagnostics +{ + public class RabbitMqClientEvents + { + private static readonly DiagnosticListener EventLogger = new(DiagnosticNames.RabbitMq); + + public static void OnMessagePublishing(RabbitMqMessage message) + { + if (EventLogger.IsEnabled(EventNames.MessagePublishing)) + EventLogger.Write(EventNames.MessagePublishing, message); + } + + public static void OnMessageReturned(ReturnedRabbitMqMessage message) + { + if (EventLogger.IsEnabled(EventNames.MessageReturned)) + EventLogger.Write(EventNames.MessageReturned, message); + } + + public static void OnMessageGot(ReceivedRabbitMqMessage? message) + { + if (EventLogger.IsEnabled(EventNames.MessageGot)) + EventLogger.Write(EventNames.MessageGot, message); + } + + public static void OnMessageReplied(ReceivedRabbitMqMessage message) + { + if (EventLogger.IsEnabled(EventNames.MessageReplied)) + EventLogger.Write(EventNames.MessageReplied, message); + } + + public static void OnMessageConsumed(ConsumeResult result) + { + if (EventLogger.IsEnabled(EventNames.MessageConsumed)) + EventLogger.Write(EventNames.MessageConsumed, result); + } + + public static void OnUnhandledException(Exception exception) + { + if (EventLogger.IsEnabled(EventNames.UnhandledException)) + EventLogger.Write(EventNames.UnhandledException, exception); + } + } +} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/RabbitMqClientCore.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/RabbitMqClientCore.cs index 54c5d11..f492d31 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/RabbitMqClientCore.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/RabbitMqClientCore.cs @@ -58,7 +58,7 @@ public RabbitMqClientCoreOptions Options { var message = await _handler.GetMessageAsync(queueName, cancellationToken) .ConfigureAwait(false); - _activitySource.Events.MessageGot(message); + RabbitMqClientEvents.OnMessageGot(message); return message; }); } @@ -92,7 +92,7 @@ public async Task PublishMessageAsync(RabbitMqMessage message, await _activitySource.ExecuteAsync(activity, async () => { - _activitySource.Events.MessagePublishing(message); + RabbitMqClientEvents.OnMessagePublishing(message); await _handler.PublishMessageAsync(message, cancellationToken).ConfigureAwait(false); }); } @@ -220,10 +220,10 @@ public async Task MakeRpc(RabbitMqMessage message, return await _activitySource.ExecuteAsync(activity, async () => { - _activitySource.Events.MessagePublishing(message); + RabbitMqClientEvents.OnMessagePublishing(message); var response = await _rpcClient.MakeRpc(message, cancellationToken) .ConfigureAwait(false); - _activitySource.Events.MessageReplied(response); + RabbitMqClientEvents.OnMessageReplied(response); return response; }).ConfigureAwait(false); } @@ -251,11 +251,11 @@ async Task OnMessageHandler(ReceivedRabbitMqMessage messag var activity = _activitySource.Activities.StartConsume(_handler.Endpoint, message); return await _activitySource.ExecuteAsync(activity, async () => { - _activitySource.Events.MessageGot(message); + RabbitMqClientEvents.OnMessageGot(message); try { var consumeResult = await consumer.OnMessage(message, ct).ConfigureAwait(false); - _activitySource.Events.MessageConsumed(consumeResult); + RabbitMqClientEvents.OnMessageConsumed(consumeResult); return await ProcessConsumeResultAsync(message, consumeResult, ct); } catch (Exception exception) @@ -334,7 +334,7 @@ private async ValueTask OnMessageReturned(ReturnedRabbitMqMessage message, Cance await _activitySource.ExecuteAsync(activity, async () => { - _activitySource.Events.MessageReturned(message); + RabbitMqClientEvents.OnMessageReturned(message); var task = MessageReturned?.Invoke(message, cancellationToken); if (task is not null) From 5283bdc164fecca3d07e1129c3cd337e2106a54a Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Mon, 25 Dec 2023 14:07:50 +0500 Subject: [PATCH 18/40] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D1=83=20?= =?UTF-8?q?=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D0=B9=20=D0=B2=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B5=D0=BA=D1=82=20=D1=81=20=D0=B0=D0=B1=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=B0=D0=BA=D1=86=D0=B8=D1=8F=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Byndyusoft.Messaging.RabbitMq.Abstractions.csproj | 1 + .../Diagnostics/Consts/DiagnosticNames.cs | 0 .../Diagnostics/Consts/EventNames.cs | 0 .../Diagnostics/RabbitMqClientEvents.cs} | 0 4 files changed, 1 insertion(+) rename src/{Byndyusoft.Messaging.RabbitMq.Core => Byndyusoft.Messaging.RabbitMq.Abstractions}/Diagnostics/Consts/DiagnosticNames.cs (100%) rename src/{Byndyusoft.Messaging.RabbitMq.Core => Byndyusoft.Messaging.RabbitMq.Abstractions}/Diagnostics/Consts/EventNames.cs (100%) rename src/{Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientEvents.Events.cs => Byndyusoft.Messaging.RabbitMq.Abstractions/Diagnostics/RabbitMqClientEvents.cs} (100%) diff --git a/src/Byndyusoft.Messaging.RabbitMq.Abstractions/Byndyusoft.Messaging.RabbitMq.Abstractions.csproj b/src/Byndyusoft.Messaging.RabbitMq.Abstractions/Byndyusoft.Messaging.RabbitMq.Abstractions.csproj index 0ce40dd..70ec003 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Abstractions/Byndyusoft.Messaging.RabbitMq.Abstractions.csproj +++ b/src/Byndyusoft.Messaging.RabbitMq.Abstractions/Byndyusoft.Messaging.RabbitMq.Abstractions.csproj @@ -9,6 +9,7 @@ + diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Consts/DiagnosticNames.cs b/src/Byndyusoft.Messaging.RabbitMq.Abstractions/Diagnostics/Consts/DiagnosticNames.cs similarity index 100% rename from src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Consts/DiagnosticNames.cs rename to src/Byndyusoft.Messaging.RabbitMq.Abstractions/Diagnostics/Consts/DiagnosticNames.cs diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Consts/EventNames.cs b/src/Byndyusoft.Messaging.RabbitMq.Abstractions/Diagnostics/Consts/EventNames.cs similarity index 100% rename from src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/Consts/EventNames.cs rename to src/Byndyusoft.Messaging.RabbitMq.Abstractions/Diagnostics/Consts/EventNames.cs diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientEvents.Events.cs b/src/Byndyusoft.Messaging.RabbitMq.Abstractions/Diagnostics/RabbitMqClientEvents.cs similarity index 100% rename from src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientEvents.Events.cs rename to src/Byndyusoft.Messaging.RabbitMq.Abstractions/Diagnostics/RabbitMqClientEvents.cs From 1d7114ea5d9e08eb58a38206a80eac911097a4d3 Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Mon, 25 Dec 2023 14:11:51 +0500 Subject: [PATCH 19/40] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D1=83=20?= =?UTF-8?q?=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D1=8F,=20=D1=81=D0=B2?= =?UTF-8?q?=D1=8F=D0=B7=D0=B0=D0=BD=D0=BD=D1=83=D1=8E=20=D1=81=20=D1=87?= =?UTF-8?q?=D1=82=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=BC=D0=BE=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Diagnostics/Consts/EventNames.cs | 1 + .../Diagnostics/RabbitMqClientEvents.cs | 6 ++++++ .../RabbitMqClientJsonExtensions.cs | 4 ++++ 3 files changed, 11 insertions(+) diff --git a/src/Byndyusoft.Messaging.RabbitMq.Abstractions/Diagnostics/Consts/EventNames.cs b/src/Byndyusoft.Messaging.RabbitMq.Abstractions/Diagnostics/Consts/EventNames.cs index 7d8d732..13e06ef 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Abstractions/Diagnostics/Consts/EventNames.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Abstractions/Diagnostics/Consts/EventNames.cs @@ -5,6 +5,7 @@ public class EventNames public static string MessagePublishing = "Byndyusoft.RabbitMq.Message.Publishing"; public static string MessageReturned = "Byndyusoft.RabbitMq.Message.Returned"; public static string MessageGot = "Byndyusoft.RabbitMq.Message.Got"; + public static string MessageModelRead = "Byndyusoft.RabbitMq.Message.ModelRead"; public static string MessageReplied = "Byndyusoft.RabbitMq.Message.Replied"; public static string MessageConsumed = "Byndyusoft.RabbitMq.Message.Consumed"; public static string UnhandledException = "Byndyusoft.RabbitMq.UnhandledException"; diff --git a/src/Byndyusoft.Messaging.RabbitMq.Abstractions/Diagnostics/RabbitMqClientEvents.cs b/src/Byndyusoft.Messaging.RabbitMq.Abstractions/Diagnostics/RabbitMqClientEvents.cs index 4122b8e..0996c03 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Abstractions/Diagnostics/RabbitMqClientEvents.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Abstractions/Diagnostics/RabbitMqClientEvents.cs @@ -43,5 +43,11 @@ public static void OnUnhandledException(Exception exception) if (EventLogger.IsEnabled(EventNames.UnhandledException)) EventLogger.Write(EventNames.UnhandledException, exception); } + + public static void OnMessageModelRead(object? model) + { + if (EventLogger.IsEnabled(EventNames.MessageModelRead)) + EventLogger.Write(EventNames.MessageModelRead, model); + } } } \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Abstractions/RabbitMqClientJsonExtensions.cs b/src/Byndyusoft.Messaging.RabbitMq.Abstractions/RabbitMqClientJsonExtensions.cs index c349584..5fae257 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Abstractions/RabbitMqClientJsonExtensions.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Abstractions/RabbitMqClientJsonExtensions.cs @@ -3,6 +3,7 @@ using System.Text.Json; using System.Threading; using System.Threading.Tasks; +using Byndyusoft.Messaging.RabbitMq.Diagnostics; using Byndyusoft.Messaging.RabbitMq.Utils; namespace Byndyusoft.Messaging.RabbitMq @@ -51,6 +52,7 @@ public static IRabbitMqConsumer SubscribeAsJson(this IRabbitMqClient client, async Task OnMessage(ReceivedRabbitMqMessage message, CancellationToken token) { var model = await message.Content.ReadFromJsonAsync(options, token).ConfigureAwait(false); + RabbitMqClientEvents.OnMessageModelRead(model); var result = await onMessage(model, token).ConfigureAwait(false); return result; } @@ -90,6 +92,7 @@ public static IRabbitMqConsumer SubscribeAsJson(this IRabbitMqClient client, async Task OnMessage(ReceivedRabbitMqMessage message, CancellationToken token) { var model = await message.Content.ReadFromJsonAsync(options, token).ConfigureAwait(false); + RabbitMqClientEvents.OnMessageModelRead(model); var result = await onMessage(model, token).ConfigureAwait(false); return result; } @@ -131,6 +134,7 @@ async Task OnMessage(ReceivedRabbitMqMessage message, CancellationTok { var request = await message.Content.ReadFromJsonAsync(options, token) .ConfigureAwait(false); + RabbitMqClientEvents.OnMessageModelRead(request); var response = await onMessage(request, token) .ConfigureAwait(false); return RpcResult.Success(JsonContent.Create(response, options: options)); From 4b083c0e236820b9e26fea2e489b2281fd9b714f Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Mon, 25 Dec 2023 14:27:00 +0500 Subject: [PATCH 20/40] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D1=83?= =?UTF-8?q?=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D1=8F=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BC=D0=BE=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Example.ConsoleApp.csproj | 2 +- ...ft.Messaging.RabbitMq.OpenTelemetry.csproj | 6 +++-- .../RabbitMqListener.cs | 27 +++++++++++++++++-- .../Settings/RabbitMqTracingOptions.cs | 19 ++++++++++--- 4 files changed, 46 insertions(+), 8 deletions(-) diff --git a/example/Example.ConsoleApp.csproj b/example/Example.ConsoleApp.csproj index ffbd476..6d0c5fd 100644 --- a/example/Example.ConsoleApp.csproj +++ b/example/Example.ConsoleApp.csproj @@ -13,7 +13,7 @@ - + diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj index 0b51a78..34cebfa 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj @@ -7,9 +7,11 @@ - + + + - + diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs index 0024a83..2ec5e12 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs @@ -7,6 +7,9 @@ using Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Base; using Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Serialization; using Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Settings; +using Byndyusoft.Telemetry; +using Byndyusoft.Telemetry.Logging; +using Byndyusoft.Telemetry.OpenTelemetry; using Microsoft.Extensions.Logging; namespace Byndyusoft.Messaging.RabbitMq.OpenTelemetry @@ -49,14 +52,16 @@ public override void OnEventWritten(string name, object? payload) OnMessageConsumed(activity, payload); else if (name.Equals(EventNames.UnhandledException)) OnUnhandledException(activity, payload); + else if (name.Equals(EventNames.MessageModelRead)) + OnMessageModelRead(activity, payload); } private bool IsProcessingNeeded(Activity? activity) { - if (_options.LogEventsInLogs) + if (_options.LogEventsInLogs || _options.EnrichLogsWithParams) return true; - return activity is not null && _options.LogEventsInTrace; + return activity is not null && (_options.LogEventsInTrace || _options.TagRequestParamsInTrace); } private void OnMessagePublishing(Activity? activity, object? payload) @@ -109,6 +114,8 @@ private void OnMessageReturned(Activity? activity, object? payload) private void OnMessageGot(Activity? activity, object? payload) { + LogPropertyDataAccessor.InitAsyncContext(); + var eventItems = BuildMessageConsumingEventItems(payload, _options.DiagnosticsOptions); Log(activity, eventItems, "message.got"); } @@ -193,6 +200,22 @@ private void OnUnhandledException(Activity? activity, object? payload) return eventItems; } + private void OnMessageModelRead(Activity? activity, object? payload) + { + if (_options.EnrichLogsWithParams == false && + (activity is null || _options.TagRequestParamsInTrace == false)) + return; + + var telemetryItems = + ObjectTelemetryItemsCollector.Collect("rabbitMqModel", payload, "amqp.message.params."); + + if (_options.EnrichLogsWithParams) + LogPropertyDataAccessor.AddTelemetryItems(telemetryItems); + + if (activity is not null && _options.TagRequestParamsInTrace) + ActivityTagEnricher.Enrich(activity, telemetryItems); + } + private void Log(Activity? activity, EventItem[]? eventItems, string eventName) { if (eventItems is null) diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqTracingOptions.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqTracingOptions.cs index 9e4b2ce..b8f731a 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqTracingOptions.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqTracingOptions.cs @@ -4,6 +4,15 @@ namespace Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Settings { public class RabbitMqTracingOptions { + public RabbitMqTracingOptions() + { + LogEventsInTrace = false; + LogEventsInLogs = true; + TagRequestParamsInTrace = true; + EnrichLogsWithParams = true; + RecordExceptions = true; + } + private RabbitMqDiagnosticsOptions _diagnosticsOptions = new(); public RabbitMqDiagnosticsOptions DiagnosticsOptions @@ -12,10 +21,14 @@ public RabbitMqDiagnosticsOptions DiagnosticsOptions set => _diagnosticsOptions = Preconditions.CheckNotNull(value, nameof(RabbitMqDiagnosticsOptions)); } - public bool LogEventsInTrace { get; set; } = false; + public bool LogEventsInTrace { get; set; } + + public bool LogEventsInLogs { get; set; } + + public bool TagRequestParamsInTrace { get; set; } - public bool LogEventsInLogs { get; set; } = true; + public bool EnrichLogsWithParams { get; set; } - public bool RecordExceptions { get; set; } = true; + public bool RecordExceptions { get; set; } } } \ No newline at end of file From e20dcbfe92bcd0a6894624ec53c7b6220ef622d9 Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Mon, 25 Dec 2023 14:40:18 +0500 Subject: [PATCH 21/40] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D1=8E=20=D0=BE=D0=B1=20=D0=BE=D1=87=D0=B5=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RabbitMqListener.cs | 24 +++++++++++++++++-- .../Settings/RabbitMqTracingOptions.cs | 3 +++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs index 2ec5e12..1cb564e 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs @@ -58,7 +58,7 @@ public override void OnEventWritten(string name, object? payload) private bool IsProcessingNeeded(Activity? activity) { - if (_options.LogEventsInLogs || _options.EnrichLogsWithParams) + if (_options.LogEventsInLogs || _options.EnrichLogsWithParams || _options.EnrichLogsWithQueueInfo) return true; return activity is not null && (_options.LogEventsInTrace || _options.TagRequestParamsInTrace); @@ -114,12 +114,30 @@ private void OnMessageReturned(Activity? activity, object? payload) private void OnMessageGot(Activity? activity, object? payload) { - LogPropertyDataAccessor.InitAsyncContext(); + EnrichLogsWithQueueInfo(payload); var eventItems = BuildMessageConsumingEventItems(payload, _options.DiagnosticsOptions); Log(activity, eventItems, "message.got"); } + private void EnrichLogsWithQueueInfo(object? payload) + { + if (_options.EnrichLogsWithQueueInfo == false) + return; + + var queueInfo = GetQueueInfo(payload); + if (queueInfo is not null) + LogPropertyDataAccessor.AddTelemetryItem(queueInfo.Name, queueInfo.Value); + } + + private EventItem? GetQueueInfo(object? payload) + { + if (payload is not ReceivedRabbitMqMessage message) + return null; + + return new EventItem("amqp.message.queue", message.Queue, QueueDescription); + } + private EventItem[]? BuildMessageConsumingEventItems(object? payload, RabbitMqDiagnosticsOptions options) { if (payload is null) @@ -153,6 +171,8 @@ private void OnMessageGot(Activity? activity, object? payload) private void OnMessageReplied(Activity? activity, object? payload) { + EnrichLogsWithQueueInfo(payload); + var eventItems = BuildMessageConsumingEventItems(payload, _options.DiagnosticsOptions); Log(activity, eventItems, "message.replied"); } diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqTracingOptions.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqTracingOptions.cs index b8f731a..f38237e 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqTracingOptions.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqTracingOptions.cs @@ -10,6 +10,7 @@ public RabbitMqTracingOptions() LogEventsInLogs = true; TagRequestParamsInTrace = true; EnrichLogsWithParams = true; + EnrichLogsWithQueueInfo = true; RecordExceptions = true; } @@ -29,6 +30,8 @@ public RabbitMqDiagnosticsOptions DiagnosticsOptions public bool EnrichLogsWithParams { get; set; } + public bool EnrichLogsWithQueueInfo { get; set; } + public bool RecordExceptions { get; set; } } } \ No newline at end of file From 432a666c60221f2246d287829d6992d5a8ec4a6d Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Mon, 25 Dec 2023 14:42:44 +0500 Subject: [PATCH 22/40] =?UTF-8?q?=D0=A3=D0=B2=D0=B5=D0=BB=D0=B8=D1=87?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Byndyusoft.Messaging.RabbitMq.Core.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj b/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj index 4cef2db..e6ae56d 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj @@ -7,7 +7,7 @@ - + From 3a7c71a71388b35b915932ecbc18bb599b8bf630 Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Mon, 25 Dec 2023 15:14:16 +0500 Subject: [PATCH 23/40] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BD=D0=B5=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D1=83?= =?UTF-8?q?=D0=B5=D0=BC=D1=8B=D0=B9=20Source?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Program.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/example/Program.cs b/example/Program.cs index 86b3f00..b7e304b 100644 --- a/example/Program.cs +++ b/example/Program.cs @@ -1,4 +1,3 @@ -using System.Diagnostics; using System.Threading.Tasks; using Byndyusoft.Net.RabbitMq.HostedServices; using Microsoft.Extensions.Configuration; @@ -12,8 +11,6 @@ namespace Byndyusoft.Net.RabbitMq { public static class Program { - private static readonly ActivitySource ActivitySource = new(nameof(Program)); - public static async Task Main(string[] args) { await CreateHostBuilder(args).RunConsoleAsync(); From 8649320ac0d69bd81a94a42ee1171d58ad35c8a0 Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Mon, 25 Dec 2023 15:44:08 +0500 Subject: [PATCH 24/40] =?UTF-8?q?=D0=A3=D0=B2=D0=B5=D0=BB=D0=B8=D1=87?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index 21aacaf..dbeab04 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - 0.6.3 + 0.7.0 Byndyusoft Byndyusoft;RabbitMq https://github.com/Byndyusoft/Byndyusoft.Net.RabbitMq From 380a7558a711cec0f53805ad9a4637b0011df744 Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Fri, 26 Jan 2024 10:58:45 +0500 Subject: [PATCH 25/40] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BC=D0=B0=D1=81=D0=BA=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B2=20=D1=82=D0=B5=D0=BB=D0=B5=D0=BC?= =?UTF-8?q?=D0=B5=D1=82=D1=80=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj | 3 ++- .../Settings/RabbitMqDiagnosticsOptions.cs | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj index 34cebfa..fdcf4e8 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;netstandard2.1 @@ -7,6 +7,7 @@ + diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqDiagnosticsOptions.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqDiagnosticsOptions.cs index e1b743a..8cdcdd3 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqDiagnosticsOptions.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqDiagnosticsOptions.cs @@ -1,5 +1,6 @@ using System.Text.Json; using System.Text.Json.Serialization; +using Byndyusoft.MaskedSerialization.Extensions; using Byndyusoft.Messaging.RabbitMq.Utils; namespace Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Settings @@ -14,7 +15,10 @@ public class RabbitMqDiagnosticsOptions public RabbitMqDiagnosticsOptions() { _jsonSerializerOptions = new JsonSerializerOptions - {DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull}; + { + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull + }; + _jsonSerializerOptions.SetupSettingsForMaskedSerialization(); _jsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); _valueMaxStringLength = DefaultValueMaxStringLength; } From cb1bf805e7c3e9228f48d23557edd2824ecda206 Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Fri, 26 Jan 2024 13:07:31 +0500 Subject: [PATCH 26/40] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BB=D0=BE=D0=B3=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8=20=D0=B2?= =?UTF-8?q?=D0=BC=D0=B5=D1=81=D1=82=D0=BE=20=D1=81=D1=8B=D1=80=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=B0=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=BC=D0=B0=D1=81=D0=BA=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RabbitMqListener.cs | 63 +++++++++++++------ .../Settings/LogContentType.cs | 11 ++++ .../Settings/RabbitMqTracingOptions.cs | 3 + 3 files changed, 59 insertions(+), 18 deletions(-) create mode 100644 src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/LogContentType.cs diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs index 1cb564e..4189331 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using System.Text; using Byndyusoft.Messaging.RabbitMq.Diagnostics; using Byndyusoft.Messaging.RabbitMq.Diagnostics.Consts; @@ -116,7 +117,7 @@ private void OnMessageGot(Activity? activity, object? payload) { EnrichLogsWithQueueInfo(payload); - var eventItems = BuildMessageConsumingEventItems(payload, _options.DiagnosticsOptions); + var eventItems = BuildMessageConsumingEventItems(payload); Log(activity, eventItems, "message.got"); } @@ -138,7 +139,7 @@ private void EnrichLogsWithQueueInfo(object? payload) return new EventItem("amqp.message.queue", message.Queue, QueueDescription); } - private EventItem[]? BuildMessageConsumingEventItems(object? payload, RabbitMqDiagnosticsOptions options) + private EventItem[]? BuildMessageConsumingEventItems(object? payload) { if (payload is null) { @@ -151,29 +152,35 @@ private void EnrichLogsWithQueueInfo(object? payload) if (payload is not ReceivedRabbitMqMessage message) return null; - var eventItems = new EventItem[] - { - new("amqp.message.content", message.Content.ReadAsStringAsync().GetAwaiter().GetResult(), - ContentDescription), - new("amqp.message.exchange", message.Exchange, ExchangeDescription), - new("amqp.message.queue", message.Queue, QueueDescription), - new("amqp.message.routing_key", message.RoutingKey, RoutingKeyDescription), - new("amqp.message.delivery_tag", message.DeliveryTag, "DeliveryTag"), - new("amqp.message.redelivered", message.Redelivered, "Redelivered"), - new("amqp.message.consumer_tag", message.ConsumerTag, "ConsumerTag"), - new("amqp.message.retry_count", message.RetryCount, "RetryCount"), - new("amqp.message.properties", JsonSerializer.Serialize(message.Properties, options), - PropertiesDescription) - }; + return EnumerateMessageConsumingEventItems(message).ToArray(); + } - return eventItems; + private IEnumerable EnumerateMessageConsumingEventItems(ReceivedRabbitMqMessage message) + { + if (_options.LogContentType == LogContentType.RawString) + yield return new EventItem( + "amqp.message.content.raw", + message.Content.ReadAsStringAsync().GetAwaiter().GetResult(), + ContentDescription); + + yield return new EventItem("amqp.message.exchange", message.Exchange, ExchangeDescription); + yield return new EventItem("amqp.message.queue", message.Queue, QueueDescription); + yield return new EventItem("amqp.message.routing_key", message.RoutingKey, RoutingKeyDescription); + yield return new EventItem("amqp.message.delivery_tag", message.DeliveryTag, "DeliveryTag"); + yield return new EventItem("amqp.message.redelivered", message.Redelivered, "Redelivered"); + yield return new EventItem("amqp.message.consumer_tag", message.ConsumerTag, "ConsumerTag"); + yield return new EventItem("amqp.message.retry_count", message.RetryCount, "RetryCount"); + yield return new EventItem( + "amqp.message.properties", + JsonSerializer.Serialize(message.Properties, _options.DiagnosticsOptions), + PropertiesDescription); } private void OnMessageReplied(Activity? activity, object? payload) { EnrichLogsWithQueueInfo(payload); - var eventItems = BuildMessageConsumingEventItems(payload, _options.DiagnosticsOptions); + var eventItems = BuildMessageConsumingEventItems(payload); Log(activity, eventItems, "message.replied"); } @@ -221,6 +228,12 @@ private void OnUnhandledException(Activity? activity, object? payload) } private void OnMessageModelRead(Activity? activity, object? payload) + { + EnrichWithModelTelemetryItems(activity, payload); + LogModelRead(activity, payload); + } + + private void EnrichWithModelTelemetryItems(Activity? activity, object? payload) { if (_options.EnrichLogsWithParams == false && (activity is null || _options.TagRequestParamsInTrace == false)) @@ -236,6 +249,20 @@ private void OnMessageModelRead(Activity? activity, object? payload) ActivityTagEnricher.Enrich(activity, telemetryItems); } + private void LogModelRead(Activity? activity, object? payload) + { + if (_options.LogContentType != LogContentType.ReadModel) + return; + + var eventItems = new EventItem[] + { + new("amqp.message.content.model", + JsonSerializer.Serialize(payload, _options.DiagnosticsOptions), + ContentDescription) + }; + Log(activity, eventItems, "message.model.read"); + } + private void Log(Activity? activity, EventItem[]? eventItems, string eventName) { if (eventItems is null) diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/LogContentType.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/LogContentType.cs new file mode 100644 index 0000000..ce0a891 --- /dev/null +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/LogContentType.cs @@ -0,0 +1,11 @@ +namespace Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Settings +{ + public enum LogContentType + { + DoNotLog, + + RawString, + + ReadModel + } +} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqTracingOptions.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqTracingOptions.cs index f38237e..76eacde 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqTracingOptions.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/RabbitMqTracingOptions.cs @@ -12,6 +12,7 @@ public RabbitMqTracingOptions() EnrichLogsWithParams = true; EnrichLogsWithQueueInfo = true; RecordExceptions = true; + LogContentType = LogContentType.ReadModel; } private RabbitMqDiagnosticsOptions _diagnosticsOptions = new(); @@ -33,5 +34,7 @@ public RabbitMqDiagnosticsOptions DiagnosticsOptions public bool EnrichLogsWithQueueInfo { get; set; } public bool RecordExceptions { get; set; } + + public LogContentType LogContentType { get; set; } } } \ No newline at end of file From ab1b9db3c576bbdb3fb069d13192958af5823d4b Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Fri, 26 Jan 2024 13:16:09 +0500 Subject: [PATCH 27/40] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/HostedServices/SubscribeAsMessagePackExample.cs | 4 +++- example/Message.cs | 7 ++++++- example/Program.cs | 1 + .../Settings/LogContentType.cs | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/example/HostedServices/SubscribeAsMessagePackExample.cs b/example/HostedServices/SubscribeAsMessagePackExample.cs index f941995..42526af 100644 --- a/example/HostedServices/SubscribeAsMessagePackExample.cs +++ b/example/HostedServices/SubscribeAsMessagePackExample.cs @@ -4,6 +4,7 @@ using System.Threading; using System.Threading.Tasks; using Byndyusoft.Messaging.RabbitMq; +using Byndyusoft.Messaging.RabbitMq.Diagnostics; using Byndyusoft.Messaging.RabbitMq.Utils; using MessagePack; using Microsoft.Extensions.Hosting; @@ -25,6 +26,7 @@ async Task OnMessage(ReceivedRabbitMqMessage message, Cancellatio { var model = await message.Content.ReadFromMessagePackAsync(options, token) .ConfigureAwait(false); + RabbitMqClientEvents.OnMessageModelRead(model); var result = await onMessage(model, token).ConfigureAwait(false); return result; } @@ -83,7 +85,7 @@ await Task.Run(async () => var rand = new Random(); while (stoppingToken.IsCancellationRequested == false) { - var message = new Message { Property = "messagepack-example" }; + var message = new Message { Property = "messagepack-example", Secret = "pwd" }; await _rabbitMqClient.PublishAsMessagePackAsync(null, queueName, message, null, stoppingToken); await Task.Delay(TimeSpan.FromSeconds(rand.NextDouble()), stoppingToken); } diff --git a/example/Message.cs b/example/Message.cs index 4e1a51f..800655a 100644 --- a/example/Message.cs +++ b/example/Message.cs @@ -1,7 +1,12 @@ +using Byndyusoft.MaskedSerialization.Annotations.Attributes; +using Byndyusoft.Telemetry.Abstraction.Attributes; + namespace Byndyusoft.Net.RabbitMq { public class Message { - public string Property { get; set; } = default!; + [TelemetryItem] public string Property { get; set; } = default!; + + [Masked] public string Secret { get; set; } = default!; } } \ No newline at end of file diff --git a/example/Program.cs b/example/Program.cs index b7e304b..eb998a6 100644 --- a/example/Program.cs +++ b/example/Program.cs @@ -1,4 +1,5 @@ using System.Threading.Tasks; +using Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Settings; using Byndyusoft.Net.RabbitMq.HostedServices; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/LogContentType.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/LogContentType.cs index ce0a891..10539bc 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/LogContentType.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Settings/LogContentType.cs @@ -2,7 +2,7 @@ namespace Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Settings { public enum LogContentType { - DoNotLog, + Skip, RawString, From e7fef205dedeec67b0c8f7b63629997b3740da34 Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Fri, 26 Jan 2024 13:17:07 +0500 Subject: [PATCH 28/40] =?UTF-8?q?=D0=98=D0=B7=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D1=81=D1=8F=20=D0=BE=D1=82=20=D0=B2=D0=BE=D1=80=D0=BD?= =?UTF-8?q?=D0=B8=D0=BD=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Program.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/example/Program.cs b/example/Program.cs index eb998a6..b7e304b 100644 --- a/example/Program.cs +++ b/example/Program.cs @@ -1,5 +1,4 @@ using System.Threading.Tasks; -using Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Settings; using Byndyusoft.Net.RabbitMq.HostedServices; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; From c94f953862e3565749d4143ce512859c10935697 Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Fri, 26 Jan 2024 14:57:13 +0500 Subject: [PATCH 29/40] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D0=B0=D0=BA=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj index fdcf4e8..1eba52f 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj @@ -7,7 +7,7 @@ - + From 0f49a8dcc5379d7df4d9494d542e9c444d298c3b Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Fri, 26 Jan 2024 15:32:07 +0500 Subject: [PATCH 30/40] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=B7=D0=B0=D0=B3=D0=BE=D0=BB=D0=BE=D0=B2=D0=BE?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B5=D0=BD=D0=B4?= =?UTF-8?q?=D0=B5=D1=80=D0=B8=D0=BD=D0=B3=D0=B0=20=D0=BB=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RabbitMqListener.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs index 4189331..a38c18c 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs @@ -161,7 +161,7 @@ private IEnumerable EnumerateMessageConsumingEventItems(ReceivedRabbi yield return new EventItem( "amqp.message.content.raw", message.Content.ReadAsStringAsync().GetAwaiter().GetResult(), - ContentDescription); + "RawContent"); yield return new EventItem("amqp.message.exchange", message.Exchange, ExchangeDescription); yield return new EventItem("amqp.message.queue", message.Queue, QueueDescription); @@ -258,7 +258,7 @@ private void LogModelRead(Activity? activity, object? payload) { new("amqp.message.content.model", JsonSerializer.Serialize(payload, _options.DiagnosticsOptions), - ContentDescription) + "ModelRead") }; Log(activity, eventItems, "message.model.read"); } From 981c069e2420b7caf1deb97a7964590aaad5a26b Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Tue, 30 Jan 2024 11:26:17 +0500 Subject: [PATCH 31/40] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80=D0=BD?= =?UTF-8?q?=D0=BE=D0=B5=20=D0=BB=D0=BE=D0=B3=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Example.ConsoleApp.csproj | 1 + example/Program.cs | 74 +++++++++++-------- example/appsettings.json | 10 +++ nuget.config | 12 --- .../Diagnostics/EventItem.cs | 18 ----- ...ft.Messaging.RabbitMq.OpenTelemetry.csproj | 1 + .../RabbitMqListener.cs | 67 ++++++++--------- 7 files changed, 84 insertions(+), 99 deletions(-) create mode 100644 example/appsettings.json delete mode 100644 nuget.config delete mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/EventItem.cs diff --git a/example/Example.ConsoleApp.csproj b/example/Example.ConsoleApp.csproj index 6d0c5fd..5f6b344 100644 --- a/example/Example.ConsoleApp.csproj +++ b/example/Example.ConsoleApp.csproj @@ -7,6 +7,7 @@ + diff --git a/example/Program.cs b/example/Program.cs index b7e304b..caea7a3 100644 --- a/example/Program.cs +++ b/example/Program.cs @@ -1,6 +1,7 @@ using System.Threading.Tasks; using Byndyusoft.Net.RabbitMq.HostedServices; -using Microsoft.Extensions.Configuration; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; @@ -19,15 +20,23 @@ public static async Task Main(string[] args) private static IHostBuilder CreateHostBuilder(string[] args) { return Host.CreateDefaultBuilder(args) - .ConfigureHostOptions(options => + .ConfigureWebHostDefaults(webBuilder => { - options.BackgroundServiceExceptionBehavior = BackgroundServiceExceptionBehavior.Ignore; - }) - .ConfigureLogging(log => log.AddConsole()) - .ConfigureAppConfiguration(configuration => { configuration.AddJsonFile("appsettings.json", true); }) - .ConfigureServices((_, services) => - { - services.AddOpenTelemetry() + webBuilder.UseStartup(); + webBuilder.ConfigureLogging(i => i.AddConsole()); + //webBuilder.UseSerilog((context, configuration) => configuration + // .UseDefaultSettings(context.Configuration) + // .UseOpenTelemetryTraces() + // .WriteToOpenTelemetry(activityEventBuilder: StructuredActivityEventBuilder.Instance)); + }); + } + } + + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddOpenTelemetry() .WithTracing(builder => builder .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("Byndyusoft.Net.RabbitMq")) .AddJaegerExporter(jaeger => @@ -41,35 +50,38 @@ private static IHostBuilder CreateHostBuilder(string[] args) o.LogEventsInLogs = true; o.RecordExceptions = true; })); - services.AddRabbitMqRpc(); - services.AddSingleton(); - services.AddRpcService(); + services.AddRabbitMqRpc(); + services.AddSingleton(); + services.AddRpcService(); - //services.AddHostedService(); - //services.AddHostedService(); - //services.AddHostedService(); + //services.AddHostedService(); + //services.AddHostedService(); + //services.AddHostedService(); - services.AddHostedService(); + services.AddHostedService(); - //services.AddHostedService(); - //services.AddHostedService(); - //services.AddHostedService(); - //services.AddHostedService(); - //services.AddHostedService(); + //services.AddHostedService(); + //services.AddHostedService(); + //services.AddHostedService(); + //services.AddHostedService(); + //services.AddHostedService(); - //services.AddHostedService(); + //services.AddHostedService(); - services.AddRabbitMqClient("host=localhost;username=guest;password=guest"); + services.AddRabbitMqClient("host=localhost;username=guest;password=guest"); - //services.AddRabbitMqClient("client-factory", "host=localhost;username=guest;password=guest"); - //services.AddInMemoryRabbitMqClient(); + //services.AddRabbitMqClient("client-factory", "host=localhost;username=guest;password=guest"); + //services.AddInMemoryRabbitMqClient(); - services.BuildServiceProvider(new ServiceProviderOptions - { - ValidateOnBuild = true, - ValidateScopes = true - }); - }); + services.BuildServiceProvider(new ServiceProviderOptions + { + ValidateOnBuild = true, + ValidateScopes = true + }); + } + + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { } } } \ No newline at end of file diff --git a/example/appsettings.json b/example/appsettings.json new file mode 100644 index 0000000..222224e --- /dev/null +++ b/example/appsettings.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "AllowedHosts": "*" +} \ No newline at end of file diff --git a/nuget.config b/nuget.config deleted file mode 100644 index 2b3b65a..0000000 --- a/nuget.config +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/EventItem.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/EventItem.cs deleted file mode 100644 index 2f677bb..0000000 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/EventItem.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace Byndyusoft.Messaging.RabbitMq.Diagnostics -{ - public class EventItem - { - public string Name { get; } - - public object? Value { get; } - - public string Description { get; } - - public EventItem(string name, object? value, string description) - { - Name = name; - Value = value; - Description = description; - } - } -} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj index 1eba52f..43444a1 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj @@ -7,6 +7,7 @@ + diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs index a38c18c..48a8f9f 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs @@ -2,8 +2,8 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; -using System.Text; -using Byndyusoft.Messaging.RabbitMq.Diagnostics; +using Byndyusoft.Logging; +using Byndyusoft.Logging.Extensions; using Byndyusoft.Messaging.RabbitMq.Diagnostics.Consts; using Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Base; using Byndyusoft.Messaging.RabbitMq.OpenTelemetry.Serialization; @@ -71,12 +71,12 @@ private void OnMessagePublishing(Activity? activity, object? payload) Log(activity, eventItems, "message.publishing"); } - private EventItem[]? BuildMessagePublishingEventItems(object? payload, RabbitMqDiagnosticsOptions options) + private StructuredActivityEventItem[]? BuildMessagePublishingEventItems(object? payload, RabbitMqDiagnosticsOptions options) { if (payload is not RabbitMqMessage message) return null; - var eventItems = new EventItem[] + var eventItems = new StructuredActivityEventItem[] { new("amqp.message.exchange", message.Exchange ?? string.Empty, ExchangeDescription), new("amqp.message.routing_key", message.RoutingKey, RoutingKeyDescription), @@ -94,12 +94,12 @@ private void OnMessageReturned(Activity? activity, object? payload) Log(activity, eventItems, "message.returned"); } - private EventItem[]? BuildMessageReturnedEventItems(object? payload, RabbitMqDiagnosticsOptions options) + private StructuredActivityEventItem[]? BuildMessageReturnedEventItems(object? payload, RabbitMqDiagnosticsOptions options) { if (payload is not ReturnedRabbitMqMessage message) return null; - var eventItems = new EventItem[] + var eventItems = new StructuredActivityEventItem[] { new("amqp.message.exchange", message.Exchange ?? string.Empty, ExchangeDescription), new("amqp.message.routing_key", message.RoutingKey, RoutingKeyDescription), @@ -131,19 +131,19 @@ private void EnrichLogsWithQueueInfo(object? payload) LogPropertyDataAccessor.AddTelemetryItem(queueInfo.Name, queueInfo.Value); } - private EventItem? GetQueueInfo(object? payload) + private StructuredActivityEventItem? GetQueueInfo(object? payload) { if (payload is not ReceivedRabbitMqMessage message) return null; - return new EventItem("amqp.message.queue", message.Queue, QueueDescription); + return new StructuredActivityEventItem("amqp.message.queue", message.Queue, QueueDescription); } - private EventItem[]? BuildMessageConsumingEventItems(object? payload) + private StructuredActivityEventItem[]? BuildMessageConsumingEventItems(object? payload) { if (payload is null) { - return new EventItem[] + return new StructuredActivityEventItem[] { new("amqp.message", null, "Message") }; @@ -155,22 +155,22 @@ private void EnrichLogsWithQueueInfo(object? payload) return EnumerateMessageConsumingEventItems(message).ToArray(); } - private IEnumerable EnumerateMessageConsumingEventItems(ReceivedRabbitMqMessage message) + private IEnumerable EnumerateMessageConsumingEventItems(ReceivedRabbitMqMessage message) { if (_options.LogContentType == LogContentType.RawString) - yield return new EventItem( + yield return new StructuredActivityEventItem( "amqp.message.content.raw", message.Content.ReadAsStringAsync().GetAwaiter().GetResult(), "RawContent"); - yield return new EventItem("amqp.message.exchange", message.Exchange, ExchangeDescription); - yield return new EventItem("amqp.message.queue", message.Queue, QueueDescription); - yield return new EventItem("amqp.message.routing_key", message.RoutingKey, RoutingKeyDescription); - yield return new EventItem("amqp.message.delivery_tag", message.DeliveryTag, "DeliveryTag"); - yield return new EventItem("amqp.message.redelivered", message.Redelivered, "Redelivered"); - yield return new EventItem("amqp.message.consumer_tag", message.ConsumerTag, "ConsumerTag"); - yield return new EventItem("amqp.message.retry_count", message.RetryCount, "RetryCount"); - yield return new EventItem( + yield return new StructuredActivityEventItem("amqp.message.exchange", message.Exchange, ExchangeDescription); + yield return new StructuredActivityEventItem("amqp.message.queue", message.Queue, QueueDescription); + yield return new StructuredActivityEventItem("amqp.message.routing_key", message.RoutingKey, RoutingKeyDescription); + yield return new StructuredActivityEventItem("amqp.message.delivery_tag", message.DeliveryTag, "DeliveryTag"); + yield return new StructuredActivityEventItem("amqp.message.redelivered", message.Redelivered, "Redelivered"); + yield return new StructuredActivityEventItem("amqp.message.consumer_tag", message.ConsumerTag, "ConsumerTag"); + yield return new StructuredActivityEventItem("amqp.message.retry_count", message.RetryCount, "RetryCount"); + yield return new StructuredActivityEventItem( "amqp.message.properties", JsonSerializer.Serialize(message.Properties, _options.DiagnosticsOptions), PropertiesDescription); @@ -190,12 +190,12 @@ private void OnMessageConsumed(Activity? activity, object? payload) Log(activity, eventItems, "message.consumed"); } - private EventItem[]? BuildMessageConsumedEventItems(object? payload) + private StructuredActivityEventItem[]? BuildMessageConsumedEventItems(object? payload) { if (payload is not ConsumeResult result) return null; - var eventItems = new EventItem[] + var eventItems = new StructuredActivityEventItem[] { new("result", result.GetDescription(), "Result") }; @@ -212,12 +212,12 @@ private void OnUnhandledException(Activity? activity, object? payload) Log(activity, eventItems, "exception"); } - private EventItem[]? BuildUnhandledExceptionEventItems(object? payload) + private StructuredActivityEventItem[]? BuildUnhandledExceptionEventItems(object? payload) { if (payload is not Exception exception) return null; - var eventItems = new EventItem[] + var eventItems = new StructuredActivityEventItem[] { new("exception.type", exception.GetType().FullName, "Type"), new("exception.message", exception.Message, "Message"), @@ -254,7 +254,7 @@ private void LogModelRead(Activity? activity, object? payload) if (_options.LogContentType != LogContentType.ReadModel) return; - var eventItems = new EventItem[] + var eventItems = new StructuredActivityEventItem[] { new("amqp.message.content.model", JsonSerializer.Serialize(payload, _options.DiagnosticsOptions), @@ -263,7 +263,7 @@ private void LogModelRead(Activity? activity, object? payload) Log(activity, eventItems, "message.model.read"); } - private void Log(Activity? activity, EventItem[]? eventItems, string eventName) + private void Log(Activity? activity, StructuredActivityEventItem[]? eventItems, string eventName) { if (eventItems is null) return; @@ -275,7 +275,7 @@ private void Log(Activity? activity, EventItem[]? eventItems, string eventName) LogEventInLog(eventItems, eventName); } - private void LogEventInTrace(Activity activity, EventItem[] eventItems, string eventName) + private void LogEventInTrace(Activity activity, StructuredActivityEventItem[] eventItems, string eventName) { var tags = new ActivityTagsCollection(); foreach (var eventItem in eventItems) @@ -285,18 +285,9 @@ private void LogEventInTrace(Activity activity, EventItem[] eventItems, string e activity.AddEvent(activityEvent); } - private void LogEventInLog(EventItem[] eventItems, string logPrefix) + private void LogEventInLog(StructuredActivityEventItem[] eventItems, string eventName) { - var messageBuilder = new StringBuilder($"{logPrefix}: "); - var parameters = new List(); - foreach (var eventItem in eventItems) - { - var itemName = eventItem.Name.Replace('.', '_'); - messageBuilder.Append($"{eventItem.Description} = {{{itemName}}}; "); - parameters.Add(eventItem.Value); - } - - _logger.LogInformation(messageBuilder.ToString(), parameters.ToArray()); + _logger.LogStructuredActivityEvent(eventName, eventItems); } } } \ No newline at end of file From 31a8b3ed7940af0cb3aa68a8b6736804f620a50b Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Thu, 4 Apr 2024 13:58:06 +0500 Subject: [PATCH 32/40] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B8=D0=B7=D0=B2=D0=BB=D0=B5=D1=87=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Diagnostics/RabbitMqClientActivitySource.Activities.cs | 5 ++++- src/Byndyusoft.Messaging.RabbitMq.Core/RabbitMqClientCore.cs | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Activities.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Activities.cs index 138269c..b397e14 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Activities.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Activities.cs @@ -65,8 +65,11 @@ public RabbitMqClientActivitySourceActivities(RabbitMqClientActivitySource activ { var activity = _activitySource.StartActivity("Consume", endpoint, ActivityKind.Consumer); - if (activity is not {IsAllDataRequested: true}) + if (activity is not { IsAllDataRequested: true }) + { + ActivityContextPropagation.ExtractContext(activity, message.Headers); return activity; + } return activity; } diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/RabbitMqClientCore.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/RabbitMqClientCore.cs index f492d31..55bbd49 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/RabbitMqClientCore.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/RabbitMqClientCore.cs @@ -58,6 +58,10 @@ public RabbitMqClientCoreOptions Options { var message = await _handler.GetMessageAsync(queueName, cancellationToken) .ConfigureAwait(false); + + if (message != null) + ActivityContextPropagation.ExtractContext(activity, message.Headers); + RabbitMqClientEvents.OnMessageGot(message); return message; }); From bb83f5c40223bfa1ba3d84634789edd0a3d24e74 Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Thu, 23 May 2024 15:04:30 +0500 Subject: [PATCH 33/40] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BE?= =?UTF-8?q?=D1=88=D0=B8=D0=B1=D0=BA=D0=B8,=20=D1=81=D0=B2=D1=8F=D0=B7?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5=20=D1=81=203-=D0=BC=20=D0=B0?= =?UTF-8?q?=D1=80=D0=B3=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RabbitMqListener.cs | 65 ++++++++----------- 1 file changed, 27 insertions(+), 38 deletions(-) diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs index 48a8f9f..7b53f2c 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs @@ -17,12 +17,6 @@ namespace Byndyusoft.Messaging.RabbitMq.OpenTelemetry { public class RabbitMqListener : ListenerHandler { - private const string ExchangeDescription = "Exchange"; - private const string RoutingKeyDescription = "RoutingKey"; - private const string QueueDescription = "Queue"; - private const string ContentDescription = "RoutingKey"; - private const string PropertiesDescription = "RoutingKey"; - private readonly ILogger _logger; private readonly RabbitMqTracingOptions _options; @@ -78,11 +72,11 @@ private void OnMessagePublishing(Activity? activity, object? payload) var eventItems = new StructuredActivityEventItem[] { - new("amqp.message.exchange", message.Exchange ?? string.Empty, ExchangeDescription), - new("amqp.message.routing_key", message.RoutingKey, RoutingKeyDescription), - new("amqp.message.mandatory", message.Mandatory, "Mandatory"), - new("amqp.message.content", message.Content.ReadAsStringAsync().GetAwaiter().GetResult(), ContentDescription), - new("amqp.message.properties", JsonSerializer.Serialize(message.Properties, options), PropertiesDescription) + new("amqp.message.exchange", message.Exchange ?? string.Empty), + new("amqp.message.routing_key", message.RoutingKey), + new("amqp.message.mandatory", message.Mandatory), + new("amqp.message.content", message.Content.ReadAsStringAsync().GetAwaiter().GetResult()), + new("amqp.message.properties", JsonSerializer.Serialize(message.Properties, options)) }; return eventItems; @@ -101,13 +95,11 @@ private void OnMessageReturned(Activity? activity, object? payload) var eventItems = new StructuredActivityEventItem[] { - new("amqp.message.exchange", message.Exchange ?? string.Empty, ExchangeDescription), - new("amqp.message.routing_key", message.RoutingKey, RoutingKeyDescription), - new("amqp.message.return_reason", message.ReturnReason, "ReturnReason"), - new("amqp.message.content", message.Content.ReadAsStringAsync().GetAwaiter().GetResult(), - ContentDescription), - new("amqp.message.properties", JsonSerializer.Serialize(message.Properties, options), - PropertiesDescription) + new("amqp.message.exchange", message.Exchange ?? string.Empty), + new("amqp.message.routing_key", message.RoutingKey), + new("amqp.message.return_reason", message.ReturnReason), + new("amqp.message.content", message.Content.ReadAsStringAsync().GetAwaiter().GetResult()), + new("amqp.message.properties", JsonSerializer.Serialize(message.Properties, options)) }; return eventItems; @@ -136,7 +128,7 @@ private void EnrichLogsWithQueueInfo(object? payload) if (payload is not ReceivedRabbitMqMessage message) return null; - return new StructuredActivityEventItem("amqp.message.queue", message.Queue, QueueDescription); + return new StructuredActivityEventItem("amqp.message.queue", message.Queue); } private StructuredActivityEventItem[]? BuildMessageConsumingEventItems(object? payload) @@ -145,7 +137,7 @@ private void EnrichLogsWithQueueInfo(object? payload) { return new StructuredActivityEventItem[] { - new("amqp.message", null, "Message") + new("amqp.message", null) }; } @@ -160,20 +152,18 @@ private IEnumerable EnumerateMessageConsumingEventI if (_options.LogContentType == LogContentType.RawString) yield return new StructuredActivityEventItem( "amqp.message.content.raw", - message.Content.ReadAsStringAsync().GetAwaiter().GetResult(), - "RawContent"); - - yield return new StructuredActivityEventItem("amqp.message.exchange", message.Exchange, ExchangeDescription); - yield return new StructuredActivityEventItem("amqp.message.queue", message.Queue, QueueDescription); - yield return new StructuredActivityEventItem("amqp.message.routing_key", message.RoutingKey, RoutingKeyDescription); - yield return new StructuredActivityEventItem("amqp.message.delivery_tag", message.DeliveryTag, "DeliveryTag"); - yield return new StructuredActivityEventItem("amqp.message.redelivered", message.Redelivered, "Redelivered"); - yield return new StructuredActivityEventItem("amqp.message.consumer_tag", message.ConsumerTag, "ConsumerTag"); - yield return new StructuredActivityEventItem("amqp.message.retry_count", message.RetryCount, "RetryCount"); + message.Content.ReadAsStringAsync().GetAwaiter().GetResult()); + + yield return new StructuredActivityEventItem("amqp.message.exchange", message.Exchange); + yield return new StructuredActivityEventItem("amqp.message.queue", message.Queue); + yield return new StructuredActivityEventItem("amqp.message.routing_key", message.RoutingKey); + yield return new StructuredActivityEventItem("amqp.message.delivery_tag", message.DeliveryTag); + yield return new StructuredActivityEventItem("amqp.message.redelivered", message.Redelivered); + yield return new StructuredActivityEventItem("amqp.message.consumer_tag", message.ConsumerTag); + yield return new StructuredActivityEventItem("amqp.message.retry_count", message.RetryCount); yield return new StructuredActivityEventItem( "amqp.message.properties", - JsonSerializer.Serialize(message.Properties, _options.DiagnosticsOptions), - PropertiesDescription); + JsonSerializer.Serialize(message.Properties, _options.DiagnosticsOptions)); } private void OnMessageReplied(Activity? activity, object? payload) @@ -197,7 +187,7 @@ private void OnMessageConsumed(Activity? activity, object? payload) var eventItems = new StructuredActivityEventItem[] { - new("result", result.GetDescription(), "Result") + new("result", result.GetDescription()) }; return eventItems; @@ -219,9 +209,9 @@ private void OnUnhandledException(Activity? activity, object? payload) var eventItems = new StructuredActivityEventItem[] { - new("exception.type", exception.GetType().FullName, "Type"), - new("exception.message", exception.Message, "Message"), - new("exception.stacktrace", exception.ToString(), "StackTrace") + new("exception.type", exception.GetType().FullName), + new("exception.message", exception.Message), + new("exception.stacktrace", exception.ToString()) }; return eventItems; @@ -257,8 +247,7 @@ private void LogModelRead(Activity? activity, object? payload) var eventItems = new StructuredActivityEventItem[] { new("amqp.message.content.model", - JsonSerializer.Serialize(payload, _options.DiagnosticsOptions), - "ModelRead") + JsonSerializer.Serialize(payload, _options.DiagnosticsOptions)) }; Log(activity, eventItems, "message.model.read"); } From 7c60ca201550edd2553b91daa17bef250075593e Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Thu, 23 May 2024 15:42:50 +0500 Subject: [PATCH 34/40] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=81=D0=BB=D0=B5=20=D1=81=D0=BB=D0=B8=D1=8F=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...RabbitMqClientActivitySource.Activities.cs | 3 - .../RabbitMqClientActivitySource.Events.cs | 150 ------------------ .../RabbitMqClientCore.cs | 5 +- .../RabbitMqListener.cs | 74 ++++++--- 4 files changed, 53 insertions(+), 179 deletions(-) delete mode 100644 src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Activities.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Activities.cs index ceafd2d..940e2e4 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Activities.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Activities.cs @@ -63,10 +63,7 @@ public RabbitMqClientActivitySourceActivities(RabbitMqClientActivitySource activ var activity = _activitySource.StartConsumeActivity("Consume", endpoint, ActivityKind.Consumer, message.Headers); if (activity is not { IsAllDataRequested: true }) - { - ActivityContextPropagation.ExtractContext(activity, message.Headers); return activity; - } return activity; } diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs deleted file mode 100644 index 92f6259..0000000 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.Events.cs +++ /dev/null @@ -1,150 +0,0 @@ -using System.Diagnostics; -using Byndyusoft.Messaging.RabbitMq.Serialization; - -namespace Byndyusoft.Messaging.RabbitMq.Diagnostics -{ - public partial class RabbitMqClientActivitySource - { - public class RabbitMqClientActivitySourceEvents - { - private readonly RabbitMqClientActivitySource _activitySource; - - public RabbitMqClientActivitySourceEvents(RabbitMqClientActivitySource activitySource) - { - _activitySource = activitySource; - } - - public void MessagePublishing(Activity? activity, RabbitMqMessage message) - { - if (activity is null) - return; - - var tags = GetPublishedMessageEventTags(message); - var activityEvent = new ActivityEvent("message.publishing", tags: tags); - activity.AddEvent(activityEvent); - } - - public void MessageReturned(Activity? activity, ReturnedRabbitMqMessage message) - { - if (activity is null) - return; - - var tags = GetReturnedMessageEventTags(message); - var activityEvent = new ActivityEvent("message.returned", tags: tags); - activity.AddEvent(activityEvent); - } - - public void MessageGot(Activity? activity, ReceivedRabbitMqMessage? message) - { - if (activity is null) - return; - - var tags = GetConsumedMessageEventTags(message); - var activityEvent = new ActivityEvent("message.got", tags: tags); - activity.AddEvent(activityEvent); - } - - public void MessageReplied(Activity? activity, ReceivedRabbitMqMessage message) - { - if (activity is null) - return; - - var tags = GetConsumedMessageEventTags(message); - var activityEvent = new ActivityEvent("message.replied", tags: tags); - activity.AddEvent(activityEvent); - } - - public void MessageConsumed(Activity? activity, ReceivedRabbitMqMessage _, ConsumeResult result) - { - if (activity is null) - return; - - var tags = new ActivityTagsCollection {{"result", result.GetDescription()}}; - var activityEvent = new ActivityEvent("message.consumed", tags: tags); - activity.AddEvent(activityEvent); - } - - private ActivityTagsCollection GetReturnedMessageEventTags(ReturnedRabbitMqMessage message) - { - var tags = new ActivityTagsCollection(); - - // https://opentelemetry.io/docs/specs/semconv/attributes-registry/messaging/ - // https://opentelemetry.io/docs/specs/semconv/messaging/rabbitmq/ - tags.Add("messaging.operation", "return"); - tags.Add("messaging.system", "rabbitmq"); - tags.Add("messaging.message.client_id", message.Properties.AppId); - tags.Add("messaging.message.id", message.Properties.MessageId); - tags.Add("messaging.message.conversation_id", message.Properties.CorrelationId); - tags.Add("messaging.message.body", - message.Content.ReadAsStringAsync().GetAwaiter().GetResult()); - tags.Add("messaging.message.body.size", - message.Content.Headers.ContentLength); - tags.Add("messaging.rabbitmq.message.properties", - JsonSerializer.Serialize(message.Properties, _activitySource._options)); - tags.Add("messaging.rabbitmq.destination.exchange", message.Exchange ?? string.Empty); - tags.Add("messaging.rabbitmq.destination.routing_key", message.RoutingKey); - tags.Add("messaging.rabbitmq.return.reason", message.ReturnReason); - - return tags; - } - - private ActivityTagsCollection GetPublishedMessageEventTags(RabbitMqMessage message) - { - var tags = new ActivityTagsCollection(); - - // https://opentelemetry.io/docs/specs/semconv/attributes-registry/messaging/ - // https://opentelemetry.io/docs/specs/semconv/messaging/rabbitmq/ - tags.Add("messaging.operation", "publish"); - tags.Add("messaging.system", "rabbitmq"); - tags.Add("messaging.message.client_id", message.Properties.AppId); - tags.Add("messaging.message.id", message.Properties.MessageId); - tags.Add("messaging.message.conversation_id", message.Properties.CorrelationId); - tags.Add("messaging.message.body", - message.Content.ReadAsStringAsync().GetAwaiter().GetResult()); - tags.Add("messaging.message.body.size", - message.Content.Headers.ContentLength); - tags.Add("messaging.rabbitmq.message.properties", - JsonSerializer.Serialize(message.Properties, _activitySource._options)); - tags.Add("messaging.rabbitmq.destination.exchange", message.Exchange ?? string.Empty); - tags.Add("messaging.rabbitmq.destination.routing_key", message.RoutingKey); - tags.Add("messaging.rabbitmq.message.mandatory", message.Mandatory); - - return tags; - } - - private ActivityTagsCollection GetConsumedMessageEventTags(ReceivedRabbitMqMessage? message) - { - var tags = new ActivityTagsCollection(); - - if (message is null) - { - tags.Add("messaging.message", "null"); - } - else - { - // https://opentelemetry.io/docs/specs/semconv/attributes-registry/messaging/ - // https://opentelemetry.io/docs/specs/semconv/messaging/rabbitmq/ - tags.Add("messaging.operation", "receive"); - tags.Add("messaging.system", "rabbitmq"); - tags.Add("messaging.message.client_id", message.Properties.AppId); - tags.Add("messaging.message.id", message.Properties.MessageId); - tags.Add("messaging.message.conversation_id", message.Properties.CorrelationId); - tags.Add("messaging.message.body", - message.Content.ReadAsStringAsync().GetAwaiter().GetResult()); - tags.Add("messaging.message.body.size", - message.Content.Headers.ContentLength); - tags.Add("messaging.rabbitmq.message.properties", - JsonSerializer.Serialize(message.Properties, _activitySource._options)); - tags.Add("messaging.rabbitmq.destination.exchange", message.Exchange ?? string.Empty); - tags.Add("messaging.rabbitmq.destination.routing_key", message.RoutingKey); - tags.Add("messaging.rabbitmq.message.delivery_tag", message.DeliveryTag); - tags.Add("messaging.rabbitmq.message.redelivered", message.Redelivered); - tags.Add("messaging.rabbitmq.message.consumer_tag", message.ConsumerTag); - tags.Add("messaging.rabbitmq.message.retry_count", message.RetryCount); - } - - return tags; - } - } - } -} \ No newline at end of file diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/RabbitMqClientCore.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/RabbitMqClientCore.cs index dbfe90d..11ddc7c 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/RabbitMqClientCore.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/RabbitMqClientCore.cs @@ -33,7 +33,7 @@ protected RabbitMqClientCore(IRabbitMqClientHandler handler, bool disposeHandler _handler.MessageReturned += OnMessageReturned; _handler.Blocked += OnBlocked; _handler.Unblocked += OnUnblocked; - _activitySource = new RabbitMqClientActivitySource(options.DiagnosticsOptions); + _activitySource = new RabbitMqClientActivitySource(); _disposeHandler = disposeHandler; _rpcClient = new RabbitMqRpcClient(_handler, options); } @@ -74,9 +74,6 @@ public RabbitMqClientOptions Options var message = await _handler.GetMessageAsync(queueName, cancellationToken) .ConfigureAwait(false); - if (message != null) - ActivityContextPropagation.ExtractContext(activity, message.Headers); - RabbitMqClientEvents.OnMessageGot(message); return message; }); diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs index 7b53f2c..34cb644 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs @@ -70,13 +70,21 @@ private void OnMessagePublishing(Activity? activity, object? payload) if (payload is not RabbitMqMessage message) return null; + // https://opentelemetry.io/docs/specs/semconv/attributes-registry/messaging/ + // https://opentelemetry.io/docs/specs/semconv/messaging/rabbitmq/ var eventItems = new StructuredActivityEventItem[] { - new("amqp.message.exchange", message.Exchange ?? string.Empty), - new("amqp.message.routing_key", message.RoutingKey), - new("amqp.message.mandatory", message.Mandatory), - new("amqp.message.content", message.Content.ReadAsStringAsync().GetAwaiter().GetResult()), - new("amqp.message.properties", JsonSerializer.Serialize(message.Properties, options)) + new("messaging.operation", "publish"), + new("messaging.system", "rabbitmq"), + new("messaging.message.client_id", message.Properties.AppId), + new("messaging.message.id", message.Properties.MessageId), + new("messaging.message.conversation_id", message.Properties.CorrelationId), + new("messaging.message.body", message.Content.ReadAsStringAsync().GetAwaiter().GetResult()), + new("messaging.message.body.size", message.Content.Headers.ContentLength), + new("messaging.rabbitmq.message.properties", JsonSerializer.Serialize(message.Properties, options)), + new("messaging.rabbitmq.destination.exchange", message.Exchange ?? string.Empty), + new("messaging.rabbitmq.destination.routing_key", message.RoutingKey), + new("messaging.rabbitmq.message.mandatory", message.Mandatory) }; return eventItems; @@ -93,13 +101,21 @@ private void OnMessageReturned(Activity? activity, object? payload) if (payload is not ReturnedRabbitMqMessage message) return null; + // https://opentelemetry.io/docs/specs/semconv/attributes-registry/messaging/ + // https://opentelemetry.io/docs/specs/semconv/messaging/rabbitmq/ var eventItems = new StructuredActivityEventItem[] { - new("amqp.message.exchange", message.Exchange ?? string.Empty), - new("amqp.message.routing_key", message.RoutingKey), - new("amqp.message.return_reason", message.ReturnReason), - new("amqp.message.content", message.Content.ReadAsStringAsync().GetAwaiter().GetResult()), - new("amqp.message.properties", JsonSerializer.Serialize(message.Properties, options)) + new("messaging.operation", "return"), + new("messaging.system", "rabbitmq"), + new("messaging.message.client_id", message.Properties.AppId), + new("messaging.message.id", message.Properties.MessageId), + new("messaging.message.conversation_id", message.Properties.CorrelationId), + new("messaging.message.body", message.Content.ReadAsStringAsync().GetAwaiter().GetResult()), + new("messaging.message.body.size", message.Content.Headers.ContentLength), + new("messaging.rabbitmq.message.properties", JsonSerializer.Serialize(message.Properties, options)), + new("messaging.rabbitmq.destination.exchange", message.Exchange ?? string.Empty), + new("messaging.rabbitmq.destination.routing_key", message.RoutingKey), + new("messaging.rabbitmq.return.reason", message.ReturnReason) }; return eventItems; @@ -137,7 +153,7 @@ private void EnrichLogsWithQueueInfo(object? payload) { return new StructuredActivityEventItem[] { - new("amqp.message", null) + new("messaging.message", null) }; } @@ -147,23 +163,37 @@ private void EnrichLogsWithQueueInfo(object? payload) return EnumerateMessageConsumingEventItems(message).ToArray(); } - private IEnumerable EnumerateMessageConsumingEventItems(ReceivedRabbitMqMessage message) + private IEnumerable EnumerateMessageConsumingEventItems( + ReceivedRabbitMqMessage message) { if (_options.LogContentType == LogContentType.RawString) yield return new StructuredActivityEventItem( - "amqp.message.content.raw", + "messaging.message.body", message.Content.ReadAsStringAsync().GetAwaiter().GetResult()); - yield return new StructuredActivityEventItem("amqp.message.exchange", message.Exchange); - yield return new StructuredActivityEventItem("amqp.message.queue", message.Queue); - yield return new StructuredActivityEventItem("amqp.message.routing_key", message.RoutingKey); - yield return new StructuredActivityEventItem("amqp.message.delivery_tag", message.DeliveryTag); - yield return new StructuredActivityEventItem("amqp.message.redelivered", message.Redelivered); - yield return new StructuredActivityEventItem("amqp.message.consumer_tag", message.ConsumerTag); - yield return new StructuredActivityEventItem("amqp.message.retry_count", message.RetryCount); - yield return new StructuredActivityEventItem( - "amqp.message.properties", + // https://opentelemetry.io/docs/specs/semconv/attributes-registry/messaging/ + // https://opentelemetry.io/docs/specs/semconv/messaging/rabbitmq/ + yield return new StructuredActivityEventItem("messaging.operation", "receive"); + yield return new StructuredActivityEventItem("messaging.system", "rabbitmq"); + yield return new StructuredActivityEventItem("messaging.message.client_id", message.Properties.AppId); + yield return new StructuredActivityEventItem("messaging.message.id", message.Properties.MessageId); + yield return new StructuredActivityEventItem("messaging.message.conversation_id", + message.Properties.CorrelationId); + yield return new StructuredActivityEventItem("messaging.message.body.size", + message.Content.Headers.ContentLength); + yield return new StructuredActivityEventItem("messaging.rabbitmq.message.properties", JsonSerializer.Serialize(message.Properties, _options.DiagnosticsOptions)); + yield return new StructuredActivityEventItem("messaging.rabbitmq.destination.exchange", + message.Exchange ?? string.Empty); + yield return new StructuredActivityEventItem("messaging.rabbitmq.destination.routing_key", + message.RoutingKey); + yield return new StructuredActivityEventItem("messaging.rabbitmq.message.delivery_tag", + message.DeliveryTag); + yield return new StructuredActivityEventItem("messaging.rabbitmq.message.redelivered", message.Redelivered); + yield return new StructuredActivityEventItem("messaging.rabbitmq.message.consumer_tag", + message.ConsumerTag); + yield return new StructuredActivityEventItem("messaging.rabbitmq.message.retry_count", message.RetryCount); + yield return new StructuredActivityEventItem("messaging.rabbitmq.destination.queue", message.Queue); } private void OnMessageReplied(Activity? activity, object? payload) From 2054363b9806ce54c56c136e4e12726d299799f5 Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Thu, 23 May 2024 15:43:06 +0500 Subject: [PATCH 35/40] =?UTF-8?q?=D0=98=D0=B7=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D1=81=D1=8F=20=D0=BE=D1=82=20=D0=B2=D0=BE=D1=80=D0=BD?= =?UTF-8?q?=D0=B8=D0=BD=D0=B3=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IRabbitMqClientHandlerFactory.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Byndyusoft.Messaging.RabbitMq.Abstractions/IRabbitMqClientHandlerFactory.cs b/src/Byndyusoft.Messaging.RabbitMq.Abstractions/IRabbitMqClientHandlerFactory.cs index 2ef7c3d..dbdd680 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Abstractions/IRabbitMqClientHandlerFactory.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Abstractions/IRabbitMqClientHandlerFactory.cs @@ -1,16 +1,16 @@ namespace Byndyusoft.Messaging.RabbitMq { /// - /// A factory abstraction for a component that can create instances with custom + /// A factory abstraction for a component that can create instances with custom /// configuration for a given logical name. /// public interface IRabbitMqClientHandlerFactory { /// - /// Creates and configures a instance. + /// Creates and configures a instance. /// /// - /// A new instance. + /// A new instance. IRabbitMqClientHandler CreateHandler(RabbitMqClientOptions options); } } \ No newline at end of file From e81e554bf52b632cedf3644d96a90ca1b4bbd0c1 Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Thu, 23 May 2024 15:51:31 +0500 Subject: [PATCH 36/40] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Example.ConsoleApp.csproj | 2 +- .../Byndyusoft.Messaging.RabbitMq.Core.csproj | 2 +- .../Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/example/Example.ConsoleApp.csproj b/example/Example.ConsoleApp.csproj index ff8d54a..adeff1d 100644 --- a/example/Example.ConsoleApp.csproj +++ b/example/Example.ConsoleApp.csproj @@ -7,7 +7,7 @@ - + diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj b/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj index dc2f671..49b6c75 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Byndyusoft.Messaging.RabbitMq.Core.csproj @@ -8,7 +8,7 @@ - + diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj index 43444a1..c432192 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/Byndyusoft.Messaging.RabbitMq.OpenTelemetry.csproj @@ -7,10 +7,10 @@ - + - - + + From bad517ff7a8c4fe04b877beed9aa2fe801ab1d11 Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Thu, 23 May 2024 15:57:09 +0500 Subject: [PATCH 37/40] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=D1=8B=20=D1=81=20open?= =?UTF-8?q?=20telemetry?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/Example.ConsoleApp.csproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/example/Example.ConsoleApp.csproj b/example/Example.ConsoleApp.csproj index adeff1d..ff92c26 100644 --- a/example/Example.ConsoleApp.csproj +++ b/example/Example.ConsoleApp.csproj @@ -10,12 +10,12 @@ - + - + - - + + From 9b059a66cb0912e64068acb92b09a7b4fe9245fa Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Fri, 24 May 2024 13:05:54 +0500 Subject: [PATCH 38/40] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/HostedServices/PullingExample.cs | 2 ++ .../Diagnostics/RabbitMqClientActivitySource.cs | 2 +- .../RabbitMqListener.cs | 6 ++---- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/example/HostedServices/PullingExample.cs b/example/HostedServices/PullingExample.cs index bfe0a3e..ccced71 100644 --- a/example/HostedServices/PullingExample.cs +++ b/example/HostedServices/PullingExample.cs @@ -4,6 +4,7 @@ using System.Threading; using System.Threading.Tasks; using Byndyusoft.Messaging.RabbitMq; +using Byndyusoft.Messaging.RabbitMq.Diagnostics; using Microsoft.Extensions.Hosting; namespace Byndyusoft.Net.RabbitMq.HostedServices @@ -37,6 +38,7 @@ await _rabbitMqClient.CreateQueueAsync(_rabbitMqClient.Options.NamingConventions { var model = await message.Content.ReadFromJsonAsync( cancellationToken: stoppingToken); + RabbitMqClientEvents.OnMessageModelRead(model); Console.WriteLine(JsonSerializer.Serialize(model)); await _rabbitMqClient.CompleteMessageAsync(message, ConsumeResult.Ack, stoppingToken); continue; diff --git a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs index d37fcd7..e1c4b6a 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/RabbitMqClientActivitySource.cs @@ -90,7 +90,7 @@ private static void SetConnectionTags(Activity activity, RabbitMqEndpoint endpoi private static void SetQueueNameTags(Activity activity, string queueName) { - activity.SetTag("amqp.queue_name", queueName); + activity.SetTag("messaging.rabbitmq.destination.queue", queueName); } public Task ExecuteAsync(Activity? activity, Func action) diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs index 34cb644..0d0ca59 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs @@ -79,7 +79,6 @@ private void OnMessagePublishing(Activity? activity, object? payload) new("messaging.message.client_id", message.Properties.AppId), new("messaging.message.id", message.Properties.MessageId), new("messaging.message.conversation_id", message.Properties.CorrelationId), - new("messaging.message.body", message.Content.ReadAsStringAsync().GetAwaiter().GetResult()), new("messaging.message.body.size", message.Content.Headers.ContentLength), new("messaging.rabbitmq.message.properties", JsonSerializer.Serialize(message.Properties, options)), new("messaging.rabbitmq.destination.exchange", message.Exchange ?? string.Empty), @@ -110,7 +109,6 @@ private void OnMessageReturned(Activity? activity, object? payload) new("messaging.message.client_id", message.Properties.AppId), new("messaging.message.id", message.Properties.MessageId), new("messaging.message.conversation_id", message.Properties.CorrelationId), - new("messaging.message.body", message.Content.ReadAsStringAsync().GetAwaiter().GetResult()), new("messaging.message.body.size", message.Content.Headers.ContentLength), new("messaging.rabbitmq.message.properties", JsonSerializer.Serialize(message.Properties, options)), new("messaging.rabbitmq.destination.exchange", message.Exchange ?? string.Empty), @@ -260,7 +258,7 @@ private void EnrichWithModelTelemetryItems(Activity? activity, object? payload) return; var telemetryItems = - ObjectTelemetryItemsCollector.Collect("rabbitMqModel", payload, "amqp.message.params."); + ObjectTelemetryItemsCollector.Collect("rabbitMqModel", payload, "messaging.message.params."); if (_options.EnrichLogsWithParams) LogPropertyDataAccessor.AddTelemetryItems(telemetryItems); @@ -276,7 +274,7 @@ private void LogModelRead(Activity? activity, object? payload) var eventItems = new StructuredActivityEventItem[] { - new("amqp.message.content.model", + new("messaging.message.body", JsonSerializer.Serialize(payload, _options.DiagnosticsOptions)) }; Log(activity, eventItems, "message.model.read"); From 4033fa2a679e5e4b0f5e0ac14f8a9a08c7697483 Mon Sep 17 00:00:00 2001 From: Rinatich <38452272+Rinatich@users.noreply.github.com> Date: Fri, 24 May 2024 13:30:24 +0500 Subject: [PATCH 39/40] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/README.md b/README.md index 6a2f2ee..c2c002c 100644 --- a/README.md +++ b/README.md @@ -150,6 +150,51 @@ public class QueueHostedService : BackgroundService } ``` +## Конфигурация + +```csharp +public class Startup +{ + public void ConfigureServices(IServiceCollection services) + { + services.AddOpenTelemetry() + .WithTracing(builder => builder + .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("Byndyusoft.Net.RabbitMq")) + .AddJaegerExporter(jaeger => + { + jaeger.AgentHost = "localhost"; + jaeger.AgentPort = 6831; + }) + .AddRabbitMqClientInstrumentation(o => + { + options.LogEventsInTrace = false; + options.LogEventsInLogs = true; + options.TagRequestParamsInTrace = true; + options.EnrichLogsWithParams = true; + options.EnrichLogsWithQueueInfo = true; + options.RecordExceptions = true; + options.LogContentType = LogContentType.ReadModel; + })); + services.AddRabbitMqClient("host=localhost;username=guest;password=guest"); + ... + } +} +``` + +Параметры конфигурации инструментации трассировки: +1. LogEventsInTrace — создавать события в трассировке. По умолчанию: false. +2. LogEventsInLogs — логировать события. По умолчанию: true. +3. TagRequestParamsInTrace — добавлять параметры сообщения в тэги трассировки. По умолчанию: true. Чтобы узнать, как извлекаются данные, см. [здесь](https://github.com/Byndyusoft/Byndyusoft.Telemetry#object-telemetry-item-collector). +4. EnrichLogsWithParams — обогатить каждый лог параметрами сообщения в контексте обработки этого сообщения. По умолчанию: true. Чтобы узнать, как извлекаются данные, см. [здесь](https://github.com/Byndyusoft/Byndyusoft.Telemetry#object-telemetry-item-collector). +5. EnrichLogsWithQueueInfo — обогатить каждый лог информацией об очереди в контексте обработки этого сообщения. Default: true. +6. RecordExceptions — помечать ошибки в трассировке. По умолчанию: true. +7. LogContentType — способ извлечения содержимого сообщения при его обработке. По умолчанию: ReadModel. + * ReadModel - будет логироваться десериализованная модель в отдельном событии трассировки и/или в отдельной записи лога. В этом случае можно маскировать данные. См. [здесь](https://github.com/Byndyusoft/Byndyusoft.MaskedSerialization) + * Skip - не будет логироваться содержимое сообщения. + * RawString - будет логироваться содержимое сообщения как есть (строка). Маскировка данных работать не будет. + +
+ [![(License)](https://img.shields.io/github/license/Byndyusoft/Byndyusoft.Net.RabbitMq.svg)](LICENSE) | Package name | Nuget | Downloads | From 31b1b6e3f711499bd7cbb13496ecb37d3dacffa0 Mon Sep 17 00:00:00 2001 From: rgaynetdinov Date: Fri, 24 May 2024 13:45:14 +0500 Subject: [PATCH 40/40] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F?= =?UTF-8?q?=20=D1=82=D1=8D=D0=B3=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=BE=D1=87?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B4=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RabbitMqListener.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs index 0d0ca59..5669aaf 100644 --- a/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs +++ b/src/Byndyusoft.Messaging.RabbitMq.OpenTelemetry/RabbitMqListener.cs @@ -142,7 +142,7 @@ private void EnrichLogsWithQueueInfo(object? payload) if (payload is not ReceivedRabbitMqMessage message) return null; - return new StructuredActivityEventItem("amqp.message.queue", message.Queue); + return new StructuredActivityEventItem("messaging.rabbitmq.destination.queue", message.Queue); } private StructuredActivityEventItem[]? BuildMessageConsumingEventItems(object? payload)