This is an automated email from the ASF dual-hosted git repository.

wangbo pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-3.0 by this push:
     new 0391d0f163f [branch-3.0]Refactor workload group metric (#46640) 
(#46919)
0391d0f163f is described below

commit 0391d0f163f340f0d3a11d2486e289754dd7b622
Author: wangbo <wan...@selectdb.com>
AuthorDate: Tue Jan 14 12:05:47 2025 +0800

    [branch-3.0]Refactor workload group metric (#46640) (#46919)
    
    pick #46640
---
 .../workload_group/workload_group_metrics.cpp      | 67 ++++++++++------------
 .../workload_group/workload_group_metrics.h        | 27 +++++----
 be/src/util/system_metrics.cpp                     |  4 +-
 3 files changed, 46 insertions(+), 52 deletions(-)

diff --git a/be/src/runtime/workload_group/workload_group_metrics.cpp 
b/be/src/runtime/workload_group/workload_group_metrics.cpp
index f1bdd0d14c2..2a34427a490 100644
--- a/be/src/runtime/workload_group/workload_group_metrics.cpp
+++ b/be/src/runtime/workload_group/workload_group_metrics.cpp
@@ -26,6 +26,13 @@
 
 namespace doris {
 
+DEFINE_COUNTER_METRIC_PROTOTYPE_2ARG(workload_group_cpu_time_sec, 
doris::MetricUnit::SECONDS);
+DEFINE_GAUGE_METRIC_PROTOTYPE_2ARG(workload_group_mem_used_bytes, 
doris::MetricUnit::BYTES);
+DEFINE_COUNTER_METRIC_PROTOTYPE_2ARG(workload_group_remote_scan_bytes, 
doris::MetricUnit::BYTES);
+DEFINE_COUNTER_METRIC_PROTOTYPE_2ARG(workload_group_total_local_scan_bytes,
+                                     doris::MetricUnit::BYTES);
+DEFINE_COUNTER_METRIC_PROTOTYPE_2ARG(workload_group_local_scan_bytes, 
doris::MetricUnit::BYTES);
+
 #include "common/compile_check_begin.h"
 
 WorkloadGroupMetrics::~WorkloadGroupMetrics() {
@@ -33,39 +40,27 @@ WorkloadGroupMetrics::~WorkloadGroupMetrics() {
 }
 
 WorkloadGroupMetrics::WorkloadGroupMetrics(WorkloadGroup* wg) {
+    std::string wg_id_prefix = "workload_group_" + std::to_string(wg->id());
     _entity = DorisMetrics::instance()->metric_registry()->register_entity(
-            "workload_group." + std::to_string(wg->id()), {{"workload_group", 
wg->name()}});
-
-    _cpu_time_metric = std::make_unique<doris::MetricPrototype>(
-            doris::MetricType::COUNTER, doris::MetricUnit::SECONDS, 
"workload_group_cpu_time_sec");
-    _cpu_time_counter =
-            
(IntAtomicCounter*)(_entity->register_metric<IntAtomicCounter>(_cpu_time_metric.get()));
-
-    _mem_used_bytes_metric = std::make_unique<doris::MetricPrototype>(
-            doris::MetricType::COUNTER, doris::MetricUnit::BYTES, 
"workload_group_mem_used_bytes");
-    _mem_used_bytes_counter = 
(IntAtomicCounter*)(_entity->register_metric<IntAtomicCounter>(
-            _mem_used_bytes_metric.get()));
-
-    _local_scan_bytes_metric = std::make_unique<doris::MetricPrototype>(
-            doris::MetricType::COUNTER, doris::MetricUnit::BYTES,
-            "workload_group_local_scan_bytes");
-    _local_scan_bytes_counter = 
(IntAtomicCounter*)(_entity->register_metric<IntAtomicCounter>(
-            _local_scan_bytes_metric.get()));
-
-    _remote_scan_bytes_metric = std::make_unique<doris::MetricPrototype>(
-            doris::MetricType::COUNTER, doris::MetricUnit::BYTES,
-            "workload_group_remote_scan_bytes");
-    _remote_scan_bytes_counter = 
(IntAtomicCounter*)(_entity->register_metric<IntAtomicCounter>(
-            _remote_scan_bytes_metric.get()));
+            wg_id_prefix, {{"workload_group", wg->name()}, {"id", 
std::to_string(wg->id())}});
+
+    INT_COUNTER_METRIC_REGISTER(_entity, workload_group_cpu_time_sec);
+    INT_GAUGE_METRIC_REGISTER(_entity, workload_group_mem_used_bytes);
+    INT_COUNTER_METRIC_REGISTER(_entity, workload_group_remote_scan_bytes);
+    INT_COUNTER_METRIC_REGISTER(_entity, 
workload_group_total_local_scan_bytes);
 
     std::vector<DataDirInfo>& data_dir_list = 
io::BeConfDataDirReader::be_config_data_dir_list;
     for (const auto& data_dir : data_dir_list) {
-        std::unique_ptr<doris::MetricPrototype> metric = 
std::make_unique<doris::MetricPrototype>(
-                doris::MetricType::COUNTER, doris::MetricUnit::BYTES,
-                "workload_group_local_scan_bytes_" + data_dir.metric_name);
-        _local_scan_bytes_counter_map.insert(
-                {data_dir.path, 
(IntCounter*)(_entity->register_metric<IntCounter>(metric.get()))});
-        _local_scan_bytes_metric_map.insert({data_dir.path, 
std::move(metric)});
+        std::string data_dir_metric_name = wg_id_prefix + "_io_" + 
data_dir.metric_name;
+        std::shared_ptr<MetricEntity> io_entity =
+                DorisMetrics::instance()->metric_registry()->register_entity(
+                        data_dir_metric_name, {{"workload_group", wg->name()},
+                                               {"path", data_dir.metric_name},
+                                               {"id", 
std::to_string(wg->id())}});
+        IntCounter* workload_group_local_scan_bytes = nullptr;
+        INT_COUNTER_METRIC_REGISTER(io_entity, 
workload_group_local_scan_bytes);
+        _local_scan_bytes_counter_map.insert({data_dir.path, 
workload_group_local_scan_bytes});
+        _io_entity_list.push_back(io_entity);
     }
 }
 
@@ -78,7 +73,7 @@ void WorkloadGroupMetrics::update_memory_used_bytes(int64_t 
memory_used) {
 }
 
 void WorkloadGroupMetrics::update_local_scan_io_bytes(std::string path, 
uint64_t delta_io_bytes) {
-    _local_scan_bytes_counter->increment(delta_io_bytes);
+    workload_group_total_local_scan_bytes->increment(delta_io_bytes);
     auto range = _local_scan_bytes_counter_map.equal_range(path);
     for (auto it = range.first; it != range.second; ++it) {
         it->second->increment((int64_t)delta_io_bytes);
@@ -86,7 +81,7 @@ void 
WorkloadGroupMetrics::update_local_scan_io_bytes(std::string path, uint64_t
 }
 
 void WorkloadGroupMetrics::update_remote_scan_io_bytes(uint64_t 
delta_io_bytes) {
-    _remote_scan_bytes_counter->increment(delta_io_bytes);
+    workload_group_remote_scan_bytes->increment(delta_io_bytes);
 }
 
 void WorkloadGroupMetrics::refresh_metrics() {
@@ -95,21 +90,21 @@ void WorkloadGroupMetrics::refresh_metrics() {
     // cpu
     uint64_t _current_cpu_time_nanos = _cpu_time_nanos.load();
     uint64_t _cpu_time_sec = _current_cpu_time_nanos / (1000L * 1000L * 1000L);
-    _cpu_time_counter->set_value(_cpu_time_sec);
+    workload_group_cpu_time_sec->set_value(_cpu_time_sec);
     _per_sec_cpu_time_nanos = (_current_cpu_time_nanos - _last_cpu_time_nanos) 
/ interval_second;
     _last_cpu_time_nanos = _current_cpu_time_nanos;
 
     // memory
-    _mem_used_bytes_counter->set_value(_memory_used);
+    workload_group_mem_used_bytes->set_value(_memory_used);
 
     // local scan
-    int64_t current_local_scan_bytes = _local_scan_bytes_counter->value();
+    int64_t current_local_scan_bytes = 
workload_group_total_local_scan_bytes->value();
     _per_sec_local_scan_bytes =
             (current_local_scan_bytes - _last_local_scan_bytes) / 
interval_second;
     _last_local_scan_bytes = current_local_scan_bytes;
 
     // remote scan
-    int64_t current_remote_scan_bytes = _remote_scan_bytes_counter->value();
+    int64_t current_remote_scan_bytes = 
workload_group_remote_scan_bytes->value();
     _per_sec_remote_scan_bytes =
             (current_remote_scan_bytes - _last_remote_scan_bytes) / 
interval_second;
     _last_remote_scan_bytes = current_remote_scan_bytes;
@@ -128,7 +123,7 @@ int64_t 
WorkloadGroupMetrics::get_remote_scan_bytes_per_second() {
 }
 
 int64_t WorkloadGroupMetrics::get_memory_used() {
-    return _mem_used_bytes_counter->value();
+    return workload_group_mem_used_bytes->value();
 }
 
 } // namespace doris
\ No newline at end of file
diff --git a/be/src/runtime/workload_group/workload_group_metrics.h 
b/be/src/runtime/workload_group/workload_group_metrics.h
index 5e43ec825c7..67085d8374f 100644
--- a/be/src/runtime/workload_group/workload_group_metrics.h
+++ b/be/src/runtime/workload_group/workload_group_metrics.h
@@ -22,6 +22,7 @@
 #include <memory>
 #include <string>
 #include <unordered_map>
+#include <vector>
 
 namespace doris {
 
@@ -29,7 +30,12 @@ class WorkloadGroup;
 
 template <typename T>
 class AtomicCounter;
-using IntAtomicCounter = AtomicCounter<int64_t>;
+using IntCounter = AtomicCounter<int64_t>;
+
+template <typename T>
+class AtomicGauge;
+using IntGuage = AtomicGauge<int64_t>;
+
 class MetricEntity;
 struct MetricPrototype;
 
@@ -58,19 +64,11 @@ public:
     int64_t get_memory_used();
 
 private:
-    std::unique_ptr<doris::MetricPrototype> _cpu_time_metric {nullptr};
-    std::unique_ptr<doris::MetricPrototype> _mem_used_bytes_metric {nullptr};
-    std::unique_ptr<doris::MetricPrototype> _local_scan_bytes_metric {nullptr};
-    std::unique_ptr<doris::MetricPrototype> _remote_scan_bytes_metric 
{nullptr};
-    // NOTE: _local_scan_bytes_metric is sum of all disk's IO
-    std::unordered_multimap<std::string, 
std::unique_ptr<doris::MetricPrototype>>
-            _local_scan_bytes_metric_map;
-
-    IntAtomicCounter* _cpu_time_counter {nullptr};          // used for metric
-    IntAtomicCounter* _mem_used_bytes_counter {nullptr};    // used for metric
-    IntAtomicCounter* _local_scan_bytes_counter {nullptr};  // used for metric
-    IntAtomicCounter* _remote_scan_bytes_counter {nullptr}; // used for metric
-    std::unordered_multimap<std::string, IntAtomicCounter*>
+    IntCounter* workload_group_cpu_time_sec {nullptr};           // used for 
metric
+    IntGuage* workload_group_mem_used_bytes {nullptr};           // used for 
metric
+    IntCounter* workload_group_remote_scan_bytes {nullptr};      // used for 
metric
+    IntCounter* workload_group_total_local_scan_bytes {nullptr}; // used for 
metric
+    std::unordered_multimap<std::string, IntCounter*>
             _local_scan_bytes_counter_map; // used for metric
 
     std::atomic<uint64_t> _cpu_time_nanos {0};
@@ -86,6 +84,7 @@ private:
     std::atomic<uint64_t> _memory_used {0};
 
     std::shared_ptr<MetricEntity> _entity {nullptr};
+    std::vector<std::shared_ptr<MetricEntity>> _io_entity_list;
 };
 
 } // namespace doris
\ No newline at end of file
diff --git a/be/src/util/system_metrics.cpp b/be/src/util/system_metrics.cpp
index cf50e5be344..49b517f8dbd 100644
--- a/be/src/util/system_metrics.cpp
+++ b/be/src/util/system_metrics.cpp
@@ -49,8 +49,8 @@ struct CpuNumberMetrics {
         INT_COUNTER_METRIC_REGISTER(entity, avail_cpu_num);
     }
 
-    IntAtomicCounter* host_cpu_num {nullptr};
-    IntAtomicCounter* avail_cpu_num {nullptr};
+    IntCounter* host_cpu_num {nullptr};
+    IntCounter* avail_cpu_num {nullptr};
     MetricEntity* entity = nullptr;
 };
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to