Skip to content

Commit 3ede767

Browse files
authored
Merge pull request #89 from opsmill/bkr-prometheus-adapter
Add Prometheus Adapter
2 parents ec44d06 + b044d65 commit 3ede767

File tree

10 files changed

+1155
-1
lines changed

10 files changed

+1155
-1
lines changed
Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
---
2+
name: from-node-exporter
3+
source:
4+
name: prometheus
5+
settings:
6+
mode: scrape
7+
url: "http://localhost:9100"
8+
endpoint: "/metrics"
9+
10+
destination:
11+
name: infrahub
12+
settings:
13+
url: "http://localhost:8000"
14+
15+
order:
16+
- "VirtualizationVirtualMachine"
17+
- "VirtualizationVMNetworkInterface"
18+
- "VirtualizationVMFilesystem"
19+
- "VirtualizationVMDisk"
20+
21+
schema_mapping:
22+
23+
###########################################################################
24+
# VIRTUAL MACHINE (root object)
25+
###########################################################################
26+
- name: VirtualizationVirtualMachine
27+
mapping: node_uname_info
28+
identifiers: ["name"]
29+
fields:
30+
- name: name
31+
mapping: labels.nodename
32+
33+
- name: os_name
34+
mapping: labels.sysname
35+
36+
- name: os_kernel
37+
mapping: labels.release
38+
39+
- name: architecture
40+
mapping: labels.machine
41+
42+
- name: mem_total_bytes
43+
mapping: mem_total_t
44+
45+
- name: ip_forwarding_enabled
46+
mapping: ip_forward_b
47+
48+
- name: conntrack_limit
49+
mapping: conntrack_limit_t
50+
51+
# optional: mark as active since the node_exporter is reachable
52+
- name: status
53+
mapping: status_t
54+
55+
transforms:
56+
# total memory in bytes
57+
- field: mem_total_t
58+
expression: "{{ lookup('node_memory_MemTotal_bytes', {}, 'value') or 0 }}"
59+
60+
# ip forwarding: 1 => enabled, 2 => disabled (treat >0 as enabled)
61+
- field: ip_forward_b
62+
expression: "{{ 1 if ((lookup('node_netstat_Ip_Forwarding', {}, 'value') or 0) | float) == 1 else 0 }}"
63+
64+
# conntrack limit
65+
- field: conntrack_limit_t
66+
expression: "{{ lookup('node_nf_conntrack_entries_limit', {}, 'value') or 0 }}"
67+
68+
# exporter up => VM 'active' (otherwise 'unknown')
69+
- field: status_t
70+
expression: "{{ 'active' if ((lookup('node_time_seconds', {}, 'value') | float ) > 0) else 'unknown' }}"
71+
72+
###########################################################################
73+
# VM NETWORK INTERFACE
74+
###########################################################################
75+
- name: VirtualizationVMNetworkInterface
76+
mapping: node_network_mtu_bytes
77+
identifiers: ["virtual_machine", "name"]
78+
fields:
79+
# parent link (join on VM name from uname)
80+
- name: virtual_machine
81+
mapping: vm_name
82+
83+
- name: name
84+
mapping: labels.device
85+
86+
- name: mac_address
87+
mapping: mac_clean
88+
89+
- name: mtu
90+
mapping: value
91+
92+
- name: speed_bps
93+
mapping: speed_clean
94+
95+
- name: operational_status
96+
mapping: op_status
97+
98+
- name: carrier
99+
mapping: carrier_b
100+
101+
- name: duplex
102+
mapping: duplex_val
103+
104+
transforms:
105+
# VM name (no instance in scrape mode)
106+
- field: vm_name
107+
expression: "{{ lookup('node_uname_info', {}, 'labels.nodename') or 'unknown' }}"
108+
109+
# MAC address from node_network_info; normalize & blank bogus all-zeroes
110+
- field: mac_raw
111+
expression: "{{ lookup('node_network_info', {'device': labels.device}, 'labels.address') or '' }}"
112+
- field: mac_norm
113+
expression: "{{ (mac_raw | lower) if mac_raw else '' }}"
114+
- field: mac_clean
115+
expression: "{{ '' if mac_norm == '00:00:00:00:00:00' else mac_norm }}"
116+
117+
# speed in bytes/sec, some exporters expose negative when unknown -> coerce to 0
118+
- field: speed_raw
119+
expression: "{{ lookup('node_network_speed_bytes', {'device': labels.device}, 'value') or 0 }}"
120+
- field: speed_clean
121+
expression: "{{ 0 if (speed_raw | float) < 0 else (speed_raw | float) }}"
122+
123+
# operstatus from node_network_up
124+
- field: op_status
125+
expression: "{{ 'up' if ((lookup('node_network_up', {'device': labels.device}, 'value') or 0) | float) > 0 else 'down' }}"
126+
127+
# carrier boolean
128+
- field: carrier_b
129+
expression: "{{ 1 if ((lookup('node_network_carrier', {'device': labels.device}, 'value') or 0) | float) > 0 else 0 }}"
130+
131+
# duplex from node_network_info (full/half/unknown)
132+
- field: duplex_raw
133+
expression: "{{ (lookup('node_network_info', {'device': labels.device}, 'labels.duplex') or '') | lower }}"
134+
- field: duplex_val
135+
expression: "{{ duplex_raw if duplex_raw in ['full','half'] else 'unknown' }}"
136+
137+
###########################################################################
138+
# VM FILESYSTEM / MOUNT
139+
###########################################################################
140+
- name: VirtualizationVMFilesystem
141+
mapping: node_filesystem_size_bytes
142+
identifiers: ["virtual_machine", "mountpoint"]
143+
fields:
144+
- name: virtual_machine
145+
mapping: vm_name
146+
147+
- name: mountpoint
148+
mapping: labels.mountpoint
149+
150+
- name: device
151+
mapping: labels.device
152+
153+
- name: fstype
154+
mapping: labels.fstype
155+
156+
- name: size_bytes
157+
mapping: value
158+
159+
- name: readonly
160+
mapping: ro_b
161+
162+
- name: device_error
163+
mapping: deverr_b
164+
165+
transforms:
166+
- field: vm_name
167+
expression: "{{ lookup('node_uname_info', {}, 'labels.nodename') or 'unknown' }}"
168+
169+
# readonly flag (1 => true)
170+
- field: ro_val
171+
expression: "{{ lookup('node_filesystem_readonly', {'device': labels.device, 'mountpoint': labels.mountpoint}, 'value') or 0 }}"
172+
- field: ro_b
173+
expression: "{{ 1 if (ro_val | float) > 0 else 0 }}"
174+
175+
# device error flag (1 => true)
176+
- field: deverr_val
177+
expression: "{{ lookup('node_filesystem_device_error', {'device': labels.device, 'mountpoint': labels.mountpoint}, 'value') or 0 }}"
178+
- field: deverr_b
179+
expression: "{{ 1 if (deverr_val | float) > 0 else 0 }}"
180+
181+
###########################################################################
182+
# VM DISK / BLOCK DEVICE
183+
###########################################################################
184+
- name: VirtualizationVMDisk
185+
mapping: node_disk_info
186+
identifiers: ["virtual_machine", "device"]
187+
fields:
188+
- name: virtual_machine
189+
mapping: vm_name
190+
191+
- name: device
192+
mapping: labels.device
193+
194+
- name: rotational
195+
mapping: rotational_b
196+
197+
transforms:
198+
- field: vm_name
199+
expression: "{{ lookup('node_uname_info', {}, 'labels.nodename') or 'unknown' }}"
200+
201+
# rotational is a LABEL on node_disk_info (string "0"/"1")
202+
- field: rotational_lbl
203+
expression: "{{ lookup('node_disk_info', {'device': labels.device}, 'labels.rotational') or '0' }}"
204+
- field: rotational_b
205+
expression: "{{ 1 if rotational_lbl == '1' else 0 }}"

