WilliamBelle.Monitoring 0.4.0

Prefix Reserved
dotnet add package WilliamBelle.Monitoring --version 0.4.0
                    
NuGet\Install-Package WilliamBelle.Monitoring -Version 0.4.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="WilliamBelle.Monitoring" Version="0.4.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="WilliamBelle.Monitoring" Version="0.4.0" />
                    
Directory.Packages.props
<PackageReference Include="WilliamBelle.Monitoring" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add WilliamBelle.Monitoring --version 0.4.0
                    
#r "nuget: WilliamBelle.Monitoring, 0.4.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package WilliamBelle.Monitoring@0.4.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=WilliamBelle.Monitoring&version=0.4.0
                    
Install as a Cake Addin
#tool nuget:?package=WilliamBelle.Monitoring&version=0.4.0
                    
Install as a Cake Tool

WilliamBelle.Monitoring

CI NuGet

An in-app monitoring agent for .NET applications. It reports, on a schedule, what only the inside of a running process can see: the runtime it is actually on, the environment it thinks it is in, and the package versions actually deployed.

Supports .NET 8, 9 and 10 — every runtime Microsoft currently supports.

That last one matters most. A repository can say a vulnerable package was upgraded while production still runs the old version — this is what notices.

Node applications are covered by @williambelle-co/monitoring, which reports the same shape to the same endpoint — so a mixed estate lands in one place.

Usage

builder.Services.TryAddWilliamBelleMonitoring(builder.Configuration.GetSection("Monitoring"));

Reads IngestUrl, AppId and SigningKey from that section, and optionally Interval, Timeout and EnvironmentName. Keep the signing key in a secret store, never in source.

A section with none of those values registers nothing and returns false. An application is usually monitored in production and not on a developer machine, so that is the normal case rather than an error. A section holding some of them is a half-finished deployment — it throws, rather than starting an application that looks monitored and reports nothing.

Where the values do not come from configuration:

builder.Services.AddWilliamBelleMonitoring(o =>
{
    o.IngestUrl  = ingestUrl;
    o.AppId      = appId;
    o.SigningKey = signingKey;
});

The application id and signing key are issued by William Belle LLC.

What it does, exactly

Every 24 hours by default it collects:

  • the runtime servicing level (RuntimeInformation.FrameworkDescription)
  • the environment name — which catches Development running in production
  • the third-party packages this deployment shipped with, and their versions

It signs that with HMAC-SHA256 and POSTs it. That is the complete data surface.

The package list is read from the dependency manifest the runtime writes beside the application, so it is the set that was restored — complete before the process has served anything, and identical on two hosts running the same build. Deployments that ship without such a manifest, single-file and ahead-of-time-compiled ones, fall back to reporting loaded assemblies.

What it deliberately does not do

  • It accepts no inbound anything. No endpoint, no commands, no remote configuration, no code execution. The channel is one-way by construction.
  • It collects no logs, no request payloads, and no user data.
  • It cannot break the host once it is running. Every reporting cycle is wrapped in catch-log-continue; an unreachable ingest endpoint costs the host nothing. Configuration is the one thing that throws, and it throws at registration — a misconfiguration is a bug worth failing on while it is still cheap to fix, not a warning nobody reads a day later.
  • It carries no proprietary dependencies. It ships into other people's applications, so it is kept to the smallest possible supply-chain surface: Microsoft.Extensions packages a host already has, and nothing else.

Keeping those properties true is the point of this package.

Building it yourself

dotnet test          # the signature scheme and what a snapshot contains
dotnet pack src/WilliamBelle.Monitoring -c Release

That suite pins this package's signing implementation to the endpoint that verifies it, and no release goes out without it passing.

The published package is built by GitHub Actions from a tag, using Trusted Publishing — no long-lived API key exists for this package. Source Link is enabled, so a debugger can step straight from the published package into this source.

Versioning

Pre-1.0 while the reporting contract settles. Breaking changes before 1.0 will be released as a minor version bump and described in the release notes.

Support

Issued application ids, signing keys, and questions about a monitored application: support@williambelle.co.

Licensed MIT — read it, audit it, and verify it does what this page says.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
0.4.0 138 8/21/2026
0.3.0 439 8/11/2026
0.2.0 115 8/10/2026
0.1.0 177 8/6/2026