v0.25.0 (⚠️ deprecated)
Important
This version has been superseded by v0.26.0
because of a small breaking change: although it technically is a breaking change, it is about the new IFusionCacheMemoryLocker
introduced just a week ago, so unless you are already implementing your own custom memory locker it will not be a problem.
Apart from this, v0.26.0
is basically the same as v0.25.0
, so please update to v0.26.0
as soon as possible so you'll be ready for the big v1.0
that will be released very soon.
🔭 OpenTelemetry support (docs)
FusionCache now natively supports full observability, thanks to the great native support of OpenTelemetry in .NET via the core Activity
and Meter
classes without any extra dependency to produce them.
In general, the 3 main signals in the observability world are traces, metrics and logs.
FusionCache always supported logging, and even in a pretty advanced and customizable way.
Now the two remaining pieces are finally here: traces and metrics.
It is possible to opt-in to generate traces and metrics for both:
- high-level operations: things like
GetOrSet
/Set
/Remove
operations,Hit
/Miss
events, etc - low-level operations: things like memory/distributed level operations, backplane events, etc
There's also a new package specific for OpenTelemetry that adds native support to instrument our applications, with FusionCache specific options ready to use, like including low-level signals or not.
It is then possible to simply plug one of the existing OpenTelemetry-compatible collectors for systems like Jaeger, Prometheus or Honeycomb and voilà, there we have full observability of our FusionCache instances.
Here's an example of how to set it up without dependency injection:
// SETUP TRACES
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddFusionCacheInstrumentation()
.AddConsoleExporter()
.Build();
// SETUP METRICS
using var meterProvider = Sdk.CreateMeterProviderBuilder()
.AddFusionCacheInstrumentation()
.AddConsoleExporter()
.Build();
or, via dependency injection:
services.AddOpenTelemetry()
// SETUP TRACES
.WithTracing(tracing => tracing
.AddFusionCacheInstrumentation()
.AddConsoleExporter()
)
// SETUP METRICS
.WithMetrics(metrics => metrics
.AddFusionCacheInstrumentation()
.AddConsoleExporter()
);
The end result of all of this, when viewed for example in Honeycomb, is something like this:
Quite nice, uh 😏 ?
Oh, and I can't thank @martinjt enough for the support!
See here for the issue.
🔒 Extensible Memory Locker
FusionCache always protected us from the Cache Stampede problem, but the internals of the memory locking mechanism have always been private.
Now no more, and thanks to the new IFusionCacheMemoryLocker
interface the community may come up with different designs and implementations.
The builder has also been extended with support for configuring different memory lockers thanks to new methods like WithRegisteredMemoryLocker
, WithMemoryLocker(locker)
, WithStandardMemoryLocker()
and more.
See here for the issue.
🐞 Fixed a minor SkipDistributedCacheReadWhenStale
bug
Thanks to community member @angularsen I fixed a small bug related to SkipDistributedCacheReadWhenStale
not working as expected during get-only operations (TryGet
, GetOrDefault
).
See here for the issue.
↩️ Better items cleanup for auto-recovery
Minor, but still: FusionCache now better cleans up processed auto-recovery items.
📕 Docs
Updated some docs and added some new ones (Observability, etc).