Skip to content

Commit c886295

Browse files
.net core metrics now working
1 parent 9d51a19 commit c886295

5 files changed

Lines changed: 128 additions & 16 deletions

File tree

ECommerce.AdminUI/ECommerce.AdminUI.csproj

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,14 @@
88

99
<ItemGroup>
1010
<PackageReference Include="Azure.Monitor.OpenTelemetry.AspNetCore" Version="1.3.0" />
11+
<PackageReference Include="OpenTelemetry" Version="1.12.0" />
1112
<PackageReference Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.12.0-beta.1" />
12-
<PackageReference Include="prometheus-net" Version="8.0.1" />
13-
<PackageReference Include="prometheus-net.AspNetCore" Version="8.0.1" />
13+
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.12.0" />
14+
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.12.0" />
15+
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.12.0" />
16+
<PackageReference Include="OpenTelemetry.Instrumentation.Process" Version="1.12.0-beta.1" />
17+
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.12.0" />
18+
<PackageReference Include="OpenTelemetry.Instrumentation.SqlClient" Version="1.12.0-beta.1" />
1419
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="8.12.0" />
1520
</ItemGroup>
1621

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using Azure.Monitor.OpenTelemetry.Exporter;
5+
using OpenTelemetry.Metrics;
6+
using OpenTelemetry.Resources;
7+
using OpenTelemetry.Trace;
8+
9+
namespace ECommerce.AdminUI;
10+
11+
public static class OpenTelemetryExtensions
12+
{
13+
public static IServiceCollection AddOpenTelemetryConfiguration(
14+
this IServiceCollection services,
15+
IConfiguration configuration)
16+
{
17+
var openTelemetryConfig = configuration.GetSection("OpenTelemetry");
18+
19+
services.AddOpenTelemetry()
20+
.WithMetrics(builder =>
21+
{
22+
builder
23+
.SetResourceBuilder(ResourceBuilder.CreateDefault()
24+
.AddService(
25+
serviceName: openTelemetryConfig["ServiceName"],
26+
serviceVersion: openTelemetryConfig["ServiceVersion"]))
27+
.AddRuntimeInstrumentation()
28+
.AddProcessInstrumentation();
29+
30+
// Conditional instrumentation
31+
if (openTelemetryConfig.GetValue<bool>("Instrumentation:AspNetCore"))
32+
builder.AddAspNetCoreInstrumentation();
33+
34+
if (openTelemetryConfig.GetValue<bool>("Instrumentation:HttpClient"))
35+
builder.AddHttpClientInstrumentation();
36+
37+
// Add exporters based on configuration
38+
var prometheusEnabled = openTelemetryConfig.GetValue<bool>("Exporters:Prometheus:Enabled");
39+
var azureMonitorEnabled = openTelemetryConfig.GetValue<bool>("Exporters:AzureMonitor:Enabled");
40+
41+
if (prometheusEnabled)
42+
{
43+
builder.AddPrometheusExporter();
44+
}
45+
46+
if (azureMonitorEnabled)
47+
{
48+
var connectionString = openTelemetryConfig["Exporters:AzureMonitor:ConnectionString"];
49+
if (!string.IsNullOrEmpty(connectionString))
50+
{
51+
builder.AddAzureMonitorMetricExporter(options =>
52+
{
53+
options.ConnectionString = connectionString;
54+
});
55+
}
56+
}
57+
})
58+
.WithTracing(builder =>
59+
{
60+
builder
61+
.SetResourceBuilder(ResourceBuilder.CreateDefault()
62+
.AddService(
63+
serviceName: openTelemetryConfig["ServiceName"],
64+
serviceVersion: openTelemetryConfig["ServiceVersion"]));
65+
66+
if (openTelemetryConfig.GetValue<bool>("Instrumentation:AspNetCore"))
67+
builder.AddAspNetCoreInstrumentation();
68+
69+
if (openTelemetryConfig.GetValue<bool>("Instrumentation:HttpClient"))
70+
builder.AddHttpClientInstrumentation();
71+
72+
if (openTelemetryConfig.GetValue<bool>("Instrumentation:SqlClient"))
73+
builder.AddSqlClientInstrumentation();
74+
75+
var azureMonitorEnabled = openTelemetryConfig.GetValue<bool>("Exporters:AzureMonitor:Enabled");
76+
if (azureMonitorEnabled)
77+
{
78+
var connectionString = openTelemetryConfig["Exporters:AzureMonitor:ConnectionString"];
79+
if (!string.IsNullOrEmpty(connectionString))
80+
{
81+
builder.AddAzureMonitorTraceExporter(options =>
82+
{
83+
options.ConnectionString = connectionString;
84+
});
85+
}
86+
}
87+
});
88+
89+
return services;
90+
}
91+
}

