| 1 | { |
| 2 | "status": 200, |
| 3 | "type": "topology", |
| 4 | "has_history": false, |
| 5 | "update_every": 10, |
| 6 | "data": { |
| 7 | "schema_version": "netdata.topology.v1", |
| 8 | "producer": { |
| 9 | "source": "snmp-l2", |
| 10 | "instance": "sample-fabric", |
| 11 | "node_id": "poller-node", |
| 12 | "machine_guid": "poller-machine", |
| 13 | "agent_version": "test", |
| 14 | "plugin": "go.d.plugin", |
| 15 | "capabilities": ["topology-v1"] |
| 16 | }, |
| 17 | "collected_at": "2026-05-09T00:00:00Z", |
| 18 | "view": { |
| 19 | "id": "l2-fabric", |
| 20 | "scope": "snmp_device", |
| 21 | "mode": "detailed", |
| 22 | "group_by": ["snmp_device"] |
| 23 | }, |
| 24 | "dictionaries": { |
| 25 | "strings": [ |
| 26 | "snmp_device", |
| 27 | "snmp_interface", |
| 28 | "switch-a", |
| 29 | "switch-b", |
| 30 | "if-a-1", |
| 31 | "if-b-1", |
| 32 | "l2_adjacency", |
| 33 | "lldp", |
| 34 | "observed_bidirectional", |
| 35 | "up", |
| 36 | "if_inventory", |
| 37 | "if_traffic" |
| 38 | ] |
| 39 | }, |
| 40 | "types": { |
| 41 | "actor_types": { |
| 42 | "snmp_device": { |
| 43 | "layer": "network", |
| 44 | "identity": ["device_id"], |
| 45 | "merge_identity": ["device_id"], |
| 46 | "aggregation_scopes": ["snmp_device"] |
| 47 | }, |
| 48 | "snmp_interface": { |
| 49 | "layer": "network", |
| 50 | "identity": ["device_id", "if_index"], |
| 51 | "merge_identity": ["device_id", "if_index"], |
| 52 | "parent_identity": ["device_id"], |
| 53 | "aggregation_scopes": ["snmp_interface"] |
| 54 | } |
| 55 | }, |
| 56 | "link_types": { |
| 57 | "l2_adjacency": { |
| 58 | "orientation": "observed_bidirectional", |
| 59 | "direction_role": "observation", |
| 60 | "aggregation": { |
| 61 | "direction": "canonicalize_unordered", |
| 62 | "evidence": "append" |
| 63 | }, |
| 64 | "evidence_types": ["snmp_l2_observation"], |
| 65 | "overlay_templates": ["if_traffic"] |
| 66 | } |
| 67 | }, |
| 68 | "evidence_types": { |
| 69 | "snmp_l2_observation": { |
| 70 | "link_type": "l2_adjacency", |
| 71 | "role": "observation_evidence", |
| 72 | "match_columns": ["local_if", "remote_if", "protocol"], |
| 73 | "columns": [ |
| 74 | {"id": "link", "type": "link_ref", "role": "reference"}, |
| 75 | {"id": "local_if", "type": "actor_ref", "role": "reference"}, |
| 76 | {"id": "remote_if", "type": "actor_ref", "role": "reference"}, |
| 77 | {"id": "protocol", "type": "string_ref", "dictionary": "strings", "role": "group_key"}, |
| 78 | {"id": "observation", "type": "string_ref", "dictionary": "strings"} |
| 79 | ] |
| 80 | } |
| 81 | }, |
| 82 | "table_types": { |
| 83 | "if_inventory": { |
| 84 | "role": "actor_inventory", |
| 85 | "owner": "actor", |
| 86 | "aggregation": "set", |
| 87 | "columns": [ |
| 88 | {"id": "actor", "type": "actor_ref", "role": "reference"}, |
| 89 | {"id": "if_name", "type": "string_ref", "dictionary": "strings"}, |
| 90 | {"id": "if_index", "type": "uint"}, |
| 91 | {"id": "oper_status", "type": "string_ref", "dictionary": "strings"}, |
| 92 | {"id": "speed_bps", "type": "uint", "unit": "bit/s", "aggregation": "max"} |
| 93 | ] |
| 94 | } |
| 95 | }, |
| 96 | "overlay_templates": { |
| 97 | "if_traffic": { |
| 98 | "provider": "netdata.metrics", |
| 99 | "contexts": ["net.net"], |
| 100 | "dimensions": ["received", "sent"], |
| 101 | "selector_params": ["node_id", "if_name"], |
| 102 | "merge": { |
| 103 | "refs": "set", |
| 104 | "values": "sum" |
| 105 | } |
| 106 | } |
| 107 | }, |
| 108 | "aggregation_scopes": { |
| 109 | "snmp_device": {"columns": ["device_id"], "evidence_policy": "preserve"}, |
| 110 | "snmp_interface": {"columns": ["device_id", "if_index"], "evidence_policy": "preserve"} |
| 111 | } |
| 112 | }, |
| 113 | "actors": { |
| 114 | "rows": 4, |
| 115 | "columns": [ |
| 116 | {"id": "type", "type": "string_ref", "dictionary": "strings"}, |
| 117 | {"id": "device_id", "type": "string_ref", "dictionary": "strings", "role": "identity"}, |
| 118 | {"id": "if_index", "type": "uint", "nullable": true, "role": "identity"}, |
| 119 | {"id": "if_name", "type": "string_ref", "dictionary": "strings", "nullable": true} |
| 120 | ], |
| 121 | "values": [ |
| 122 | {"codec": "dict", "values": [0, 1], "indexes": [0, 0, 1, 1]}, |
| 123 | {"codec": "values", "values": [2, 3, 2, 3]}, |
| 124 | {"codec": "values", "values": [null, null, 1, 1]}, |
| 125 | {"codec": "values", "values": [null, null, 4, 5]} |
| 126 | ] |
| 127 | }, |
| 128 | "links": { |
| 129 | "rows": 1, |
| 130 | "columns": [ |
| 131 | {"id": "src_actor", "type": "actor_ref", "role": "reference"}, |
| 132 | {"id": "dst_actor", "type": "actor_ref", "role": "reference"}, |
| 133 | {"id": "type", "type": "string_ref", "dictionary": "strings"}, |
| 134 | {"id": "evidence_count", "type": "uint", "role": "metric", "aggregation": "sum"} |
| 135 | ], |
| 136 | "values": [ |
| 137 | {"codec": "const", "value": 0}, |
| 138 | {"codec": "const", "value": 1}, |
| 139 | {"codec": "const", "value": 6}, |
| 140 | {"codec": "const", "value": 1} |
| 141 | ] |
| 142 | }, |
| 143 | "evidence": { |
| 144 | "snmp_l2_observation": { |
| 145 | "type": "snmp_l2_observation", |
| 146 | "table": { |
| 147 | "rows": 1, |
| 148 | "columns": [ |
| 149 | {"id": "link", "type": "link_ref", "role": "reference"}, |
| 150 | {"id": "local_if", "type": "actor_ref", "role": "reference"}, |
| 151 | {"id": "remote_if", "type": "actor_ref", "role": "reference"}, |
| 152 | {"id": "protocol", "type": "string_ref", "dictionary": "strings", "role": "group_key"}, |
| 153 | {"id": "observation", "type": "string_ref", "dictionary": "strings"} |
| 154 | ], |
| 155 | "values": [ |
| 156 | {"codec": "const", "value": 0}, |
| 157 | {"codec": "const", "value": 2}, |
| 158 | {"codec": "const", "value": 3}, |
| 159 | {"codec": "const", "value": 7}, |
| 160 | {"codec": "const", "value": 8} |
| 161 | ] |
| 162 | } |
| 163 | } |
| 164 | }, |
| 165 | "tables": { |
| 166 | "actor": { |
| 167 | "if_inventory": { |
| 168 | "type": "if_inventory", |
| 169 | "table": { |
| 170 | "rows": 2, |
| 171 | "columns": [ |
| 172 | {"id": "actor", "type": "actor_ref", "role": "reference"}, |
| 173 | {"id": "if_name", "type": "string_ref", "dictionary": "strings"}, |
| 174 | {"id": "if_index", "type": "uint"}, |
| 175 | {"id": "oper_status", "type": "string_ref", "dictionary": "strings"}, |
| 176 | {"id": "speed_bps", "type": "uint", "unit": "bit/s", "aggregation": "max"} |
| 177 | ], |
| 178 | "values": [ |
| 179 | {"codec": "values", "values": [2, 3]}, |
| 180 | {"codec": "values", "values": [4, 5]}, |
| 181 | {"codec": "const", "value": 1}, |
| 182 | {"codec": "const", "value": 9}, |
| 183 | {"codec": "const", "value": 1000000000} |
| 184 | ] |
| 185 | } |
| 186 | } |
| 187 | } |
| 188 | }, |
| 189 | "overlays": { |
| 190 | "refs": { |
| 191 | "rows": 2, |
| 192 | "columns": [ |
| 193 | {"id": "template", "type": "string_ref", "dictionary": "strings"}, |
| 194 | {"id": "link", "type": "link_ref", "role": "reference"}, |
| 195 | {"id": "node_id", "type": "string_ref", "dictionary": "strings"}, |
| 196 | {"id": "if_name", "type": "string_ref", "dictionary": "strings"} |
| 197 | ], |
| 198 | "values": [ |
| 199 | {"codec": "const", "value": 11}, |
| 200 | {"codec": "const", "value": 0}, |
| 201 | {"codec": "values", "values": [2, 3]}, |
| 202 | {"codec": "values", "values": [4, 5]} |
| 203 | ] |
| 204 | } |
| 205 | }, |
| 206 | "stats": { |
| 207 | "actors": 4, |
| 208 | "links": 1, |
| 209 | "evidence_rows": 1, |
| 210 | "overlay_refs": 2 |
| 211 | } |
| 212 | } |
| 213 | } |