Browse Source

First release

pull/2/head
Ricardo Hernandez 5 years ago
commit
702998db40
  1. 5
      .gitignore
  2. 5
      AUTHORS
  3. 7
      CHANGELOG.rst
  4. 9
      FORMULA
  5. 14
      LICENSE
  6. 46
      README.rst
  7. 1
      VERSION
  8. 66
      pillar.example
  9. 73
      prometheus/alertmanager.sls
  10. 66
      prometheus/defaults.yaml
  11. 48
      prometheus/exporters/node.sls
  12. 18
      prometheus/files/alertmanager.systemd.jinja
  13. 30
      prometheus/files/alertmanager.upstart.jinja
  14. 1
      prometheus/files/config.jinja
  15. 25
      prometheus/files/default-alertmanager.jinja
  16. 2
      prometheus/files/default-node_exporter.jinja
  17. 178
      prometheus/files/default-prometheus.jinja
  18. 18
      prometheus/files/node_exporter.systemd.jinja
  19. 30
      prometheus/files/node_exporter.upstart.jinja
  20. 123
      prometheus/files/orig-alertmanager.yml
  21. 30
      prometheus/files/orig-prometheus.yml
  22. 18
      prometheus/files/prometheus.systemd.jinja
  23. 30
      prometheus/files/prometheus.upstart.jinja
  24. 4
      prometheus/init.sls
  25. 3
      prometheus/map.jinja
  26. 77
      prometheus/server.sls
  27. 9
      prometheus/user.sls
  28. 3
      requirements.dev.txt
  29. 65
      test/cluster/Vagrantfile
  30. 11
      test/cluster/conf/master
  31. 3
      test/cluster/conf/minion
  32. 27
      test/cluster/keys/master.pem
  33. 9
      test/cluster/keys/master.pub
  34. 27
      test/cluster/keys/min1.pem
  35. 9
      test/cluster/keys/min1.pub
  36. 27
      test/cluster/keys/min2.pem
  37. 9
      test/cluster/keys/min2.pub
  38. 27
      test/cluster/keys/min3.pem
  39. 9
      test/cluster/keys/min3.pub
  40. 12
      test/pillar/prometheus.sls
  41. 3
      test/pillar/top.sls
  42. 3
      test/salt/top.sls
  43. 37
      test/single/Vagrantfile
  44. 13
      test/single/conf/minion
  45. 6
      test/single/tox.ini
  46. 2
      test/testinfra/test_prometheus.py

5
.gitignore

@ -0,0 +1,5 @@
.vagrant
.tox
.cache
__pycache__
*~

5
AUTHORS

@ -0,0 +1,5 @@
=======
Authors
=======
* Ricardo Hernandez (richerve)

7
CHANGELOG.rst

@ -0,0 +1,7 @@
prometheus formula
==================
201610 (2016-10-04)
-------------------
- First release

9
FORMULA

@ -0,0 +1,9 @@
name: prometheus
os: Ubuntu
os_family: Debian
version: 201610
release: 1
summary: Prometheus saltstack formula
description: Prometheus saltstack formula
top_level_dir: prometheus
recommended:

14
LICENSE

@ -0,0 +1,14 @@
Copyright (c) 2016 Ricardo Hernandez
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

46
README.rst

@ -0,0 +1,46 @@
============================
Prometheus saltstack formula
============================
.. note::
See the full `Salt Formulas installation and usage instructions
<http://docs.saltstack.com/en/latest/topics/development/conventions/formulas.html>`_.
Features
========
- Install and configure prometheus server, node_exporter and alertmanager
Compatibility
=============
- prometheus >= 1.0
- saltstack = 2016.3.3
Available states
================
.. contents::
:local:
``prometheus.server``
``prometheus.exportes.node``
``prometheus.alertmanager``
Running
=======
$ salt node state.apply prometheus
Ideas and future development
============================
Template
========
This formula was created from a cookiecutter template.
See https://github.com/richerve/saltstack-formula-cookiecutter.

1
VERSION

@ -0,0 +1 @@
201609

66
pillar.example

@ -0,0 +1,66 @@
prometheus:
server:
version: 1.1.3.linux-amd64
install_dir: /opt
source: https://github.com/prometheus/prometheus/releases/download/v1.1.3/prometheus-1.1.3.linux-amd64.tar.gz
source_hash: md5=839293afa9bfce47c476a0bdfd01a780
args:
config_file: /etc/prometheus/prometheus.yml
storage:
local_path: /var/lib/prometheus/metrics
config:
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9100']
alertmanager:
version: 0.4.2.linux-amd64
install_dir: /opt
source: https://github.com/prometheus/alertmanager/releases/download/v0.4.2/alertmanager-0.4.2.linux-amd64.tar.gz
source_hash: md5=715878f14ab091769c989ecdb2db9f15
args:
config_file: /etc/alertmanager/alertmanager.yml
storage:
path: /var/lib/alertmanager
config:
global:
smtp_smarthost: "localhost:25"
smtp_from: 'alertmanager@example.org'
smtp_auth_username: 'alertmanager'
smtp_auth_password: 'password'
templates:
- "/etc/alertmanager/template/*.tmpl"
route:
group_by: ['alertname', 'cluster', 'service']
group_wait: 30s
group_interval: 5m
repeat_interval: 3h
receiver: team-X-mails
routes:
- match_re:
service: ^(foo1|foo2|baz)$
receiver: team-X-mails
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'cluster', 'service']
receivers:
- name: 'team-X-mails'
email_configs:
- to: 'team-X+alerts@example.org'
exporters:
node:
version: 0.12.0.linux-amd64
install_dir: /opt
source: https://github.com/prometheus/node_exporter/releases/download/0.12.0/node_exporter-0.12.0.linux-amd64.tar.gz
source_hash: md5=efe49b6fae4b1a5cb75b24a60a35e1fc

73
prometheus/alertmanager.sls

