Skip to content

Commit 4684171

Browse files
authored
Merge pull request #58 from PandaTechAM/development
Nuget and performance updates + cleanup
2 parents ca39798 + d8e2db3 commit 4684171

File tree

10 files changed

+107
-56
lines changed

10 files changed

+107
-56
lines changed

Readme.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ Based on the above configuration, the UI will be accessible at the following URL
274274
- `LogBackend.Loki` (Loki formatter to file), or
275275
- `LogBackend.CompactJson` (compact JSON format to file).
276276
- **Environment-Specific Configuration:**
277-
- **Local:** Logs to console.
277+
- **Local:** Only logs to console even if you choose `LogBackend.Any`.
278278
- **Production:** Logs to file (in ECS or Loki format depending on the backend).
279279
- **Other Environments:** Logs to both console and file.
280280
- **Automatic Log Cleanup:** Log files are automatically cleaned up based on the configured retention period.
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
using System.Reflection;
2+
using MassTransit;
3+
using RabbitMQ.Client;
4+
5+
namespace SharedKernel.Demo;
6+
7+
public static class MassTransitExtension
8+
{
9+
public static WebApplicationBuilder AddMassTransit(this WebApplicationBuilder builder, params Assembly[] assemblies)
10+
{
11+
builder.Services.AddMassTransit(x =>
12+
{
13+
x.AddConsumers(assemblies);
14+
x.SetKebabCaseEndpointNameFormatter();
15+
x.UsingRabbitMq((context, cfg) =>
16+
{
17+
cfg.Host(builder.Configuration.GetConnectionString("RabbitMq")!);
18+
cfg.ConfigureEndpoints(context);
19+
cfg.UseMessageRetry(r =>
20+
r.Exponential(5, TimeSpan.FromSeconds(30), TimeSpan.FromHours(1), TimeSpan.FromSeconds(60)));
21+
22+
//Approximate Retry Timings:
23+
//Retry Attempt Approximate Delay
24+
//1st Retry 30 sec
25+
//2nd Retry ~5 min
26+
//3rd Retry ~15 min
27+
//4th Retry ~30 min
28+
//5th Retry ~1 hour(capped)
29+
});
30+
});
31+
32+
builder.AddRmqHealthCheck();
33+
34+
return builder;
35+
}
36+
}
37+
38+
internal static class RmqHealthCheckExtensions
39+
{
40+
public static WebApplicationBuilder AddRmqHealthCheck(this WebApplicationBuilder builder)
41+
{
42+
builder.Services
43+
.AddSingleton<IConnection>(_ =>
44+
{
45+
var rmqConnectionString = builder.Configuration.GetConnectionString("RabbitMq")!;
46+
var factory = new ConnectionFactory
47+
{
48+
Uri = new Uri(rmqConnectionString),
49+
};
50+
return factory.CreateConnectionAsync()
51+
.GetAwaiter()
52+
.GetResult();
53+
})
54+
.AddHealthChecks()
55+
.AddRabbitMQ(name: "rabbit_mq", timeout: TimeSpan.FromSeconds(3), tags: ["rmq"]);
56+
57+
return builder;
58+
}
59+
}

SharedKernel.Demo/Program.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
o.RedisConnectionString = "localhost:6379";
3636
o.ChannelPrefix = "app_name:";
3737
})
38+
.AddMassTransit(AssemblyRegistry.ToArray())
3839
.MapDefaultTimeZone()
3940
.AddCors()
4041
.AddOutboundLoggingHandler()

SharedKernel.Demo/SharedKernel.Demo.csproj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
</PropertyGroup>
88

99
<ItemGroup>
10-
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.7" />
10+
<PackageReference Include="AspNetCore.HealthChecks.Rabbitmq" Version="9.0.0" />
11+
<PackageReference Include="MassTransit.RabbitMQ" Version="8.5.2" />
12+
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.8" />
1113
</ItemGroup>
1214

1315
<ItemGroup>

SharedKernel.Demo/appsettings.Development.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
"DefaultTimeZone": "Caucasus Standard Time",
1313
"RepositoryName": "be-lib-sharedkernel",
1414
"ConnectionStrings": {
15-
"Redis": "localhost:6379",
15+
"Redis": "localhost:6379",
16+
"RabbitMq": "amqp://test:test@localhost:5672/",
1617
"PersistentStorage": "/persistence"
1718
}
1819
}

