Guard VNI tooltip join against transient duplicate series
Wrap the group_left RHS in max by (device, vlan) so a Prometheus restart or relabel change (old/new label-set series briefly coexisting in the staleness window) can't trip PromQL's many-to-many matching error. Closes #50
This commit is contained in:
@@ -100,7 +100,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"refId": "D",
|
"refId": "D",
|
||||||
"expr": "count by (device, vlan) (network_instances_network_instance_fdb_mac_table_entries_entry_vlan{device=~\"campus-leaf1|campus-leaf2|campus-leaf3|campus-leaf4|dc-leaf1|dc-leaf2|dc-leaf5|dc-leaf6\"})\n* on(device, vlan) group_left(vlan_to_vni_state_vni)\ninterfaces_interface_arista_vxlan_vlan_to_vnis_vlan_to_vni_state_vni{device=~\"campus-leaf1|campus-leaf2|campus-leaf3|campus-leaf4|dc-leaf1|dc-leaf2|dc-leaf5|dc-leaf6\"}",
|
"expr": "count by (device, vlan) (network_instances_network_instance_fdb_mac_table_entries_entry_vlan{device=~\"campus-leaf1|campus-leaf2|campus-leaf3|campus-leaf4|dc-leaf1|dc-leaf2|dc-leaf5|dc-leaf6\"})\n* on(device, vlan) group_left(vlan_to_vni_state_vni)\nmax by (device, vlan) (interfaces_interface_arista_vxlan_vlan_to_vnis_vlan_to_vni_state_vni{device=~\"campus-leaf1|campus-leaf2|campus-leaf3|campus-leaf4|dc-leaf1|dc-leaf2|dc-leaf5|dc-leaf6\"})",
|
||||||
"legendFormat": "VNI {{device}} {{vlan}}",
|
"legendFormat": "VNI {{device}} {{vlan}}",
|
||||||
"datasource": {
|
"datasource": {
|
||||||
"type": "prometheus",
|
"type": "prometheus",
|
||||||
|
|||||||
@@ -352,12 +352,18 @@ def build_weathermap(devices, links, interface_speeds, positions, prometheus_url
|
|||||||
if vtep_hosts:
|
if vtep_hosts:
|
||||||
vtep_regex = "|".join(promql_escape(h) for h in vtep_hosts)
|
vtep_regex = "|".join(promql_escape(h) for h in vtep_hosts)
|
||||||
# Verbatim join from #44 "VXLAN (MAC count per VNI)", scoped to VTEP nodes.
|
# Verbatim join from #44 "VXLAN (MAC count per VNI)", scoped to VTEP nodes.
|
||||||
|
# RHS is wrapped in max by (device, vlan) so the join key is always
|
||||||
|
# unique -- a Prometheus restart or relabel change otherwise leaves
|
||||||
|
# the pre-restart (frozen) and post-restart series briefly coexisting
|
||||||
|
# within the 5m staleness window, both matching the same (device,
|
||||||
|
# vlan) group, which trips PromQL's "many-to-many matching not
|
||||||
|
# allowed" error. See #50.
|
||||||
targets.append({
|
targets.append({
|
||||||
"refId": "D",
|
"refId": "D",
|
||||||
"expr": (
|
"expr": (
|
||||||
f'count by (device, vlan) (network_instances_network_instance_fdb_mac_table_entries_entry_vlan{{device=~"{vtep_regex}"}})\n'
|
f'count by (device, vlan) (network_instances_network_instance_fdb_mac_table_entries_entry_vlan{{device=~"{vtep_regex}"}})\n'
|
||||||
f'* on(device, vlan) group_left(vlan_to_vni_state_vni)\n'
|
f'* on(device, vlan) group_left(vlan_to_vni_state_vni)\n'
|
||||||
f'interfaces_interface_arista_vxlan_vlan_to_vnis_vlan_to_vni_state_vni{{device=~"{vtep_regex}"}}'
|
f'max by (device, vlan) (interfaces_interface_arista_vxlan_vlan_to_vnis_vlan_to_vni_state_vni{{device=~"{vtep_regex}"}})'
|
||||||
),
|
),
|
||||||
"legendFormat": "VNI {{device}} {{vlan}}",
|
"legendFormat": "VNI {{device}} {{vlan}}",
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user