feat(exporters): added node_exporter

This commit is contained in:
Alexander Weidinger 2019-04-26 13:09:43 +02:00
parent a7fad98251
commit 34ada49bf7
10 changed files with 148 additions and 1 deletions

View File

@ -92,3 +92,9 @@ dependency on ``prometheus.service.clean`` via include list.
This state will remove the prometheus package and has a depency on This state will remove the prometheus package and has a depency on
``prometheus.config.clean`` via include list. ``prometheus.config.clean`` via include list.
``prometheus.exporters``
^^^^^^^^^^^^^^^^^^^^^^^^
This state will manage prometheus exporters according to Pillar ``prometheus:exporters``.
It includes sub-states like ``prometheus.exporters.node``.
If you don't want to use Pillar data for this you may use the sub-states directly.

View File

@ -42,6 +42,7 @@ provisioner:
base: base:
'*': '*':
- prometheus - prometheus
- prometheus.exporters
pillars: pillars:
top.sls: top.sls:
base: base:

View File

@ -62,3 +62,8 @@ prometheus:
static_configs: static_configs:
- targets: ['localhost:9090'] - targets: ['localhost:9090']
exporters:
node:
args:
web.listen-address: ":9110"

View File

@ -9,3 +9,7 @@ prometheus:
service: service:
name: prometheus name: prometheus
sysrc: False sysrc: False
exporters:
node:
pkg: prometheus-node-exporter
service: prometheus-node-exporter

View File

@ -0,0 +1,14 @@
# -*- coding: utf-8 -*-
# vim: ft=sls
{#- Get the `tplroot` from `tpldir` #}
{%- set tplroot = tpldir.split('/')[0] %}
{%- set sls_config_file = tplroot ~ '.config.file' %}
{%- from tplroot ~ "/map.jinja" import prometheus with context %}
{%- if prometheus.exporters.keys()|length > 0 %}
include:
{%- for name in prometheus.exporters.keys()|list %}
- .{{ name }}
{%- endfor %}
{%- endif %}

View File

@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
# vim: ft=sls
{#- Get the `tplroot` from `tpldir` #}
{%- set tplroot = tpldir.split('/')[0] %}
{%- from tplroot ~ "/map.jinja" import prometheus with context %}
prometheus-exporters-node-service-dead:
service.dead:
- name: {{ prometheus.exporters.node.service }}
- enable: False
prometheus-exporters-node-pkg-removed:
pkg.removed:
- name: {{ prometheus.exporters.node.pkg }}
- require:
- service: prometheus-exporters-node-service-dead
{# FreeBSD #}
{%- if salt['grains.get']('os_family') == 'FreeBSD' %}
{%- for parameter in ['args', 'listen_address', 'textfile_dir'] %}
prometheus-exporters-node-args-{{ parameter }}:
sysrc.absent:
- name: node_exporter_{{ parameter }}
- require:
- service: prometheus-exporters-node-service-dead
{%- endfor %}
{%- endif %}

View File

@ -0,0 +1,73 @@
# -*- coding: utf-8 -*-
# vim: ft=sls
{#- Get the `tplroot` from `tpldir` #}
{%- set tplroot = tpldir.split('/')[0] %}
{%- from tplroot ~ "/map.jinja" import prometheus with context %}
{%- macro concat_args(args) %}
{%- if args|length > 0 %}
{%- for k,v in args -%}
{%- if not k or not v %}{% continue %}{% endif -%}
--{{ k }}={{ v }}
{%- if not loop.last %} {% endif -%}
{%- endfor -%}
{%- endif -%}
{%- endmacro %}
prometheus-exporters-node-pkg-installed:
pkg.installed:
- name: {{ prometheus.exporters.node.pkg }}
{%- if 'args' in prometheus.exporters.node %}
{%- set args = prometheus.exporters.node.get('args', {}) -%}
{# FreeBSD #}
{%- if salt['grains.get']('os_family') == 'FreeBSD' %}
{%- if 'web.listen-address' in args.keys() %}
{%- set value = args.pop('web.listen-address') %}
prometheus-exporters-node-args-web-listen-address:
sysrc.managed:
- name: node_exporter_listen_address
- value: {{ value }}
- watch_in:
- service: prometheus-exporters-node-service-running
{%- endif %}
{%- if 'collector.textfile.directory' in args.keys() %}
{%- set value = args.pop('collector.textfile.directory') %}
prometheus-exporters-node-args-collector-textfile-directory:
sysrc.managed:
- name: node_exporter_textfile_dir
- value: {{ value }}
- watch_in:
- service: prometheus-exporters-node-service-running
{%- endif %}
prometheus-exporters-node-args:
sysrc.managed:
- name: node_exporter_args
# service node_exporter restart tended to hang on FreeBSD
# https://github.com/saltstack/salt/issues/44848#issuecomment-487016414
- value: "{{ concat_args(args|dictsort) }} >/dev/null 2>&1"
- watch_in:
- service: prometheus-exporters-node-service-running
{# Debian #}
{%- elif salt['grains.get']('os_family') == 'Debian'%}
prometheus-exporters-node-args:
file.managed:
- name: {{ prometheus.exporters.node.config_file }}
- contents: |
ARGS="{{ concat_args(args) }}"
- watch_in:
- service: prometheus-exporters-node-service-running
{%- endif %}
{%- endif %}
prometheus-exporters-node-service-running:
service.running:
- name: {{ prometheus.exporters.node.service }}
- enable: True
- watch:
- pkg: prometheus-exporters-node-pkg-installed

View File

@ -10,7 +10,10 @@
# you will need to provide at least an empty dict in this file, e.g. # you will need to provide at least an empty dict in this file, e.g.
# osfamilymap: {} # osfamilymap: {}
--- ---
Debian: {} Debian:
exporters:
node:
config_file: /etc/default/prometheus-node-exporter
RedHat: {} RedHat: {}
@ -27,6 +30,10 @@ FreeBSD:
config_file: /usr/local/etc/prometheus.yml config_file: /usr/local/etc/prometheus.yml
service: service:
sysrc: True sysrc: True
exporters:
node:
pkg: node_exporter
service: node_exporter
OpenBSD: OpenBSD:
rootgroup: wheel rootgroup: wheel

View File

@ -4,4 +4,8 @@ control 'Prometheus package' do
describe package('prometheus') do describe package('prometheus') do
it { should be_installed } it { should be_installed }
end end
describe package('prometheus-node-exporter') do
it { should be_installed }
end
end end

View File

@ -6,4 +6,9 @@ control 'Prometheus service' do
it { should be_enabled } it { should be_enabled }
it { should be_running } it { should be_running }
end end
describe service('prometheus-node-exporter') do
it { should be_enabled }
it { should be_running }
end
end end