7 #ifndef swcdb_common_queries_update_MetricsReporting_h
8 #define swcdb_common_queries_update_MetricsReporting_h
16 namespace SWC {
namespace Common {
27 using namespace client::Query::Update::Handlers::Metric;
36 bool with_count) noexcept {
39 uint64_t avg = value.
avg();
52 static void add_value(
54 uint8_t field_start,
bool with_count,
57 uint64_t avg = value.
avg();
59 wfields.
add(field_start, int64_t(value.
min));
61 wfields.
add(field_start + 1, int64_t(value.
max));
63 wfields.
add(field_start + 2, int64_t(value.
count));
64 wfields.
add(field_start + 2 + with_count, int64_t(avg));
71 template<
typename CommandsT>
77 static constexpr
const uint8_t FIELD_CONN_OPEN = 0;
78 static constexpr
const uint8_t FIELD_CONN_ACC = 1;
79 static constexpr
const uint8_t FIELD_CONN_EST = 2;
81 static constexpr
const uint8_t FIELD_BYTES_SENT_MIN = 3;
82 static constexpr
const uint8_t FIELD_BYTES_SENT_MAX = 4;
83 static constexpr
const uint8_t FIELD_BYTES_SENT_TRX = 5;
84 static constexpr
const uint8_t FIELD_BYTES_SENT_AVG = 6;
86 static constexpr
const uint8_t FIELD_BYTES_RECV_MIN = 7;
87 static constexpr
const uint8_t FIELD_BYTES_RECV_MAX = 8;
88 static constexpr
const uint8_t FIELD_BYTES_RECV_TRX = 9;
89 static constexpr
const uint8_t FIELD_BYTES_RECV_AVG = 10;
91 static constexpr
const uint8_t FIELD_EV_COMMAND_START = 100;
94 typedef std::unique_ptr<Item_Net>
Ptr;
97 const asio::ip::address
addr;
107 : addr(endpoint.address()),
108 conn_open(0), conn_accept(0), conn_est(0) {
113 for(uint8_t secure = 0; secure <= using_secure; ++secure) {
114 m_addresses[secure].reserve(endpoints.
size());
115 for(
auto& endpoint : endpoints)
116 m_addresses[secure].emplace_back(
new Addr(endpoint));
123 Addr*
get(
const asio::ip::address& for_addr,
bool secure)
const noexcept {
124 for(
auto& addr : m_addresses[secure]) {
125 if(addr->addr.is_unspecified() || addr->addr == for_addr)
133 if(Addr* addr = get(endpoint.address(), secure))
134 addr->conn_accept.fetch_add(1);
139 Addr* addr = m_addresses[0].front().get();
140 addr->conn_open.fetch_add(1);
141 addr->conn_est.fetch_add(1);
146 Addr* addr = m_addresses[0].front().get();
147 addr->conn_open.fetch_sub(1);
152 if(Addr* addr = get(conn->endpoint_local.address(), conn->is_secure())) {
153 addr->conn_open.fetch_add(1);
154 addr->conn_est.fetch_add(1);
160 if(Addr* addr = get(conn->endpoint_local.address(), conn->is_secure()))
161 addr->conn_open.fetch_sub(1);
166 if(Addr* addr = get(conn->endpoint_local.address(), conn->is_secure()))
167 addr->commands[cmd].fetch_add(1);
172 if(Addr* addr = get(conn->endpoint_local.address(), conn->is_secure()))
178 if(Addr* addr = get(conn->endpoint_local.address(), conn->is_secure()))
179 addr->bytes_sent.add(bytes);
184 if(Addr* addr = get(conn->endpoint_local.address(), conn->is_secure()))
185 addr->bytes_recv.add(bytes);
192 for(
auto& addr : m_addresses[secure]) {
199 cell.
key.
add(addr->addr.to_string());
200 cell.
key.
add(secure ?
"SECURE" :
"PLAIN");
240 labels.
push_back(
"Receive Bytes Minimum");
246 labels.
push_back(
"Receive Bytes Maximum");
252 labels.
push_back(
"Receive Transactions");
258 labels.
push_back(
"Receive Bytes Average");
269 labels.
push_back(
"Accepted Connections");
273 labels.
push_back(
"Connections Established");
277 ids.
push_back(i + FIELD_EV_COMMAND_START);
281 size_t sz = 15 + 2 * ids.
size() + relations.
size();
282 for(
size_t i=0; i < names.
size(); ++i) {
283 sz += names[i].
size();
284 sz += labels[i].
size();
292 wfields.
add(aggregations);
293 wfields.
add(relations);
301 if(!m_addresses[secure].empty())
309 int64_t conn_open = 0;
310 int64_t conn_accept = 0;
311 int64_t conn_est = 0;
317 for(
auto& addr : m_addresses[secure]) {
320 key.
copy(parent_key);
322 key.
add(addr->addr.to_string());
323 key.
add(secure ?
"SECURE" :
"PLAIN");
331 conn_open = addr->conn_open.load();
333 if((conn_accept = addr->conn_accept.exchange(0)))
335 if((conn_est = addr->conn_est.exchange(0)))
338 addr->bytes_sent.gather(bytes_sent);
340 addr->bytes_recv.gather(bytes_recv);
345 if((counts[i] = addr->commands[i].exchange(0)))
352 add_value(bytes_sent, FIELD_BYTES_SENT_MIN,
true, wfields);
353 add_value(bytes_recv, FIELD_BYTES_RECV_MIN,
true, wfields);
355 wfields.
add(FIELD_CONN_OPEN, conn_open);
357 wfields.
add(FIELD_CONN_ACC, conn_accept);
359 wfields.
add(FIELD_CONN_EST, conn_est);
362 wfields.
add(i + FIELD_EV_COMMAND_START, counts[i]);
370 if(!m_addresses[secure].empty())
378 for(
auto& addr : m_addresses[secure]) {
379 addr->conn_open.store(0);
380 addr->conn_accept.store(0);
381 addr->conn_est.store(0);
382 addr->bytes_sent.reset();
383 addr->bytes_recv.reset();
384 for(
auto& c : addr->commands) {
390 if(!m_addresses[secure].empty())
407 static constexpr
const uint8_t FIELD_RSS_FREE_MIN = 0;
408 static constexpr
const uint8_t FIELD_RSS_FREE_MAX = 1;
409 static constexpr
const uint8_t FIELD_RSS_FREE_AVG = 2;
411 static constexpr
const uint8_t FIELD_RSS_USED_MIN = 3;
412 static constexpr
const uint8_t FIELD_RSS_USED_MAX = 4;
413 static constexpr
const uint8_t FIELD_RSS_USED_AVG = 5;
415 static constexpr
const uint8_t FIELD_RSS_USED_REG_MIN = 6;
416 static constexpr
const uint8_t FIELD_RSS_USED_REG_MAX = 7;
417 static constexpr
const uint8_t FIELD_RSS_USED_REG_AVG = 8;
420 typedef std::unique_ptr<Item_Mem>
Ptr;
434 key.
copy(parent_key);
450 FIELD_RSS_USED_REG_MIN,
451 FIELD_RSS_USED_REG_MAX,
452 FIELD_RSS_USED_REG_AVG,
472 "RSS Registred Minimal",
473 "RSS Registred Maximal",
474 "RSS Registred Average"
494 rss_free.
gather(_rss_free);
497 rss_used.
gather(_rss_used);
500 rss_used_reg.
gather(_rss_used_reg);
510 key.
copy(parent_key);
522 add_value(_rss_free, FIELD_RSS_FREE_MIN,
false, wfields);
523 add_value(_rss_used, FIELD_RSS_USED_MIN,
false, wfields);
524 add_value(_rss_used_reg, FIELD_RSS_USED_REG_MIN,
false, wfields);
533 rss_used_reg.
reset();
545 static constexpr
const uint8_t FIELD_CPU_U_PERC_MIN = 0;
546 static constexpr
const uint8_t FIELD_CPU_U_PERC_MAX = 1;
547 static constexpr
const uint8_t FIELD_CPU_U_PERC_AVG = 2;
549 static constexpr
const uint8_t FIELD_CPU_S_PERC_MIN = 3;
550 static constexpr
const uint8_t FIELD_CPU_S_PERC_MAX = 4;
551 static constexpr
const uint8_t FIELD_CPU_S_PERC_AVG = 5;
553 static constexpr
const uint8_t FIELD_NTHREADS_MIN = 6;
554 static constexpr
const uint8_t FIELD_NTHREADS_MAX = 7;
555 static constexpr
const uint8_t FIELD_NTHREADS_AVG = 8;
558 typedef std::unique_ptr<Item_CPU>
Ptr;
572 key.
copy(parent_key);
582 FIELD_CPU_U_PERC_MIN,
583 FIELD_CPU_U_PERC_MAX,
584 FIELD_CPU_U_PERC_AVG,
585 FIELD_CPU_S_PERC_MIN,
586 FIELD_CPU_S_PERC_MAX,
587 FIELD_CPU_S_PERC_AVG,
634 percent_user.
gather(_percent_user);
637 percent_sys.
gather(_percent_sys);
640 nthreads.
gather(_nthreads);
650 key.
copy(parent_key);
661 add_value(_percent_user, FIELD_CPU_U_PERC_MIN,
false, wfields);
662 add_value(_percent_sys, FIELD_CPU_S_PERC_MIN,
false, wfields);
663 add_value(_nthreads, FIELD_NTHREADS_MIN,
false, wfields);
670 percent_user.
reset();
684 static constexpr
const uint8_t FIELD_FDS = 0;
685 static constexpr
const uint8_t FIELD_MIN = 1;
686 static constexpr
const uint8_t FIELD_MAX = 2;
687 static constexpr
const uint8_t FIELD_COUNT = 3;
688 static constexpr
const uint8_t FIELD_AVG = 4;
689 static constexpr
const uint8_t FIELD_ERROR = 5;
693 typedef std::unique_ptr<Item_FS>
Ptr;
704 key.
copy(parent_key);
732 labels.
push_back(cmd +
" Requests Count");
733 labels.
push_back(cmd +
" Latency ns Average");
741 labels.
push_back(
"Open File Descriptors");
751 labels.
push_back(cmd +
" Latency ns Minimum");
752 labels.
push_back(cmd +
" Latency ns Maximum");
764 size_t sz = 15 + 3 * ids.
size();
765 for(uint8_t i=0; i < names.
size(); ++i) {
766 sz += names[i].
size();
767 sz += labels[i].
size();
774 wfields.
add(aggregations);
775 wfields.
add(relations);
785 fs->statistics.gather(stats);
786 uint64_t open_fds = fs->statistics.fds_count.load();
794 uint64_t avg = m.
m_total/m.m_count;
820 wfields.
add(FIELD_FDS, int64_t(open_fds));
826 uint64_t avg = m.
m_total/m.m_count;
828 wfields.
add(FIELD_MIN + i, int64_t(m.m_min));
830 wfields.
add(FIELD_MAX + i, int64_t(m.m_max));
831 wfields.
add(FIELD_COUNT + i, int64_t(m.m_count));
832 wfields.
add(FIELD_AVG + i, int64_t(avg));
834 wfields.
add(FIELD_ERROR + i, int64_t(m.m_error));
843 fs->statistics.reset();
853 typedef std::shared_ptr<Reporting>
Ptr;
859 : client::Query::Update::Handlers::Metric::
Reporting(
860 a_clients, a_io, a_cfg_intval, a_executor),
861 system(this), cpu(nullptr), mem(nullptr) {
866 auto level = host ? get_level(host) :
nullptr;
868 level = level ? level->get_level(group_name) : get_level(group_name);
870 level = level ? level->get_level(inst_name) : get_level(inst_name);
871 if(!endpoints.
empty()) {
873 level = level ? level->get_level(port.c_str()) : get_level(port.c_str());
877 level->metrics.emplace_back(cpu = system.cpu);
878 level->metrics.emplace_back(mem = system.mem);
891 : reporting(a_reporting),
908 void cpu_user(
size_t perc_milli) noexcept
override {
912 void cpu_sys(
size_t perc_milli) noexcept
override {
936 #endif // swcdb_common_queries_update_MetricsReporting_h