yams/tests/unit/daemon/metrics_consistency_catch2_test.cpp
trvon 66689cd7a3
refactor(daemon): remove the symbol_concurrent tuning knob and stage metrics
The retired symbol stage never activates, so tuning.post_ingest.
symbol_concurrent and YAMS_POST_SYMBOL_CONCURRENT had no effect, and
status reported symbol_* queue metrics and post_symbol_limit that were
always zero. Remove the config key and environment override, the status
keys and CLI rows, the metrics snapshot fields, and the event-bus symbol
counters. The internal stage slot stays so budget and limiter indices
are unchanged; benchmark JSON keeps its symbol fields at zero.
2026-09-22 14:41:05 -06:00

167 lines
7 KiB
C++

// Copyright (c) 2025 YAMS Contributors
// SPDX-License-Identifier: GPL-3.0-or-later
//
// Migrated from GTest: metrics_consistency_test.cpp
#include <catch2/catch_test_macros.hpp>
#include <string_view>
#include <unordered_set>
#include <yams/daemon/metric_keys.h>
using namespace yams::daemon::metrics;
TEST_CASE("Metrics consistency: keys not empty", "[unit][daemon][metrics]") {
static_assert(!kWorkerThreads.empty());
static_assert(!kPostIngestQueued.empty());
static_assert(!kKgQueueDepth.empty());
CHECK_FALSE(kWorkerThreads.empty());
CHECK_FALSE(kPostIngestQueued.empty());
CHECK_FALSE(kKgQueueDepth.empty());
}
TEST_CASE("Metrics consistency: unique keys", "[unit][daemon][metrics]") {
std::unordered_set<std::string_view> keys = {
// Vector
kVectorEmbeddingsAvailable, kVectorScoringEnabled,
// Worker
kWorkerThreads, kWorkerActive, kWorkerQueued,
// Post-Ingest
kPostIngestThreads, kPostIngestQueued, kPostIngestInflight, kPostIngestCapacity,
kPostIngestProcessed, kPostIngestFailed, kPostIngestLatencyEma, kPostIngestRateEma,
kPostIngestBackpressureRejects,
// RPC
kPostIngestRpcQueued, kPostIngestRpcCapacity, kPostIngestRpcMaxPerBatch,
// Stages
kExtractionInflight, kPostExtractionLimit, kKgQueued, kKgDropped, kKgConsumed, kKgInflight,
kKgQueueDepth, kPostKgLimit, kKgJobsCapacity, kKgJobsFillPct, kEntityQueued, kEntityDropped,
kEntityConsumed, kEntityInflight, kEntityQueueDepth, kPostEntityLimit, kTitleQueued,
kTitleDropped, kTitleConsumed, kTitleInflight, kTitleQueueDepth, kPostTitleLimit,
kEmbedQueued, kEmbedInflight, kPostEmbedLimit,
// FTS5
kFts5Queued, kFts5Dropped, kFts5Consumed,
// Search
kSearchActive, kSearchQueued, kSearchExecuted, kSearchCacheHitRatePct, kSearchAvgLatencyUs,
kSearchConcurrencyLimit,
// Ingestion
kDeferredQueueDepth, kPostIngestUseBus,
// Storage
kStorageLogicalBytes, kStoragePhysicalBytes, kStorageDocuments, kStorageSavedBytes,
kStorageSavedPct, kCasPhysicalBytes, kCasUniqueRawBytes, kCasDedupSavedBytes,
kCasCompressSavedBytes, kMetadataPhysicalBytes, kIndexPhysicalBytes, kVectorPhysicalBytes,
kLogsTmpPhysicalBytes, kPhysicalTotalBytes,
// Counts
kDocumentsTotal, kDocumentsIndexed, kDocumentsContentExtracted, kDocumentsEmbedded,
kVectorCount,
// Session
kWatchEnabled, kWatchIntervalMs,
// Tuning
kTuningPostIngestCapacity, kTuningPostIngestThreadsMin, kTuningPostIngestThreadsMax,
kTuningAdmitWarnThreshold, kTuningAdmitStopThreshold,
// WorkCoordinator and vector checkpoint
kWorkCoordinatorActive, kWorkCoordinatorRunning, kWorkCoordinatorProgressProbesPosted,
kWorkCoordinatorProgressProbesCompleted, kWorkCoordinatorProgressProbeInFlight,
kWorkCoordinatorLastProgressAgeMs, kVectorCheckpointPhase, kVectorCheckpointRequests,
kVectorCheckpointCoalesced, kVectorCheckpointStarted, kVectorCheckpointCompleted,
kVectorCheckpointTimedOut, kVectorCheckpointPostFailures, kVectorCheckpointQueuedAgeMs,
kVectorCheckpointRunningAgeMs,
// State
kServiceFsmState, kEmbeddingState, kPluginHostState,
// Stream
kStreamTotal, kStreamBatches, kStreamKeepalives, kStreamTtfbAvgMs,
// Add Tracking
kFilesAdded, kDirectoriesAdded, kFilesProcessed, kDirectoriesProcessed,
// Governor
kPressureLevel,
// Repair
kRepairRunning, kRepairInProgress, kRepairQueueDepth, kRepairBatchesAttempted,
kRepairEmbeddingsGenerated, kRepairEmbeddingsSkipped, kRepairFailedOperations,
kRepairIdleTicks, kRepairBusyTicks, kRepairTotalBacklog, kRepairProcessed};
CHECK(keys.size() >= 81);
}
TEST_CASE("Metrics consistency: specific values", "[unit][daemon][metrics]") {
CHECK(kKgQueueDepth == "kg_queue_depth");
CHECK(kPostIngestQueued == "post_ingest_queued");
CHECK(kEmbedQueued == "embed_svc_queued");
CHECK(kSearchActive == "search_active");
CHECK(kStorageLogicalBytes == "storage_logical_bytes");
CHECK(kRepairQueueDepth == "repair_queue_depth");
CHECK(kRepairBatchesAttempted == "repair_batches_attempted");
CHECK(kRepairInProgress == "repair_in_progress");
}
TEST_CASE("Metrics consistency: readiness keys not empty", "[unit][daemon][metrics]") {
static_assert(!yams::daemon::readiness::kIpcServer.empty());
static_assert(!yams::daemon::readiness::kVectorDb.empty());
static_assert(!yams::daemon::readiness::kSearchEngineDegraded.empty());
CHECK_FALSE(yams::daemon::readiness::kIpcServer.empty());
CHECK_FALSE(yams::daemon::readiness::kVectorDb.empty());
CHECK_FALSE(yams::daemon::readiness::kSearchEngineDegraded.empty());
}
TEST_CASE("Metrics consistency: readiness unique keys", "[unit][daemon][metrics]") {
std::unordered_set<std::string_view> keys = {
yams::daemon::readiness::kIpcServer,
yams::daemon::readiness::kContentStore,
yams::daemon::readiness::kDatabase,
yams::daemon::readiness::kMetadataRepo,
yams::daemon::readiness::kSearchEngine,
yams::daemon::readiness::kModelProvider,
yams::daemon::readiness::kVectorIndex,
yams::daemon::readiness::kVectorDb,
yams::daemon::readiness::kPlugins,
yams::daemon::readiness::kVectorDbInitAttempted,
yams::daemon::readiness::kVectorDbReady,
yams::daemon::readiness::kVectorDbDim,
yams::daemon::readiness::kSearchEngineDegraded,
yams::daemon::readiness::kEmbeddingReady,
yams::daemon::readiness::kEmbeddingDegraded,
yams::daemon::readiness::kPluginsReady,
yams::daemon::readiness::kPluginsDegraded,
yams::daemon::readiness::kVectorEmbeddingsAvailable,
yams::daemon::readiness::kVectorScoringEnabled,
yams::daemon::readiness::kRepairService,
yams::daemon::readiness::kSearchEngineBuildReasonInitial,
yams::daemon::readiness::kSearchEngineBuildReasonRebuild,
yams::daemon::readiness::kSearchEngineBuildReasonDegraded,
};
CHECK(keys.size() == 23);
}
TEST_CASE("Metrics consistency: readiness specific values", "[unit][daemon][metrics]") {
CHECK(yams::daemon::readiness::kIpcServer == "ipc_server");
CHECK(yams::daemon::readiness::kContentStore == "content_store");
CHECK(yams::daemon::readiness::kMetadataRepo == "metadata_repo");
CHECK(yams::daemon::readiness::kSearchEngine == "search_engine");
CHECK(yams::daemon::readiness::kModelProvider == "model_provider");
CHECK(yams::daemon::readiness::kVectorIndex == "vector_index");
CHECK(yams::daemon::readiness::kVectorDb == "vector_db");
CHECK(yams::daemon::readiness::kPlugins == "plugins");
CHECK(yams::daemon::readiness::kRepairService == "repair_service");
CHECK(yams::daemon::readiness::kVectorDbInitAttempted == "vector_db_init_attempted");
CHECK(yams::daemon::readiness::kVectorDbReady == "vector_db_ready");
CHECK(yams::daemon::readiness::kVectorDbDim == "vector_db_dim");
}