examples/prometheus_to_infrahub (node_exporter)/infrahub/__init__.py

Whitespace-only changes.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from infrahub_sync.adapters.infrahub import InfrahubAdapter
2+
3+
from .sync_models import (
4+
VirtualizationVMDisk,
5+
VirtualizationVMFilesystem,
6+
VirtualizationVMNetworkInterface,
7+
VirtualizationVirtualMachine,
8+
)
9+
10+
11+
# -------------------------------------------------------
12+
# AUTO-GENERATED FILE, DO NOT MODIFY
13+
# This file has been generated with the command `infrahub-sync generate`
14+
# All modifications will be lost the next time you reexecute this command
15+
# -------------------------------------------------------
16+
class InfrahubSync(InfrahubAdapter):
17+
VirtualizationVMDisk = VirtualizationVMDisk
18+
VirtualizationVMFilesystem = VirtualizationVMFilesystem
19+
VirtualizationVMNetworkInterface = VirtualizationVMNetworkInterface
20+
VirtualizationVirtualMachine = VirtualizationVirtualMachine
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
from __future__ import annotations
2+
3+
from typing import Any, List
4+
5+
from infrahub_sync.adapters.infrahub import InfrahubModel
6+
7+
# -------------------------------------------------------
8+
# AUTO-GENERATED FILE, DO NOT MODIFY
9+
# This file has been generated with the command `infrahub-sync generate`
10+
# All modifications will be lost the next time you reexecute this command
11+
# -------------------------------------------------------
12+
class VirtualizationVMDisk(InfrahubModel):
13+
_modelname = "VirtualizationVMDisk"
14+
_identifiers = ("virtual_machine", "device")
15+
_attributes = ("rotational",)
16+
device: str
17+
rotational: bool | None = None
18+
virtual_machine: str
19+
20+
local_id: str | None = None
21+
local_data: Any | None = None
22+
23+
class VirtualizationVMFilesystem(InfrahubModel):
24+
_modelname = "VirtualizationVMFilesystem"
25+
_identifiers = ("virtual_machine", "mountpoint")
26+
_attributes = ("readonly", "fstype", "size_bytes", "device_error", "device")
27+
readonly: bool | None = None
28+
fstype: str | None = None
29+
size_bytes: int | None = None
30+
device_error: bool | None = None
31+
device: str | None = None
32+
mountpoint: str
33+
virtual_machine: str
34+
35+
local_id: str | None = None
36+
local_data: Any | None = None
37+
38+
class VirtualizationVMNetworkInterface(InfrahubModel):
39+
_modelname = "VirtualizationVMNetworkInterface"
40+
_identifiers = ("virtual_machine", "name")
41+
_attributes = ("mtu", "mac_address", "carrier", "operational_status", "speed_bps", "duplex")
42+
mtu: int | None = None
43+
mac_address: str | None = None
44+
carrier: bool | None = None
45+
operational_status: str | None = None
46+
speed_bps: int | None = None
47+
duplex: str | None = None
48+
name: str
49+
virtual_machine: str
50+
51+
local_id: str | None = None
52+
local_data: Any | None = None
53+
54+
class VirtualizationVirtualMachine(InfrahubModel):
55+
_modelname = "VirtualizationVirtualMachine"
56+
_identifiers = ("name",)
57+
_attributes = ("os_name", "ip_forwarding_enabled", "os_kernel", "status", "architecture", "conntrack_limit", "mem_total_bytes")
58+
os_name: str | None = None
59+
ip_forwarding_enabled: bool | None = None
60+
os_kernel: str | None = None
61+
status: str | None = None
62+
architecture: str | None = None
63+
conntrack_limit: int | None = None
64+
name: str
65+
mem_total_bytes: int | None = None
66+
67+
local_id: str | None = None
68+
local_data: Any | None = None

