Skip to content

Commit 6ea8ba5

Browse files
authored
Add Serilog and OpenTelemetry (#15)
1 parent 64dd6d9 commit 6ea8ba5

File tree

6 files changed

+103
-8
lines changed

6 files changed

+103
-8
lines changed

docker-compose.override.yml

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ services:
44
- ASPNETCORE_ENVIRONMENT=Development
55
- ASPNETCORE_HTTP_PORTS=8080
66
- ASPNETCORE_HTTPS_PORTS=8081
7+
- OTEL_EXPORTER_OTLP_ENDPOINT=http://kernelmemory.ecommerce.sample.seq:5341/ingest/otlp/v1/traces
8+
- OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
79
ports:
810
- "8080"
911
- "8081"

docker-compose.yml

+13-1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,18 @@ services:
4242
volumes:
4343
- qdrant-data:/var/lib/qdrant/storage
4444

45+
46+
kernelmemory.ecommerce.sample.seq:
47+
image: datalust/seq
48+
ports:
49+
- 5341:80
50+
environment:
51+
- ACCEPT_EULA=Y
52+
- SEQ_FIRSTRUN_ADMINPASSWORD=password
53+
volumes:
54+
- seq-data:/data
55+
4556
volumes:
4657
db-data:
47-
qdrant-data:
58+
qdrant-data:
59+
seq-data:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using System.Diagnostics;
2+
using Npgsql;
3+
using OpenTelemetry.Logs;
4+
using OpenTelemetry.Metrics;
5+
using OpenTelemetry.Resources;
6+
using OpenTelemetry.Trace;
7+
8+
namespace KernelMemory.Ecommerce.Sample.Api.Infrastructure.Logging;
9+
10+
public static class OpenTelemetryRegistrationExtensions
11+
{
12+
public static WebApplicationBuilder AddOpenTelemetry(
13+
this WebApplicationBuilder builder)
14+
{
15+
builder.Services
16+
.AddOpenTelemetry()
17+
.ConfigureResource(resource => resource.AddService("kernelmemory.ecommerce.sample.api"))
18+
.WithTracing(tracing =>
19+
{
20+
tracing
21+
.AddHttpClientInstrumentation(options =>
22+
{
23+
options.EnrichWithHttpRequestMessage = (activity, request) =>
24+
{
25+
if (request.RequestUri != null)
26+
{
27+
activity.DisplayName = $"{request.Method.Method} {request.RequestUri.AbsoluteUri}";
28+
}
29+
};
30+
31+
options.EnrichWithHttpResponseMessage = (activity, response) =>
32+
{
33+
activity.DisplayName = $"{activity.DisplayName} {(int)response.StatusCode}";
34+
};
35+
})
36+
.AddAspNetCoreInstrumentation()
37+
.AddNpgsql();
38+
39+
// Exporter is configured in docker-compose via
40+
// OTEL_EXPORTER_OTLP_ENDPOINT variable.
41+
tracing.AddOtlpExporter();
42+
});
43+
44+
return builder;
45+
}
46+
}

src/KernelMemory.Ecommerce.Sample.Api/KernelMemory.Ecommerce.Sample.Api.csproj

+7
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,13 @@
1515
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.0" />
1616
<PackageReference Include="Microsoft.KernelMemory.Service.AspNetCore" Version="0.95.241216.2" />
1717
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.21.0" />
18+
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.10.0" />
19+
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.10.0" />
20+
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.10.1" />
21+
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.10.0" />
22+
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
23+
<PackageReference Include="Serilog.Sinks.Seq" Version="9.0.0" />
24+
<PackageReference Include="Npgsql.OpenTelemetry" Version="9.0.2" />
1825
<PackageReference Include="MediatR" Version="12.4.1" />
1926
<PackageReference Include="Swashbuckle.AspNetCore" Version="7.2.0" />
2027
</ItemGroup>

src/KernelMemory.Ecommerce.Sample.Api/Program.cs

+9
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
using KernelMemory.Ecommerce.Sample.Api.Application.Configuration;
22
using KernelMemory.Ecommerce.Sample.Api.Infrastructure;
33
using KernelMemory.Ecommerce.Sample.Api.Presentation;
4+
using KernelMemory.Ecommerce.Sample.Api.Infrastructure.Logging;
45
using Microsoft.KernelMemory;
6+
using Serilog;
57

68
namespace KernelMemory.Ecommerce.Sample.Api;
79

@@ -11,11 +13,16 @@ private static async Task Main(string[] args)
1113
{
1214
var builder = WebApplication.CreateBuilder(args);
1315

16+
builder.Host.UseSerilog((context, loggerConfig) =>
17+
loggerConfig.ReadFrom.Configuration(context.Configuration));
18+
1419
builder.Services.AddEndpointsApiExplorer();
1520
builder.Services.AddSwaggerGen();
1621

1722
builder.Services.AddApplicationServices();
1823

24+
builder.AddOpenTelemetry();
25+
1926
var app = BuildAsynchronousKernelMemoryApp(builder);
2027

2128
app.UseDefaultFiles();
@@ -29,6 +36,8 @@ private static async Task Main(string[] args)
2936

3037
app.UseHttpsRedirection();
3138

39+
app.UseSerilogRequestLogging();
40+
3241
app.MapEndpoints();
3342

3443
await app.RunAsync();

src/KernelMemory.Ecommerce.Sample.Api/appsettings.json

+26-7
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,4 @@
11
{
2-
"Logging": {
3-
"LogLevel": {
4-
"Default": "Information",
5-
"Microsoft.AspNetCore": "Warning"
6-
}
7-
},
82
"ProductSearch": {
93
"SearchResultsLimit": 5,
104
"MinSearchResultsRelevance": 0.8
@@ -53,5 +47,30 @@
5347
}
5448
}
5549
},
56-
"AllowedHosts": "*"
50+
"AllowedHosts": "*",
51+
"Serilog": {
52+
"Using": [
53+
"Serilog.Sinks.Console",
54+
"Serilog.Sinks.Seq"
55+
],
56+
"MinimumLevel": {
57+
"Default": "Information",
58+
"Override": {
59+
"Microsoft": "Information",
60+
"Microsoft.AspNetCore": "Warning",
61+
"Microsoft.KernelMemory": "Debug"
62+
}
63+
},
64+
"WriteTo": [
65+
{ "Name": "Console" },
66+
{
67+
"Name": "Seq",
68+
"Args": { "serverUrl": "http://kernelmemory.ecommerce.sample.seq:5341" }
69+
}
70+
],
71+
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
72+
"Properties": {
73+
"Application": "kernelmemory.ecommerce.sample.api"
74+
}
75+
}
5776
}

0 commit comments

Comments
 (0)