Skip to content

Commit 8310b49

Browse files
Aspire + Open Telemetry (#69)
- added Aspire started project - added basic Open Telemetry configuration
1 parent bb8cdd7 commit 8310b49

File tree

13 files changed

+156
-0
lines changed

13 files changed

+156
-0
lines changed

Directory.Packages.props

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<ItemGroup>
66
<PackageVersion Include="Asp.Versioning.Http" Version="8.1.0" />
77
<PackageVersion Include="Asp.Versioning.Mvc.ApiExplorer" Version="8.1.0" />
8+
<PackageVersion Include="Aspire.Hosting.AppHost" Version="9.0.0" />
89
<PackageVersion Include="Bogus" Version="35.6.3" />
910
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
1011
<PackageVersion Include="EFCore.BulkExtensions.PostgreSql" Version="9.0.1" />
@@ -26,6 +27,12 @@
2627
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.13.0" />
2728
<PackageVersion Include="NetArchTest.Rules" Version="1.3.2" />
2829
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
30+
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.9.0" />
31+
<PackageVersion Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.12.0-beta.1" />
32+
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.9.0" />
33+
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.9.0" />
34+
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.9.0" />
35+
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.9.0" />
2936
<PackageVersion Include="Quartz" Version="3.14.0" />
3037
<PackageVersion Include="Quartz.Extensions.Hosting" Version="3.14.0" />
3138
<PackageVersion Include="Respawn" Version="6.2.1" />

TeamUp.slnx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,14 @@
66
</Configurations>
77
<Folder Name="/Scripts/">
88
<File Path="scripts/rundb.ps1" />
9+
<File Path="scripts/rungrafana.ps1" />
10+
<File Path="scripts/runprometheus.ps1" />
11+
<File Path="scripts/prometheus.yml" />
912
</Folder>
1013
<Folder Name="/Solution Items/">
1114
<File Path=".editorconfig" />
15+
<File Path=".gitattributes" />
16+
<File Path=".gitignore" />
1217
<File Path="Directory.Build.props" />
1318
<File Path="Directory.Packages.props" />
1419
</Folder>
@@ -27,6 +32,7 @@
2732
<Project Path="tests/TeamUp.Tests.Performance/TeamUp.Tests.Performance.csproj" />
2833
</Folder>
2934
<Folder Name="/tools/">
35+
<Project Path="tools/TeamUp.Tools.Aspire/TeamUp.Tools.Aspire.csproj" />
3036
<Project Path="tools/TeamUp.Tools.Seeder/TeamUp.Tools.Seeder.csproj" />
3137
</Folder>
3238
</Solution>

scripts/prometheus.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
global:
2+
scrape_interval: 15s
3+
4+
scrape_configs:
5+
- job_name: "teamup-api"
6+
static_configs:
7+
- targets: ["localhost:7089"]

scripts/rungrafana.ps1

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
docker run --name ca-grafana -p 3000:3000 -d grafana/grafana

scripts/runprometheus.ps1

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
docker run --name ca-prometheus -p 9092:9090 -v $PSScriptRoot/prometheus.yml:/etc/prometheus/prometheus.yml -d prom/prometheus

src/TeamUp.Api/Program.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
builder.Configuration.AddEnvironmentVariables(prefix: "TEAMUP_");
1212

13+
builder.ConfigureOpenTelemetry();
14+
1315
builder.Services.AddApiVersioning(options =>
1416
{
1517
options.DefaultApiVersion = new ApiVersion(1);
@@ -24,6 +26,7 @@
2426
options.GroupNameFormat = "'v'V";
2527
options.SubstituteApiVersionInUrl = true;
2628
});
29+
2730
builder.Services.AddHttpContextAccessor();
2831
builder.Services.AddEndpointsApiExplorer();
2932

@@ -60,6 +63,7 @@
6063
app.UseAuthentication();
6164
app.UseAuthorization();
6265

66+
app.MapPrometheusScrapingEndpoint();
6367
app.MapHealthChecks("/_health");
6468
app.MapEndpoints();
6569

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
using Microsoft.Extensions.Hosting;
3+
using Microsoft.Extensions.Logging;
4+
using OpenTelemetry.Logs;
5+
using OpenTelemetry.Metrics;
6+
using OpenTelemetry.Trace;
7+
8+
namespace TeamUp.Infrastructure;
9+
10+
public static class HostApplicationBuilderExtensions
11+
{
12+
public static IHostApplicationBuilder ConfigureOpenTelemetry(this IHostApplicationBuilder builder)
13+
{
14+
builder.Logging.AddOpenTelemetry(options =>
15+
{
16+
options.IncludeScopes = true;
17+
options.IncludeFormattedMessage = true;
18+
});
19+
20+
builder.Services
21+
.AddOpenTelemetry()
22+
.WithMetrics(metrics =>
23+
{
24+
metrics.AddAspNetCoreInstrumentation();
25+
metrics.AddHttpClientInstrumentation();
26+
metrics.AddRuntimeInstrumentation();
27+
28+
metrics.AddPrometheusExporter();
29+
})
30+
.WithTracing(tracing =>
31+
{
32+
if (builder.Environment.IsDevelopment())
33+
{
34+
tracing.SetSampler<AlwaysOnSampler>();
35+
}
36+
37+
tracing.AddSource(builder.Environment.ApplicationName);
38+
tracing.AddAspNetCoreInstrumentation();
39+
tracing.AddHttpClientInstrumentation();
40+
});
41+
42+
var useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]);
43+
if (useOtlpExporter)
44+
{
45+
builder.Services.Configure<OpenTelemetryLoggerOptions>(options => options.AddOtlpExporter());
46+
builder.Services.ConfigureOpenTelemetryMeterProvider(options => options.AddOtlpExporter());
47+
builder.Services.ConfigureOpenTelemetryTracerProvider(options => options.AddOtlpExporter());
48+
}
49+
50+
return builder;
51+
}
52+
}

