diff --git a/Directory.Packages.props b/Directory.Packages.props index 0998c2b312..b26b37aa24 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..2a99ee4255 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,48 @@ 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) + { + 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(); + 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(); }