ECommerce.AdminUI/Program.cs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1+
using ECommerce.AdminUI;
12
using Microsoft.AspNetCore.DataProtection;
2-
using Prometheus;
3-
using OpenTelemetry.Metrics;
43

54
var builder = WebApplication.CreateBuilder(args);
65

@@ -17,14 +16,8 @@
1716
Console.WriteLine($"TokenServiceUrl from config: {builder.Configuration["TokenServiceUrl"] ?? "not set"}");
1817
Console.WriteLine("==========================");
1918

20-
// Add OpenTelemetry with ASP.NET Core built-in metrics
21-
builder.Services.AddOpenTelemetry()
22-
.WithMetrics(metrics =>
23-
{
24-
metrics.AddAspNetCoreInstrumentation();
25-
metrics.AddHttpClientInstrumentation();
26-
metrics.AddPrometheusExporter();
27-
});
19+
// Add OpenTelemetry
20+
builder.Services.AddOpenTelemetryConfiguration(builder.Configuration);
2821

2922
// Add Prometheus metrics
3023
builder.Services.AddHealthChecks();
@@ -111,6 +104,14 @@
111104
var app = builder.Build();
112105
var logger = app.Logger;
113106

107+
// Configure Prometheus endpoint if enabled
108+
var openTelemetryConfig = builder.Configuration.GetSection("OpenTelemetry");
109+
if (openTelemetryConfig.GetValue<bool>("Exporters:Prometheus:Enabled"))
110+
{
111+
logger.LogInformation("Prometheus exporter is enabled. Configuring scraping endpoint");
112+
app.MapPrometheusScrapingEndpoint();
113+
}
114+
114115
// Log ASPNETCORE_PATHBASE value at startup
115116
string? pathBase = app.Configuration["ASPNETCORE_PATHBASE"] ?? Environment.GetEnvironmentVariable("ASPNETCORE_PATHBASE");
116117
logger.LogInformation("ASPNETCORE_PATHBASE is set to: \'{PathBase}\'", pathBase);
@@ -144,10 +145,6 @@
144145

145146
app.UseAuthorization();
146147

147-
// Configure metrics endpoint before mapping controllers
148-
app.UseMetricServer("/metrics"); // This exposes the metrics endpoint
149-
app.UseHttpMetrics(); // Collect HTTP metrics
150-
151148
app.MapRazorPages();
152149
app.MapHealthChecks("/health");
153150

ECommerce.AdminUI/appsettings.json

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,24 @@
55
"Microsoft.AspNetCore": "Warning"
66
}
77
},
8+
"OpenTelemetry": {
9+
"ServiceName": "AdminUI",
10+
"ServiceVersion": "1.0.0",
11+
"Exporters": {
12+
"Prometheus": {
13+
"Enabled": true,
14+
"Endpoint": "/metrics"
15+
},
16+
"AzureMonitor": {
17+
"Enabled": false,
18+
"ConnectionString": ""
19+
}
20+
},
21+
"Instrumentation": {
22+
"AspNetCore": true,
23+
"HttpClient": true,
24+
"SqlClient": true
25+
}
26+
},
827
"AllowedHosts": "*"
928
}
File renamed without changes.

0 commit comments

Comments
 (0)