Skip to content

Commit d223fa7

Browse files
committed
add otel
1 parent 8d0dc26 commit d223fa7

File tree

128 files changed

+1642
-320
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

128 files changed

+1642
-320
lines changed

src/Directory.Packages.props

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,30 @@
1313
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="8.0.4" />
1414
<PackageVersion Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="8.0.7" />
1515
<PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="7.4.0" />
16+
<PackageVersion Include="OpenTelemetry" Version="1.14.0" />
17+
<PackageVersion Include="OpenTelemetry.Exporter.Console" Version="1.14.0" />
18+
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.14.0" />
19+
<PackageVersion Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.14.0-beta.1" />
20+
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.14.0" />
21+
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.14.0" />
22+
<PackageVersion Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" Version="1.14.0-beta.2" />
23+
<PackageVersion Include="OpenTelemetry.Instrumentation.GrpcNetClient" Version="1.14.0-beta.1" />
24+
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.14.0" />
25+
<PackageVersion Include="OpenTelemetry.Instrumentation.MassTransit" Version="1.0.0-beta.3" />
26+
<PackageVersion Include="OpenTelemetry.Instrumentation.Process" Version="1.14.0-beta.2" />
27+
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.14.0" />
28+
<PackageVersion Include="OpenTelemetry.SemanticConventions" Version="1.0.0-rc9.9" />
1629
<PackageVersion Include="Refit" Version="8.0.0" />
1730
<PackageVersion Include="Refit.HttpClientFactory" Version="8.0.0" />
1831
<PackageVersion Include="ReHackt.Extensions.Options.Validation" Version="8.0.2" />
1932
<PackageVersion Include="Respawn" Version="6.2.1" />
2033
<PackageVersion Include="Scrutor" Version="4.2.2" />
34+
<PackageVersion Include="Serilog.Enrichers.Environment" Version="3.0.1" />
35+
<PackageVersion Include="Serilog.Enrichers.Process" Version="3.0.0" />
36+
<PackageVersion Include="Serilog.Enrichers.Span" Version="3.1.0" />
37+
<PackageVersion Include="Serilog.Exceptions" Version="8.4.0" />
38+
<PackageVersion Include="Serilog.Sinks.Debug" Version="3.0.0" />
39+
<PackageVersion Include="Serilog.Sinks.Elasticsearch" Version="10.0.0" />
2140
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.5.0" />
2241
<PackageVersion Include="AutoFixture.Xunit2" Version="4.18.1" />
2342
<PackageVersion Include="coverlet.collector" Version="6.0.0" />
@@ -45,7 +64,7 @@
4564
<PackageVersion Include="FluentValidation" Version="12.0.0" />
4665
<PackageVersion Include="FluentValidation.AspNetCore" Version="11.3.0" />
4766
<PackageVersion Include="FluentValidation.DependencyInjectionExtensions" Version="11.9.0" />
48-
<PackageVersion Include="Serilog" Version="3.1.1" />
67+
<PackageVersion Include="Serilog" Version="4.3.0" />
4968
<PackageVersion Include="MediatR" Version="12.4.1" />
5069
<PackageVersion Include="Ulid" Version="1.3.4" />
5170
<PackageVersion Include="ValueOf" Version="2.0.31" />

src/Services/Basket/Basket.API.IntegrationTests/ApiFactory.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,16 @@
88

99
namespace Basket.API.IntegrationTests;
1010

