Started implementing metrics system

This commit is contained in:
2025-05-23 17:15:19 +02:00
parent 565d9a5a4d
commit f3a35bd62a
7 changed files with 203 additions and 8 deletions

View File

@@ -2,8 +2,12 @@ using Microsoft.OpenApi.Models;
using Moonlight.ApiServer.Configuration;
using Moonlight.ApiServer.Database;
using Moonlight.ApiServer.Implementations.Diagnose;
using Moonlight.ApiServer.Implementations.Metrics;
using Moonlight.ApiServer.Interfaces;
using Moonlight.ApiServer.Plugins;
using Moonlight.ApiServer.Services;
using OpenTelemetry.Metrics;
using OpenTelemetry.Trace;
namespace Moonlight.ApiServer.Implementations.Startup;
@@ -13,13 +17,13 @@ public class CoreStartup : IPluginStartup
public Task BuildApplication(IServiceProvider serviceProvider, IHostApplicationBuilder builder)
{
var configuration = serviceProvider.GetRequiredService<AppConfiguration>();
#region Api Docs
if (configuration.Development.EnableApiDocs)
{
builder.Services.AddEndpointsApiExplorer();
// Configure swagger api specification generator and set the document title for the api docs to use
builder.Services.AddSwaggerGen(options =>
{
@@ -27,9 +31,9 @@ public class CoreStartup : IPluginStartup
{
Title = "Moonlight API"
});
options.CustomSchemaIds(x => x.FullName);
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Name = "Authorization",
@@ -54,22 +58,53 @@ public class CoreStartup : IPluginStartup
builder.Services.AddSingleton<IDiagnoseProvider, LogsDiagnoseProvider>();
#endregion
#region Prometheus
if (configuration.Metrics.Enable)
{
builder.Services.AddSingleton<MetricsBackgroundService>();
builder.Services.AddHostedService(sp => sp.GetRequiredService<MetricsBackgroundService>());
builder.Services.AddSingleton<IMetric, ApplicationMetric>();
builder.Services.AddSingleton<IMetric, UsersMetric>();
builder.Services.AddOpenTelemetry()
.WithMetrics(providerBuilder =>
{
providerBuilder.AddPrometheusExporter();
providerBuilder.AddAspNetCoreInstrumentation();
providerBuilder.AddMeter("moonlight");
});
}
#endregion
return Task.CompletedTask;
}
public Task ConfigureApplication(IServiceProvider serviceProvider, IApplicationBuilder app)
{
var configuration = serviceProvider.GetRequiredService<AppConfiguration>();
#region Prometheus
if(configuration.Metrics.Enable)
app.UseOpenTelemetryPrometheusScrapingEndpoint();
#endregion
return Task.CompletedTask;
}
public Task ConfigureEndpoints(IServiceProvider serviceProvider, IEndpointRouteBuilder routeBuilder)
{
var configuration = serviceProvider.GetRequiredService<AppConfiguration>();
if(configuration.Development.EnableApiDocs)
if (configuration.Development.EnableApiDocs)
routeBuilder.MapSwagger("/api/swagger/{documentName}");
return Task.CompletedTask;
}
}