HTTP User Agent Parser Extensions for IMemoryCache
$ dotnet add package MyCSharp.HttpUserAgentParser.MemoryCacheIMemoryCache-based caching provider for MyCSharp.HttpUserAgentParser.
Repository: https://github.com/mycsharp/HttpUserAgentParser
dotnet add package MyCSharp.HttpUserAgentParser.MemoryCache
Register the provider:
services.AddHttpUserAgentMemoryCachedParser();
Then inject IHttpUserAgentParserProvider:
public sealed class MyService(IHttpUserAgentParserProvider parser)
{
public HttpUserAgentInformation Parse(string userAgent) => parser.Parse(userAgent);
services.AddHttpUserAgentMemoryCachedParser(options =>
{
options.CacheEntryOptions.SlidingExpiration = TimeSpan.FromMinutes(60); // default is 1 day
options.CacheOptions.SizeLimit = 1024; // default is null (= no limit)
});
Notes:
MemoryCache instance.Telemetry is modular and opt-in.
services
.AddHttpUserAgentMemoryCachedParser()
.WithMemoryCacheTelemetry();
Optionally enable core counters too:
services
.AddHttpUserAgentMemoryCachedParser()
.WithTelemetry()
.WithMemoryCacheTelemetry();
EventSource: MyCSharp.HttpUserAgentParser.MemoryCache (constant: HttpUserAgentParserMemoryCacheEventSource.EventSourceName)
user_agent_parser.cache.hit (incrementing)user_agent_parser.cache.miss (incrementing)user_agent_parser.cache.size (polling)dotnet-counters monitor --process-id <pid> MyCSharp.HttpUserAgentParser.MemoryCache
This package can also emit native System.Diagnostics.Metrics instruments.
services
.AddHttpUserAgentMemoryCachedParser()
.WithMemoryCacheMeterTelemetry();
Optionally enable core meters too:
services
.AddHttpUserAgentMemoryCachedParser()
.WithMeterTelemetry()
.WithMemoryCacheMeterTelemetry();
Meter: MyCSharp.HttpUserAgentParser.MemoryCache (constant: HttpUserAgentParserMemoryCacheMeters.MeterName)
user_agent_parser.cache.hit (counter)user_agent_parser.cache.miss (counter)user_agent_parser.cache.size (observable gauge)You can collect these counters with OpenTelemetry’s EventCounters instrumentation.
Add the EventSource name:
using OpenTelemetry.Metrics;
metrics.AddEventCountersInstrumentation(options =>
{
options.AddEventSources(HttpUserAgentParserMemoryCacheEventSource.EventSourceName);
});
From there you can export to:
If you enabled native meters (see above), collect them via AddMeter(...):
using OpenTelemetry.Metrics;
using MyCSharp.HttpUserAgentParser.MemoryCache.Telemetry;
metrics.AddMeter(HttpUserAgentParserMemoryCacheMeters.MeterName);
If you prefer a direct listener instead of OpenTelemetry, you can attach an EventListener and forward values into Application Insights.