11-
public class ApiFactory(string postgresConnection, string redisConnectionString) : WebApplicationFactory<Program>
11+
public class ApiFactory(
12+
string postgresConnection,
13+
string redisConnectionString,
14+
string elasticSearchString) : WebApplicationFactory<Program>
1215
{
1316
protected override void ConfigureWebHost(IWebHostBuilder builder)
1417
{
1518
Environment.SetEnvironmentVariable("ConnectionStrings__Database", postgresConnection);
1619
Environment.SetEnvironmentVariable("ConnectionStrings__Redis", redisConnectionString);
20+
Environment.SetEnvironmentVariable("Logger__elasticsearch", elasticSearchString);
1721

1822
builder.ConfigureTestServices(service =>
1923
{

src/Services/Basket/Basket.API.IntegrationTests/ApiSpecification.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,10 @@ public async Task InitializeAsync()
5353
_discountWireMockServer = StartWireMockServer();
5454
Environment.SetEnvironmentVariable("Grpc__Discount", _discountWireMockServer.Url);
5555

56-
_factory = new ApiFactory(_webApiContainer.PostgresConnectionString, _webApiContainer.RedisConnectionString);
56+
_factory = new ApiFactory(
57+
_webApiContainer.PostgresConnectionString,
58+
_webApiContainer.RedisConnectionString,
59+
_webApiContainer.ElasticSearchUri);
5760
_store = _factory.Services.GetRequiredService<IDocumentStore>();
5861
_cache = _factory.Services.GetRequiredService<IDistributedCache>();
5962
await Task.CompletedTask;

src/Services/Basket/Basket.API.IntegrationTests/Features/DeleteBasket/DeleteBasketTests.cs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,4 @@
1-
using System.Net;
2-
using System.Net.Http.Json;
3-
using Basket.API.Authorization;
41
using Basket.API.Features.DeleteBasket;
5-
using Basket.API.IntegrationTests.AutoFixture;
6-
using Basket.API.IntegrationTests.Database.Postgres;
7-
using Basket.API.IntegrationTests.Database.Redis;
8-
using Basket.API.Models;
9-
using IntegrationTests.Common;
10-
using Shouldly;
112

123
namespace Basket.API.IntegrationTests.Features.DeleteBasket;
134

src/Services/Basket/Basket.API.IntegrationTests/Features/GetBasket/GetBasketTests.cs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,4 @@
1-
using System.Net;
2-
using System.Net.Http.Json;
3-
using Basket.API.Authorization;
41
using Basket.API.Features.GetBasket;
5-
using Basket.API.IntegrationTests.Database.Postgres;
6-
using Basket.API.IntegrationTests.Database.Redis;
7-
using Basket.API.Models;
8-
using IntegrationTests.Common;
9-
using Microsoft.AspNetCore.Mvc;
10-
using Newtonsoft.Json;
11-
using Shouldly;
122

133
namespace Basket.API.IntegrationTests.Features.GetBasket;
144

src/Services/Basket/Basket.API.IntegrationTests/Features/StoreBasket/StoreBasketTests.cs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,6 @@
1-
using System.Net;
2-
using System.Net.Http.Json;
3-
using Basket.API.Authorization;
41
using Basket.API.Features.StoreBasket;
5-
using Basket.API.IntegrationTests.AutoFixture;
6-
using Basket.API.IntegrationTests.Database.Postgres;
7-
using Basket.API.IntegrationTests.Database.Redis;
82
using Basket.API.IntegrationTests.ServerGivens;
93
using Basket.API.Models.Dtos;
10-
using IntegrationTests.Common;
11-
using Microsoft.AspNetCore.Mvc;
12-
using Newtonsoft.Json;
13-
using Shouldly;
144

155
namespace Basket.API.IntegrationTests.Features.StoreBasket;
166

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
global using Shouldly;
2+
global using System.Net;
3+
global using System.Net.Http.Json;
4+
global using Basket.API.IntegrationTests.AutoFixture;
5+
global using Basket.API.IntegrationTests.Database.Postgres;
6+
global using Basket.API.IntegrationTests.Database.Redis;
7+
global using Basket.API.Models;
8+
global using IntegrationTests.Common;
9+
global using Basket.API.Authorization;
10+
global using Newtonsoft.Json;
11+
global using Microsoft.AspNetCore.Mvc;

src/Services/Basket/Basket.API.IntegrationTests/WebApiContainerFactory.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ namespace Basket.API.IntegrationTests;
66
public class WebApiContainerFactory : IAsyncLifetime
77
{
88
private const ushort PostgresPort = 5432;
9-
109
private const ushort RedisPort = 6379;
10+
private const ushort ElasticSearchPort = 9200;
1111

1212
private readonly IContainer _postgres = new ContainerBuilder()
1313
.WithImage("postgres")
@@ -24,6 +24,14 @@ public class WebApiContainerFactory : IAsyncLifetime
2424
.WithWaitStrategy(Wait.ForUnixContainer().UntilPortIsAvailable(RedisPort))
2525
.Build();
2626

27+
private readonly IContainer _elasticsearch = new ContainerBuilder()
28+
.WithImage("docker.elastic.co/elasticsearch/elasticsearch:8.1.2")
29+
.WithPortBinding(9200, true)
30+
.WithWaitStrategy(Wait.ForUnixContainer().UntilPortIsAvailable(ElasticSearchPort))
31+
.Build();
32+
33+
internal string ElasticSearchUri =>
34+
$"http://{_elasticsearch.Hostname}:{_elasticsearch.GetMappedPublicPort(ElasticSearchPort)}";
2735
internal Uri PostgresUri => new($"http://{_postgres.Hostname}:{_postgres.GetMappedPublicPort(PostgresPort)}");
2836

2937
internal string PostgresConnectionString =>
@@ -35,11 +43,13 @@ public async Task InitializeAsync()
3543
{
3644
await _postgres.StartAsync().ConfigureAwait(false);
3745
await _redis.StartAsync().ConfigureAwait(false);
46+
await _elasticsearch.StartAsync().ConfigureAwait(false);
3847
}
3948

4049
public async Task DisposeAsync()
4150
{
4251
await _postgres.DisposeAsync().ConfigureAwait(false);
4352
await _redis.DisposeAsync().ConfigureAwait(false);
53+
await _elasticsearch.DisposeAsync().ConfigureAwait(false);
4454
}
4555
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System.ComponentModel.DataAnnotations;
2+
3+
namespace Basket.API.Configurations.ConfigurationOptions;
4+
5+
internal sealed record LoggerConfigurations
6+
{
7+
[ConfigurationKeyName("Logger:elasticsearch")]
8+
[Required]
9+
public required string ElasticSearch { get; init; }
10+
}

src/Services/Basket/Basket.API/Data/BasketRepository.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,25 @@ namespace Basket.API.Data;
22

33
internal class BasketRepository(IDocumentSession session) : IBasketRepository
44
{
5+
private readonly ILogger _logger = Log.ForContext<BasketRepository>();
56
public async Task<ShoppingCart> GetBasketAsync(string username, CancellationToken cancellationToken = default)
67
{
8+
_logger.Information("Getting basket from database");
79
var basket = await session.LoadAsync<ShoppingCart>(username, cancellationToken).ConfigureAwait(false);
810
return basket ?? throw new BasketNotFoundException(username);
911
}
1012

1113
public async Task<ShoppingCart> StoreBasketAsync(ShoppingCart basket, CancellationToken cancellationToken = default)
1214
{
15+
_logger.Information("Saving basket to database");
1316
session.Store(basket);
1417
await session.SaveChangesAsync(cancellationToken).ConfigureAwait(false);
1518
return basket;
1619
}
1720

1821
public async Task<bool> DeleteBasketAsync(string username, CancellationToken cancellationToken = default)
1922
{
23+
_logger.Information("Deleting basket from database");
2024
session.Delete<ShoppingCart>(username);
2125
await session.SaveChangesAsync(cancellationToken).ConfigureAwait(false);
2226
return true;

0 commit comments

Comments
 (0)