Browse Source

memory allocator objects count for monitoring

ivanmorozov 1 year ago
parent
commit
cc9d4b3e08

+ 61 - 0
ydb/core/tx/columnshard/counters/common/object_counter.h

@@ -0,0 +1,61 @@
+#pragma once
+#include "owner.h"
+#include <ydb/core/protos/services.pb.h>
+#include <library/cpp/actors/core/log.h>
+
+namespace NKikimr::NColumnShard {
+
+template <class TObject, bool UseSignals, bool UseLogs>
+class TMonitoringObjectsCounterImpl: public TCommonCountersOwner {
+private:
+    using TBase = TCommonCountersOwner;
+    NMonitoring::TDynamicCounters::TCounterPtr Counter;
+    NMonitoring::TDynamicCounters::TCounterPtr Allocation;
+    NMonitoring::TDynamicCounters::TCounterPtr Free;
+public:
+    TMonitoringObjectsCounterImpl()
+        : TBase("ObjectsCounter")
+    {
+        TBase::DeepSubGroup("type_id", TypeName<TObject>());
+        Counter = TCommonCountersOwner::GetValue("ObjectsCount");
+        Allocation = TCommonCountersOwner::GetDeriviative("Allocation");
+        Free = TCommonCountersOwner::GetDeriviative("Free");
+    }
+
+    void Inc() const {
+        Counter->Inc();
+        Allocation->Add(1);
+    }
+
+    void Dec() const {
+        Counter->Dec();
+        Free->Add(1);
+    }
+};
+
+template <class TObject, bool UseSignals, bool UseLogs>
+class TMonitoringObjectsCounter {
+private:
+    static inline TAtomicCounter Counter = 0;
+public:
+    TMonitoringObjectsCounter() {
+        if (UseSignals) {
+            Singleton<TMonitoringObjectsCounterImpl<TObject, UseSignals, UseLogs>>()->Inc();
+        }
+        Counter.Inc();
+        if (UseLogs) {
+            AFL_TRACE(NKikimrServices::OBJECTS_MONITORING)("event", "create")("object_type", TypeName<TObject>())("count", Counter.Val());
+        }
+    }
+    ~TMonitoringObjectsCounter() {
+        if (UseSignals) {
+            Singleton<TMonitoringObjectsCounterImpl<TObject, UseSignals, UseLogs>>()->Dec();
+        }
+        Counter.Dec();
+        if (UseLogs) {
+            AFL_TRACE(NKikimrServices::OBJECTS_MONITORING)("event", "destroy")("object_type", TypeName<TObject>())("count", Counter.Val());
+        }
+    }
+};
+
+}

+ 4 - 0
ydb/core/tx/columnshard/counters/common/owner.cpp

@@ -46,4 +46,8 @@ std::shared_ptr<TValueAggregationClient> TCommonCountersOwner::GetValueAutoAggre
     return agent->GetClient();
 }
 
+void TCommonCountersOwner::DeepSubGroup(const TString& id, const TString& value) {
+    SubGroup = SubGroup->GetSubgroup(id, value);
+}
+
 }

+ 1 - 0
ydb/core/tx/columnshard/counters/common/owner.h

@@ -24,6 +24,7 @@ public:
     NMonitoring::TDynamicCounters::TCounterPtr GetAggregationValue(const TString& name) const;
     NMonitoring::TDynamicCounters::TCounterPtr GetValue(const TString& name) const;
     NMonitoring::TDynamicCounters::TCounterPtr GetDeriviative(const TString& name) const;
+    void DeepSubGroup(const TString& id, const TString& value);
     NMonitoring::THistogramPtr GetHistogram(const TString& name, NMonitoring::IHistogramCollectorPtr&& hCollector) const;
 
     TCommonCountersOwner(const TString& module, TIntrusivePtr<::NMonitoring::TDynamicCounters> baseSignals = nullptr);

+ 2 - 1
ydb/core/tx/columnshard/engines/reader/filter_assembler.h

@@ -5,12 +5,13 @@
 #include <ydb/core/formats/arrow/arrow_filter.h>
 #include <ydb/core/tx/columnshard/engines/portion_info.h>
 #include <ydb/core/tx/columnshard/engines/indexed_read_data.h>
+#include <ydb/core/tx/columnshard/counters/common/object_counter.h>
 
 #include <contrib/libs/apache/arrow/cpp/src/arrow/record_batch.h>
 
 namespace NKikimr::NOlap::NIndexedReader {
 
-    class TAssembleFilter: public NColumnShard::IDataTasksProcessor::ITask {
+    class TAssembleFilter: public NColumnShard::IDataTasksProcessor::ITask, public NColumnShard::TMonitoringObjectsCounter<TAssembleFilter, true, true> {
     private:
         using TBase = NColumnShard::IDataTasksProcessor::ITask;
         TPortionInfo::TPreparedBatchData BatchConstructor;

+ 2 - 1
ydb/core/tx/columnshard/engines/reader/postfilter_assembler.h

@@ -2,6 +2,7 @@
 #include "common.h"
 #include "conveyor_task.h"
 
+#include <ydb/core/tx/columnshard/counters/common/object_counter.h>
 #include <ydb/core/tx/columnshard/engines/portion_info.h>
 #include <ydb/core/formats/arrow/arrow_filter.h>
 
@@ -9,7 +10,7 @@
 
 namespace NKikimr::NOlap::NIndexedReader {
 class TBatch;
-class TAssembleBatch: public NColumnShard::IDataTasksProcessor::ITask {
+class TAssembleBatch: public NColumnShard::IDataTasksProcessor::ITask, public NColumnShard::TMonitoringObjectsCounter<TAssembleBatch, true, true> {
 private:
     using TBase = NColumnShard::IDataTasksProcessor::ITask;
     TPortionInfo::TPreparedBatchData BatchConstructor;