From a1a3b9dd830dcd1dfff53d228ff727f358880cda Mon Sep 17 00:00:00 2001 From: Tom Date: Thu, 18 Apr 2024 22:19:21 +0100 Subject: [PATCH 1/2] add otel --- Directory.Packages.props | 6 +++ .../ApiServiceCollectionExtensions.cs | 49 +++++++++++++++++++ Jellyfin.Server/Jellyfin.Server.csproj | 6 +++ Jellyfin.Server/Startup.cs | 2 + .../Configuration/OtelConfiguration.cs | 27 ++++++++++ .../Configuration/ServerConfiguration.cs | 5 ++ 6 files changed, 95 insertions(+) create mode 100644 MediaBrowser.Model/Configuration/OtelConfiguration.cs diff --git a/Directory.Packages.props b/Directory.Packages.props index e125b536a7..72d1d18372 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -55,6 +55,12 @@ + + + + + + diff --git a/Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs b/Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs index 597643ed19..c9a2991112 100644 --- a/Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs +++ b/Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs @@ -24,6 +24,7 @@ using Jellyfin.Server.Configuration; using Jellyfin.Server.Filters; using MediaBrowser.Common.Api; using MediaBrowser.Common.Net; +using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Entities; using MediaBrowser.Model.Session; using Microsoft.AspNetCore.Authentication; @@ -35,6 +36,9 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.OpenApi.Any; using Microsoft.OpenApi.Interfaces; using Microsoft.OpenApi.Models; +using OpenTelemetry.Metrics; +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; using Swashbuckle.AspNetCore.SwaggerGen; using AuthenticationSchemes = Jellyfin.Api.Constants.AuthenticationSchemes; @@ -255,6 +259,51 @@ namespace Jellyfin.Server.Extensions }); } + /// + /// Add Open Telemetry Services. + /// + /// The Service Collection. + /// Otel Config. + /// Application Version. + /// Updated Service Collection. + public static IServiceCollection AddOTel(this IServiceCollection serviceCollection, OtelConfiguration config, string appVersion) + { + serviceCollection + .AddOpenTelemetry() + .ConfigureResource(resourceBuilder => resourceBuilder.AddService("JellyFin", appVersion)) + .WithMetrics(metrics => + { + metrics + .AddMeter(config.Meters) + .AddAspNetCoreInstrumentation() + .AddRuntimeInstrumentation() + .AddHttpClientInstrumentation(); + if (config.Enabled) + { + metrics.AddOtlpExporter(exporter => + { + exporter.Endpoint = new Uri(config.Endpoint); + }); + } + }) + .WithTracing(tracing => + { + tracing + .AddSource(config.ActivitySources) + .AddAspNetCoreInstrumentation() + .AddHttpClientInstrumentation(); + if (config.Enabled) + { + tracing.AddOtlpExporter(exporter => + { + exporter.Endpoint = new Uri(config.Endpoint); + }); + } + }); + + return serviceCollection; + } + private static void AddPolicy(this AuthorizationOptions authorizationOptions, string policyName, IAuthorizationRequirement authorizationRequirement) { authorizationOptions.AddPolicy(policyName, policy => diff --git a/Jellyfin.Server/Jellyfin.Server.csproj b/Jellyfin.Server/Jellyfin.Server.csproj index e18212908e..c57685aa68 100644 --- a/Jellyfin.Server/Jellyfin.Server.csproj +++ b/Jellyfin.Server/Jellyfin.Server.csproj @@ -48,6 +48,12 @@ + + + + + + diff --git a/Jellyfin.Server/Startup.cs b/Jellyfin.Server/Startup.cs index e9fb3e4c27..d5d795fda4 100644 --- a/Jellyfin.Server/Startup.cs +++ b/Jellyfin.Server/Startup.cs @@ -127,6 +127,8 @@ namespace Jellyfin.Server services.AddHlsPlaylistGenerator(); services.AddLiveTvServices(); + services.AddOTel(_serverConfigurationManager.Configuration.OtelConfiguration, _serverApplicationHost.ApplicationVersionString); + services.AddHostedService(); services.AddHostedService(); services.AddHostedService(); diff --git a/MediaBrowser.Model/Configuration/OtelConfiguration.cs b/MediaBrowser.Model/Configuration/OtelConfiguration.cs new file mode 100644 index 0000000000..e22d7519b4 --- /dev/null +++ b/MediaBrowser.Model/Configuration/OtelConfiguration.cs @@ -0,0 +1,27 @@ +namespace MediaBrowser.Model.Configuration; + +/// +/// Open Telemetry Configuration. +/// +public class OtelConfiguration +{ + /// + /// Gets or Sets a value indicating whether to enable otlp. + /// + public bool Enabled { get; set; } + + /// + /// Gets or Sets the endpoint to exporter to. + /// + public string Endpoint { get; set; } = string.Empty; + + /// + /// Gets or sets the meters to listen to. + /// + public string Meters { get; set; } = string.Empty; + + /// + /// Gets or sets the activity sources to listen to. + /// + public string ActivitySources { get; set; } = string.Empty; +} diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs index fe92251e9b..6ad788e5fc 100644 --- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs +++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs @@ -283,4 +283,9 @@ public class ServerConfiguration : BaseApplicationConfiguration /// /// The trickplay options. public TrickplayOptions TrickplayOptions { get; set; } = new TrickplayOptions(); + + /// + /// Gets or sets the otel config. + /// + public OtelConfiguration OtelConfiguration { get; set; } = new OtelConfiguration(); } From 5c7cd1c8ebe45e80431a311eb85dd576625a89c5 Mon Sep 17 00:00:00 2001 From: Tom Date: Thu, 18 Apr 2024 22:25:49 +0100 Subject: [PATCH 2/2] move check --- .../ApiServiceCollectionExtensions.cs | 47 +++++++++---------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs b/Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs index c9a2991112..2a99ee4255 100644 --- a/Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs +++ b/Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs @@ -268,38 +268,35 @@ namespace Jellyfin.Server.Extensions /// Updated Service Collection. public static IServiceCollection AddOTel(this IServiceCollection serviceCollection, OtelConfiguration config, string appVersion) { - serviceCollection - .AddOpenTelemetry() - .ConfigureResource(resourceBuilder => resourceBuilder.AddService("JellyFin", appVersion)) - .WithMetrics(metrics => - { - metrics - .AddMeter(config.Meters) - .AddAspNetCoreInstrumentation() - .AddRuntimeInstrumentation() - .AddHttpClientInstrumentation(); - if (config.Enabled) + if (config.Enabled) + { + serviceCollection + .AddOpenTelemetry() + .ConfigureResource(resourceBuilder => resourceBuilder.AddService("JellyFin", appVersion)) + .WithMetrics(metrics => { + metrics + .AddMeter(config.Meters) + .AddAspNetCoreInstrumentation() + .AddRuntimeInstrumentation() + .AddHttpClientInstrumentation(); metrics.AddOtlpExporter(exporter => - { - exporter.Endpoint = new Uri(config.Endpoint); - }); - } - }) - .WithTracing(tracing => - { - tracing - .AddSource(config.ActivitySources) - .AddAspNetCoreInstrumentation() - .AddHttpClientInstrumentation(); - if (config.Enabled) + { + exporter.Endpoint = new Uri(config.Endpoint); + }); + }) + .WithTracing(tracing => { + tracing + .AddSource(config.ActivitySources) + .AddAspNetCoreInstrumentation() + .AddHttpClientInstrumentation(); tracing.AddOtlpExporter(exporter => { exporter.Endpoint = new Uri(config.Endpoint); }); - } - }); + }); + } return serviceCollection; }