Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions Common.Web/Common.Web.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,14 @@
<PackageReference Include="Microsoft.ApplicationInsights" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" />
<PackageReference Include="OpenTelemetry" />
<PackageReference Include="OpenTelemetry.Exporter.Console" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" />
<PackageReference Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" />
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" VersionOverride="8.18.0" />
</ItemGroup>
<ItemGroup>
Expand Down
26 changes: 1 addition & 25 deletions Common.Web/ServiceConfiguration.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using Common.Web.Services;
using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
Expand Down Expand Up @@ -29,27 +27,5 @@ public static void ConfigurePlugins(IApplicationBuilder app, IEnumerable<IPlugin
foreach (var plugin in pluginModules)
plugin.Configure(app);
}

public static void ConfigureApplicationInsights(IApplicationBuilder app, IConfiguration config, bool isDevelopment)
{
var aiConn = config.GetValue("ApplicationInsights:ConnectionString", "");
if (aiConn == "SECRET" || aiConn == string.Empty)
{
if (isDevelopment == false)
Console.WriteLine($"Warning: InstrumentationKey not set ({aiConn})");
//throw new ArgumentException("InstrumentationKey not set");
}
else
{
var telemetryConfig = app.ApplicationServices.GetService<TelemetryConfiguration>();
if (telemetryConfig != null)
{
telemetryConfig.ConnectionString = aiConn;
var telemetry = new TelemetryClient(telemetryConfig);
telemetry.TrackEvent("Application start");
telemetry.TrackTrace("Trace Application start");
}
}
}
}
}
}
49 changes: 49 additions & 0 deletions Common.Web/Setup.AppInsights.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using Microsoft.ApplicationInsights;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace Common.Web
{
public class SetupAppInsights
{
public static void Add(IServiceCollection services, ConfigurationManager configurationManager)
{
//services.Configure<TelemetryConfiguration>(telemetryConfiguration =>
//{
// var builder = telemetryConfiguration.DefaultTelemetrySink.TelemetryProcessorChainBuilder;
// telemetryConfiguration.DefaultTelemetrySink.TelemetryProcessorChainBuilder
// .UseAdaptiveSampling(maxTelemetryItemsPerSecond: 5, excludedTypes: "Trace;Request;Exception");
//});
//services.AddApplicationInsightsTelemetry(new ApplicationInsightsServiceOptions
//{
// EnableAdaptiveSampling = false,
//});

//services.AddSingleton<ITelemetryInitializer, UserInformationTelemetryInitializer>();
}

public static void Configure(IApplicationBuilder app, IConfiguration config, bool isDevelopment)
{
var aiConn = config.GetValue("ApplicationInsights:ConnectionString", "");
if (aiConn == "SECRET" || aiConn == string.Empty)
{
if (isDevelopment == false)
Console.WriteLine($"Warning: InstrumentationKey not set ({aiConn})");
//throw new ArgumentException("InstrumentationKey not set");
}
else
{
var telemetryConfig = app.ApplicationServices.GetService<TelemetryConfiguration>();
if (telemetryConfig != null)
{
telemetryConfig.ConnectionString = aiConn;
var telemetry = new TelemetryClient(telemetryConfig);
telemetry.TrackEvent("Application start");
telemetry.TrackTrace("Trace Application start");
}
}
}
}
}
63 changes: 63 additions & 0 deletions Common.Web/Setup.OpenTelemetry.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;

