IMemoryCache-based caching provider for MyCSharp.HttpUserAgentParser.
Repository: https://github.com/mycsharp/HttpUserAgentParser
dotnet add package MyCSharp.HttpUserAgentParser.MemoryCacheRegister 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:
- Each unique user-agent string counts as one cache entry.
- The provider is registered as singleton and owns its internal
MemoryCacheinstance. - Like any cache, concurrent requests for a new key can race; counters are best-effort.
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.MemoryCacheThis 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:
- OTLP (Collector)
- Prometheus
- Azure Monitor / Application Insights (via an Azure Monitor exporter)
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.