mirror of
https://github.com/XRPLF/clio.git
synced 2025-11-04 20:05:51 +00:00
feat: Expose ledger cache full and disabled to prometheus (#1957)
Fixes #1771
This commit is contained in:
@@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
#include "data/LedgerCacheInterface.hpp"
|
#include "data/LedgerCacheInterface.hpp"
|
||||||
#include "data/Types.hpp"
|
#include "data/Types.hpp"
|
||||||
|
#include "util/prometheus/Bool.hpp"
|
||||||
#include "util/prometheus/Counter.hpp"
|
#include "util/prometheus/Counter.hpp"
|
||||||
#include "util/prometheus/Label.hpp"
|
#include "util/prometheus/Label.hpp"
|
||||||
#include "util/prometheus/Prometheus.hpp"
|
#include "util/prometheus/Prometheus.hpp"
|
||||||
@@ -77,8 +78,16 @@ class LedgerCache : public LedgerCacheInterface {
|
|||||||
mutable std::shared_mutex mtx_;
|
mutable std::shared_mutex mtx_;
|
||||||
std::condition_variable_any cv_;
|
std::condition_variable_any cv_;
|
||||||
uint32_t latestSeq_ = 0;
|
uint32_t latestSeq_ = 0;
|
||||||
std::atomic_bool full_ = false;
|
util::prometheus::Bool full_{PrometheusService::boolMetric(
|
||||||
std::atomic_bool disabled_ = false;
|
"ledger_cache_full",
|
||||||
|
util::prometheus::Labels{},
|
||||||
|
"Whether ledger cache full or not"
|
||||||
|
)};
|
||||||
|
util::prometheus::Bool disabled_{PrometheusService::boolMetric(
|
||||||
|
"ledger_cache_disabled",
|
||||||
|
util::prometheus::Labels{},
|
||||||
|
"Whether ledger cache is disabled or not"
|
||||||
|
)};
|
||||||
|
|
||||||
// temporary set to prevent background thread from writing already deleted data. not used when cache is full
|
// temporary set to prevent background thread from writing already deleted data. not used when cache is full
|
||||||
std::unordered_set<ripple::uint256, ripple::hardened_hash<>> deletes_;
|
std::unordered_set<ripple::uint256, ripple::hardened_hash<>> deletes_;
|
||||||
|
|||||||
@@ -158,9 +158,9 @@ struct MockPrometheusImpl : PrometheusInterface {
|
|||||||
{
|
{
|
||||||
std::unique_ptr<MetricBase> metric;
|
std::unique_ptr<MetricBase> metric;
|
||||||
auto const key = name + labelsString;
|
auto const key = name + labelsString;
|
||||||
if constexpr (std::is_same_v<MetricType, GaugeInt>) {
|
if constexpr (std::is_same_v<MetricType, GaugeInt> or std::is_same_v<MetricType, Bool>) {
|
||||||
auto& impl = counterIntImpls[key];
|
auto& impl = counterIntImpls[key];
|
||||||
metric = std::make_unique<MetricType>(name, labelsString, impl);
|
metric = std::make_unique<GaugeInt>(name, labelsString, impl);
|
||||||
} else if constexpr (std::is_same_v<MetricType, CounterInt>) {
|
} else if constexpr (std::is_same_v<MetricType, CounterInt>) {
|
||||||
auto& impl = counterUintImpls[key];
|
auto& impl = counterUintImpls[key];
|
||||||
metric = std::make_unique<MetricType>(name, labelsString, impl);
|
metric = std::make_unique<MetricType>(name, labelsString, impl);
|
||||||
@@ -235,7 +235,7 @@ struct WithMockPrometheus : virtual ::testing::Test {
|
|||||||
if (!mockPrometheusPtr->metrics.contains(key))
|
if (!mockPrometheusPtr->metrics.contains(key))
|
||||||
mockPrometheusPtr->makeMetric<MetricType>(std::move(name), std::move(labelsString));
|
mockPrometheusPtr->makeMetric<MetricType>(std::move(name), std::move(labelsString));
|
||||||
|
|
||||||
if constexpr (std::is_same_v<MetricType, GaugeInt>) {
|
if constexpr (std::is_same_v<MetricType, GaugeInt> or std::is_same_v<MetricType, Bool>) {
|
||||||
return mockPrometheusPtr->counterIntImpls[key];
|
return mockPrometheusPtr->counterIntImpls[key];
|
||||||
} else if constexpr (std::is_same_v<MetricType, CounterInt>) {
|
} else if constexpr (std::is_same_v<MetricType, CounterInt>) {
|
||||||
return mockPrometheusPtr->counterUintImpls[key];
|
return mockPrometheusPtr->counterUintImpls[key];
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ target_sources(
|
|||||||
data/AmendmentCenterTests.cpp
|
data/AmendmentCenterTests.cpp
|
||||||
data/BackendCountersTests.cpp
|
data/BackendCountersTests.cpp
|
||||||
data/BackendInterfaceTests.cpp
|
data/BackendInterfaceTests.cpp
|
||||||
|
data/LedgerCacheTests.cpp
|
||||||
data/cassandra/AsyncExecutorTests.cpp
|
data/cassandra/AsyncExecutorTests.cpp
|
||||||
data/cassandra/ExecutionStrategyTests.cpp
|
data/cassandra/ExecutionStrategyTests.cpp
|
||||||
data/cassandra/RetryPolicyTests.cpp
|
data/cassandra/RetryPolicyTests.cpp
|
||||||
|
|||||||
68
tests/unit/data/LedgerCacheTests.cpp
Normal file
68
tests/unit/data/LedgerCacheTests.cpp
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
/*
|
||||||
|
This file is part of clio: https://github.com/XRPLF/clio
|
||||||
|
Copyright (c) 2025, the clio developers.
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted, provided that the above
|
||||||
|
copyright notice and this permission notice appear in all copies.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*/
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
#include "data/LedgerCache.hpp"
|
||||||
|
#include "util/LoggerFixtures.hpp"
|
||||||
|
#include "util/MockPrometheus.hpp"
|
||||||
|
#include "util/prometheus/Bool.hpp"
|
||||||
|
|
||||||
|
#include <gmock/gmock.h>
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
using namespace data;
|
||||||
|
|
||||||
|
struct LedgerCacheTest : util::prometheus::WithPrometheus, NoLoggerFixture {
|
||||||
|
LedgerCache cache;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(LedgerCacheTest, defaultState)
|
||||||
|
{
|
||||||
|
EXPECT_FALSE(cache.isDisabled());
|
||||||
|
EXPECT_FALSE(cache.isFull());
|
||||||
|
EXPECT_EQ(cache.size(), 0u);
|
||||||
|
EXPECT_EQ(cache.latestLedgerSequence(), 0u);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct LedgerCachePrometheusMetricTest : util::prometheus::WithMockPrometheus, NoLoggerFixture {
|
||||||
|
LedgerCache cache;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(LedgerCachePrometheusMetricTest, setDisabled)
|
||||||
|
{
|
||||||
|
auto& disabledMock = makeMock<util::prometheus::Bool>("ledger_cache_disabled", {});
|
||||||
|
|
||||||
|
EXPECT_CALL(disabledMock, set(1));
|
||||||
|
cache.setDisabled();
|
||||||
|
|
||||||
|
EXPECT_CALL(disabledMock, value()).WillOnce(testing::Return(1));
|
||||||
|
EXPECT_TRUE(cache.isDisabled());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(LedgerCachePrometheusMetricTest, setFull)
|
||||||
|
{
|
||||||
|
auto& fullMock = makeMock<util::prometheus::Bool>("ledger_cache_full", {});
|
||||||
|
auto& disabledMock = makeMock<util::prometheus::Bool>("ledger_cache_disabled", {});
|
||||||
|
|
||||||
|
EXPECT_CALL(disabledMock, value()).WillOnce(testing::Return(0));
|
||||||
|
EXPECT_CALL(fullMock, set(1));
|
||||||
|
cache.setFull();
|
||||||
|
|
||||||
|
EXPECT_CALL(fullMock, value()).WillOnce(testing::Return(1));
|
||||||
|
EXPECT_TRUE(cache.isFull());
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user