update ebpf-socket function name and columns (#16727)
improve ebpf-socket function
Ilya Mashchenko committed
Jan 4, 2024 at 22:45 UTC
38731a94e9c607749cdfd97caea8e3dc7af0439f
2 files changed
+70
-100
collectors/ebpf.plugin/ebpf_functions.c
+69
-99
@@ -92,6 +92,10 @@ static inline void ebpf_socket_fill_fake_socket(netdata_socket_plus_t *fake_valu
92
fake_values->data.protocol = AF_UNSPEC;
93
}
94
95
+static NETDATA_DOUBLE bytes_to_mb(uint64_t bytes) {
96
+ return (NETDATA_DOUBLE)bytes / (1024 * 1024);
97
+}
98
+
99
/**
100
* Fill function buffer
101
*
@@ -112,10 +116,10 @@ static void ebpf_fill_function_buffer(BUFFER *wb, netdata_socket_plus_t *values,
116
buffer_json_add_array_item_uint64(wb, (uint64_t)values->pid);
117
118
// NAME
115
- buffer_json_add_array_item_string(wb, (name) ? name : "not identified");
119
+ buffer_json_add_array_item_string(wb, (name) ? name : "unknown");
120
121
// Origin
118
- buffer_json_add_array_item_string(wb, (values->data.external_origin) ? "incoming" : "outgoing");
122
+ buffer_json_add_array_item_string(wb, (values->data.external_origin) ? "in" : "out");
123
124
// Source IP
125
buffer_json_add_array_item_string(wb, values->socket_string.src_ip);
@@ -131,39 +135,19 @@ static void ebpf_fill_function_buffer(BUFFER *wb, netdata_socket_plus_t *values,
135
136
uint64_t connections;
137
if (values->data.protocol == IPPROTO_TCP) {
134
- // Protocol
138
buffer_json_add_array_item_string(wb, "TCP");
136
-
137
- // Bytes received
138
- buffer_json_add_array_item_uint64(wb, (uint64_t) values->data.tcp.tcp_bytes_received);
139
-
140
- // Bytes sent
141
- buffer_json_add_array_item_uint64(wb, (uint64_t) values->data.tcp.tcp_bytes_sent);
142
-
143
- // Connections
139
+ buffer_json_add_array_item_double(wb, bytes_to_mb(values->data.tcp.tcp_bytes_received));
140
+ buffer_json_add_array_item_double(wb, bytes_to_mb(values->data.tcp.tcp_bytes_sent));
141
connections = values->data.tcp.ipv4_connect + values->data.tcp.ipv6_connect;
142
} else if (values->data.protocol == IPPROTO_UDP) {
146
- // Protocol
143
buffer_json_add_array_item_string(wb, "UDP");
148
-
149
- // Bytes received
150
- buffer_json_add_array_item_uint64(wb, (uint64_t) values->data.udp.udp_bytes_received);
151
-
152
- // Bytes sent
153
- buffer_json_add_array_item_uint64(wb, (uint64_t) values->data.udp.udp_bytes_sent);
154
-
155
- // Connections
144
+ buffer_json_add_array_item_double(wb, bytes_to_mb(values->data.udp.udp_bytes_received));
145
+ buffer_json_add_array_item_double(wb, bytes_to_mb(values->data.udp.udp_bytes_sent));
146
connections = values->data.udp.call_udp_sent + values->data.udp.call_udp_received;
147
} else {
158
- // Protocol
148
buffer_json_add_array_item_string(wb, "UNSPEC");
160
-
161
- // Bytes received
162
- buffer_json_add_array_item_uint64(wb, 0);
163
-
164
- // Bytes sent
165
- buffer_json_add_array_item_uint64(wb, 0);
166
-
149
+ buffer_json_add_array_item_double(wb, 0);
150
+ buffer_json_add_array_item_double(wb, 0);
151
connections = 1;
152
}
153
@@ -475,26 +459,29 @@ for (int i = 1; i < PLUGINSD_MAX_WORDS; i++) {
459
RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_STICKY,
460
NULL);
461
478
- buffer_rrdf_table_add_field(wb, fields_id++, "PName", "Process Name", RRDF_FIELD_TYPE_STRING,
462
+ buffer_rrdf_table_add_field(wb, fields_id++, "Name", "Process Name", RRDF_FIELD_TYPE_STRING,
463
RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE, 0, NULL, NAN,
464
RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
465
RRDF_FIELD_FILTER_MULTISELECT,
482
- RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_STICKY, NULL);
466
+ RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_UNIQUE_KEY | RRDF_FIELD_OPTS_STICKY | RRDF_FIELD_OPTS_FULL_WIDTH,
467
+ NULL);
468
484
- buffer_rrdf_table_add_field(wb, fields_id++, "Origin", "The connection origin.", RRDF_FIELD_TYPE_STRING,
469
+ buffer_rrdf_table_add_field(wb, fields_id++, "Origin", "Connection Origin", RRDF_FIELD_TYPE_STRING,
470
RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE, 0, NULL, NAN,
471
RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
472
RRDF_FIELD_FILTER_MULTISELECT,
488
- RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_STICKY, NULL);
473
+ RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_UNIQUE_KEY | RRDF_FIELD_OPTS_STICKY,
474
+ NULL);
475
490
- buffer_rrdf_table_add_field(wb, fields_id++, "Request from", "Request from IP", RRDF_FIELD_TYPE_STRING,
476
+ buffer_rrdf_table_add_field(wb, fields_id++, "Src", "Source IP Address", RRDF_FIELD_TYPE_STRING,
477
RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE, 0, NULL, NAN,
478
RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
479
RRDF_FIELD_FILTER_MULTISELECT,
494
- RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_STICKY, NULL);
480
+ RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_UNIQUE_KEY | RRDF_FIELD_OPTS_STICKY,
481
+ NULL);
482
483
/*
497
- buffer_rrdf_table_add_field(wb, fields_id++, "SRC PORT", "Source Port", RRDF_FIELD_TYPE_INTEGER,
484
+ buffer_rrdf_table_add_field(wb, fields_id++, "SrcPort", "Source Port", RRDF_FIELD_TYPE_INTEGER,
485
RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NUMBER, 0, NULL, NAN,
486
RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
487
RRDF_FIELD_FILTER_MULTISELECT,
@@ -502,70 +489,74 @@ for (int i = 1; i < PLUGINSD_MAX_WORDS; i++) {
489
NULL);
490
*/
491
505
- buffer_rrdf_table_add_field(wb, fields_id++, "Destination IP", "Destination IP", RRDF_FIELD_TYPE_STRING,
492
+ buffer_rrdf_table_add_field(wb, fields_id++, "Dst", "Destination IP Address", RRDF_FIELD_TYPE_STRING,
493
RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE, 0, NULL, NAN,
494
RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
495
RRDF_FIELD_FILTER_MULTISELECT,
509
- RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_STICKY, NULL);
496
+ RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_UNIQUE_KEY | RRDF_FIELD_OPTS_STICKY,
497
+ NULL);
498
511
- buffer_rrdf_table_add_field(wb, fields_id++, "Destination Port", "Destination Port", RRDF_FIELD_TYPE_STRING,
499
+ buffer_rrdf_table_add_field(wb, fields_id++, "DstPort", "Destination Port", RRDF_FIELD_TYPE_STRING,
500
RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE, 0, NULL, NAN,
501
RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
502
RRDF_FIELD_FILTER_MULTISELECT,
515
- RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_STICKY, NULL);
503
+ RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_UNIQUE_KEY | RRDF_FIELD_OPTS_STICKY,
504
+ NULL);
505
517
- buffer_rrdf_table_add_field(wb, fields_id++, "Protocol", "Communication protocol", RRDF_FIELD_TYPE_STRING,
506
+ buffer_rrdf_table_add_field(wb, fields_id++, "Protocol", "Transport Layer Protocol", RRDF_FIELD_TYPE_STRING,
507
RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NONE, 0, NULL, NAN,
508
RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
509
RRDF_FIELD_FILTER_MULTISELECT,
521
- RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_STICKY, NULL);
510
+ RRDF_FIELD_OPTS_NONE | RRDF_FIELD_OPTS_UNIQUE_KEY | RRDF_FIELD_OPTS_STICKY,
511
+ NULL);
512
523
- buffer_rrdf_table_add_field(wb, fields_id++, "IncomingBandwidth", "Bytes received.", RRDF_FIELD_TYPE_INTEGER,
524
- RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NUMBER, 0, NULL, NAN,
525
- RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
526
- RRDF_FIELD_FILTER_MULTISELECT,
527
- RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_STICKY,
513
+ buffer_rrdf_table_add_field(wb, fields_id++, "Rcvd", "Traffic Received", RRDF_FIELD_TYPE_INTEGER,
514
+ RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NUMBER, 3, "MB", NAN,
515
+ RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
516
+ RRDF_FIELD_FILTER_NONE,
517
+ RRDF_FIELD_OPTS_VISIBLE,
518
NULL);
519
530
- buffer_rrdf_table_add_field(wb, fields_id++, "OutgoingBandwidth", "Bytes sent.", RRDF_FIELD_TYPE_INTEGER,
531
- RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NUMBER, 0, NULL, NAN,
532
- RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
533
- RRDF_FIELD_FILTER_MULTISELECT,
534
- RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_STICKY,
520
+ buffer_rrdf_table_add_field(wb, fields_id++, "Sent", "Traffic Sent", RRDF_FIELD_TYPE_INTEGER,
521
+ RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NUMBER, 3, "MB", NAN,
522
+ RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
523
+ RRDF_FIELD_FILTER_NONE,
524
+ RRDF_FIELD_OPTS_VISIBLE,
525
NULL);
526
537
- buffer_rrdf_table_add_field(wb, fields_id, "Connections", "Number of calls to tcp_vX_connections and udp_sendmsg, where X is the protocol version.", RRDF_FIELD_TYPE_INTEGER,
538
- RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NUMBER, 0, NULL, NAN,
539
- RRDF_FIELD_SORT_ASCENDING, NULL, RRDF_FIELD_SUMMARY_COUNT,
540
- RRDF_FIELD_FILTER_MULTISELECT,
541
- RRDF_FIELD_OPTS_VISIBLE | RRDF_FIELD_OPTS_STICKY,
527
+ buffer_rrdf_table_add_field(wb, fields_id, "Conns", "Connections", RRDF_FIELD_TYPE_INTEGER,
528
+ RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NUMBER, 0, "connections", NAN,
529
+ RRDF_FIELD_SORT_DESCENDING, NULL, RRDF_FIELD_SUMMARY_SUM,
530
+ RRDF_FIELD_FILTER_NONE,
531
+ RRDF_FIELD_OPTS_VISIBLE,
532
NULL);
533
}
534
buffer_json_object_close(wb); // columns
535
546
- buffer_json_member_add_string(wb, "default_sort_column", "IncomingBandwidth");
536
+ buffer_json_member_add_string(wb, "default_sort_column", "Rcvd");
537
538
buffer_json_member_add_object(wb, "charts");
539
{
550
- buffer_json_member_add_object(wb, "IncomingConnections");
540
+ buffer_json_member_add_object(wb, "Traffic");
541
{
552
- buffer_json_member_add_string(wb, "name", "TCP Inbound Connection");
542
+ buffer_json_member_add_string(wb, "name", "Traffic");
543
buffer_json_member_add_string(wb, "type", "stacked-bar");
544
buffer_json_member_add_array(wb, "columns");
545
{
556
- buffer_json_add_array_item_string(wb, "IncomingBandwidth");
546
+ buffer_json_add_array_item_string(wb, "Rcvd");
547
+ buffer_json_add_array_item_string(wb, "Sent");
548
}
549
buffer_json_array_close(wb);
550
}
551
buffer_json_object_close(wb);
552
562
- buffer_json_member_add_object(wb, "OutgoingConnections");
553
+ buffer_json_member_add_object(wb, "Connections");
554
{
564
- buffer_json_member_add_string(wb, "name", "TCP Outgoing Connection");
555
+ buffer_json_member_add_string(wb, "name", "Connections");
556
buffer_json_member_add_string(wb, "type", "stacked-bar");
557
buffer_json_member_add_array(wb, "columns");
558
{
568
- buffer_json_add_array_item_string(wb, "OutgoingBandwidth");
559
+ buffer_json_add_array_item_string(wb, "Conns");
560
}
561
buffer_json_array_close(wb);
562
}
@@ -576,45 +567,30 @@ for (int i = 1; i < PLUGINSD_MAX_WORDS; i++) {
567
buffer_json_member_add_array(wb, "default_charts");
568
{
569
buffer_json_add_array_item_array(wb);
579
- buffer_json_add_array_item_string(wb, "IncomingConnections");
580
- buffer_json_add_array_item_string(wb, "PName");
570
+ buffer_json_add_array_item_string(wb, "Traffic");
571
+ buffer_json_add_array_item_string(wb, "Name");
572
buffer_json_array_close(wb);
573
574
buffer_json_add_array_item_array(wb);
584
- buffer_json_add_array_item_string(wb, "OutgoingConnections");
585
- buffer_json_add_array_item_string(wb, "PName");
575
+ buffer_json_add_array_item_string(wb, "Connections");
576
+ buffer_json_add_array_item_string(wb, "Name");
577
buffer_json_array_close(wb);
578
}
579
buffer_json_array_close(wb);
580
590
- // Do we use only on fields that can be groupped?
581
buffer_json_member_add_object(wb, "group_by");
582
{
593
- // group by PID
594
- buffer_json_member_add_object(wb, "PID");
595
- {
596
- buffer_json_member_add_string(wb, "name", "Process ID");
597
- buffer_json_member_add_array(wb, "columns");
598
- {
599
- buffer_json_add_array_item_string(wb, "PID");
600
- }
601
- buffer_json_array_close(wb);
602
- }
603
- buffer_json_object_close(wb);
604
-
605
- // group by Process Name
606
- buffer_json_member_add_object(wb, "PName");
583
+ buffer_json_member_add_object(wb, "Name");
584
{
585
buffer_json_member_add_string(wb, "name", "Process Name");
586
buffer_json_member_add_array(wb, "columns");
587
{
611
- buffer_json_add_array_item_string(wb, "PName");
588
+ buffer_json_add_array_item_string(wb, "Name");
589
}
590
buffer_json_array_close(wb);
591
}
592
buffer_json_object_close(wb);
593
617
- // group by Process Name
594
buffer_json_member_add_object(wb, "Origin");
595
{
596
buffer_json_member_add_string(wb, "name", "Origin");
@@ -626,43 +602,39 @@ for (int i = 1; i < PLUGINSD_MAX_WORDS; i++) {
602
}
603
buffer_json_object_close(wb);
604
629
- // group by Request From IP
630
- buffer_json_member_add_object(wb, "Request from");
605
+ buffer_json_member_add_object(wb, "Src");
606
{
632
- buffer_json_member_add_string(wb, "name", "Request from IP");
607
+ buffer_json_member_add_string(wb, "name", "Source IP");
608
buffer_json_member_add_array(wb, "columns");
609
{
635
- buffer_json_add_array_item_string(wb, "Request from");
610
+ buffer_json_add_array_item_string(wb, "Src");
611
}
612
buffer_json_array_close(wb);
613
}
614
buffer_json_object_close(wb);
615
641
- // group by Destination IP
642
- buffer_json_member_add_object(wb, "Destination IP");
616
+ buffer_json_member_add_object(wb, "Dst");
617
{
618
buffer_json_member_add_string(wb, "name", "Destination IP");
619
buffer_json_member_add_array(wb, "columns");
620
{
647
- buffer_json_add_array_item_string(wb, "Destination IP");
621
+ buffer_json_add_array_item_string(wb, "Dst");
622
}
623
buffer_json_array_close(wb);
624
}
625
buffer_json_object_close(wb);
626
653
- // group by DST Port
654
- buffer_json_member_add_object(wb, "Destination Port");
627
+ buffer_json_member_add_object(wb, "DstPort");
628
{
629
buffer_json_member_add_string(wb, "name", "Destination Port");
630
buffer_json_member_add_array(wb, "columns");
631
{
659
- buffer_json_add_array_item_string(wb, "Destination Port");
632
+ buffer_json_add_array_item_string(wb, "DstPort");
633
}
634
buffer_json_array_close(wb);
635
}
636
buffer_json_object_close(wb);
637
665
- // group by Protocol
638
buffer_json_member_add_object(wb, "Protocol");
639
{
640
buffer_json_member_add_string(wb, "name", "Protocol");
@@ -711,10 +683,8 @@ void *ebpf_function_thread(void *ptr)
683
&lock,
684
&ebpf_plugin_exit);
685
714
- functions_evloop_add_function(wg,
715
- "ebpf_socket",
716
- ebpf_function_socket_manipulation,
717
- PLUGINS_FUNCTIONS_TIMEOUT_DEFAULT);
686
+ functions_evloop_add_function(
687
+ wg, EBPF_FUNCTION_SOCKET, ebpf_function_socket_manipulation, PLUGINS_FUNCTIONS_TIMEOUT_DEFAULT);
688
689
pthread_mutex_lock(&lock);
690
int i;
collectors/ebpf.plugin/ebpf_functions.h
+1
-1
@@ -14,7 +14,7 @@ static inline void EBPF_PLUGIN_FUNCTIONS(const char *NAME, const char *DESC, int
14
#define NETDATA_EBPF_FUNCTIONS_MODULE_DESC "Show information about current function status."
15
16
// function list
17
-#define EBPF_FUNCTION_SOCKET "ebpf_socket"
17
+#define EBPF_FUNCTION_SOCKET "network-connections"
18
19
// socket constants
20
#define EBPF_PLUGIN_SOCKET_FUNCTION_DESCRIPTION "Detailed information about open sockets."