@ -0,0 +1,73 @@
{% from "prometheus/map.jinja" import prometheus with context %}
{%- set version_path = prometheus.alertmanager.install_dir ~ "/alertmanager-" ~ prometheus.alertmanager.version %}
include:
- prometheus.user
alertmanager_tarball:
archive.extracted:
- name: {{ prometheus.alertmanager.install_dir }}
- source: {{ prometheus.alertmanager.source }}
- source_hash: {{ prometheus.alertmanager.source_hash }}
- archive_format: tar
- if_missing: {{ version_path }}
alertmanager_bin_link:
alternatives.install:
- name: alertmanager
- link: /usr/bin/alertmanager
- path: {{ version_path }}/alertmanager
- priority: 10
- require:
- archive: alertmanager_tarball
alertmanager_config:
file.managed:
- name: {{ prometheus.alertmanager.args.config_file }}
- source: salt://prometheus/files/config.jinja
- template: jinja
- user: prometheus
- group: prometheus
- makedirs: True
- defaults:
data: {{ prometheus.alertmanager.config }}
alertmanager_defaults:
file.managed:
- name: /etc/default/alertmanager
- source: salt://prometheus/files/default-alertmanager.jinja
- template: jinja
- defaults:
config_file: {{ prometheus.alertmanager.args.config_file }}
storage_path: {{ prometheus.alertmanager.args.storage.path }}
alertmanager_storage_path:
file.directory:
- name: {{ prometheus.alertmanager.args.storage.path }}
- user: prometheus
- group: prometheus
- makedirs: True
- watch:
- file: alertmanager_defaults
alertmanager_service_unit:
file.managed:
{%- if grains.get('init') == 'systemd' %}
- name: /etc/systemd/system/alertmanager.service
- source: salt://prometheus/files/alertmanager.systemd.jinja
{%- elif grains.get('init') == 'upstart' %}
- name: /etc/init/alertmanager.conf
- source: salt://prometheus/files/alertmanager.upstart.jinja
{%- endif %}
- watch:
- file: alertmanager_defaults
- require_in:
- file: alertmanager_service
alertmanager_service:
service.running:
- name: alertmanager
- enable: True
- reload: True
- watch:
- file: alertmanager_config

66
prometheus/defaults.yaml

@ -0,0 +1,66 @@
prometheus:
server:
version: 1.1.3.linux-amd64
install_dir: /opt
source: https://github.com/prometheus/prometheus/releases/download/v1.1.3/prometheus-1.1.3.linux-amd64.tar.gz
source_hash: md5=839293afa9bfce47c476a0bdfd01a780
args:
config_file: /etc/prometheus/prometheus.yml
storage:
local_path: /var/lib/prometheus/metrics
config:
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9100']
alertmanager:
version: 0.4.2.linux-amd64
install_dir: /opt
source: https://github.com/prometheus/alertmanager/releases/download/v0.4.2/alertmanager-0.4.2.linux-amd64.tar.gz
source_hash: md5=715878f14ab091769c989ecdb2db9f15
args:
config_file: /etc/alertmanager/alertmanager.yml
storage:
path: /var/lib/alertmanager
config:
global:
smtp_smarthost: "localhost:25"
smtp_from: 'alertmanager@example.org'
smtp_auth_username: 'alertmanager'
smtp_auth_password: 'password'
templates:
- "/etc/alertmanager/template/*.tmpl"
route:
group_by: ['alertname', 'cluster', 'service']
group_wait: 30s
group_interval: 5m
repeat_interval: 3h
receiver: team-X-mails
routes:
- match_re:
service: ^(foo1|foo2|baz)$
receiver: team-X-mails
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'cluster', 'service']
receivers:
- name: 'team-X-mails'
email_configs:
- to: 'team-X+alerts@example.org'
exporters:
node:
version: 0.12.0.linux-amd64
install_dir: /opt
source: https://github.com/prometheus/node_exporter/releases/download/0.12.0/node_exporter-0.12.0.linux-amd64.tar.gz
source_hash: md5=efe49b6fae4b1a5cb75b24a60a35e1fc

48
prometheus/exporters/node.sls

@ -0,0 +1,48 @@
{% from "prometheus/map.jinja" import prometheus with context %}
{%- set version_path = prometheus.exporters.node.install_dir ~ "/node_exporter-" ~ prometheus.exporters.node.version %}
include:
- prometheus.user
node_exporter_tarball:
archive.extracted:
- name: {{ prometheus.exporters.node.install_dir }}
- source: {{ prometheus.exporters.node.source }}
- source_hash: {{ prometheus.exporters.node.source_hash }}
- archive_format: tar
- if_missing: {{ version_path }}
node_exporter_bin_link:
alternatives.install:
- name: node_exporter
- link: /usr/bin/node_exporter
- path: {{ version_path }}/node_exporter
- priority: 10
- require:
- archive: node_exporter_tarball
node_exporter_defaults:
file.managed:
- name: /etc/default/node_exporter
- source: salt://prometheus/files/default-node_exporter.jinja
- template: jinja
node_exporter_service_unit:
file.managed:
{%- if grains.get('init') == 'systemd' %}
- name: /etc/systemd/system/node_exporter.service
- source: salt://prometheus/files/node_exporter.systemd.jinja
{%- elif grains.get('init') == 'upstart' %}
- name: /etc/init/node_exporter.conf
- source: salt://prometheus/files/node_exporter.upstart.jinja
{%- endif %}
- require_in:
- file: node_exporter_service
node_exporter_service:
service.running:
- name: node_exporter
- enable: True
- reload: True
- watch:
- file: node_exporter_defaults

18
prometheus/files/alertmanager.systemd.jinja

@ -0,0 +1,18 @@
[Unit]
Description=The Alertmanager handles alerts sent by client applications such as the Prometheus server
Documentation=https://prometheus.io/docs/alerting/alertmanager/
Wants=basic.target
After=basic.target network.target
[Service]
User=prometheus
Group=prometheus
EnvironmentFile=/etc/default/alertmanager
ExecStart=/usr/bin/alertmanager $ARGS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always
RestartSec=42s
[Install]
WantedBy=multi-user.target

30
prometheus/files/alertmanager.upstart.jinja

@ -0,0 +1,30 @@
# Prometheus Alert Manager (Upstart unit)
description "The Alertmanager handles alerts sent by client applications such as the Prometheus server."
start on runlevel [2345]
stop on runlevel [06]
env ALERTMANAGER=/usr/bin/alertmanager
env USER=prometheus
env GROUP=prometheus
env DEFAULTS=/etc/default/alertmanager
env RUNDIR=/var/run/alertmanager
env PID_FILE=/var/run/alertmanager/alertmanager.pid
pre-start script
[ -e $DEFAULTS ] && . $DEFAULTS
mkdir -p $RUNDIR || true
chmod 0750 $RUNDIR || true
chown $USER:$GROUP $RUNDIR || true
end script
script
# read settings like GOMAXPROCS from "/etc/default/alertmanager", if available.
[ -e $DEFAULTS ] && . $DEFAULTS
export GOMAXPROCS=${GOMAXPROCS:-2}
exec start-stop-daemon -c $USER -g $GROUP -p $PID_FILE -x $ALERTMANAGER -S -- $ARGS
end script
respawn
respawn limit 10 10
kill timeout 10

1
prometheus/files/config.jinja

@ -0,0 +1 @@
{{ data|yaml(False) }}

25
prometheus/files/default-alertmanager.jinja

