From 388942c2a59f2b1f18c27e533ddfd1bd78f73ec3 Mon Sep 17 00:00:00 2001 From: "Carlos J. Aliaga" Date: Fri, 7 Aug 2026 14:49:24 +0200 Subject: [PATCH 1/2] Extract FanArtTV telemetry contracts (#5) Move the stable activity source and meter names into a lightweight diagnostics package so OpenTelemetry registration no longer depends on the full client graph. Preserve the existing public type through forwarding and publish all three packages together. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .github/workflows/pr-build.yml | 1 + .github/workflows/publish-on-main.yml | 1 + .github/workflows/publish-on-tag.yml | 1 + README.md | 2 ++ RELEASING.md | 2 +- TrackSeries.FanArtTV.Client.slnx | 1 + .../FanArtTVClientTelemetry.cs | 0 ...kSeries.FanArtTV.Client.Diagnostics.csproj | 13 +++++++ ...eries.FanArtTV.Client.OpenTelemetry.csproj | 2 +- .../Diagnostics/TypeForwarders.cs | 4 +++ .../TrackSeries.FanArtTV.Client.csproj | 4 +++ .../FanArtTVClientDiagnosticsContractTests.cs | 35 +++++++++++++++++++ 12 files changed, 64 insertions(+), 2 deletions(-) rename src/{TrackSeries.FanArtTV.Client/Diagnostics => TrackSeries.FanArtTV.Client.Diagnostics}/FanArtTVClientTelemetry.cs (100%) create mode 100644 src/TrackSeries.FanArtTV.Client.Diagnostics/TrackSeries.FanArtTV.Client.Diagnostics.csproj create mode 100644 src/TrackSeries.FanArtTV.Client/Diagnostics/TypeForwarders.cs create mode 100644 tests/TrackSeries.FanArtTV.Client.UnitTests/FanArtTVClientDiagnosticsContractTests.cs 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); + } +} From 8df9bab46ccf6bf05e995f62c6a49ab824297dcb Mon Sep 17 00:00:00 2001 From: "Carlos J. Aliaga" Date: Fri, 7 Aug 2026 14:53:54 +0200 Subject: [PATCH 2/2] Complete telemetry split forward port Preserve main's manual release fallback while carrying the Diagnostics package through all build and publish workflows. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 303993ae-a512-46f4-bbb6-8f66a6838305