src/SharedKernel/Extensions/HealthCheckExtensions.cs

Lines changed: 12 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -13,39 +13,21 @@ public static class HealthCheckExtensions
1313
{
1414
public static WebApplication EnsureHealthy(this WebApplication app)
1515
{
16-
var healthCheckService = app.Services.GetRequiredService<HealthCheckService>();
17-
18-
var report = healthCheckService.CheckHealthAsync()
19-
.Result;
16+
var svc = app.Services.GetRequiredService<HealthCheckService>();
2017

21-
// "masstransit-bus" entry is only becoming healthy after app.run
22-
var relevantEntries = report
23-
.Entries
24-
.Where(e => e.Key != "masstransit-bus")
25-
.ToList();
18+
// Skip MassTransit during preflight
19+
var report = svc.CheckHealthAsync(r => r.Name != "masstransit-bus")
20+
.GetAwaiter()
21+
.GetResult();
2622

27-
// Determine overall status based on filtered entries
28-
var overallStatus = relevantEntries.Exists(e => e.Value.Status == HealthStatus.Unhealthy)
29-
? HealthStatus.Unhealthy
30-
: HealthStatus.Healthy;
23+
var failures = report.Entries
24+
.Where(e => e.Value.Status != HealthStatus.Healthy)
25+
.Select(e => $"{e.Key}: {e.Value.Status}")
26+
.ToList();
3127

32-
if (overallStatus != HealthStatus.Unhealthy)
33-
{
34-
return app;
35-
}
36-
37-
var unhealthyChecks = relevantEntries
38-
.Where(e => e.Value.Status != HealthStatus.Healthy)
39-
.Select(e => $"{e.Key}: {e.Value.Status}")
40-
.ToList();
41-
42-
if (unhealthyChecks.Count == 0)
43-
{
44-
return app;
45-
}
46-
47-
var message = $"Unhealthy services detected: {string.Join(", ", unhealthyChecks)}";
48-
throw new ServiceUnavailableException(message);
28+
return failures.Count > 0
29+
? throw new ServiceUnavailableException($"Unhealthy services detected: {string.Join(", ", failures)}")
30+
: app;
4931
}
5032

5133
public static WebApplicationBuilder AddHealthChecks(this WebApplicationBuilder builder)

src/SharedKernel/Logging/LogCleanupHostedService.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,20 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
1111
{
1212
try
1313
{
14-
var files = Directory.EnumerateFiles(logsDirectory, "logs-*.json", SearchOption.TopDirectoryOnly);
15-
foreach (var file in files)
14+
if (!Directory.Exists(logsDirectory))
1615
{
17-
var creationTime = File.GetCreationTime(file);
18-
if (DateTime.UtcNow - creationTime > retentionPeriod)
16+
Log.Logger.Information("Logs directory does not exist yet: {Directory}", logsDirectory);
17+
}
18+
else
19+
{
20+
var files = Directory.EnumerateFiles(logsDirectory, "logs-*.json", SearchOption.TopDirectoryOnly);
21+
foreach (var file in files)
1922
{
20-
File.Delete(file);
23+
var creationTime = File.GetCreationTime(file);
24+
if (DateTime.UtcNow - creationTime > retentionPeriod)
25+
{
26+
File.Delete(file);
27+
}
2128
}
2229
}
2330
}

src/SharedKernel/Logging/SerilogExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public static WebApplicationBuilder AddSerilog(this WebApplicationBuilder builde
4444

4545
builder.Host.UseSerilog();
4646

47-
if (daysToRetain <= 0 || logBackend == LogBackend.None)
47+
if (daysToRetain <= 0 || logBackend == LogBackend.None || builder.Environment.IsLocal())
4848
{
4949
return builder;
5050
}

src/SharedKernel/SharedKernel.csproj

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88
<PackageReadmeFile>Readme.md</PackageReadmeFile>
99
<Authors>Pandatech</Authors>
1010
<Copyright>MIT</Copyright>
11-
<Version>1.5.3</Version>
11+
<Version>1.5.4</Version>
1212
<PackageId>Pandatech.SharedKernel</PackageId>
1313
<Title>Pandatech Shared Kernel Library</Title>
1414
<PackageTags>Pandatech, shared kernel, library, OpenAPI, Swagger, utilities, scalar</PackageTags>
1515
<Description>Pandatech.SharedKernel provides centralized configurations, utilities, and extensions for ASP.NET Core projects. For more information refere to readme.md document.</Description>
1616
<RepositoryUrl>https://github.com/PandaTechAM/be-lib-sharedkernel</RepositoryUrl>
17-
<PackageReleaseNotes>ResponseCrafter update</PackageReleaseNotes>
17+
<PackageReleaseNotes>Nuget updates, performance tweaks and etc.</PackageReleaseNotes>
1818
</PropertyGroup>
1919

2020
<ItemGroup>
@@ -29,31 +29,30 @@
2929
<ItemGroup>
3030
<PackageReference Include="AspNetCore.HealthChecks.Prometheus.Metrics" Version="9.0.0" />
3131
<PackageReference Include="AspNetCore.HealthChecks.UI.Client" Version="9.0.0" />
32-
<PackageReference Include="Elastic.CommonSchema.Serilog" Version="8.18.2" />
32+
<PackageReference Include="Elastic.CommonSchema.Serilog" Version="9.0.0" />
3333
<PackageReference Include="FluentDateTime" Version="3.0.0" />
3434
<PackageReference Include="FluentValidation.DependencyInjectionExtensions" Version="12.0.0" />
3535
<PackageReference Include="HtmlSanitizer" Version="9.0.886" />
3636
<PackageReference Include="MediatR" Version="[12.5.0]" />
37-
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.7" />
38-
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="9.0.7" />
39-
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" Version="9.0.7" />
40-
<PackageReference Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="9.0.7" />
41-
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="9.0.7" />
42-
<PackageReference Include="Microsoft.Extensions.Http.Resilience" Version="9.7.0" />
37+
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.8" />
38+
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="9.0.8" />
39+
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" Version="9.0.8" />
40+
<PackageReference Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="9.0.8" />
41+
<PackageReference Include="Microsoft.Extensions.Http.Resilience" Version="9.8.0" />
4342
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.12.0" />
4443
<PackageReference Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.8.0-rc.1" />
4544
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.12.0" />
4645
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.12.0" />
4746
<PackageReference Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" Version="1.0.0-beta.12" />
4847
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.12.0" />
4948
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.12.0" />
50-
<PackageReference Include="Pandatech.Crypto" Version="5.0.2" />
51-
<PackageReference Include="Pandatech.DistributedCache" Version="4.0.8" />
52-
<PackageReference Include="PandaTech.FileExporter" Version="4.0.6" />
53-
<PackageReference Include="Pandatech.FluentMinimalApiMapper" Version="2.0.3" />
54-
<PackageReference Include="Pandatech.PandaVaultClient" Version="4.0.5" />
55-
<PackageReference Include="Pandatech.ResponseCrafter" Version="5.1.11" />
56-
<PackageReference Include="Scalar.AspNetCore" Version="2.5.6" />
49+
<PackageReference Include="Pandatech.Crypto" Version="5.0.3" />
50+
<PackageReference Include="Pandatech.DistributedCache" Version="4.0.9" />
51+
<PackageReference Include="PandaTech.FileExporter" Version="4.0.7" />
52+
<PackageReference Include="Pandatech.FluentMinimalApiMapper" Version="2.0.4" />
53+
<PackageReference Include="Pandatech.PandaVaultClient" Version="4.0.6" />
54+
<PackageReference Include="Pandatech.ResponseCrafter" Version="5.2.0" />
55+
<PackageReference Include="Scalar.AspNetCore" Version="2.6.9" />
5756
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
5857
<PackageReference Include="Serilog.Sinks.Async" Version="2.1.0" />
5958
<PackageReference Include="Serilog.Sinks.Grafana.Loki" Version="8.3.1" />

test/SharedKernel.Tests/SharedKernel.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<ItemGroup>
1313
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
1414
<PackageReference Include="xunit" Version="2.9.3" />
15-
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.1">
15+
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.3">
1616
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1717
<PrivateAssets>all</PrivateAssets>
1818
</PackageReference>

0 commit comments

Comments
 (0)