Skip to content

Commit 6748288

Browse files
authored
Merge pull request #452 from Moonlight-Panel/v2.1_OpenTelemetry
Added open telemetry exporter to existing metric system. Improved config section for metrics
2 parents c02c13b + 2c5d45e commit 6748288

File tree

4 files changed

+87
-23
lines changed

4 files changed

+87
-23
lines changed

Moonlight.ApiServer/Configuration/AppConfiguration.cs

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,26 @@ namespace Moonlight.ApiServer.Configuration;
66

77
public record AppConfiguration
88
{
9-
[YamlMember(Description = "The public url your instance should be accessible through")]
9+
[YamlMember(Description = "Moonlight configuration\n\n\nThe public url your instance should be accessible through")]
1010
public string PublicUrl { get; set; } = "http://localhost:5165";
1111

12-
[YamlMember(Description = "The credentials of the postgres which moonlight should use")]
12+
[YamlMember(Description = "\nThe credentials of the postgres which moonlight should use")]
1313
public DatabaseConfig Database { get; set; } = new();
1414

15-
[YamlMember(Description = "Settings regarding authentication")]
15+
[YamlMember(Description = "\nSettings regarding authentication")]
1616
public AuthenticationConfig Authentication { get; set; } = new();
1717

18-
[YamlMember(Description = "These options are only meant for development purposes")]
18+
[YamlMember(Description = "\nThese options are only meant for development purposes")]
1919
public DevelopmentConfig Development { get; set; } = new();
20+
21+
[YamlMember(Description = "\nSettings for hosting the frontend")]
2022
public FrontendData Frontend { get; set; } = new();
23+
24+
[YamlMember(Description = "\nSettings for the internal web server moonlight is running in")]
2125
public KestrelConfig Kestrel { get; set; } = new();
22-
public MetricsData Metrics { get; set; } = new();
26+
27+
[YamlMember(Description = "\nSettings for open telemetry")]
28+
public OpenTelemetryData OpenTelemetry { get; set; } = new();
2329

2430
public static AppConfiguration CreateEmpty()
2531
{
@@ -91,12 +97,37 @@ public record KestrelConfig
9197
public string[] AllowedOrigins { get; set; } = ["*"];
9298
}
9399

94-
public record MetricsData
100+
public record OpenTelemetryData
95101
{
96-
[YamlMember(Description = "This enables the collecting of metrics and allows access to the /metrics endpoint")]
102+
[YamlMember(Description = "This enables open telemetry for moonlight")]
97103
public bool Enable { get; set; } = false;
104+
105+
public OpenTelemetryMetricsData Metrics { get; set; } = new();
106+
public OpenTelemetryTracesData Traces { get; set; } = new();
107+
public OpenTelemetryLogsData Logs { get; set; } = new();
108+
}
109+
110+
public record OpenTelemetryMetricsData
111+
{
112+
[YamlMember(Description = "This enables the exporting of metrics")]
113+
public bool Enable { get; set; } = true;
114+
115+
[YamlMember(Description = "Enables the /metrics exporter for prometheus")]
116+
public bool EnablePrometheus { get; set; } = false;
98117

99118
[YamlMember(Description = "The interval in which metrics are created, specified in seconds")]
100119
public int Interval { get; set; } = 15;
101120
}
121+
122+
public record OpenTelemetryTracesData
123+
{
124+
[YamlMember(Description = "This enables the exporting of traces")]
125+
public bool Enable { get; set; } = true;
126+
}
127+
128+
public record OpenTelemetryLogsData
129+
{
130+
[YamlMember(Description = "This enables the exporting of logs")]
131+
public bool Enable { get; set; } = true;
132+
}
102133
}

Moonlight.ApiServer/Implementations/Startup/CoreStartup.cs

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Microsoft.AspNetCore.Routing;
33
using Microsoft.Extensions.DependencyInjection;
44
using Microsoft.Extensions.Hosting;
5+
using Microsoft.Extensions.Logging;
56
using Microsoft.OpenApi.Models;
67
using Moonlight.ApiServer.Configuration;
78
using Moonlight.ApiServer.Database;
@@ -11,7 +12,10 @@
1112
using Moonlight.ApiServer.Models;
1213
using Moonlight.ApiServer.Plugins;
1314
using Moonlight.ApiServer.Services;
15+
using OpenTelemetry.Logs;
1416
using OpenTelemetry.Metrics;
17+
using OpenTelemetry.Resources;
18+
using OpenTelemetry.Trace;
1519

