37 #include <sys/types.h> 45 #include <qb/qblist.h> 46 #include <qb/qbipcs.h> 47 #include <qb/qbipc_common.h> 99 {
STAT_SRP,
"time_since_token_last_received", offsetof(
totemsrp_stats_t, time_since_token_last_received), ICMAP_VALUETYPE_UINT64},
101 {
STAT_SRP,
"continuous_sendmsg_failures", offsetof(
totemsrp_stats_t, continuous_sendmsg_failures), ICMAP_VALUETYPE_UINT32},
110 {
STAT_KNET,
"connected", offsetof(
struct knet_link_status, connected), ICMAP_VALUETYPE_UINT8},
113 {
STAT_KNET,
"rx_data_packets", offsetof(
struct knet_link_status, stats.rx_data_packets), ICMAP_VALUETYPE_UINT64},
114 {
STAT_KNET,
"tx_data_bytes", offsetof(
struct knet_link_status, stats.tx_data_bytes), ICMAP_VALUETYPE_UINT64},
115 {
STAT_KNET,
"rx_data_bytes", offsetof(
struct knet_link_status, stats.rx_data_bytes), ICMAP_VALUETYPE_UINT64},
116 {
STAT_KNET,
"tx_ping_packets", offsetof(
struct knet_link_status, stats.tx_ping_packets), ICMAP_VALUETYPE_UINT64},
117 {
STAT_KNET,
"rx_ping_packets", offsetof(
struct knet_link_status, stats.rx_ping_packets), ICMAP_VALUETYPE_UINT64},
118 {
STAT_KNET,
"tx_ping_bytes", offsetof(
struct knet_link_status, stats.tx_ping_bytes), ICMAP_VALUETYPE_UINT64},
119 {
STAT_KNET,
"rx_ping_bytes", offsetof(
struct knet_link_status, stats.rx_ping_bytes), ICMAP_VALUETYPE_UINT64},
120 {
STAT_KNET,
"tx_pong_packets", offsetof(
struct knet_link_status, stats.tx_pong_packets), ICMAP_VALUETYPE_UINT64},
121 {
STAT_KNET,
"rx_pong_packets", offsetof(
struct knet_link_status, stats.rx_pong_packets), ICMAP_VALUETYPE_UINT64},
122 {
STAT_KNET,
"tx_pong_bytes", offsetof(
struct knet_link_status, stats.tx_pong_bytes), ICMAP_VALUETYPE_UINT64},
123 {
STAT_KNET,
"rx_pong_bytes", offsetof(
struct knet_link_status, stats.rx_pong_bytes), ICMAP_VALUETYPE_UINT64},
124 {
STAT_KNET,
"tx_pmtu_packets", offsetof(
struct knet_link_status, stats.tx_pmtu_packets), ICMAP_VALUETYPE_UINT64},
125 {
STAT_KNET,
"rx_pmtu_packets", offsetof(
struct knet_link_status, stats.rx_pmtu_packets), ICMAP_VALUETYPE_UINT64},
126 {
STAT_KNET,
"tx_pmtu_bytes", offsetof(
struct knet_link_status, stats.tx_pmtu_bytes), ICMAP_VALUETYPE_UINT64},
127 {
STAT_KNET,
"rx_pmtu_bytes", offsetof(
struct knet_link_status, stats.rx_pmtu_bytes), ICMAP_VALUETYPE_UINT64},
128 {
STAT_KNET,
"tx_total_packets", offsetof(
struct knet_link_status, stats.tx_total_packets), ICMAP_VALUETYPE_UINT64},
129 {
STAT_KNET,
"rx_total_packets", offsetof(
struct knet_link_status, stats.rx_total_packets), ICMAP_VALUETYPE_UINT64},
130 {
STAT_KNET,
"tx_total_bytes", offsetof(
struct knet_link_status, stats.tx_total_bytes), ICMAP_VALUETYPE_UINT64},
131 {
STAT_KNET,
"rx_total_bytes", offsetof(
struct knet_link_status, stats.rx_total_bytes), ICMAP_VALUETYPE_UINT64},
132 {
STAT_KNET,
"tx_total_errors", offsetof(
struct knet_link_status, stats.tx_total_errors), ICMAP_VALUETYPE_UINT64},
133 {
STAT_KNET,
"rx_total_retries", offsetof(
struct knet_link_status, stats.tx_total_retries), ICMAP_VALUETYPE_UINT64},
134 {
STAT_KNET,
"tx_pmtu_errors", offsetof(
struct knet_link_status, stats.tx_pmtu_errors), ICMAP_VALUETYPE_UINT32},
135 {
STAT_KNET,
"tx_pmtu_retries", offsetof(
struct knet_link_status, stats.tx_pmtu_retries), ICMAP_VALUETYPE_UINT32},
136 {
STAT_KNET,
"tx_ping_errors", offsetof(
struct knet_link_status, stats.tx_ping_errors), ICMAP_VALUETYPE_UINT32},
137 {
STAT_KNET,
"tx_ping_retries", offsetof(
struct knet_link_status, stats.tx_ping_retries), ICMAP_VALUETYPE_UINT32},
138 {
STAT_KNET,
"tx_pong_errors", offsetof(
struct knet_link_status, stats.tx_pong_errors), ICMAP_VALUETYPE_UINT32},
139 {
STAT_KNET,
"tx_pong_retries", offsetof(
struct knet_link_status, stats.tx_pong_retries), ICMAP_VALUETYPE_UINT32},
140 {
STAT_KNET,
"tx_data_errors", offsetof(
struct knet_link_status, stats.tx_data_errors), ICMAP_VALUETYPE_UINT32},
141 {
STAT_KNET,
"tx_data_retries", offsetof(
struct knet_link_status, stats.tx_data_retries), ICMAP_VALUETYPE_UINT32},
142 {
STAT_KNET,
"latency_min", offsetof(
struct knet_link_status, stats.latency_min), ICMAP_VALUETYPE_UINT32},
143 {
STAT_KNET,
"latency_max", offsetof(
struct knet_link_status, stats.latency_max), ICMAP_VALUETYPE_UINT32},
144 {
STAT_KNET,
"latency_ave", offsetof(
struct knet_link_status, stats.latency_ave), ICMAP_VALUETYPE_UINT32},
145 {
STAT_KNET,
"latency_samples", offsetof(
struct knet_link_status, stats.latency_samples), ICMAP_VALUETYPE_UINT32},
146 {
STAT_KNET,
"down_count", offsetof(
struct knet_link_status, stats.down_count), ICMAP_VALUETYPE_UINT32},
147 {
STAT_KNET,
"up_count", offsetof(
struct knet_link_status, stats.up_count), ICMAP_VALUETYPE_UINT32},
151 {
STAT_KNET_HANDLE,
"tx_compressed_packets", offsetof(
struct knet_handle_stats, tx_compressed_packets), ICMAP_VALUETYPE_UINT64},
152 {
STAT_KNET_HANDLE,
"tx_compressed_original_bytes", offsetof(
struct knet_handle_stats, tx_compressed_original_bytes), ICMAP_VALUETYPE_UINT64},
153 {
STAT_KNET_HANDLE,
"tx_compressed_size_bytes", offsetof(
struct knet_handle_stats, tx_compressed_size_bytes), ICMAP_VALUETYPE_UINT64},
154 {
STAT_KNET_HANDLE,
"tx_compress_time_min", offsetof(
struct knet_handle_stats, tx_compress_time_min), ICMAP_VALUETYPE_UINT64},
155 {
STAT_KNET_HANDLE,
"tx_compress_time_max", offsetof(
struct knet_handle_stats, tx_compress_time_max), ICMAP_VALUETYPE_UINT64},
156 {
STAT_KNET_HANDLE,
"tx_compress_time_ave", offsetof(
struct knet_handle_stats, tx_compress_time_ave), ICMAP_VALUETYPE_UINT64},
157 {
STAT_KNET_HANDLE,
"rx_compressed_packets", offsetof(
struct knet_handle_stats, rx_compressed_packets), ICMAP_VALUETYPE_UINT64},
158 {
STAT_KNET_HANDLE,
"rx_compressed_original_bytes", offsetof(
struct knet_handle_stats, rx_compressed_original_bytes), ICMAP_VALUETYPE_UINT64},
159 {
STAT_KNET_HANDLE,
"rx_compressed_size_bytes", offsetof(
struct knet_handle_stats, rx_compressed_size_bytes), ICMAP_VALUETYPE_UINT64},
160 {
STAT_KNET_HANDLE,
"rx_compress_time_min", offsetof(
struct knet_handle_stats, rx_compress_time_min), ICMAP_VALUETYPE_UINT64},
161 {
STAT_KNET_HANDLE,
"rx_compress_time_max", offsetof(
struct knet_handle_stats, rx_compress_time_max), ICMAP_VALUETYPE_UINT64},
162 {
STAT_KNET_HANDLE,
"rx_compress_time_ave", offsetof(
struct knet_handle_stats, rx_compress_time_ave), ICMAP_VALUETYPE_UINT64},
163 {
STAT_KNET_HANDLE,
"tx_crypt_time_min", offsetof(
struct knet_handle_stats, tx_crypt_time_min), ICMAP_VALUETYPE_UINT64},
164 {
STAT_KNET_HANDLE,
"tx_crypt_time_max", offsetof(
struct knet_handle_stats, tx_crypt_time_max), ICMAP_VALUETYPE_UINT64},
165 {
STAT_KNET_HANDLE,
"tx_crypt_time_ave", offsetof(
struct knet_handle_stats, tx_crypt_time_ave), ICMAP_VALUETYPE_UINT64},
166 {
STAT_KNET_HANDLE,
"tx_crypt_byte_overhead", offsetof(
struct knet_handle_stats, tx_crypt_byte_overhead), ICMAP_VALUETYPE_UINT64},
167 {
STAT_KNET_HANDLE,
"tx_crypt_packets", offsetof(
struct knet_handle_stats, tx_crypt_packets), ICMAP_VALUETYPE_UINT64},
168 {
STAT_KNET_HANDLE,
"rx_crypt_time_min", offsetof(
struct knet_handle_stats, rx_crypt_time_min), ICMAP_VALUETYPE_UINT64},
169 {
STAT_KNET_HANDLE,
"rx_crypt_time_max", offsetof(
struct knet_handle_stats, rx_crypt_time_max), ICMAP_VALUETYPE_UINT64},
170 {
STAT_KNET_HANDLE,
"rx_crypt_time_ave", offsetof(
struct knet_handle_stats, rx_crypt_time_ave), ICMAP_VALUETYPE_UINT64},
171 {
STAT_KNET_HANDLE,
"rx_crypt_packets", offsetof(
struct knet_handle_stats, rx_crypt_packets), ICMAP_VALUETYPE_UINT64},
194 #define NUM_PG_STATS (sizeof(cs_pg_stats) / sizeof(struct cs_stats_conv)) 195 #define NUM_SRP_STATS (sizeof(cs_srp_stats) / sizeof(struct cs_stats_conv)) 196 #define NUM_KNET_STATS (sizeof(cs_knet_stats) / sizeof(struct cs_stats_conv)) 197 #define NUM_KNET_HANDLE_STATS (sizeof(cs_knet_handle_stats) / sizeof(struct cs_stats_conv)) 198 #define NUM_IPCSC_STATS (sizeof(cs_ipcs_conn_stats) / sizeof(struct cs_stats_conv)) 199 #define NUM_IPCSG_STATS (sizeof(cs_ipcs_global_stats) / sizeof(struct cs_stats_conv)) 215 struct qb_list_head list;
232 *value_len = strlen((
char *)(stat_array) + conv->
offset)+1;
236 memcpy(value, (
char *)(stat_array) + conv->
offset, *value_len);
240 static void stats_add_entry(
const char *key,
struct cs_stats_conv *cs_conv)
250 static void stats_rm_entry(
const char *key)
275 sprintf(param,
"stats.pg.%s", cs_pg_stats[i].
name);
276 stats_add_entry(param, &cs_pg_stats[i]);
279 sprintf(param,
"stats.srp.%s", cs_srp_stats[i].
name);
280 stats_add_entry(param, &cs_srp_stats[i]);
283 sprintf(param,
"stats.ipcs.%s", cs_ipcs_global_stats[i].
name);
284 stats_add_entry(param, &cs_ipcs_global_stats[i]);
299 struct knet_link_status link_status;
302 struct knet_handle_stats knet_handle_stats;
316 switch (statinfo->
type) {
319 stats_map_set_value(statinfo, pg_stats, value, value_len, type);
323 stats_map_set_value(statinfo, pg_stats->
srp, value, value_len, type);
330 stats_map_set_value(statinfo, &knet_handle_stats, value, value_len, type);
333 if (sscanf(key_name,
"stats.knet.node%d.link%d", &nodeid, &link_no) != 2) {
338 if (nodeid <= 0 || nodeid > KNET_MAX_HOST ||
339 link_no < 0 || link_no > KNET_MAX_LINK) {
348 stats_map_set_value(statinfo, &link_status, value, value_len, type);
351 if (sscanf(key_name,
"stats.ipcs.service%d.%d.%p", &service_id, &pid, &conn_ptr) != 3) {
358 stats_map_set_value(statinfo, &ipcs_conn_stats, value, value_len, type);
362 stats_map_set_value(statinfo, &ipcs_global_stats, value, value_len, type);
370 #define STATS_CLEAR "stats.clear." 371 #define STATS_CLEAR_KNET "stats.clear.knet" 372 #define STATS_CLEAR_IPC "stats.clear.ipc" 373 #define STATS_CLEAR_TOTEM "stats.clear.totem" 374 #define STATS_CLEAR_ALL "stats.clear.all" 428 return (qb_map_pref_iter_create(
stats_map, prefix));
437 res = qb_map_iter_next(iter, (
void **)&item);
441 stats_map_set_value(item->cs_conv, NULL, NULL, value_len, type);
448 qb_map_iter_free(iter);
455 struct qb_list_head *iter;
463 qb_list_for_each(iter, &stats_tracker_list_head) {
471 &value, &value_len, &type);
474 if ((res ==
CS_OK) && (memcmp(&value, &tracker->
old_value, value_len) != 0)) {
477 old_val.
len = new_val.
len = value_len;
483 memcpy(&tracker->
old_value, &value, value_len);
490 static void stats_map_notify_fn(uint32_t event,
char *key,
void *old_value,
void *value,
void *
user_data)
497 if (value == NULL && old_value == NULL) {
501 new_val.
data = new_value;
511 memcpy(&old_val, &new_val,
sizeof(new_val));
546 tracker->
events = track_type;
548 tracker->
key_name = strdup(key_name);
564 if ((track_type & ICMAP_TRACK_ADD) ||
565 (track_type & ICMAP_TRACK_DELETE)) {
578 qb_list_add (&tracker->
list, &stats_tracker_list_head);
592 tracker->
key_name, stats_map_notify_fn,
599 qb_list_del(&tracker->
list);
620 sprintf(param,
"stats.knet.node%d.link%d.%s", nodeid, link_no, cs_knet_stats[i].
name);
621 stats_add_entry(param, &cs_knet_stats[i]);
630 sprintf(param,
"stats.knet.node%d.link%d.%s", nodeid, link_no, cs_knet_stats[i].
name);
631 stats_rm_entry(param);
643 sprintf(param,
"stats.knet.handle.%s", cs_knet_handle_stats[i].
name);
644 stats_add_entry(param, &cs_knet_handle_stats[i]);
655 sprintf(param,
"stats.ipcs.service%d.%d.%p.%s", service_id, pid, ptr, cs_ipcs_conn_stats[i].
name);
656 stats_add_entry(param, &cs_ipcs_conn_stats[i]);
665 sprintf(param,
"stats.ipcs.service%d.%d.%p.%s", service_id, pid, ptr, cs_ipcs_conn_stats[i].
name);
666 stats_rm_entry(param);
struct cs_stats_conv cs_pg_stats[]
const icmap_value_types_t value_type
#define TOTEMPG_STATS_CLEAR_TOTEM
void *(* totem_get_stats)(void)
void totempg_stats_clear(int flags)
#define STATS_CLEAR_TOTEM
cs_error_t stats_map_track_add(const char *key_name, int32_t track_type, icmap_notify_fn_t notify_fn, void *user_data, icmap_track_t *icmap_track)
struct cs_stats_conv cs_srp_stats[]
int32_t icmap_tt_to_qbtt(int32_t track_type)
cs_error_t stats_map_init(const struct corosync_api_v1 *corosync_api)
void stats_trigger_trackers()
struct cs_stats_conv * cs_conv
cs_error_t stats_map_track_delete(icmap_track_t icmap_track)
enum cs_stats_conv::@8 type
struct cs_stats_conv cs_ipcs_conn_stats[]
size_t icmap_get_valuetype_len(icmap_value_types_t type)
#define log_printf(level, format, args...)
#define ICMAP_TRACK_DELETE
void stats_ipcs_add_connection(int service_id, uint32_t pid, void *ptr)
#define ICMAP_KEYNAME_MAXLEN
Maximum length of key in icmap.
int totemknet_handle_get_stats(struct knet_handle_stats *stats)
#define ICMAP_TRACK_MODIFY
struct cs_stats_conv cs_knet_handle_stats[]
void(* icmap_notify_fn_t)(int32_t event, const char *key_name, struct icmap_notify_value new_value, struct icmap_notify_value old_value, void *user_data)
Prototype for notify callback function.
void stats_knet_add_member(knet_node_id_t nodeid, uint8_t link_no)
#define LOGSYS_LEVEL_ERROR
cs_error_t
The cs_error_t enum.
struct cs_stats_conv cs_knet_stats[]
LOGSYS_DECLARE_SUBSYS("STATS")
void * stats_map_track_get_user_data(icmap_track_t icmap_track)
The corosync_api_v1 struct.
void cs_ipcs_get_global_stats(struct ipcs_global_stats *ipcs_stats)
int totemknet_link_get_status(knet_node_id_t node, uint8_t link, struct knet_link_status *status)
int32_t icmap_qbtt_to_tt(int32_t track_type)
cs_error_t stats_map_set(const char *key_name, const void *value, size_t value_len, icmap_value_types_t type)
cs_error_t stats_map_adjust_int(const char *key_name, int32_t step)
const char * stats_map_iter_next(icmap_iter_t iter, size_t *value_len, icmap_value_types_t *type)
icmap_iter_t stats_map_iter_init(const char *prefix)
QB_LIST_DECLARE(stats_tracker_list_head)
cs_error_t cs_ipcs_get_conn_stats(int service_id, uint32_t pid, void *conn_ptr, struct ipcs_conn_stats *ipcs_stats)
cs_error_t stats_map_delete(const char *key_name)
void cs_ipcs_clear_stats()
struct cs_stats_conv cs_ipcs_global_stats[]
struct icmap_track * icmap_track_t
Track type.
cs_error_t stats_map_get(const char *key_name, void *value, size_t *value_len, icmap_value_types_t *type)
void stats_map_iter_finalize(icmap_iter_t iter)
void stats_ipcs_del_connection(int service_id, uint32_t pid, void *ptr)
void stats_knet_add_handle(void)
icmap_notify_fn_t notify_fn
struct cmap_map stats_map
#define NUM_KNET_HANDLE_STATS
void stats_knet_del_member(knet_node_id_t nodeid, uint8_t link_no)
cs_error_t qb_to_cs_error(int result)
qb_to_cs_error
icmap_value_types_t
Possible types of value.
qb_map_iter_t * icmap_iter_t
Itterator type.
Structure passed as new_value and old_value in change callback.
#define TOTEMPG_STATS_CLEAR_TRANSPORT
#define ICMAP_TRACK_PREFIX
Whole prefix is tracked, instead of key only (so "totem." tracking means that "totem.nodeid", "totem.version", ...
int stats_map_is_key_ro(const char *key_name)