collector: support custom poll intervals

Also simplify config context schema for SNMP since we only use a single
instance.
This commit is contained in:
Timotej Lazar 2025-11-04 14:56:40 +01:00
parent be7eca3a89
commit f3eec5fcbf
4 changed files with 21 additions and 16 deletions

View file

@ -1,18 +1,19 @@
Set up metric collection with prometheus and telegraf as the SNMP proxy.
NetBox config context should contain the lists `prometheus_hosts` and `snmp_hosts` with job definitions. Each entry should define `name` and `nb_filter` user to query hosts from NetBox. For example:
Each entry in `prometheus_config` should define `name`, `hosts` and optionally `interval`. As above, `hosts` is used as a query filter.
For SNMP the properties `snmp_hosts` and optional `snmp_interval` should define respectively the NetBox query filter and poll interval.
For example:
{
"prometheus_hosts": [
"prometheus_config": [
{
"name": "classroom",
"nb_filter": "role=desktop-computer status=active location=classroom"
"hosts": "role=desktop-computer status=active location=classroom",
"interval": 300
}
],
"snmp_hosts": [
{
"name": "switch",
"nb_filter": "role=switch name__isw=sw- status=active status=staged status=planned"
}
]
"snmp_hosts": "role=switch name__isw=sw- status=active status=staged status=planned",
"snmp_interval": 300
}

View file

@ -28,7 +28,7 @@
template:
dest: "/etc/prometheus/conf.d/{{ item.name }}.yml"
src: "prometheus-job.yml.j2"
loop: "{{ prometheus_hosts }}"
loop: "{{ prometheus_config }}"
loop_control:
label: "{{ item.name }}"
notify: reload prometheus

View file

@ -1,10 +1,14 @@
{% set devices = query("netbox.netbox.nb_lookup", "devices", api_filter="{{ item.nb_filter }}", raw_data=true)
{% set devices = query("netbox.netbox.nb_lookup", "devices", api_filter="{{ item.hosts }}", raw_data=true)
| selectattr("primary_ip")
| map(attribute="name")
| map("extract", hostvars) -%}
scrape_configs:
- job_name: "{{ item.name }}"
{% if item.interval is defined %}
scrape_interval: {{ item.interval }}s
scrape_timeout: {{ item.interval // 5 }}s
{% endif %}
relabel_configs:
- source_labels: [__address__]
regex: '([^.]+).*'

View file

@ -1,13 +1,13 @@
[[inputs.snmp]]
interval = "300s"
{% if snmp_interval is defined %}
interval = "{{ snmp_interval }}s"
{% endif %}
agent_host_tag = "source"
agents = [
{% for item in snmp_hosts %}
{% for address in query("netbox.netbox.nb_lookup", "devices", api_filter=item.nb_filter, raw_data=true)
{% for address in query("netbox.netbox.nb_lookup", "devices", api_filter=snmp_hosts, raw_data=true)
| selectattr("primary_ip4") | map(attribute="primary_ip4.address")
| ipaddr("address") %}
| ipaddr("int") | sort | ipaddr("address") %}
"{{ address }}",
{% endfor %}
{% endfor %}
]
version = 3