mirror of
				https://github.com/XRPLF/clio.git
				synced 2025-11-04 11:55: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/Types.hpp"
 | 
			
		||||
#include "util/prometheus/Bool.hpp"
 | 
			
		||||
#include "util/prometheus/Counter.hpp"
 | 
			
		||||
#include "util/prometheus/Label.hpp"
 | 
			
		||||
#include "util/prometheus/Prometheus.hpp"
 | 
			
		||||
@@ -77,8 +78,16 @@ class LedgerCache : public LedgerCacheInterface {
 | 
			
		||||
    mutable std::shared_mutex mtx_;
 | 
			
		||||
    std::condition_variable_any cv_;
 | 
			
		||||
    uint32_t latestSeq_ = 0;
 | 
			
		||||
    std::atomic_bool full_ = false;
 | 
			
		||||
    std::atomic_bool disabled_ = false;
 | 
			
		||||
    util::prometheus::Bool full_{PrometheusService::boolMetric(
 | 
			
		||||
        "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
 | 
			
		||||
    std::unordered_set<ripple::uint256, ripple::hardened_hash<>> deletes_;
 | 
			
		||||
 
 | 
			
		||||
@@ -158,9 +158,9 @@ struct MockPrometheusImpl : PrometheusInterface {
 | 
			
		||||
    {
 | 
			
		||||
        std::unique_ptr<MetricBase> metric;
 | 
			
		||||
        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];
 | 
			
		||||
            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>) {
 | 
			
		||||
            auto& impl = counterUintImpls[key];
 | 
			
		||||
            metric = std::make_unique<MetricType>(name, labelsString, impl);
 | 
			
		||||
@@ -235,7 +235,7 @@ struct WithMockPrometheus : virtual ::testing::Test {
 | 
			
		||||
        if (!mockPrometheusPtr->metrics.contains(key))
 | 
			
		||||
            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];
 | 
			
		||||
        } else if constexpr (std::is_same_v<MetricType, CounterInt>) {
 | 
			
		||||
            return mockPrometheusPtr->counterUintImpls[key];
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,7 @@ target_sources(
 | 
			
		||||
          data/AmendmentCenterTests.cpp
 | 
			
		||||
          data/BackendCountersTests.cpp
 | 
			
		||||
          data/BackendInterfaceTests.cpp
 | 
			
		||||
          data/LedgerCacheTests.cpp
 | 
			
		||||
          data/cassandra/AsyncExecutorTests.cpp
 | 
			
		||||
          data/cassandra/ExecutionStrategyTests.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