src/TeamUp.Infrastructure/TeamUp.Infrastructure.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@
1313
<PackageReference Include="Microsoft.Extensions.Options" />
1414
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" />
1515
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" />
16+
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" />
17+
<PackageReference Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" />
18+
<PackageReference Include="OpenTelemetry.Extensions.Hosting" />
19+
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" />
20+
<PackageReference Include="OpenTelemetry.Instrumentation.Http" />
21+
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" />
1622
<PackageReference Include="Quartz" />
1723
<PackageReference Include="Quartz.Extensions.Hosting" />
1824
<PackageReference Include="Skrasek.Mediato.MicrosoftDependencyInjection" />
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
using Projects;
2+
3+
var builder = DistributedApplication.CreateBuilder(args);
4+
5+
builder.AddProject<TeamUp_Api>("api");
6+
7+
builder.Build().Run();
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"$schema": "https://json.schemastore.org/launchsettings.json",
3+
"profiles": {
4+
"https": {
5+
"commandName": "Project",
6+
"dotnetRunMessages": true,
7+
"launchBrowser": true,
8+
"applicationUrl": "https://localhost:17153;http://localhost:15237",
9+
"environmentVariables": {
10+
"ASPNETCORE_ENVIRONMENT": "Development",
11+
"DOTNET_ENVIRONMENT": "Development",
12+
"DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21163",
13+
"DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:22282"
14+
}
15+
},
16+
"http": {
17+
"commandName": "Project",
18+
"dotnetRunMessages": true,
19+
"launchBrowser": true,
20+
"applicationUrl": "http://localhost:15237",
21+
"environmentVariables": {
22+
"ASPNETCORE_ENVIRONMENT": "Development",
23+
"DOTNET_ENVIRONMENT": "Development",
24+
"DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19178",
25+
"DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20229"
26+
}
27+
}
28+
}
29+
}

0 commit comments

Comments
 (0)