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),
109 bytes_sent(), bytes_recv() {
114 for(uint8_t secure = 0; secure <= using_secure; ++secure) {
115 m_addresses[secure].reserve(endpoints.
size());
116 for(
auto& endpoint : endpoints)
117 m_addresses[secure].emplace_back(
new Addr(endpoint));
124 Addr*
get(
const asio::ip::address& for_addr,
bool secure)
const noexcept {
125 for(
auto& addr : m_addresses[secure]) {
126 if(addr->addr.is_unspecified() || addr->addr == for_addr)
134 if(Addr* addr = get(endpoint.address(), secure))
135 addr->conn_accept.fetch_add(1);
140 Addr* addr = m_addresses[0].front().get();
141 addr->conn_open.fetch_add(1);
142 addr->conn_est.fetch_add(1);
147 Addr* addr = m_addresses[0].front().get();
148 addr->conn_open.fetch_sub(1);
153 if(Addr* addr = get(conn->endpoint_local.address(), conn->is_secure())) {
154 addr->conn_open.fetch_add(1);
155 addr->conn_est.fetch_add(1);
161 if(Addr* addr = get(conn->endpoint_local.address(), conn->is_secure()))
162 addr->conn_open.fetch_sub(1);
167 if(Addr* addr = get(conn->endpoint_local.address(), conn->is_secure()))
168 addr->commands[cmd].fetch_add(1);
173 if(Addr* addr = get(conn->endpoint_local.address(), conn->is_secure()))
179 if(Addr* addr = get(conn->endpoint_local.address(), conn->is_secure()))
180 addr->bytes_sent.add(bytes);
185 if(Addr* addr = get(conn->endpoint_local.address(), conn->is_secure()))
186 addr->bytes_recv.add(bytes);
193 for(
auto& addr : m_addresses[secure]) {
200 cell.
key.
add(addr->addr.to_string());
201 cell.
key.
add(secure ?
"SECURE" :
"PLAIN");
241 labels.
push_back(
"Receive Bytes Minimum");
247 labels.
push_back(
"Receive Bytes Maximum");
253 labels.
push_back(
"Receive Transactions");
259 labels.
push_back(
"Receive Bytes Average");
270 labels.
push_back(
"Accepted Connections");
274 labels.
push_back(
"Connections Established");
278 ids.
push_back(i + FIELD_EV_COMMAND_START);
282 size_t sz = 15 + 2 * ids.
size() + relations.
size();
283 for(
size_t i=0; i < names.
size(); ++i) {
284 sz += names[i].
size();
285 sz += labels[i].
size();
293 wfields.
add(aggregations);
294 wfields.
add(relations);
302 if(!m_addresses[secure].empty())
310 int64_t conn_open = 0;
311 int64_t conn_accept = 0;
312 int64_t conn_est = 0;
318 for(
auto& addr : m_addresses[secure]) {
321 key.
copy(parent_key);
323 key.
add(addr->addr.to_string());
324 key.
add(secure ?
"SECURE" :
"PLAIN");
332 conn_open = addr->conn_open.load();
334 if((conn_accept = addr->conn_accept.exchange(0)))
336 if((conn_est = addr->conn_est.exchange(0)))
339 addr->bytes_sent.gather(bytes_sent);
341 addr->bytes_recv.gather(bytes_recv);
346 if((counts[i] = addr->commands[i].exchange(0)))
353 add_value(bytes_sent, FIELD_BYTES_SENT_MIN,
true, wfields);
354 add_value(bytes_recv, FIELD_BYTES_RECV_MIN,
true, wfields);
356 wfields.
add(FIELD_CONN_OPEN, conn_open);
358 wfields.
add(FIELD_CONN_ACC, conn_accept);
360 wfields.
add(FIELD_CONN_EST, conn_est);
363 wfields.
add(i + FIELD_EV_COMMAND_START, counts[i]);
371 if(!m_addresses[secure].empty())
379 for(
auto& addr : m_addresses[secure]) {
380 addr->conn_open.store(0);
381 addr->conn_accept.store(0);
382 addr->conn_est.store(0);
383 addr->bytes_sent.reset();
384 addr->bytes_recv.reset();
385 for(
auto& c : addr->commands) {
391 if(!m_addresses[secure].empty())
408 static constexpr
const uint8_t FIELD_RSS_FREE_MIN = 0;
409 static constexpr
const uint8_t FIELD_RSS_FREE_MAX = 1;
410 static constexpr
const uint8_t FIELD_RSS_FREE_AVG = 2;
412 static constexpr
const uint8_t FIELD_RSS_USED_MIN = 3;
413 static constexpr
const uint8_t FIELD_RSS_USED_MAX = 4;
414 static constexpr
const uint8_t FIELD_RSS_USED_AVG = 5;
416 static constexpr
const uint8_t FIELD_RSS_USED_REG_MIN = 6;
417 static constexpr
const uint8_t FIELD_RSS_USED_REG_MAX = 7;
418 static constexpr
const uint8_t FIELD_RSS_USED_REG_AVG = 8;
421 typedef std::unique_ptr<Item_Mem>
Ptr;
427 Item_Mem() noexcept: rss_free(), rss_used(), rss_used_reg() { }
435 key.
copy(parent_key);
451 FIELD_RSS_USED_REG_MIN,
452 FIELD_RSS_USED_REG_MAX,
453 FIELD_RSS_USED_REG_AVG,
473 "RSS Registred Minimal",
474 "RSS Registred Maximal",
475 "RSS Registred Average"
495 rss_free.
gather(_rss_free);
498 rss_used.
gather(_rss_used);
501 rss_used_reg.
gather(_rss_used_reg);
511 key.
copy(parent_key);
523 add_value(_rss_free, FIELD_RSS_FREE_MIN,
false, wfields);
524 add_value(_rss_used, FIELD_RSS_USED_MIN,
false, wfields);
525 add_value(_rss_used_reg, FIELD_RSS_USED_REG_MIN,
false, wfields);
534 rss_used_reg.
reset();
546 static constexpr
const uint8_t FIELD_CPU_U_PERC_MIN = 0;
547 static constexpr
const uint8_t FIELD_CPU_U_PERC_MAX = 1;
548 static constexpr
const uint8_t FIELD_CPU_U_PERC_AVG = 2;
550 static constexpr
const uint8_t FIELD_CPU_S_PERC_MIN = 3;
551 static constexpr
const uint8_t FIELD_CPU_S_PERC_MAX = 4;
552 static constexpr
const uint8_t FIELD_CPU_S_PERC_AVG = 5;
554 static constexpr
const uint8_t FIELD_NTHREADS_MIN = 6;
555 static constexpr
const uint8_t FIELD_NTHREADS_MAX = 7;
556 static constexpr
const uint8_t FIELD_NTHREADS_AVG = 8;
559 typedef std::unique_ptr<Item_CPU>
Ptr;
565 Item_CPU() noexcept : percent_user(), percent_sys(), nthreads() { }
573 key.
copy(parent_key);
583 FIELD_CPU_U_PERC_MIN,
584 FIELD_CPU_U_PERC_MAX,
585 FIELD_CPU_U_PERC_AVG,
586 FIELD_CPU_S_PERC_MIN,
587 FIELD_CPU_S_PERC_MAX,
588 FIELD_CPU_S_PERC_AVG,
635 percent_user.
gather(_percent_user);
638 percent_sys.
gather(_percent_sys);
641 nthreads.
gather(_nthreads);
651 key.
copy(parent_key);
662 add_value(_percent_user, FIELD_CPU_U_PERC_MIN,
false, wfields);
663 add_value(_percent_sys, FIELD_CPU_S_PERC_MIN,
false, wfields);
664 add_value(_nthreads, FIELD_NTHREADS_MIN,
false, wfields);
671 percent_user.
reset();
685 static constexpr
const uint8_t FIELD_FDS = 0;
686 static constexpr
const uint8_t FIELD_MIN = 1;
687 static constexpr
const uint8_t FIELD_MAX = 2;
688 static constexpr
const uint8_t FIELD_COUNT = 3;
689 static constexpr
const uint8_t FIELD_AVG = 4;
690 static constexpr
const uint8_t FIELD_ERROR = 5;
694 typedef std::unique_ptr<Item_FS>
Ptr;
705 key.
copy(parent_key);
733 labels.
push_back(cmd +
" Requests Count");
734 labels.
push_back(cmd +
" Latency ns Average");
742 labels.
push_back(
"Open File Descriptors");
752 labels.
push_back(cmd +
" Latency ns Minimum");
753 labels.
push_back(cmd +
" Latency ns Maximum");
765 size_t sz = 15 + 3 * ids.
size();
766 for(uint8_t i=0; i < names.
size(); ++i) {
767 sz += names[i].
size();
768 sz += labels[i].
size();
775 wfields.
add(aggregations);
776 wfields.
add(relations);
786 fs->statistics.gather(stats);
787 uint64_t open_fds = fs->statistics.fds_count.load();
795 uint64_t avg = m.
m_total/m.m_count;
821 wfields.
add(FIELD_FDS, int64_t(open_fds));
827 uint64_t avg = m.
m_total/m.m_count;
829 wfields.
add(FIELD_MIN + i, int64_t(m.m_min));
831 wfields.
add(FIELD_MAX + i, int64_t(m.m_max));
832 wfields.
add(FIELD_COUNT + i, int64_t(m.m_count));
833 wfields.
add(FIELD_AVG + i, int64_t(avg));
835 wfields.
add(FIELD_ERROR + i, int64_t(m.m_error));
844 fs->statistics.reset();
854 typedef std::shared_ptr<Reporting>
Ptr;
860 : client::Query::Update::Handlers::Metric::
Reporting(
861 a_clients, a_io, a_cfg_intval, a_executor),
862 system(this), cpu(nullptr), mem(nullptr) {
867 auto level = host ? get_level(host) :
nullptr;
869 level = level ? level->get_level(group_name) : get_level(group_name);
871 level = level ? level->get_level(inst_name) : get_level(inst_name);
872 if(!endpoints.
empty()) {
874 level = level ? level->get_level(port.c_str()) : get_level(port.c_str());
878 level->metrics.emplace_back(cpu = system.cpu);
879 level->metrics.emplace_back(mem = system.mem);
897 : reporting(a_reporting),
919 void cpu_user(
size_t perc_milli) noexcept
override {
923 void cpu_sys(
size_t perc_milli) noexcept
override {
947 #endif // swcdb_common_queries_update_MetricsReporting_h