@ -0,0 +1,25 @@
# Set the command-line arguments to pass to the server.
ARGS="-config.file {{config_file}} -storage.path {{ storage_path }}"
# The alert manager supports the following options:
# -config.file string
# Alertmanager configuration file name.
# (default "/etc/prometheus/alertmanager.yml")
# -log.level value
# Only log messages with the given severity or above.
# Valid levels: [debug, info, warn, error, fatal]. (default info)
# -storage.path string
# Base path for data storage.
# (default "/var/lib/prometheus/alertmanager/")
# -web.external-url string
# The URL under which Alertmanager is externally reachable (for example,
# if Alertmanager is served via a reverse proxy). Used for generating
# relative and absolute links back to Alertmanager itself. If the URL has
# a path portion, it will be used to prefix all HTTP endpoints served by
# Alertmanager. If omitted, relevant URL components will be derived
# automatically.
# -web.listen-address string
# Address to listen on for the web interface and API. (default ":9093")
# -web.local-assets string
# Path to static assets/templates directory.
# (default "/usr/share/prometheus/alertmanager/")

2
prometheus/files/default-node_exporter.jinja

@ -0,0 +1,2 @@
# Set the command-line arguments to pass to the server.
ARGS=""

178
prometheus/files/default-prometheus.jinja

@ -0,0 +1,178 @@
# Set the command-line arguments to pass to the server.
ARGS="-config.file {{config_file}} -storage.local.path {{storage_local_path}} -web.console.libraries {{web_console_libraries}} -web.console.templates {{web_console_templates}}"
# Prometheus supports the following options:
# -config.file "/etc/prometheus/prometheus.yml"
# Prometheus configuration file name.
#
# == ALERTMANAGER ==
#
# -alertmanager.notification-queue-capacity 10000
# The capacity of the queue for pending alert manager notifications.
#
# -alertmanager.timeout 10s
# Alert manager HTTP API timeout.
#
# -alertmanager.url
# The URL of the alert manager to send notifications to.
#
# == LOG ==
#
# -log.format
# If set use a syslog logger or JSON logging. Example:
# logger:syslog?appname=bob&local=7 or logger:stdout?json=true. Defaults to
# stderr.
#
# -log.level "info"
# Only log messages with the given severity or above. Valid levels:
# [debug, info, warn, error, fatal].
#
# == QUERY ==
#
# -query.max-concurrency 20
# Maximum number of queries executed concurrently.
#
# -query.staleness-delta 5m0s
# Staleness delta allowance during expression evaluations.
#
# -query.timeout 2m0s
# Maximum time a query may take before being aborted.
#
# == STORAGE ==
#
# -storage.local.checkpoint-dirty-series-limit 5000
# If approx. that many time series are in a state that would require
# a recovery operation after a crash, a checkpoint is triggered, even if
# the checkpoint interval hasn't passed yet. A recovery operation requires
# a disk seek. The default limit intends to keep the recovery time below
# 1min even on spinning disks. With SSD, recovery is much faster, so you
# might want to increase this value in that case to avoid overly frequent
# checkpoints.
#
# -storage.local.checkpoint-interval 5m0s
# The period at which the in-memory metrics and the chunks not yet
# persisted to series files are checkpointed.
#
# -storage.local.chunk-encoding-version 1
# Which chunk encoding version to use for newly created chunks.
# Currently supported is 0 (delta encoding) and 1 (double-delta encoding).
#
# -storage.local.dirty false
# If set, the local storage layer will perform crash recovery even if
# the last shutdown appears to be clean.
#
# -storage.local.index-cache-size.fingerprint-to-metric 10485760
# The size in bytes for the fingerprint to metric index cache.
#
# -storage.local.index-cache-size.fingerprint-to-timerange 5242880
# The size in bytes for the metric time range index cache.
#
# -storage.local.index-cache-size.label-name-to-label-values 10485760
# The size in bytes for the label name to label values index cache.
#
# -storage.local.index-cache-size.label-pair-to-fingerprints 20971520
# The size in bytes for the label pair to fingerprints index cache.
#
# -storage.local.max-chunks-to-persist 524288
# How many chunks can be waiting for persistence before sample
# ingestion will be throttled. Many chunks waiting to be persisted will
# increase the checkpoint size.
#
# -storage.local.memory-chunks 1048576
# How many chunks to keep in memory. While the size of a chunk is
# 1kiB, the total memory usage will be significantly higher than this value
# * 1kiB. Furthermore, for various reasons, more chunks might have to be
# kept in memory temporarily. Sample ingestion will be throttled if the
# configured value is exceeded by more than 10%.
#
# -storage.local.path "/var/lib/prometheus/metrics"
# Base path for metrics storage.
#
# -storage.local.pedantic-checks false
# If set, a crash recovery will perform checks on each series file.
# This might take a very long time.
#
# -storage.local.retention 360h0m0s
# How long to retain samples in the local storage.
#
# -storage.local.series-file-shrink-ratio 0.1
# A series file is only truncated (to delete samples that have
# exceeded the retention period) if it shrinks by at least the provided
# ratio. This saves I/O operations while causing only a limited storage
# space overhead. If 0 or smaller, truncation will be performed even for a
# single dropped chunk, while 1 or larger will effectively prevent any
# truncation.
#
# -storage.local.series-sync-strategy "adaptive"
# When to sync series files after modification. Possible values:
# 'never', 'always', 'adaptive'. Sync'ing slows down storage performance
# but reduces the risk of data loss in case of an OS crash. With the
# 'adaptive' strategy, series files are sync'd for as long as the storage
# is not too much behind on chunk persistence.
#
# -storage.remote.graphite-address
# The host:port of the remote Graphite server to send samples to.
# None, if empty.
#
# -storage.remote.graphite-prefix
# The prefix to prepend to all metrics exported to Graphite. None, if
# empty.
#
# -storage.remote.graphite-transport "tcp"
# Transport protocol to use to communicate with Graphite. 'tcp', if
# empty.
#
# -storage.remote.influxdb-url
# The URL of the remote InfluxDB server to send samples to. None, if
# empty.
#
# -storage.remote.influxdb.database "prometheus"
# The name of the database to use for storing samples in InfluxDB.
#
# -storage.remote.influxdb.retention-policy "default"
# The InfluxDB retention policy to use.
#
# -storage.remote.influxdb.username
# The username to use when sending samples to InfluxDB. The
# corresponding password must be provided via the INFLUXDB_PW environment
# variable.
#
# -storage.remote.opentsdb-url
# The URL of the remote OpenTSDB server to send samples to. None, if
# empty.
#
# -storage.remote.timeout 30s
# The timeout to use when sending samples to the remote storage.
#
# == WEB ==
#
# -web.console.libraries "/etc/prometheus/console_libraries"
# Path to the console library directory.
#
# -web.console.templates "/etc/prometheus/consoles"
# Path to the console template directory, available at /consoles.
#
# -web.enable-remote-shutdown false
# Enable remote service shutdown.
#
# -web.external-url
# The URL under which Prometheus is externally reachable (for
# example, if Prometheus is served via a reverse proxy). Used for
# generating relative and absolute links back to Prometheus itself. If the
# URL has a path portion, it will be used to prefix all HTTP endpoints
# served by Prometheus. If omitted, relevant URL components will be derived
# automatically.
#
# -web.listen-address ":9090"
# Address to listen on for the web interface, API, and telemetry.
#
# -web.local-assets "/usr/share/prometheus/web/"
# Path to static assets/templates directory.
#
# -web.telemetry-path "/metrics"
# Path under which to expose metrics.
#
# -web.user-assets
# Path to static asset directory, available at /user.
#

