Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Добавли возможность настройки для логирования в трассы и в консоль #41

Open
wants to merge 42 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
f4dfcf0
Небольшой рефакторинг
Rinatich Dec 7, 2023
3a1fbfe
Добавил опции трейсинга
Rinatich Dec 7, 2023
867bf46
Добавил DiagnosticListener
rgaynetdinov Dec 8, 2023
cdc1c4f
Добавлен слушатель событий для логирования
Rinatich Dec 11, 2023
9c90357
Добавли регистрацию для инструментации
Rinatich Dec 11, 2023
64098a1
Избавился от ворнингов
Rinatich Dec 11, 2023
7b32ba8
Добавил отправку событий
Rinatich Dec 11, 2023
95f6cb4
Перенес обработку событий в отдельную инструментацию
Rinatich Dec 12, 2023
a4e970f
Удалил использование activity во всех событиях
Rinatich Dec 12, 2023
fb88fb0
Переделал настройку для проекта-примера
Rinatich Dec 12, 2023
ab07777
Перенес логику в один файл
Rinatich Dec 12, 2023
188773b
Удалил EventItemBuilder
Rinatich Dec 12, 2023
4c5494f
Перенес все нужное в проект с OpenTelemetry + удалил SupportsNullActi…
Rinatich Dec 12, 2023
cda5b0a
Вынес в отдельную настройку запись исключений
Rinatich Dec 12, 2023
1954fc0
Тестирование
Rinatich Dec 12, 2023
c314fa3
Форматирование csproj файла
rgaynetdinov Dec 13, 2023
ba4e0cb
Вынес отправку событий в отдельный класс
rgaynetdinov Dec 25, 2023
5283bdc
Перенес отправку событий в проект с абстракциями
rgaynetdinov Dec 25, 2023
1d7114e
Добавил отправку события, связанную с чтением модели
rgaynetdinov Dec 25, 2023
4b083c0
Добавил обработку события получения модели
rgaynetdinov Dec 25, 2023
e20dcbf
Добавил информацию об очереди
rgaynetdinov Dec 25, 2023
432a666
Увеличил версию
rgaynetdinov Dec 25, 2023
3a7c71a
Удалил неиспользуемый Source
rgaynetdinov Dec 25, 2023
8649320
Увеличил версию
rgaynetdinov Dec 25, 2023
380a755
Добавил маскирование в телеметрии
rgaynetdinov Jan 26, 2024
cb1bf80
Добавил логирование модели вместо сырого текста для маскирования данных
rgaynetdinov Jan 26, 2024
ab1b9db
Добавил пример для проверки
rgaynetdinov Jan 26, 2024
e7fef20
Избавился от ворнинга
rgaynetdinov Jan 26, 2024
c94f953
Обновил пакет
rgaynetdinov Jan 26, 2024
0f49a8d
Поправил заголово для контента для рендеринга логов
rgaynetdinov Jan 26, 2024
981c069
Добавил структурное логирование
rgaynetdinov Jan 30, 2024
31a8b3e
Добавил извлечение данных
rgaynetdinov Apr 4, 2024
bb83f5c
Убрал ошибки, связанные с 3-м аргументом
rgaynetdinov May 23, 2024
d278902
Merge branch 'master' into feature/145-instrumentation
rgaynetdinov May 23, 2024
7c60ca2
Исправил ошибки после слияния
rgaynetdinov May 23, 2024
2054363
Избавился от ворнингов
rgaynetdinov May 23, 2024
e81e554
Обновил пакеты
rgaynetdinov May 23, 2024
bad517f
Обновил пакеты с open telemetry
rgaynetdinov May 23, 2024
9b059a6
Правки после тестирования
rgaynetdinov May 24, 2024
4033fa2
Добавил документацию
Rinatich May 24, 2024
31b1b6e
Поправил названия тэга для очереди
rgaynetdinov May 24, 2024
9650453
Merge branch 'feature/145-instrumentation' of https://github.com/Bynd…
rgaynetdinov May 24, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Byndyusoft.Net.RabbitMq.sln.DotSettings
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/UserDictionary/Words/=Byndyusoft/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Liveness/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=middlewares/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
6 changes: 4 additions & 2 deletions example/Example.ConsoleApp.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@
<ItemGroup>
<PackageReference Include="Byndyusoft.Net.Http.MessagePack" Version="0.5.3" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="OpenTelemetry" Version="1.5.1" />
<PackageReference Include="OpenTelemetry" Version="1.7.0" />
<PackageReference Include="OpenTelemetry.Exporter.Jaeger" Version="1.5.1" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.5.1" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.7.0" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.7.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.6.0-rc.1" />
<PackageReference Include="System.Data.SqlClient" Version="4.8.5" />
</ItemGroup>

Expand Down
2 changes: 2 additions & 0 deletions example/HostedServices/QueueInstallerHostedService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
28 changes: 14 additions & 14 deletions example/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using OpenTelemetry;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;

Expand All @@ -17,19 +16,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();
}

