feat(backend): start work on metrics
This commit is contained in:
parent
fa49030b06
commit
16f230b97d
6 changed files with 53 additions and 4 deletions
|
@ -10,6 +10,7 @@ public class Config
|
||||||
public string MediaBaseUrl { get; set; } = null!;
|
public string MediaBaseUrl { get; set; } = null!;
|
||||||
|
|
||||||
public string Address => $"http://{Host}:{Port}";
|
public string Address => $"http://{Host}:{Port}";
|
||||||
|
public string? MetricsAddress => Logging.MetricsPort != null ? $"http://{Host}:{Logging.MetricsPort}" : null;
|
||||||
|
|
||||||
public LoggingConfig Logging { get; init; } = new();
|
public LoggingConfig Logging { get; init; } = new();
|
||||||
public DatabaseConfig Database { get; init; } = new();
|
public DatabaseConfig Database { get; init; } = new();
|
||||||
|
@ -27,6 +28,7 @@ public class Config
|
||||||
public bool SentryTracing { get; init; } = false;
|
public bool SentryTracing { get; init; } = false;
|
||||||
public double SentryTracesSampleRate { get; init; } = 0.0;
|
public double SentryTracesSampleRate { get; init; } = 0.0;
|
||||||
public bool LogQueries { get; init; } = false;
|
public bool LogQueries { get; init; } = false;
|
||||||
|
public int? MetricsPort { get; init; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class DatabaseConfig
|
public class DatabaseConfig
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
using App.Metrics;
|
||||||
|
using App.Metrics.AspNetCore;
|
||||||
|
using App.Metrics.Formatters.Prometheus;
|
||||||
using Foxnouns.Backend.Database;
|
using Foxnouns.Backend.Database;
|
||||||
using Foxnouns.Backend.Jobs;
|
using Foxnouns.Backend.Jobs;
|
||||||
using Foxnouns.Backend.Middleware;
|
using Foxnouns.Backend.Middleware;
|
||||||
|
@ -6,6 +9,7 @@ using Microsoft.EntityFrameworkCore;
|
||||||
using NodaTime;
|
using NodaTime;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
using Serilog.Events;
|
using Serilog.Events;
|
||||||
|
using IClock = NodaTime.IClock;
|
||||||
|
|
||||||
namespace Foxnouns.Backend.Extensions;
|
namespace Foxnouns.Backend.Extensions;
|
||||||
|
|
||||||
|
@ -29,6 +33,7 @@ public static class WebApplicationExtensions
|
||||||
.MinimumLevel.Override("Microsoft.AspNetCore.Hosting", LogEventLevel.Warning)
|
.MinimumLevel.Override("Microsoft.AspNetCore.Hosting", LogEventLevel.Warning)
|
||||||
.MinimumLevel.Override("Microsoft.AspNetCore.Mvc", LogEventLevel.Warning)
|
.MinimumLevel.Override("Microsoft.AspNetCore.Mvc", LogEventLevel.Warning)
|
||||||
.MinimumLevel.Override("Microsoft.AspNetCore.Routing", LogEventLevel.Warning)
|
.MinimumLevel.Override("Microsoft.AspNetCore.Routing", LogEventLevel.Warning)
|
||||||
|
.MinimumLevel.Override("Hangfire", LogEventLevel.Information)
|
||||||
.WriteTo.Console();
|
.WriteTo.Console();
|
||||||
|
|
||||||
if (config.Logging.SeqLogUrl != null)
|
if (config.Logging.SeqLogUrl != null)
|
||||||
|
@ -52,6 +57,36 @@ public static class WebApplicationExtensions
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static WebApplicationBuilder AddMetrics(this WebApplicationBuilder builder)
|
||||||
|
{
|
||||||
|
var config = builder.Configuration.Get<Config>() ?? new();
|
||||||
|
var metrics = AppMetrics.CreateDefaultBuilder()
|
||||||
|
.OutputMetrics.AsPrometheusPlainText()
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
builder.Services.AddSingleton(metrics);
|
||||||
|
builder.Services.AddSingleton<IMetrics>(metrics);
|
||||||
|
|
||||||
|
builder.WebHost
|
||||||
|
.ConfigureMetrics(metrics)
|
||||||
|
.UseMetrics(opts =>
|
||||||
|
{
|
||||||
|
opts.EndpointOptions = options =>
|
||||||
|
{
|
||||||
|
// Metrics must listen on a separate port for security reasons. If no metrics port is set, disable the endpoint entirely.
|
||||||
|
options.MetricsEndpointEnabled = config.Logging.MetricsPort != null;
|
||||||
|
options.EnvironmentInfoEndpointEnabled = config.Logging.MetricsPort != null;
|
||||||
|
options.MetricsTextEndpointEnabled = false;
|
||||||
|
options.MetricsEndpointOutputFormatter = metrics.OutputMetricsFormatters
|
||||||
|
.OfType<MetricsPrometheusTextOutputFormatter>().First();
|
||||||
|
};
|
||||||
|
})
|
||||||
|
.UseMetricsWebTracking()
|
||||||
|
.ConfigureAppMetricsHostingConfiguration(opts => { opts.AllEndpointsPort = config.Logging.MetricsPort; });
|
||||||
|
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
public static IConfigurationBuilder AddConfiguration(this IConfigurationBuilder builder)
|
public static IConfigurationBuilder AddConfiguration(this IConfigurationBuilder builder)
|
||||||
{
|
{
|
||||||
var file = Environment.GetEnvironmentVariable("FOXNOUNS_CONFIG_FILE") ?? "config.ini";
|
var file = Environment.GetEnvironmentVariable("FOXNOUNS_CONFIG_FILE") ?? "config.ini";
|
||||||
|
|
|
@ -6,6 +6,9 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="App.Metrics" Version="4.3.0" />
|
||||||
|
<PackageReference Include="App.Metrics.AspNetCore.All" Version="4.3.0" />
|
||||||
|
<PackageReference Include="App.Metrics.Prometheus" Version="4.3.0" />
|
||||||
<PackageReference Include="EFCore.NamingConventions" Version="8.0.3"/>
|
<PackageReference Include="EFCore.NamingConventions" Version="8.0.3"/>
|
||||||
<PackageReference Include="Hangfire.AspNetCore" Version="1.8.14" />
|
<PackageReference Include="Hangfire.AspNetCore" Version="1.8.14" />
|
||||||
<PackageReference Include="Hangfire.Core" Version="1.8.14" />
|
<PackageReference Include="Hangfire.Core" Version="1.8.14" />
|
||||||
|
|
6
Foxnouns.Backend/Metrics.cs
Normal file
6
Foxnouns.Backend/Metrics.cs
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
namespace Foxnouns.Backend;
|
||||||
|
|
||||||
|
public static class Metrics
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
|
@ -21,7 +21,7 @@ var builder = WebApplication.CreateBuilder(args);
|
||||||
|
|
||||||
var config = builder.AddConfiguration();
|
var config = builder.AddConfiguration();
|
||||||
|
|
||||||
builder.AddSerilog();
|
builder.AddSerilog().AddMetrics();
|
||||||
|
|
||||||
builder.WebHost
|
builder.WebHost
|
||||||
.UseSentry(opts =>
|
.UseSentry(opts =>
|
||||||
|
@ -75,9 +75,9 @@ builder.Services
|
||||||
.Build());
|
.Build());
|
||||||
|
|
||||||
builder.Services.AddHangfire(c => c.UseSentry().UseRedisStorage(config.Jobs.Redis, new RedisStorageOptions
|
builder.Services.AddHangfire(c => c.UseSentry().UseRedisStorage(config.Jobs.Redis, new RedisStorageOptions
|
||||||
{
|
{
|
||||||
Prefix = "foxnouns_"
|
Prefix = "foxnouns_"
|
||||||
}))
|
}))
|
||||||
.AddHangfireServer(options => { options.WorkerCount = config.Jobs.Workers; });
|
.AddHangfireServer(options => { options.WorkerCount = config.Jobs.Workers; });
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
|
@ -103,6 +103,7 @@ app.UseHangfireDashboard("/hangfire", new DashboardOptions
|
||||||
|
|
||||||
app.Urls.Clear();
|
app.Urls.Clear();
|
||||||
app.Urls.Add(config.Address);
|
app.Urls.Add(config.Address);
|
||||||
|
if (config.MetricsAddress != null) app.Urls.Add(config.MetricsAddress);
|
||||||
|
|
||||||
// Fire off the periodic tasks loop in the background
|
// Fire off the periodic tasks loop in the background
|
||||||
_ = new Timer(_ =>
|
_ = new Timer(_ =>
|
||||||
|
|
|
@ -20,6 +20,8 @@ SentryTracing = true
|
||||||
SentryTracesSampleRate = 1.0
|
SentryTracesSampleRate = 1.0
|
||||||
; Whether to log SQL queries. Note that this is very verbose. Defaults to false.
|
; Whether to log SQL queries. Note that this is very verbose. Defaults to false.
|
||||||
LogQueries = false
|
LogQueries = false
|
||||||
|
; The port the /metrics endpoint will listen on. If not set, metrics will be disabled.
|
||||||
|
MetricsPort = 5001
|
||||||
|
|
||||||
[Database]
|
[Database]
|
||||||
; The database URL in ADO.NET format.
|
; The database URL in ADO.NET format.
|
||||||
|
|
Loading…
Reference in a new issue