18
prometheus/files/node_exporter.systemd.jinja

@ -0,0 +1,18 @@
[Unit]
Description=Prometheus exporter for machine metrics
Documentation=https://github.com/prometheus/node_exporter
Wants=basic.target
After=basic.target network.target
[Service]
User=prometheus
Group=prometheus
EnvironmentFile=/etc/default/node_exporter
ExecStart=/usr/bin/node_exporter $ARGS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always
RestartSec=42s
[Install]
WantedBy=multi-user.target

30
prometheus/files/node_exporter.upstart.jinja

@ -0,0 +1,30 @@
# Prometheus Node Exporter (Upstart unit)
description "Prometheus exporter for machine metrics"
start on runlevel [2345]
stop on runlevel [06]
env NODE_EXPORTER=/usr/bin/node_exporter
env USER=prometheus
env GROUP=prometheus
env DEFAULTS=/etc/default/node_exporter
env RUNDIR=/var/run/node_exporter
env PID_FILE=/var/run/node_exporter/node_exporter.pid
pre-start script
[ -e $DEFAULTS ] && . $DEFAULTS
mkdir -p $RUNDIR || true
chmod 0750 $RUNDIR || true
chown $USER:$GROUP $RUNDIR || true
end script
script
# read settings like GOMAXPROCS from "/etc/default/node_exporter", if available.
[ -e $DEFAULTS ] && . $DEFAULTS
export GOMAXPROCS=${GOMAXPROCS:-2}
exec start-stop-daemon -c $USER -g $GROUP -p $PID_FILE -x $NODE_EXPORTER -S -- $ARGS
end script
respawn
respawn limit 10 10
kill timeout 10

123
prometheus/files/orig-alertmanager.yml

@ -0,0 +1,123 @@
global:
# The smarthost and SMTP sender used for mail notifications.
smtp_smarthost: 'localhost:25'
smtp_from: 'alertmanager@example.org'
smtp_auth_username: 'alertmanager'
smtp_auth_password: 'password'
# The auth token for Hipchat.
hipchat_auth_token: '1234556789'
# Alternative host for Hipchat.
hipchat_url: 'https://hipchat.foobar.org/'
# The directory from which notification templates are read.
templates:
- '/etc/alertmanager/template/*.tmpl'
# The root route on which each incoming alert enters.
route:
# The labels by which incoming alerts are grouped together. For example,
# multiple alerts coming in for cluster=A and alertname=LatencyHigh would
# be batched into a single group.
group_by: ['alertname', 'cluster', 'service']
# When a new group of alerts is created by an incoming alert, wait at
# least 'group_wait' to send the initial notification.
# This way ensures that you get multiple alerts for the same group that start
# firing shortly after another are batched together on the first
# notification.
group_wait: 30s
# When the first notification was sent, wait 'group_interval' to send a batch
# of new alerts that started firing for that group.
group_interval: 5m
# If an alert has successfully been sent, wait 'repeat_interval' to
# resend them.
repeat_interval: 3h
# A default receiver
receiver: team-X-mails
# All the above attributes are inherited by all child routes and can
# overwritten on each.
# The child route trees.
routes:
# This routes performs a regular expression match on alert labels to
# catch alerts that are related to a list of services.
- match_re:
service: ^(foo1|foo2|baz)$
receiver: team-X-mails
# The service has a sub-route for critical alerts, any alerts
# that do not match, i.e. severity != critical, fall-back to the
# parent node and are sent to 'team-X-mails'
routes:
- match:
severity: critical
receiver: team-X-pager
- match:
service: files
receiver: team-Y-mails
routes:
- match:
severity: critical
receiver: team-Y-pager
# This route handles all alerts coming from a database service. If there's
# no team to handle it, it defaults to the DB team.
- match:
service: database
receiver: team-DB-pager
# Also group alerts by affected database.
group_by: [alertname, cluster, database]
routes:
- match:
owner: team-X
receiver: team-X-pager
- match:
owner: team-Y
receiver: team-Y-pager
# Inhibition rules allow to mute a set of alerts given that another alert is
# firing.
# We use this to mute any warning-level notifications if the same alert is
# already critical.
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
# Apply inhibition if the alertname is the same.
equal: ['alertname', 'cluster', 'service']
receivers:
- name: 'team-X-mails'
email_configs:
- to: 'team-X+alerts@example.org'
- name: 'team-X-pager'
email_configs:
- to: 'team-X+alerts-critical@example.org'
pagerduty_configs:
- service_key: <team-X-key>
- name: 'team-Y-mails'
email_configs:
- to: 'team-Y+alerts@example.org'
- name: 'team-Y-pager'
pagerduty_configs:
- service_key: <team-Y-key>
- name: 'team-DB-pager'
pagerduty_configs:
- service_key: <team-DB-key>
- name: 'team-X-hipchat'
hipchat_configs:
- auth_token: <auth_token>
room_id: 85
message_format: html
notify: true

30
prometheus/files/orig-prometheus.yml

@ -0,0 +1,30 @@
# my global config
global:
scrape_interval: 15s # By default, scrape targets every 15 seconds.
evaluation_interval: 15s # By default, scrape targets every 15 seconds.
# scrape_timeout is set to the global default (10s).
# Attach these labels to any time series or alerts when communicating with
# external systems (federation, remote storage, Alertmanager).
external_labels:
monitor: 'codelab-monitor'
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first.rules"
# - "second.rules"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# Override the global default and scrape targets from this job every 5 seconds.
scrape_interval: 5s
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']

18
prometheus/files/prometheus.systemd.jinja

@ -0,0 +1,18 @@
[Unit]
Description=Monitoring system and time series database
Documentation=https://prometheus.io/docs/introduction/overview/
Wants=basic.target
After=basic.target network.target
[Service]
User=prometheus
Group=prometheus
EnvironmentFile=/etc/default/prometheus
ExecStart=/usr/bin/prometheus $ARGS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=always
RestartSec=42s
[Install]
WantedBy=multi-user.target

30
prometheus/files/prometheus.upstart.jinja

@ -0,0 +1,30 @@
# Prometheus Monitoring Framework (Upstart unit)
description "Prometheus Monitoring Framework"
start on runlevel [2345]
stop on runlevel [06]
env PROMETHEUS=/usr/bin/prometheus
env USER=prometheus
env GROUP=prometheus
env DEFAULTS=/etc/default/prometheus
env RUNDIR=/var/run/prometheus
env PID_FILE=/var/run/prometheus/prometheus.pid
pre-start script
[ -e $DEFAULTS ] && . $DEFAULTS
mkdir -p $RUNDIR || true
chmod 0750 $RUNDIR || true
chown $USER:$GROUP $RUNDIR || true
end script
script
# read settings like GOMAXPROCS from "/etc/default/prometheus", if available.
[ -e $DEFAULTS ] && . $DEFAULTS
export GOMAXPROCS=${GOMAXPROCS:-2}
exec start-stop-daemon -c $USER -g $GROUP -p $PID_FILE -x $PROMETHEUS -S -- $ARGS
end script
respawn
respawn limit 10 10
kill timeout 10

