@cryptotaxi247 / netdata-1 / commits / 5364e24ea

feat(topology): add role field to presentation actor types (#22217)

The UI needs to know which actor types are first-class (always render at full fidelity) versus which are summarizable (can be hidden or clustered when the graph is dense). The set of actor types differs per topology source (network-viewer uses self/process/endpoint; SNMP uses device/router/.../endpoint; streaming uses parent/child/vnode/stale), so the frontend cannot string-match on actor_type to make that classification safely. Add a new string field "role" on each presentation.actor_types entry: - "actor" first-class, always rendered at full fidelity - "endpoint" summarizable at scale (hidden or grouped per actor) Absent role is treated as "actor" by the frontend, keeping older agents compatible. - network-viewer.plugin: self/process -> actor, endpoint -> endpoint - function-streaming: parent/child/vnode/stale -> actor Required by the UI topology performance optimization work, so the frontend can hide endpoints on dense graphs without hard-coding the list of summarizable actor types.

Costa Tsaousis committed Apr 16, 2026 at 23:01 UTC 5364e24ea34a825158dec0803d108d77988f0f4c
2 files changed +7
src/collectors/network-viewer.plugin/network-viewer.c
+3
@@ -1715,6 +1715,7 @@ static void topology_write_presentation(BUFFER *wb) {
1715 buffer_json_member_add_string(wb, "label", "This host");
1716 buffer_json_member_add_string(wb, "color_slot", "self");
1717 buffer_json_member_add_boolean(wb, "border", true);
1718 + buffer_json_member_add_string(wb, "role", "actor");
1719 buffer_json_member_add_boolean(wb, "size_by_links", true);
1720
1721 buffer_json_member_add_array(wb, "summary_fields");
@@ -1791,6 +1792,7 @@ static void topology_write_presentation(BUFFER *wb) {
1792 buffer_json_member_add_string(wb, "label", "Process");
1793 buffer_json_member_add_string(wb, "color_slot", "primary");
1794 buffer_json_member_add_boolean(wb, "border", true);
1795 + buffer_json_member_add_string(wb, "role", "actor");
1796 buffer_json_member_add_boolean(wb, "size_by_links", true);
1797 buffer_json_member_add_boolean(wb, "show_port_bullets", true);
1798
@@ -1925,6 +1927,7 @@ static void topology_write_presentation(BUFFER *wb) {
1927 buffer_json_member_add_string(wb, "label", "Endpoint");
1928 buffer_json_member_add_string(wb, "color_slot", "derived");
1929 buffer_json_member_add_boolean(wb, "border", true);
1930 + buffer_json_member_add_string(wb, "role", "endpoint");
1931
1932 buffer_json_member_add_array(wb, "summary_fields");
1933 {
src/web/api/functions/function-streaming.c
+4
@@ -566,6 +566,7 @@ int function_streaming_topology(BUFFER *wb, const char *function, BUFFER *payloa
566 buffer_json_member_add_string(wb, "color_slot", "primary");
567 buffer_json_member_add_double(wb, "opacity", 1.0);
568 buffer_json_member_add_boolean(wb, "border", true);
569 + buffer_json_member_add_string(wb, "role", "actor");
570 buffer_json_member_add_boolean(wb, "size_by_links", true);
571 buffer_json_member_add_boolean(wb, "show_port_bullets", true);
572 streaming_topology_parent_presentation(wb);
@@ -578,6 +579,7 @@ int function_streaming_topology(BUFFER *wb, const char *function, BUFFER *payloa
579 buffer_json_member_add_string(wb, "color_slot", "primary");
580 buffer_json_member_add_double(wb, "opacity", 1.0);
581 buffer_json_member_add_boolean(wb, "border", false);
582 + buffer_json_member_add_string(wb, "role", "actor");
583 buffer_json_member_add_boolean(wb, "size_by_links", false);
584 buffer_json_member_add_boolean(wb, "show_port_bullets", false);
585 streaming_topology_child_presentation(wb);
@@ -590,6 +592,7 @@ int function_streaming_topology(BUFFER *wb, const char *function, BUFFER *payloa
592 buffer_json_member_add_string(wb, "color_slot", "warning");
593 buffer_json_member_add_double(wb, "opacity", 1.0);
594 buffer_json_member_add_boolean(wb, "border", false);
595 + buffer_json_member_add_string(wb, "role", "actor");
596 buffer_json_member_add_boolean(wb, "size_by_links", false);
597 buffer_json_member_add_boolean(wb, "show_port_bullets", false);
598 streaming_topology_vnode_presentation(wb);
@@ -602,6 +605,7 @@ int function_streaming_topology(BUFFER *wb, const char *function, BUFFER *payloa
605 buffer_json_member_add_string(wb, "color_slot", "dim");
606 buffer_json_member_add_double(wb, "opacity", 0.5);
607 buffer_json_member_add_boolean(wb, "border", false);
608 + buffer_json_member_add_string(wb, "role", "actor");
609 buffer_json_member_add_boolean(wb, "size_by_links", false);
610 buffer_json_member_add_boolean(wb, "show_port_bullets", false);
611 streaming_topology_stale_presentation(wb);