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();
}