4
prometheus/init.sls

@ -0,0 +1,4 @@
{% from "prometheus/map.jinja" import prometheus with context %}
include:
- prometheus.server

3
prometheus/map.jinja

@ -0,0 +1,3 @@
{% import_yaml 'prometheus/defaults.yaml' as defaults %}
{% set prometheus = salt['pillar.get']('prometheus', default=defaults.prometheus, merge=True) %}

77
prometheus/server.sls

@ -0,0 +1,77 @@
{% from "prometheus/map.jinja" import prometheus with context %}
{%- set version_path = prometheus.server.install_dir ~ "/prometheus-" ~ prometheus.server.version %}
include:
- prometheus.user
prometheus_server_tarball:
archive.extracted:
- name: {{ prometheus.server.install_dir }}
- source: {{ prometheus.server.source }}
- source_hash: {{ prometheus.server.source_hash }}
- archive_format: tar
- if_missing: {{ version_path }}
prometheus_bin_link:
alternatives.install:
- name: prometheus
- link: /usr/bin/prometheus
- path: {{ version_path }}/prometheus
- priority: 10
- require:
- archive: prometheus_server_tarball
prometheus_server_config:
file.managed:
- name: {{ prometheus.server.args.config_file }}
- source: salt://prometheus/files/config.jinja
- template: jinja
- user: prometheus
- group: prometheus
- makedirs: True
- defaults:
data: {{ prometheus.server.config }}
prometheus_defaults:
file.managed:
- name: /etc/default/prometheus
- source: salt://prometheus/files/default-prometheus.jinja
- template: jinja
- defaults:
config_file: {{ prometheus.server.args.config_file }}
storage_local_path: {{ prometheus.server.args.storage.local_path }}
web_console_libraries: {{ version_path }}/console_libraries
web_console_templates: {{ version_path }}/consoles
{%- if prometheus.server.args.storage.local_path is defined %}
prometheus_storage_local_path:
file.directory:
- name: {{ prometheus.server.args.storage.local_path }}
- user: prometheus
- group: prometheus
- makedirs: True
- watch:
- file: prometheus_defaults
{%- endif %}
prometheus_service_unit:
file.managed:
{%- if grains.get('init') == 'systemd' %}
- name: /etc/systemd/system/prometheus.service
- source: salt://prometheus/files/prometheus.systemd.jinja
{%- elif grains.get('init') == 'upstart' %}
- name: /etc/init/prometheus.conf
- source: salt://prometheus/files/prometheus.upstart.jinja
{%- endif %}
- watch:
- file: prometheus_defaults
- require_in:
- file: prometheus_service
prometheus_service:
service.running:
- name: prometheus
- enable: True
- reload: True
- watch:
- file: prometheus_server_config

9
prometheus/user.sls

@ -0,0 +1,9 @@
prometheus_group:
group.present:
- name: prometheus
prometheus_user:
user.present:
- name: prometheus
- home: /var/lib/prometheus
- gid_from_name: True

3
requirements.dev.txt

@ -0,0 +1,3 @@
pytest
pytest-xdist
testinfra

65
test/cluster/Vagrantfile

@ -0,0 +1,65 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
required_plugins = %w( vagrant-hostmanager )
required_plugins.each do |plugin|
exec "vagrant plugin install #{plugin};vagrant #{ARGV.join(" ")}" unless Vagrant.has_plugin? plugin || ARGV[0] == 'plugin'
end
Vagrant.configure(2) do |config|
config.vm.box = "ubuntu/trusty64"
if Vagrant.has_plugin?("vagrant-cachier")
config.cache.scope = :box
end
config.hostmanager.enabled = true
config.hostmanager.manage_guest = true
config.hostmanager.include_offline = true
config.vm.provision :shell, inline: "sudo locale-gen en_IE.UTF-8"
(1..3).each do |m|
config.vm.define "min#{m}" do |min|
min.vm.network "private_network", ip: "172.16.199.1#{m}"
min.vm.hostname = "min#{m}"
min.vm.provider "virtualbox" do |vb|
vb.name = "prometheus-min#{m}"
vb.memory = "2048"
end
min.vm.provision :salt do |salt|
salt.minion_config = "conf/minion"
salt.minion_key = "keys/min#{m}.pem"
salt.minion_pub = "keys/min#{m}.pub"
end
end
end
config.vm.define :master do |master|
master.vm.network "private_network", ip: "172.16.199.10"
master.vm.hostname = "salt"
master.vm.synced_folder "../../prometheus", "/srv/formulas/prometheus"
master.vm.synced_folder "../salt", "/srv/salt"
master.vm.synced_folder "../pillar", "/srv/pillar"
master.vm.provider "virtualbox" do |vb|
vb.name = "prometheus-master"
vb.memory = "1024"
end
master.vm.provision :shell, inline: "sudo apt-get install -y python-git python-pip"
master.vm.provision :salt do |salt|
salt.run_highstate = false
salt.install_master = true
salt.master_config = "conf/master"
salt.master_key = "keys/master.pem"
salt.master_pub = "keys/master.pub"
salt.seed_master = {"min1": "keys/min1.pub",
"min2": "keys/min2.pub",
"min3": "keys/min3.pub"}
end
end
end

11
test/cluster/conf/master

@ -0,0 +1,11 @@
fileserver_backend:
- roots
# - git
file_roots:
base:
- /srv/salt
- /srv/formulas
#gitfs_remotes:
# - https://github.com/repo/something-formula.git

3
test/cluster/conf/minion

@ -0,0 +1,3 @@
grains:
roles:
- prometheus

27
test/cluster/keys/master.pem

