This is an automated email from the ASF dual-hosted git repository.
wangbo pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.1 by this push:
new 7d35838f4f3 [branch-2.1]Refactor workload group metric (#46640)
(#46875)
7d35838f4f3 is described below
commit 7d35838f4f3279944c389578e76858fc994538f3
Author: wangbo <[email protected]>
AuthorDate: Mon Jan 13 15:16:53 2025 +0800
[branch-2.1]Refactor workload group metric (#46640) (#46875)
pick #46640
---
.../workload_group/workload_group_metrics.cpp | 68 ++++++++++------------
.../workload_group/workload_group_metrics.h | 27 +++++----
be/src/util/system_metrics.cpp | 4 +-
3 files changed, 46 insertions(+), 53 deletions(-)
diff --git a/be/src/runtime/workload_group/workload_group_metrics.cpp
b/be/src/runtime/workload_group/workload_group_metrics.cpp
index c79bb1ef239..7a3efbc12b0 100644
--- a/be/src/runtime/workload_group/workload_group_metrics.cpp
+++ b/be/src/runtime/workload_group/workload_group_metrics.cpp
@@ -27,45 +27,39 @@
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);
+
WorkloadGroupMetrics::~WorkloadGroupMetrics() {
DorisMetrics::instance()->metric_registry()->deregister_entity(_entity);
}
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,
-
(IntAtomicCounter*)(_entity->register_metric<IntAtomicCounter>(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 +72,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 +80,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 +89,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 +122,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: [email protected]
For additional commands, e-mail: [email protected]