diff --git a/.github/workflows/pr-build.yml b/.github/workflows/pr-build.yml
index 040944b..e0329c1 100644
--- a/.github/workflows/pr-build.yml
+++ b/.github/workflows/pr-build.yml
@@ -33,5 +33,6 @@ jobs:
- name: Pack
run: |
+ dotnet pack src/TrackSeries.FanArtTV.Client.Diagnostics/TrackSeries.FanArtTV.Client.Diagnostics.csproj --no-build -c Release /p:Packing=true /p:CI=true
dotnet pack src/TrackSeries.FanArtTV.Client/TrackSeries.FanArtTV.Client.csproj --no-build -c Release /p:Packing=true /p:CI=true
dotnet pack src/TrackSeries.FanArtTV.Client.OpenTelemetry/TrackSeries.FanArtTV.Client.OpenTelemetry.csproj --no-build -c Release /p:Packing=true /p:CI=true
diff --git a/.github/workflows/publish-on-main.yml b/.github/workflows/publish-on-main.yml
index 04e0137..d19bf3d 100644
--- a/.github/workflows/publish-on-main.yml
+++ b/.github/workflows/publish-on-main.yml
@@ -40,6 +40,7 @@ jobs:
- name: Pack
run: |
+ dotnet pack src/TrackSeries.FanArtTV.Client.Diagnostics/TrackSeries.FanArtTV.Client.Diagnostics.csproj --no-build -c Release /p:Packing=true /p:CI=true -o ./artifacts
dotnet pack src/TrackSeries.FanArtTV.Client/TrackSeries.FanArtTV.Client.csproj --no-build -c Release /p:Packing=true /p:CI=true -o ./artifacts
dotnet pack src/TrackSeries.FanArtTV.Client.OpenTelemetry/TrackSeries.FanArtTV.Client.OpenTelemetry.csproj --no-build -c Release /p:Packing=true /p:CI=true -o ./artifacts
diff --git a/.github/workflows/publish-on-tag.yml b/.github/workflows/publish-on-tag.yml
index f224721..9b55831 100644
--- a/.github/workflows/publish-on-tag.yml
+++ b/.github/workflows/publish-on-tag.yml
@@ -52,6 +52,7 @@ jobs:
- name: Pack
run: |
+ dotnet pack src/TrackSeries.FanArtTV.Client.Diagnostics/TrackSeries.FanArtTV.Client.Diagnostics.csproj --no-build -c Release /p:Packing=true /p:CI=true -o ./artifacts
dotnet pack src/TrackSeries.FanArtTV.Client/TrackSeries.FanArtTV.Client.csproj --no-build -c Release /p:Packing=true /p:CI=true -o ./artifacts
dotnet pack src/TrackSeries.FanArtTV.Client.OpenTelemetry/TrackSeries.FanArtTV.Client.OpenTelemetry.csproj --no-build -c Release /p:Packing=true /p:CI=true -o ./artifacts
diff --git a/README.md b/README.md
index 44a8c3b..5919c76 100644
--- a/README.md
+++ b/README.md
@@ -77,6 +77,8 @@ services
Configure exporters, resources and sampling in the application as usual. The standard `HttpClient` instrumentation can be enabled alongside this integration to observe individual HTTP attempts, while the FanArtTV activity represents the logical request across retries.
+Services that only need the stable source and meter names can reference the lightweight `TrackSeries.FanArtTV.Client.Diagnostics` package without pulling in the client or OpenTelemetry dependencies.
+
[Integration example](https://github.com/TrackSeries/TrackSeries.FanArtTV.Client/blob/main/tests/TrackSeries.FanArtTV.Client.IntegrationTests/FanArtTVSmokeTests.cs)
## Migrating to version 2
diff --git a/RELEASING.md b/RELEASING.md
index 9fac88a..202eda4 100644
--- a/RELEASING.md
+++ b/RELEASING.md
@@ -29,7 +29,7 @@ git tag -a "v$version" -m "Release $version"
git push origin "v$version"
```
-The tag triggers `.github/workflows/publish-on-tag.yml`, which builds both packages, publishes them to NuGet.org, and creates a GitHub Release with automatically generated release notes. Pushing the next prerelease version to `main` publishes prerelease packages to GitHub Packages.
+The tag triggers `.github/workflows/publish-on-tag.yml`, which builds all three packages, publishes them to NuGet.org, and creates a GitHub Release with automatically generated release notes. Pushing the next prerelease version to `main` publishes prerelease packages to GitHub Packages.
If pushing the tag does not start a workflow run, trigger the safe manual fallback from `main` with the same `v`-prefixed tag:
diff --git a/TrackSeries.FanArtTV.Client.slnx b/TrackSeries.FanArtTV.Client.slnx
index 6bbaa69..b1d8caa 100644
--- a/TrackSeries.FanArtTV.Client.slnx
+++ b/TrackSeries.FanArtTV.Client.slnx
@@ -5,6 +5,7 @@
+
diff --git a/src/TrackSeries.FanArtTV.Client/Diagnostics/FanArtTVClientTelemetry.cs b/src/TrackSeries.FanArtTV.Client.Diagnostics/FanArtTVClientTelemetry.cs
similarity index 100%
rename from src/TrackSeries.FanArtTV.Client/Diagnostics/FanArtTVClientTelemetry.cs
rename to src/TrackSeries.FanArtTV.Client.Diagnostics/FanArtTVClientTelemetry.cs
diff --git a/src/TrackSeries.FanArtTV.Client.Diagnostics/TrackSeries.FanArtTV.Client.Diagnostics.csproj b/src/TrackSeries.FanArtTV.Client.Diagnostics/TrackSeries.FanArtTV.Client.Diagnostics.csproj
new file mode 100644
index 0000000..3231109
--- /dev/null
+++ b/src/TrackSeries.FanArtTV.Client.Diagnostics/TrackSeries.FanArtTV.Client.Diagnostics.csproj
@@ -0,0 +1,13 @@
+
+
+
+ net10.0;net8.0
+ enable
+ enable
+ latest
+ true
+ $(NoWarn);1591
+ Stable telemetry names for TrackSeries.FanArtTV.Client instrumentation.
+
+
+
diff --git a/src/TrackSeries.FanArtTV.Client.OpenTelemetry/TrackSeries.FanArtTV.Client.OpenTelemetry.csproj b/src/TrackSeries.FanArtTV.Client.OpenTelemetry/TrackSeries.FanArtTV.Client.OpenTelemetry.csproj
index b2682a8..3231431 100644
--- a/src/TrackSeries.FanArtTV.Client.OpenTelemetry/TrackSeries.FanArtTV.Client.OpenTelemetry.csproj
+++ b/src/TrackSeries.FanArtTV.Client.OpenTelemetry/TrackSeries.FanArtTV.Client.OpenTelemetry.csproj
@@ -11,7 +11,7 @@
-
+
diff --git a/src/TrackSeries.FanArtTV.Client/Diagnostics/TypeForwarders.cs b/src/TrackSeries.FanArtTV.Client/Diagnostics/TypeForwarders.cs
new file mode 100644
index 0000000..936f154
--- /dev/null
+++ b/src/TrackSeries.FanArtTV.Client/Diagnostics/TypeForwarders.cs
@@ -0,0 +1,4 @@
+using System.Runtime.CompilerServices;
+using TrackSeries.FanArtTV.Client.Diagnostics;
+
+[assembly: TypeForwardedTo(typeof(FanArtTVClientTelemetry))]
diff --git a/src/TrackSeries.FanArtTV.Client/TrackSeries.FanArtTV.Client.csproj b/src/TrackSeries.FanArtTV.Client/TrackSeries.FanArtTV.Client.csproj
index 200c784..fd2ad9e 100644
--- a/src/TrackSeries.FanArtTV.Client/TrackSeries.FanArtTV.Client.csproj
+++ b/src/TrackSeries.FanArtTV.Client/TrackSeries.FanArtTV.Client.csproj
@@ -14,6 +14,10 @@
+
+
+
+
diff --git a/tests/TrackSeries.FanArtTV.Client.UnitTests/FanArtTVClientDiagnosticsContractTests.cs b/tests/TrackSeries.FanArtTV.Client.UnitTests/FanArtTVClientDiagnosticsContractTests.cs
new file mode 100644
index 0000000..c7506a4
--- /dev/null
+++ b/tests/TrackSeries.FanArtTV.Client.UnitTests/FanArtTVClientDiagnosticsContractTests.cs
@@ -0,0 +1,35 @@
+using OpenTelemetry;
+using TrackSeries.FanArtTV.Client.Diagnostics;
+
+namespace TrackSeries.FanArtTV.Client.UnitTests;
+
+public sealed class FanArtTVClientDiagnosticsContractTests
+{
+ [Fact]
+ public void Client_Uses_Stable_Telemetry_Contract()
+ {
+ Assert.Equal("TrackSeries.FanArtTV.Client", FanArtTVClientTelemetry.ActivitySourceName);
+ Assert.Equal("TrackSeries.FanArtTV.Client", FanArtTVClientTelemetry.MeterName);
+ Assert.Equal(FanArtTVClientTelemetry.ActivitySourceName, FanArtTVClientDiagnostics.ActivitySource.Name);
+ Assert.Equal(FanArtTVClientTelemetry.MeterName, FanArtTVClientDiagnostics.Meter.Name);
+ }
+
+ [Fact]
+ public void Main_Client_Forwards_Existing_Telemetry_Contract_Type()
+ {
+ Assert.Contains(
+ typeof(FanArtTVClientTelemetry),
+ typeof(IFanArtTVClient).Assembly.GetForwardedTypes());
+ }
+
+ [Fact]
+ public void OpenTelemetry_Assembly_Does_Not_Reference_Main_Client()
+ {
+ var referencedAssemblyNames = typeof(FanArtTVClientOpenTelemetryBuilderExtensions)
+ .Assembly
+ .GetReferencedAssemblies()
+ .Select(static assembly => assembly.Name);
+
+ Assert.DoesNotContain("TrackSeries.FanArtTV.Client", referencedAssemblyNames);
+ }
+}