@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAlbO37bcGrTXwDlHA7Oea2ZYS1e6UP6alvifCBfQNyPAqU/qr
tZmANExHev6jXjkgB8TKbwdZtg21zCsUfJzY2LAYlbj5iT3HDJ4fRnB0JIs5v6Zq
n/u8w2bB+K71TfqpzEFVcEbIQ7bMjfOTSx06XhqnsiDyLqKu7eoWUpCBtJO1+1UF
OYNJwVqnrGkab/4MPDSqnuOlNa0QP/OUSLANiw1nts4MFvdaOtFZ7fFCOuYdsocd
Ec6LFvzhqUjwSnCunIMndo7hiPUgKxyBogxSaTduPE6zCHeGNCkbov8LiuPYThvC
D+ZLZBje09QYPgNU8+iFaoAyOjIrEUja6LAlWwIDAQABAoIBAAR04DHcc/9uDqJu
fp7O2kZF+HOT8affbym1B0qkFFD6DViIqtnyIuXrq2kW8YgZjUGN8zTQ9DO+Pr5A
PhDjnnT88Q5r/km+pBFVF7tCF8MKvgJdkukGVn0+ruGXW8ghgTKKc1+vS8DwTTCg
oq7mxNkOVBWyc2M+BpUgld+JW8MjYuQItbxw8a/PNrJqKAdipFnE3THI0CIZhZEE
ja0ExjIJ4c+0bS5hPpq3LenQkeQbtBgeIFfPEm+1yO7ijtkeUEauwU0TAG4ELNOa
74biw7fyoI1i1PTSdHfBWJDTWsNm5mhi333bmwH84I6tmq6e6MM061cOKSOxRGYv
Z7dAykECgYEAtXQth67J4eLtNuqb4smplbDFLckVPQo5F34/kfy7rFKGWJdUJp4p
EzVOXeQ9J6oXYAHjz7yeb7bTYDvqp/rF6g9Ptui09Vt8oRdUYSlTZVBO/hYZkbMt
3IUOXC+R4+XVJZvvxkQtO8h70s/v4jL4PdchNqDZ30N5Y2CJCXWcuzsCgYEA0zQl
0JS9EB5Xl6U3T9p3I26KQp84TttTeWhUhlraojJZra9BnsXF4bqdzRBVAv0+gmeF
t+M9MjxPvGLOgZA0GQ3rJHjRMj5zAYiYFbxCfbvU0kvQ1lLfNameLtRnkQrLBCSN
4sTjETxd3HFNqRbGaif5OpV94maYOgzjQlbMXGECgYAi/9q8XiGAmYXJ3uzcjKtS
PTt7PlsDYBJtDqPyY75LWcuiEOZhYIZptxF7mMeW+/7wPM0VR7uDrs8Ms+HqLru4
DuYAUNh+rvvWEqrq5s64LwpdhiO+b8I708pWS7KnM7CuRWq1YncbHeuMWSFbDxvE
ydcVM2dy4g/q9DbahT4K+wKBgQCgOkSh6+VO8CX1ltLSkuOljrv3dQFr2bqHNZ5C
W3TYbihYusemo1XPPRtwMf68iNE+bzkj25JWpSi8u5z88CCGDWghwEK8wmHPfQgc
HTm4V6JKdFgX8MED3g1ya5OylqSUHQNDUakOL2Tp009egze921uZlUXuV3UPPS2/
60eYoQKBgQCqOPv/40dW1CE67y+z2qXWye6GNkUcxCM3A0WW3wRFFXuPfy+4lBSX
43+Zq6w6+sAcv4RpKQFF4kjtLGkekAOWgOmQmPafSeUUZ2dtuydVk0Q9GDMaAFHO
n1teSXnYfb2vZMz4kQ6a5PyrqKLhwfk7aCaDXYF4NlQTGokxtTqa5w==
-----END RSA PRIVATE KEY-----

9
test/cluster/keys/master.pub

@ -0,0 +1,9 @@
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlbO37bcGrTXwDlHA7Oea
2ZYS1e6UP6alvifCBfQNyPAqU/qrtZmANExHev6jXjkgB8TKbwdZtg21zCsUfJzY
2LAYlbj5iT3HDJ4fRnB0JIs5v6Zqn/u8w2bB+K71TfqpzEFVcEbIQ7bMjfOTSx06
XhqnsiDyLqKu7eoWUpCBtJO1+1UFOYNJwVqnrGkab/4MPDSqnuOlNa0QP/OUSLAN
iw1nts4MFvdaOtFZ7fFCOuYdsocdEc6LFvzhqUjwSnCunIMndo7hiPUgKxyBogxS
aTduPE6zCHeGNCkbov8LiuPYThvCD+ZLZBje09QYPgNU8+iFaoAyOjIrEUja6LAl
WwIDAQAB
-----END PUBLIC KEY-----

27
test/cluster/keys/min1.pem

@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAivO8wR28TXAcKJhZmt+8w9Dc/KpqakkjHVea3ujBweLSmajj
qJPwd9DkdzjwygZBLNTYm24DSljBHcolG/tByZxM6/lP8HIWCJqxSaIeW6L0Hwab
fyj/OU/mHbNH51HXzwnRkOsNWp1X+wU7cSJyBncA1IrObMw27A814h6y5CbYG6gc
mDk3WkljDjx29uzNY+Sd7lPpbLy9p2z5eMh2crCi+mgXrJmWZSLtlXHvDKFQhWZo
BJbZzs4hdjAia7y9QScbTra1rIxBYYEwiuOsymCVkGNyX18lCuu4DFop22Qnlbqz
Y0LzlYUlSUndLQraTDqh7D5HScUzj83jKie1owIDAQABAoIBAGNXGk1eeu9KBXeo
Y/drmcLNIhCprWbLXwVtSlWvRkbdaP9eVVSCX9rpR01NMijdC9+HVEza/BM9HOO1
T46PtVr0GbJjDZmzlrkUD0e7VcTh3XIJAUaKAt3wl24IbJGeW5GzTVY0FdoAv5PB
C9w4ahjhH4DUs/vojCN8RGOi2vZtGUfRs0slbRTqyHrIjKvhSCUOwJp7ZFGVLP3X
3aL2j/5CBy0/0m73EXR2YS68UvB+l8h1XUEYk+mi/SmN4x9QloW8reUCbb4CXmNr
3qlYpomQmwBjLsINvXlHgEG+mnqHNBvfCh3mZxcpvcT6wBtc6K1B6o3ThaV1qFbI
9/lDJ/ECgYEAu0QN7o/4PIgHSczUWzaC6hImagvJ4PcPH63hNVJaKborwlUrkT5X
lQNpSLMyK9kRd7TyABC0sZ9+UdRCHUuC7iXfn4RT98DiyuKpmtM/2ATnKuZ6Zzh3
WLRC93/mYz9/mp+GmvDDzeHJxrRK+LP4zsPuk0fXSF6i3Z9PjJ0Rvy8CgYEAvfQC
MXV4i5DhG+FnBMTDV0JGjDdyRaupwatowdQ19n9xvEscglQcY/NvJx+Q+lktWCiJ
F/BEbxe0C5QDZADat99u7x8rwBIl8o6nJHqzYbbCcUT7e6fIS+8gSpFgOaXtD0n0
/SfvYPyJp6aTRZt/aGpwlADqJrjkm2SBGT8I880CgYA59mWNirheHAiNej3cgbHh
u35yYnW5ER94QbysYXIQ6lPzEaOrkC1RrT2gR/7mfYifkb058fHL7L8PmvBf2uiK
x+RAnpfS3rwT6jZu+qYPOe1HZRFL87lVFm6H5umrnJLljC0AtjcU+acXvuRZuHLx
pMmqgpkLCGfGyzG3J0K/9wKBgQCb4SLvnXvn5GOm8okM07+N2vhz1ohy/hVXtidI
cLI774fRQj5KAWYu67U6gOADYa0hXFpsh6JRHD2HBtbleQIDxFqP5p+LhhkX/NLS
z9JnDIhyVW6eoihvj/OK3dP+Wti4JDPkj6IUkAkSyFKw25Nph3eNLVb5od8QWiDL
K/xXvQKBgEWAvAas9yGhgSEhgX9xMyGbll8CLie6Xd9VwqF9gnlkoYLUOcOxME9K
CU1j/dryAED1pjtZbkYS40hbzoWiw/Qvt5deQPzbKAn19C/RZK+5EnCNzkUgHlk6
5KPMzlXZ3nCwrnAYF12ItziAP3gDlpRbJqQGPCkVruY2teQjQOxU
-----END RSA PRIVATE KEY-----

