From 809b7e05633563f6b0fe6d7806a5b06157f7b7ed Mon Sep 17 00:00:00 2001 From: "v.bartusevicius" Date: Wed, 1 Nov 2023 09:31:24 +0200 Subject: [PATCH] Separate MetricsCache from common Cache. --- README.md | 1 + src/Configuration/UnleashConfiguration.php | 13 ++++++++++++ src/Metrics/DefaultMetricsHandler.php | 6 +++--- src/UnleashBuilder.php | 10 ++++++++++ tests/UnleashBuilderTest.php | 23 ++++++++++++++++++++++ 5 files changed, 50 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b5699189..ad7aa08d 100755 --- a/README.md +++ b/README.md @@ -948,6 +948,7 @@ $unleash = UnleashBuilder::create() ->withMetricsEnabled(false) // turn off metric sending ->withMetricsEnabled(true) // turn on metric sending ->withMetricsInterval(10_000) // interval in milliseconds (10 seconds) + ->withMetricsCacheHandler(new Psr16Cache(new RedisAdapter())) // use custom cache handler for metrics, defaults to standard cache handler ->build(); // the metric will be collected but not sent immediately diff --git a/src/Configuration/UnleashConfiguration.php b/src/Configuration/UnleashConfiguration.php index 9a02b4e2..155eef69 100755 --- a/src/Configuration/UnleashConfiguration.php +++ b/src/Configuration/UnleashConfiguration.php @@ -45,6 +45,7 @@ public function __construct( private int $staleTtl = 30 * 60, private ?CacheInterface $staleCache = null, private ?string $proxyKey = null, + private ?CacheInterface $metricsCache = null, ) { $this->contextProvider ??= new DefaultUnleashContextProvider(); if ($defaultContext !== null) { @@ -66,6 +67,11 @@ public function getStaleCache(): CacheInterface return $this->staleCache ?? $this->getCache(); } + public function getMetricsCache(): CacheInterface + { + return $this->metricsCache ?? $this->getCache(); + } + public function getUrl(): string { $url = $this->url; @@ -117,6 +123,13 @@ public function setStaleCache(?CacheInterface $cache): self return $this; } + public function setMetricsCache(?CacheInterface $cache): self + { + $this->metricsCache = $cache; + + return $this; + } + public function setTtl(int $ttl): self { $this->ttl = $ttl; diff --git a/src/Metrics/DefaultMetricsHandler.php b/src/Metrics/DefaultMetricsHandler.php index cd4de9a6..711a79e5 100755 --- a/src/Metrics/DefaultMetricsHandler.php +++ b/src/Metrics/DefaultMetricsHandler.php @@ -33,7 +33,7 @@ public function handleMetrics(Feature $feature, bool $successful, Variant $varia private function getOrCreateBucket(): MetricsBucket { - $cache = $this->configuration->getCache(); + $cache = $this->configuration->getMetricsCache(); $bucket = null; if ($cache->has(CacheKey::METRICS_BUCKET)) { @@ -62,7 +62,7 @@ private function send(MetricsBucket $bucket): void { $bucket->setEndDate(new DateTimeImmutable()); $this->metricsSender->sendMetrics($bucket); - $cache = $this->configuration->getCache(); + $cache = $this->configuration->getMetricsCache(); if ($cache->has(CacheKey::METRICS_BUCKET)) { $cache->delete(CacheKey::METRICS_BUCKET); } @@ -70,7 +70,7 @@ private function send(MetricsBucket $bucket): void private function store(MetricsBucket $bucket): void { - $cache = $this->configuration->getCache(); + $cache = $this->configuration->getMetricsCache(); $cache->set(CacheKey::METRICS_BUCKET, $bucket); } } diff --git a/src/UnleashBuilder.php b/src/UnleashBuilder.php index 1da158d5..e180a61d 100755 --- a/src/UnleashBuilder.php +++ b/src/UnleashBuilder.php @@ -76,6 +76,8 @@ final class UnleashBuilder private ?CacheInterface $staleCache = null; + private ?CacheInterface $metricsCache = null; + private ?int $cacheTtl = null; private ?int $staleTtl = null; @@ -223,6 +225,12 @@ public function withStaleCacheHandler(?CacheInterface $cache): self return $this->with('staleCache', $cache); } + #[Pure] + public function withMetricsCacheHandler(?CacheInterface $cache): self + { + return $this->with('metricsCache', $cache); + } + #[Pure] public function withCacheTimeToLive(int $timeToLive): self { @@ -412,6 +420,7 @@ public function build(): Unleash } assert($cache instanceof CacheInterface); $staleCache = $this->staleCache ?? $cache; + $metricsCache = $this->metricsCache ?? $cache; $httpClient = $this->httpClient; if ($httpClient === null) { @@ -488,6 +497,7 @@ public function build(): Unleash $configuration ->setCache($cache) ->setStaleCache($staleCache) + ->setMetricsCache($metricsCache) ->setTtl($this->cacheTtl ?? $configuration->getTtl()) ->setStaleTtl($this->staleTtl ?? $configuration->getStaleTtl()) ->setMetricsEnabled($this->metricsEnabled ?? $configuration->isMetricsEnabled()) diff --git a/tests/UnleashBuilderTest.php b/tests/UnleashBuilderTest.php index ae75322f..d1adbb5e 100755 --- a/tests/UnleashBuilderTest.php +++ b/tests/UnleashBuilderTest.php @@ -773,6 +773,29 @@ public function testWithStaleCacheHandler() self::assertSame($cache1, $this->getConfiguration($instance->build())->getCache()); } + public function testWithMetricsCacheHandler() + { + $cache1 = $this->getCache(); + $cache2 = $this->getCache(); + + $instance = $this->instance->withFetchingEnabled(false); + self::assertNull($this->getProperty($instance, 'metricsCache')); + self::assertNotNull($this->getConfiguration($instance->build())->getMetricsCache()); + + $instance = $this->instance->withFetchingEnabled(false)->withCacheHandler($cache1); + self::assertNull($this->getProperty($instance, 'metricsCache')); + self::assertSame($cache1, $this->getConfiguration($instance->build())->getMetricsCache()); + + $instance = $this->instance + ->withFetchingEnabled(false) + ->withCacheHandler($cache1) + ->withMetricsCacheHandler($cache2) + ; + self::assertSame($cache2, $this->getProperty($instance, 'metricsCache')); + self::assertSame($cache2, $this->getConfiguration($instance->build())->getMetricsCache()); + self::assertSame($cache1, $this->getConfiguration($instance->build())->getCache()); + } + public function testWithMetricsHandler() { $metricsHandler = new class implements MetricsHandler {