1620
namespace Moonlight.ApiServer.Implementations.Startup;
1721

@@ -64,22 +68,56 @@ public Task BuildApplication(IServiceProvider serviceProvider, IHostApplicationB
6468

6569
#region Prometheus
6670

67-
if (configuration.Metrics.Enable)
71+
if (configuration.OpenTelemetry.Enable)
6872
{
69-
builder.Services.AddSingleton<MetricsBackgroundService>();
70-
builder.Services.AddHostedService(sp => sp.GetRequiredService<MetricsBackgroundService>());
73+
var openTel = builder.Services.AddOpenTelemetry();
74+
var openTelConfig = configuration.OpenTelemetry;
7175

72-
builder.Services.AddSingleton<IMetric, ApplicationMetric>();
73-
builder.Services.AddSingleton<IMetric, UsersMetric>();
76+
var resourceBuilder = ResourceBuilder.CreateDefault();
77+
resourceBuilder.AddService(serviceName: "moonlight");
7478

75-
builder.Services.AddOpenTelemetry()
76-
.WithMetrics(providerBuilder =>
79+
openTel.ConfigureResource(x => x.AddService(serviceName: "moonlight"));
80+
81+
if (openTelConfig.Metrics.Enable)
82+
{
83+
builder.Services.AddSingleton<MetricsBackgroundService>();
84+
builder.Services.AddHostedService(sp => sp.GetRequiredService<MetricsBackgroundService>());
85+
86+
builder.Services.AddSingleton<IMetric, ApplicationMetric>();
87+
builder.Services.AddSingleton<IMetric, UsersMetric>();
88+
89+
openTel.WithMetrics(providerBuilder =>
7790
{
78-
providerBuilder.AddPrometheusExporter();
7991
providerBuilder.AddAspNetCoreInstrumentation();
92+
providerBuilder.AddOtlpExporter();
93+
94+
if (openTelConfig.Metrics.EnablePrometheus)
95+
providerBuilder.AddPrometheusExporter();
8096

8197
providerBuilder.AddMeter("moonlight");
8298
});
99+
}
100+
101+
if (openTelConfig.Logs.Enable)
102+
{
103+
openTel.WithLogging();
104+
105+
builder.Logging.AddOpenTelemetry(options =>
106+
{
107+
options.SetResourceBuilder(resourceBuilder);
108+
options.AddOtlpExporter();
109+
});
110+
}
111+
112+
if (openTelConfig.Traces.Enable)
113+
{
114+
openTel.WithTracing(providerBuilder =>
115+
{
116+
providerBuilder.AddAspNetCoreInstrumentation();
117+
118+
providerBuilder.AddOtlpExporter();
119+
});
120+
}
83121
}
84122

85123
#endregion
@@ -110,7 +148,7 @@ public Task ConfigureApplication(IServiceProvider serviceProvider, IApplicationB
110148

111149
#region Prometheus
112150

113-
if (configuration.Metrics.Enable)
151+
if (configuration.OpenTelemetry is { Enable: true, Metrics.EnablePrometheus: true })
114152
app.UseOpenTelemetryPrometheusScrapingEndpoint();
115153

116154
#endregion

Moonlight.ApiServer/Moonlight.ApiServer.csproj

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
<PackageReference Include="MoonCore" Version="1.9.6"/>
3131
<PackageReference Include="MoonCore.Extended" Version="1.3.6"/>
3232
<PackageReference Include="MoonCore.PluginFramework.Generator" Version="1.0.2"/>
33+
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.12.0" />
3334
<PackageReference Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.12.0-beta.1"/>
3435
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.12.0"/>
3536
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.12.0"/>
@@ -38,10 +39,4 @@
3839
<PackageReference Include="Swashbuckle.AspNetCore" Version="8.1.2"/>
3940
<PackageReference Include="Ben.Demystifier" Version="0.4.1"/>
4041
</ItemGroup>
41-
<ItemGroup>
42-
<Compile Remove="storage\**\*"/>
43-
<Content Remove="storage\**\*"/>
44-
<None Remove="storage\**\*"/>
45-
<None Remove="Properties\launchSettings.json"/>
46-
</ItemGroup>
4742
</Project>

Moonlight.ApiServer/Services/MetricsBackgroundService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
7373
}
7474

7575
await Task.Delay(
76-
TimeSpan.FromSeconds(Configuration.Metrics.Interval),
76+
TimeSpan.FromSeconds(Configuration.OpenTelemetry.Metrics.Interval),
7777
stoppingToken
7878
);
7979
}

0 commit comments

Comments
 (0)