9
test/cluster/keys/min1.pub

@ -0,0 +1,9 @@
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAivO8wR28TXAcKJhZmt+8
w9Dc/KpqakkjHVea3ujBweLSmajjqJPwd9DkdzjwygZBLNTYm24DSljBHcolG/tB
yZxM6/lP8HIWCJqxSaIeW6L0Hwabfyj/OU/mHbNH51HXzwnRkOsNWp1X+wU7cSJy
BncA1IrObMw27A814h6y5CbYG6gcmDk3WkljDjx29uzNY+Sd7lPpbLy9p2z5eMh2
crCi+mgXrJmWZSLtlXHvDKFQhWZoBJbZzs4hdjAia7y9QScbTra1rIxBYYEwiuOs
ymCVkGNyX18lCuu4DFop22QnlbqzY0LzlYUlSUndLQraTDqh7D5HScUzj83jKie1
owIDAQAB
-----END PUBLIC KEY-----

27
test/cluster/keys/min2.pem

@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA1HA3HZrHBBeS22+ocqidpvY4nymcNjnpnytnRWzbPyLJHPmM
dPYGkmttaeApUtOFKaqmJ9WQoNvyEdrWgkRuMBl++1LavSqL1GDhxkz/nM/JI3vq
VByhyC7EFhMxtvltE8bqIk4CvPM2Ya+1iEL1f8vahigUNQU7TRq6Yi02w4xnL0sb
R5J8w/7DX5EvO8Se4mG6+0mb4EWg2UnYWdZO3BHpv0OrrA9uEzF+j02/R6JclFGg
3h1COc9aOlJ5q8rrd+4q+et/Q1JBo9cVV+9QiuJg62CwpfI2sPAihEts7SYKpOIn
5THt0dCVCv8/JGvBWdBnlcyeNSA/oWPbyMqJOwIDAQABAoIBAEMuHW/iQ2962PlF
7TodMoXbNXq32OuZEtVAD4935jmoEXt1O0K9jsR87oPd3JORynmrupG8Stlj1MBq
uQ1HAKV7Wpm10PCjZMbLwHpKXUdEunHbPPZOe6bniyED/uPDKwhnDiG9E8aXDyqD
O2AU9LfuSnPEdudxeRhgDHMBo2DhEL7ehKLAbpcusOiAQtevunYIKtLmpXKlOZ13
GUVgPa04meJaYu2grXAnC3pTMiGoGUO5HO/eDTPUirbZKBBMCLufiGQJq19C5NS4
FWj9nLDS1Bl8q+gnlLV6/LBC7Ieojkrv1zwKR5D+W4CskXt76dt1DfBmDCWbX+78
dd8biPECgYEA1uB8JCK1QZ+1QxaNzjLqOKLrePJ1O9grOV0NosqALJO6xDch5qnY
Fzr6tN39Yhd1dGP9Gyh4KB4t1RBQN4EmHDdbX3NdPmdYXH9MypXmTsap8cJdDVq+
iemGuyRP5kmbaL0Yobyjv1s9Ttd9oII5LBHdF9RS8tm1KnPN1oesMVkCgYEA/RhB
+6+wqPIMD1vV/iGDc0H8hCFkcn6geN5jui4RlBDNJWvRN5mie097L83Qhm8hxCjX
DXLOoRtf7FARUSHC5jT4rRH/0JDlYHwLYjOZ8IedLhKJNcTHYnRu5gHG3vZjC00J
a4dKaN+enqrgnmXzbAUgPntTvcQle8vDik47SLMCgYBEsGI+0vGKVtmE5rLSFaiW
Dk6jzS34wXOf1MVFIuKyXU845j7qE6VGV85I/yW+s60SVdxVUCyI9ozELYDXHWvn
XTLSYniOOE8g0njj0eNbj1pINE+2sylxwLsXG9aG0UTiyIAVQ848n5gLmgtIwhgw
pE0/DtqtUzb8qSRFzf0XkQKBgQCoOP9icpxRLtClRL0vdMcSTMGycR96mn++1tIi
ZYx5hdFVFhyxgARnQaT3WS1IrYUcBKkr3ytIGhHf2DgqXO5WZM8E+fm2fxh20Pwg
AXxIS1tFzDw26Nw9rHYpmvS8LbgXQtUIC5yBqGCdxaYWolzxZ1bPMNmwQDdJ2V3X
B7iP0QKBgFFNWvsKcTrKmAe+9XOgH2TH9pzpiLxY6k6qo2psRB6JjNB9O9kVXhUc
O49A+IVlhfrTAsT2/ygXhyGLPdDBQUyXu+mquiteg4lgVmzjOveEMXzwgjb94qdH
JsDSYLbuG6MfY6BztXALzTCXlo/mgWjY4NZPpDX5qUyfrgts+Xko
-----END RSA PRIVATE KEY-----

9
test/cluster/keys/min2.pub

@ -0,0 +1,9 @@
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1HA3HZrHBBeS22+ocqid
pvY4nymcNjnpnytnRWzbPyLJHPmMdPYGkmttaeApUtOFKaqmJ9WQoNvyEdrWgkRu
MBl++1LavSqL1GDhxkz/nM/JI3vqVByhyC7EFhMxtvltE8bqIk4CvPM2Ya+1iEL1
f8vahigUNQU7TRq6Yi02w4xnL0sbR5J8w/7DX5EvO8Se4mG6+0mb4EWg2UnYWdZO
3BHpv0OrrA9uEzF+j02/R6JclFGg3h1COc9aOlJ5q8rrd+4q+et/Q1JBo9cVV+9Q
iuJg62CwpfI2sPAihEts7SYKpOIn5THt0dCVCv8/JGvBWdBnlcyeNSA/oWPbyMqJ
OwIDAQAB
-----END PUBLIC KEY-----

27
test/cluster/keys/min3.pem