Expand All @@ -44,6 +30,20 @@ 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(o =>
{
o.LogEventsInTrace = true;
o.LogEventsInLogs = true;
o.RecordExceptions = true;
}));
services.AddRabbitMqRpc();
services.AddSingleton<MathRpcServiceClient>();
services.AddRpcService<MathRpcService>();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System;
using System.Net.Http;

namespace Byndyusoft.Messaging.RabbitMq
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ namespace Byndyusoft.Messaging.RabbitMq
{
public class RabbitMqClientCoreOptions
{
private RabbitMqDiagnosticsOptions _diagnosticsOptions = new();
private QueueNamingConventions _namingConventions = new();

public string ApplicationName { get; set; } =
Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Byndyusoft.Messaging.RabbitMq.Topology;
using Byndyusoft.Messaging.RabbitMq.Utils;

// ReSharper disable once CheckNamespace
namespace Byndyusoft.Messaging.RabbitMq
{
/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="System.Diagnostics.DiagnosticSource" Version="6.0.0" />
<PackageReference Include="OpenTelemetry.API" Version="1.3.1" />
<PackageReference Include="OpenTelemetry.API" Version="1.3.1" />
<PackageReference Include="System.Diagnostics.DiagnosticSource" Version="6.0.0" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace Byndyusoft.Messaging.RabbitMq.Diagnostics.Consts
{
public class DiagnosticNames
{
public static string RabbitMq = "Byndyusoft.RabbitMq";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
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.Replied";
public static string MessageConsumed = "Byndyusoft.RabbitMq.Message.Consumed";
public static string UnhandledException = "Byndyusoft.RabbitMq.UnhandledException";
}
}
18 changes: 18 additions & 0 deletions src/Byndyusoft.Messaging.RabbitMq.Core/Diagnostics/EventItem.cs
Original file line number Diff line number Diff line change
@@ -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;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,124 +1,39 @@
using System.Diagnostics;
using Byndyusoft.Messaging.RabbitMq.Serialization;
using Byndyusoft.Messaging.RabbitMq.Diagnostics.Consts;

namespace Byndyusoft.Messaging.RabbitMq.Diagnostics
{
public partial class RabbitMqClientActivitySource
{
public class RabbitMqClientActivitySourceEvents
{
private readonly RabbitMqClientActivitySource _activitySource;

public RabbitMqClientActivitySourceEvents(RabbitMqClientActivitySource activitySource)
public void MessagePublishing(RabbitMqMessage message)
{
_activitySource = activitySource;
if (EventLogger.IsEnabled(EventNames.MessagePublishing))
EventLogger.Write(EventNames.MessagePublishing, message);
}

public void MessagePublishing(Activity? activity, RabbitMqMessage message)
public void MessageReturned(ReturnedRabbitMqMessage message)
{
if (activity is null)
return;

var tags = GetPublishedMessageEventTags(message);
var activityEvent = new ActivityEvent("message.publishing", tags: tags);
activity.AddEvent(activityEvent);
if (EventLogger.IsEnabled(EventNames.MessageReturned))
EventLogger.Write(EventNames.MessageReturned, message);
}

public void MessageReturned(Activity? activity, ReturnedRabbitMqMessage message)
public void MessageGot(ReceivedRabbitMqMessage? message)
{
if (activity is null)
return;

var tags = GetReturnedMessageEventTags(message);
var activityEvent = new ActivityEvent("message.returned", tags: tags);
activity.AddEvent(activityEvent);
if (EventLogger.IsEnabled(EventNames.MessageGot))
EventLogger.Write(EventNames.MessageGot, message);
}

public void MessageGot(Activity? activity, ReceivedRabbitMqMessage? message)
public void MessageReplied(ReceivedRabbitMqMessage 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 (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);
if (EventLogger.IsEnabled(EventNames.MessageReplied))
EventLogger.Write(EventNames.MessageReplied, message);
}

private ActivityTagsCollection GetReturnedMessageEventTags(ReturnedRabbitMqMessage message)
public void MessageConsumed(ConsumeResult result)
{
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));

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));

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;
if (EventLogger.IsEnabled(EventNames.MessageConsumed))
EventLogger.Write(EventNames.MessageConsumed, result);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -10,21 +11,18 @@ 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<AssemblyFileVersionAttribute>()?.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);
}

Expand Down Expand Up @@ -52,31 +50,20 @@ private static void StopActivity(Activity? activity)
return;

activity.SetStatus(ActivityStatusCode.Ok);
activity.SetTag("otel.status_code", "OK");
activity.Dispose();
}

private static void SetException(Activity? activity, Exception exception, bool escaped = true)
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;

activity.SetStatus(ActivityStatusCode.Error, exception.Message);

var tags = new ActivityTagsCollection
{
{"exception.type", exception.GetType().FullName},
{"exception.message", exception.Message},
{"exception.stacktrace", exception.ToString()},
{"exception.escaped", escaped}
};
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();
}

Expand Down
Loading
Loading