namespace Common.Web
{
public class SetupOpenTelemetry
{
public static void Add(IServiceCollection services, IConfiguration config)
{
//config["Otel:"]
var endpointLoki = "http://localhost:4318";
var endpointPrometheus = "/metrics";

services.AddOpenTelemetry()
//.ConfigureResource(builder => builder.AddDetector(sp => sp.GetRequiredService<MyResourceDetector>()))
//.ConfigureResource(builder => builder.AddService(serviceName: "MyService"))
.WithTracing(builder =>
{
builder.AddAspNetCoreInstrumentation()
.AddConsoleExporter();
if (endpointLoki?.Any() == true)
builder.AddOtlpExporter(opts => { opts.Endpoint = new Uri(endpointLoki); });
})
.WithMetrics(builder =>
{
builder.AddAspNetCoreInstrumentation()
.AddRuntimeInstrumentation()
.AddHttpClientInstrumentation()
.AddConsoleExporter()
.AddPrometheusExporter(c => c.ScrapeEndpointPath = endpointPrometheus);
//.AddOtlpExporter(opts => { opts.Endpoint = new Uri(endpoint); });
});
}

public static void Configure(IApplicationBuilder app)
{
app.UseOpenTelemetryPrometheusScrapingEndpoint();
}

public class MyResourceDetector : IResourceDetector
{
private readonly IWebHostEnvironment webHostEnvironment;

public MyResourceDetector(IWebHostEnvironment webHostEnvironment)
{
this.webHostEnvironment = webHostEnvironment;
}

public Resource Detect()
{
return ResourceBuilder.CreateEmpty()
.AddService(serviceName: webHostEnvironment.ApplicationName)
.AddAttributes(new Dictionary<string, object> { ["host.environment"] = webHostEnvironment.EnvironmentName })
.Build();
}
}
}
}
8 changes: 8 additions & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,14 @@
<PackageVersion Include="Newtonsoft.Json" Version="13.0.4" />
<PackageVersion Include="NSwag.AspNetCore" Version="14.7.1" />
<PackageVersion Include="NSwag.MSBuild" Version="14.7.1" />
<PackageVersion Include="OpenTelemetry" Version="1.17.0" />
<PackageVersion Include="OpenTelemetry.Exporter.Console" Version="1.17.0" />
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.17.0" />
<PackageVersion Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.17.0-beta.1" />
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.17.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.17.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.17.0" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.17.0" />
<PackageVersion Include="Scriban" Version="7.2.1" />
<PackageVersion Include="Shouldly" Version="4.3.0" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="7.3.2" />
Expand Down
32 changes: 12 additions & 20 deletions ProblemSource/TrainingApi/Startup.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
using Common.Web;
using Common.Web.Services;
using Microsoft.ApplicationInsights.AspNetCore.Extensions;
using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Extensions.FileProviders;
Expand Down Expand Up @@ -33,6 +31,8 @@ public void ConfigureServices(IServiceCollection services, ConfigurationManager
services.AddTransient<IAccessResolver, AccessResolver>();

services.AddSingleton<CreateUserWithTrainings>();
services.AddHttpClient();
services.AddHttpContextAccessor();

var apiKeyUsers = new List<ApiKeyUser>();
configurationManager.GetSection("AppSettings:ApiKeyUsers").Bind(apiKeyUsers);
Expand Down Expand Up @@ -85,29 +85,21 @@ public void ConfigureServices(IServiceCollection services, ConfigurationManager

services.AddLogging(builder =>
{
builder.AddApplicationInsights(); // AddAzureWebAppDiagnostics
//builder.AddApplicationInsights(); // AddAzureWebAppDiagnostics
});

services.Configure<TelemetryConfiguration>(telemetryConfiguration =>
{
var builder = telemetryConfiguration.DefaultTelemetrySink.TelemetryProcessorChainBuilder;
telemetryConfiguration.DefaultTelemetrySink.TelemetryProcessorChainBuilder
.UseAdaptiveSampling(maxTelemetryItemsPerSecond:5, excludedTypes: "Trace;Request;Exception");
});
services.AddApplicationInsightsTelemetry(new ApplicationInsightsServiceOptions
{
EnableAdaptiveSampling = false,
});

services.AddSingleton<ITelemetryInitializer, UserInformationTelemetryInitializer>();
SetupOpenTelemetry.Add(services, configurationManager);
//SetupAppInsights.Add(services, configurationManager);
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
ServiceConfiguration.ConfigurePlugins(app, plugins);

// Configure the HTTP request pipeline.
if (env.HasDevelopmentEnvironment())
SetupOpenTelemetry.Configure(app);

// Configure the HTTP request pipeline.
if (env.HasDevelopmentEnvironment())
{
//app.UseSwagger();
//app.UseSwaggerUI();
Expand Down Expand Up @@ -219,13 +211,13 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
MinimumSameSitePolicy = env.IsDevelopment() ? Microsoft.AspNetCore.Http.SameSiteMode.None : Microsoft.AspNetCore.Http.SameSiteMode.Lax
});

ServiceConfiguration.ConfigureApplicationInsights(app, config, env.IsDevelopment());
//SetupAppInsights.Configure(app, config, env.IsDevelopment());

//if (oldDbStartup != null)
// oldDbStartup.Configure(app);
}

private IPluginModule[] ConfigureProblemSource(IServiceCollection services, IConfiguration config, IHostEnvironment env)
private IPluginModule[] ConfigureProblemSource(IServiceCollection services, IConfiguration config, IHostEnvironment env)
{
//TypedConfiguration.ConfigureTypedConfiguration<AppSettings>(services, config, "AppSettings");
ConfigureAuthentication(services, config, env);
Expand Down