@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAtir2HZ/CoT93HRHrj1IYPt91X63TAk6u+khbq1mGdf2QmhrW
s+OTGFVZh0pMFax0jJvJUIkii4jaehemJUtZzkmqfyS8Sk/Nlzg7FCokjnwqIftM
Q2+9PBcY2R3YSOoEuaNMpCbrBzTfrih3rKHM/pRJ/hOIPQ7XaKrqh+/L695AJXPH
FYvZx4DOX2RdCoGvuN4utJmGDDpF0jPEp8J/aV9hov/vPC0auuPBiIAGyPsRsI4a
IW5ghBZmGBILqkg7WO8Jyg6CVa0bU3ynr64Wltjz4mocH4vV1uOa7gxShXkyKROw
sDiOS7GRBKPqKkHpbMGRfBXEafIirS+6xzc2ewIDAQABAoIBAA68zwh6gk51Sfeq
GXqQ07FSdrZ045tOLk3FSNVF+uDU0LwG69PF14KidQnC8wDV4N/3QoQndAoB2lsC
Ssi9ndhYkViT6j/A0Qso2264Mhjs5qO1JuhVw+N2ouX9yh+r/xHdqjelhmIg3u/C
ClyHAoSeDpZlkiIOb1LicPLqbX75awpcSOkuMNtfa3XBW6BPPSgQh8QMF9CRs6fJ
xUNBRLjsUFLV6LUESei3DIbZQPwJwX+TzsMVtYTawQHwazNRsTB2yV4JJMA/6NKR
Txhr5VMuDhx9yMbsM/ye2r644Ha7RWS0ZxghaJi6XDpfm7GwJBVtFb8r14z9uTa3
acDsIsECgYEAy404/uKDq5CGMiATIXBQZkmtKpSBZxGalRAfSqZw5WJFv+Z1pc5I
4OxUoq7qS1TRyCXftbZyeo03gzqpCti4CTZovOOtG/+x0UVgUxz7ggpD4h+D/xM4
CfrOKizhhaUHJFJqG5RvehWKb/sTWiPSXmyeq3jJ3ZcvsVp2N8nIfdECgYEA5Rs1
HqcmNg7LJ9OzqjAerNX0SJBP8Y91F+qqfdF+BhPMByxamspzlWabOmBnSpnJaxUx
OX+5JCBhpR/5BtGFKaEgI+ppYHl8iooADWp6SzPd6lXhIJZGVF27qdimvEk73641
540hmJlIAymiCbvkyWdoLV0fvEseEz7NME/oBosCgYEAqc8hmjk7oRfLa+uoKgA5
gmu6Y8hJ/8MG044EnNEnY6VNDN9kjDMAR2vA24rSeI/FBpTaAQy4ihZfFkIMnbjY
Jw9V5yaE1tPD8xJOXmfSRdTsdqrWAih1WpX6AeM5LLXUtG9wh5uYOB/aQrsRlORH
bnBtGh2FQjALIIiYEMhsUtECgYAlVBeFlQpeyG5FYPLnCcwVsQ6KPCkqXIthiDSb
J2T3LIaTrKBelBnc/8jO7CIoP4JX1i4dBjhuMHB4bQswFzcxHzWTZIAi3ehy0iVM
Cks+sYa4xaFWo+V1nYgUFl6kUvJUcZgK0C3nJSJckY37NAgE4LpSmdev4DVYQWVB
N+PAHQKBgHLSijHknPIeXUzqmSpnsGy+QHY5bgVp+0lFOwPdl+jUs9ciJL+D5Agu
WXXbj+57WAKeGjd9rJhAUimAmTitINSlJ9ggNLqqHb3/2oTNKp5pdSjbCVY5S4pp
1lYwCVBwJvXk4SRx11XthNTdCfp3WY1J3chi9srC8P6OXzd9RtQZ
-----END RSA PRIVATE KEY-----

9
test/cluster/keys/min3.pub

@ -0,0 +1,9 @@
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtir2HZ/CoT93HRHrj1IY
Pt91X63TAk6u+khbq1mGdf2QmhrWs+OTGFVZh0pMFax0jJvJUIkii4jaehemJUtZ
zkmqfyS8Sk/Nlzg7FCokjnwqIftMQ2+9PBcY2R3YSOoEuaNMpCbrBzTfrih3rKHM
/pRJ/hOIPQ7XaKrqh+/L695AJXPHFYvZx4DOX2RdCoGvuN4utJmGDDpF0jPEp8J/
aV9hov/vPC0auuPBiIAGyPsRsI4aIW5ghBZmGBILqkg7WO8Jyg6CVa0bU3ynr64W
ltjz4mocH4vV1uOa7gxShXkyKROwsDiOS7GRBKPqKkHpbMGRfBXEafIirS+6xzc2
ewIDAQAB
-----END PUBLIC KEY-----

12
test/pillar/prometheus.sls

@ -0,0 +1,12 @@
prometheus:
server:
config:
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9100']

3
test/pillar/top.sls

@ -0,0 +1,3 @@
base:
'*':
- prometheus

3
test/salt/top.sls

@ -0,0 +1,3 @@
base:
'*':
- prometheus

37
test/single/Vagrantfile

@ -0,0 +1,37 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
config.vm.box = "bento/ubuntu-16.04"
if Vagrant.has_plugin?("vagrant-cachier")
config.cache.scope = :box
end
config.vm.provision :shell, inline: "sudo locale-gen en_IE.UTF-8"
config.vm.network "forwarded_port", guest: 9090, host: 9090, auto_correct: true
config.vm.network "forwarded_port", guest: 9100, host: 9100, auto_correct: true
config.vm.hostname = "prometheus-formula"
config.vm.synced_folder "../../prometheus", "/srv/formulas/prometheus"
config.vm.synced_folder "../salt", "/srv/salt"
config.vm.synced_folder "../pillar", "/srv/pillar/"
# Testing with tox and testinfra
# config.vm.synced_folder "../testinfra", "/vagrant/testinfra"
config.vm.provider "virtualbox" do |vb|
vb.name = "prometheus-formula"
vb.memory = "1024"
end
config.vm.provision :salt do |salt|
salt.masterless = true
salt.minion_config = "conf/minion"
salt.run_highstate = true
end
#config.vm.provision "shell", inline: "sudo pip install tox"
#config.vm.provision "test", type: "shell" do |t|
# t.inline = "tox -c /vagrant/tox.ini"
#end
end

13
test/single/conf/minion

@ -0,0 +1,13 @@
file_client: local
fileserver_backend:
- roots
file_roots:
base:
- /srv/salt
- /srv/formulas
grains:
roles:
- prometheus

6
test/single/tox.ini

@ -0,0 +1,6 @@
[tox]
skipsdist = True
[testenv]
deps = testinfra
commands = testinfra -v

2
test/testinfra/test_prometheus.py

@ -0,0 +1,2 @@
def test_prometheus(User):
assert User("prometheus").exists
Loading…
Cancel
Save