examples/prometheus_to_infrahub (node_exporter)/prometheus/__init__.py

Whitespace-only changes.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from infrahub_sync.adapters.prometheus import PrometheusAdapter
2+
3+
from .sync_models import (
4+
VirtualizationVMDisk,
5+
VirtualizationVMFilesystem,
6+
VirtualizationVMNetworkInterface,
7+
VirtualizationVirtualMachine,
8+
)
9+
10+
11+
# -------------------------------------------------------
12+
# AUTO-GENERATED FILE, DO NOT MODIFY
13+
# This file has been generated with the command `infrahub-sync generate`
14+
# All modifications will be lost the next time you reexecute this command
15+
# -------------------------------------------------------
16+
class PrometheusSync(PrometheusAdapter):
17+
VirtualizationVMDisk = VirtualizationVMDisk
18+
VirtualizationVMFilesystem = VirtualizationVMFilesystem
19+
VirtualizationVMNetworkInterface = VirtualizationVMNetworkInterface
20+
VirtualizationVirtualMachine = VirtualizationVirtualMachine
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
from __future__ import annotations
2+
3+
from typing import Any, List
4+
5+
from infrahub_sync.adapters.prometheus import PrometheusModel
6+
7+
# -------------------------------------------------------
8+
# AUTO-GENERATED FILE, DO NOT MODIFY
9+
# This file has been generated with the command `infrahub-sync generate`
10+
# All modifications will be lost the next time you reexecute this command
11+
# -------------------------------------------------------
12+
class VirtualizationVMDisk(PrometheusModel):
13+
_modelname = "VirtualizationVMDisk"
14+
_identifiers = ("virtual_machine", "device")
15+
_attributes = ("rotational",)
16+
device: str
17+
rotational: bool | None = None
18+
virtual_machine: str
19+
20+
local_id: str | None = None
21+
local_data: Any | None = None
22+
23+
class VirtualizationVMFilesystem(PrometheusModel):
24+
_modelname = "VirtualizationVMFilesystem"
25+
_identifiers = ("virtual_machine", "mountpoint")
26+
_attributes = ("readonly", "fstype", "size_bytes", "device_error", "device")
27+
readonly: bool | None = None
28+
fstype: str | None = None
29+
size_bytes: int | None = None
30+
device_error: bool | None = None
31+
device: str | None = None
32+
mountpoint: str
33+
virtual_machine: str
34+
35+
local_id: str | None = None
36+
local_data: Any | None = None
37+
38+
class VirtualizationVMNetworkInterface(PrometheusModel):
39+
_modelname = "VirtualizationVMNetworkInterface"
40+
_identifiers = ("virtual_machine", "name")
41+
_attributes = ("mtu", "mac_address", "carrier", "operational_status", "speed_bps", "duplex")
42+
mtu: int | None = None
43+
mac_address: str | None = None
44+
carrier: bool | None = None
45+
operational_status: str | None = None
46+
speed_bps: int | None = None
47+
duplex: str | None = None
48+
name: str
49+
virtual_machine: str
50+
51+
local_id: str | None = None
52+
local_data: Any | None = None
53+
54+
class VirtualizationVirtualMachine(PrometheusModel):
55+
_modelname = "VirtualizationVirtualMachine"
56+
_identifiers = ("name",)
57+
_attributes = ("os_name", "ip_forwarding_enabled", "os_kernel", "status", "architecture", "conntrack_limit", "mem_total_bytes")
58+
os_name: str | None = None
59+
ip_forwarding_enabled: bool | None = None
60+
os_kernel: str | None = None
61+
status: str | None = None
62+
architecture: str | None = None
63+
conntrack_limit: int | None = None
64+
name: str
65+
mem_total_bytes: int | None = None
66+
67+
local_id: str | None = None
68+
local_data: Any | None = None

0 commit comments

Comments
 (0)