Skip to content

Commit

Permalink
Merge pull request voxpupuli#144 from kalinux/master
Browse files Browse the repository at this point in the history
adding remote_write support
  • Loading branch information
tuxmea committed Jan 31, 2018
2 parents a109d02 + 6cc23a7 commit ce4f890
Show file tree
Hide file tree
Showing 8 changed files with 187 additions and 9 deletions.
120 changes: 120 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,25 @@ class { 'prometheus':
localstorage => '/prometheus/prometheus',
}
```
On the server (for prometheus version >= 2.0.0):

```puppet
class { '::prometheus':
version => '2.0.0',
alerts => { 'groups' => [{ 'name' => 'alert.rules', 'rules' => [{ 'alert' => 'InstanceDown', 'expr' => 'up == 0', 'for' => '5m', 'labels' => { 'severity' => 'page', }, 'annotations' => { 'summary' => 'Instance {{ $labels.instance }} down', 'description' => '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.' }}]}]},
scrape_configs => [
{ 'job_name' => 'prometheus',
'scrape_interval' => '10s',
'scrape_timeout' => '10s',
'static_configs' => [
{ 'targets' => [ 'localhost:9090' ],
'labels' => { 'alias' => 'Prometheus'}
}
]
}
]
}
```

or simply:
```puppet
Expand Down Expand Up @@ -94,6 +113,10 @@ alertrules:

When using prometheus >= 2.0, we use the new yaml format (https://prometheus.io/docs/prometheus/2.0/migration/#recording-rules-and-alerts) configuration

```puppet
alerts => { 'groups' => [{ 'name' => 'alert.rules', 'rules' => [{ 'alert' => 'InstanceDown', 'expr' => 'up == 0', 'for' => '5m', 'labels' => { 'severity' => 'page', }, 'annotations' => { 'summary' => 'Instance {{ $labels.instance }} down', 'description' => '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.' } }]}]},
```

```yaml
alerts:
groups:
Expand Down Expand Up @@ -127,6 +150,103 @@ class { 'prometheus::node_exporter':

For more information regarding class parameters please take a look at class docstring.

## Example

Real Prometheus >=2.0.0 setup example including alertmanager and slack_configs.

```puppet
include profiles::prometheus
class { '::prometheus':
version => '2.0.0',
alerts => { 'groups' => [{ 'name' => 'alert.rules', 'rules' => [{ 'alert' => 'InstanceDown', 'expr' => 'up == 0', 'for' => '5m', 'labels' => { 'severity' => 'page', }, 'annotations' => { 'summary' => 'Instance {{ $labels.instance }} down', 'description' => '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.' } }]}]},
scrape_configs => [
{ 'job_name' => 'prometheus',
'scrape_interval' => '10s',
'scrape_timeout' => '10s',
'static_configs' => [
{ 'targets' => [ 'localhost:9090' ],
'labels' => { 'alias'=> 'Prometheus'}
}
]
},
{ 'job_name' => 'node',
'scrape_interval' => '5s',
'scrape_timeout' => '5s',
'static_configs' => [
{ 'targets' => [ 'nodexporter.domain.com:9100' ],
'labels' => { 'alias'=> 'Node'}
}
]
}
],
alertmanagers_config => [{ 'static_configs' => [{'targets' => [ 'localhost:9093' ]}]}],
}
class { '::prometheus::alertmanager':
version => '0.13.0',
route => { 'group_by' => [ 'alertname', 'cluster', 'service' ], 'group_wait'=> '30s', 'group_interval'=> '5m', 'repeat_interval'=> '3h', 'receiver'=> 'slack' },
receivers => [ { 'name' => 'slack', 'slack_configs'=> [ { 'api_url'=> 'https://hooks.slack.com/services/ABCDEFG123456', 'channel' => '#channel', 'send_resolved' => true, 'username' => 'username'}] }]
}
```

the same in hiera

```puppet
rometheus::version: '2.0.0'
prometheus::scrape_configs:
- job_name: 'nodexporter'
scrape_interval: '10s'
scrape_timeout: '10s'
static_configs:
- targets:
- nodexporter.domain.com:9100
labels:
alias: 'nodexporter'
- job_name: prometheus
scrape_interval: 10s
scrape_timeout: 10s
static_configs:
- targets:
- localhost:9090
labels:
alias: Prometheus
prometheus::alerts:
groups:
- name: alert.rules
rules:
- alert: 'InstanceDown'
expr: 'up == 0'
for: '5m'
labels:
'severity': 'page'
annotations:
'summary': 'Instance {{ $labels.instance }} down'
'description': '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes.'
prometheus::alertmanagers_config:
- static_configs:
- targets:
- localhost:9093
prometheus::alertmanager::version: '0.13.0'
prometheus::alertmanager::route:
group_by:
- alertname
- cluster
- service
group_wait: 30s
group_interval: 5m
repeat_interval: 3h
receiver: slack
prometheus::alertmanager::receivers:
- name: slack
slack_configs:
- api_url: https://hooks.slack.com/services/ABCDEFG123456
channel: "#channel"
send_resolved: true
username: username
```
Test you commit with vagrant https://github.com/kalinux/vagrant-puppet-prometheus.git

## Limitations/Known issues

In version 0.1.14 of this module the alertmanager was configured to run as the service `alert_manager`. This has been changed in version 0.2.00 to be `alertmanager`.
Expand Down
12 changes: 10 additions & 2 deletions manifests/alertmanager.pp
Original file line number Diff line number Diff line change
Expand Up @@ -208,9 +208,17 @@
mode => '0755',
}

$options = "-config.file=${prometheus::alertmanager::config_file} -storage.path=${prometheus::alertmanager::storage_path} ${prometheus::alertmanager::extra_options}"
if( versioncmp($::prometheus::alertmanager::version, '0.12.0') == 1 ){
$options = "--config.file=${prometheus::alertmanager::config_file} --storage.path=${prometheus::alertmanager::storage_path} ${prometheus::alertmanager::extra_options}"
} else {
$options = "-config.file=${prometheus::alertmanager::config_file} -storage.path=${prometheus::alertmanager::storage_path} ${prometheus::alertmanager::extra_options}"
}
} else {
$options = "-config.file=${prometheus::alertmanager::config_file} ${prometheus::alertmanager::extra_options}"
if( versioncmp($::prometheus::alertmanager::version, '0.12.0') == 1 ){
$options = "--config.file=${prometheus::alertmanager::config_file} ${prometheus::alertmanager::extra_options}"
} else {
$options = "-config.file=${prometheus::alertmanager::config_file} ${prometheus::alertmanager::extra_options}"
}
}

prometheus::daemon { $service_name:
Expand Down
4 changes: 4 additions & 0 deletions manifests/config.pp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
$rule_files,
$scrape_configs,
$remote_read_configs,
$remote_write_configs,
$config_template = $::prometheus::params::config_template,
$storage_retention = $::prometheus::params::storage_retention,
) {
Expand All @@ -16,6 +17,9 @@
if $remote_read_configs != [] {
fail('remote_read_configs requires prometheus 2.X')
}
if $remote_write_configs != [] {
fail('remote_write_configs requires prometheus 2.X')
}
$daemon_flags = [
"-config.file=${::prometheus::config_dir}/prometheus.yaml",
"-storage.local.path=${::prometheus::localstorage}",
Expand Down
17 changes: 11 additions & 6 deletions manifests/init.pp
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,9 @@
# [*remote_read_configs*]
# Prometheus remote_read config to scrape prometheus 1.8+ instances
#
# [*remote_write_configs*]
# Prometheus remote_write config to scrape prometheus 1.8+ instances
#
# [*alert_relabel_config*]
# Prometheus alert relabel config under alerting
#
Expand Down Expand Up @@ -153,6 +156,7 @@
Array $rule_files = $::prometheus::params::rule_files,
Array $scrape_configs = $::prometheus::params::scrape_configs,
Array $remote_read_configs = $::prometheus::params::remote_read_configs,
Array $remote_write_configs = $::prometheus::params::remote_write_configs,
$alerts = $::prometheus::params::alerts,
Array $alert_relabel_config = $::prometheus::params::alert_relabel_config,
Array $alertmanagers_config = $::prometheus::params::alertmanagers_config,
Expand Down Expand Up @@ -183,12 +187,13 @@
alerts => $alerts,
}
-> class { '::prometheus::config':
global_config => $global_config,
rule_files => $rule_files,
scrape_configs => $scrape_configs,
remote_read_configs => $remote_read_configs,
config_template => $config_template,
storage_retention => $storage_retention,
global_config => $global_config,
rule_files => $rule_files,
scrape_configs => $scrape_configs,
remote_read_configs => $remote_read_configs,
remote_write_configs => $remote_write_configs,
config_template => $config_template,
storage_retention => $storage_retention,
}
-> class { '::prometheus::run_service': }
-> class { '::prometheus::service_reload': }
Expand Down
1 change: 1 addition & 0 deletions manifests/params.pp
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@
$rule_files = [ "${config_dir}/${alertfile_name}" ]
$scrape_configs = [ { 'job_name'=> 'prometheus', 'scrape_interval'=> '10s', 'scrape_timeout'=> '10s', 'static_configs'=> [ { 'targets'=> [ 'localhost:9090' ], 'labels'=> { 'alias'=> 'Prometheus'} } ] } ]
$remote_read_configs = []
$remote_write_configs = []
$shared_dir = '/usr/local/share/prometheus'
$snmp_exporter_config_file = '/etc/snmp-exporter.yaml'
$snmp_exporter_config_template = ''
Expand Down
30 changes: 30 additions & 0 deletions spec/classes/prometheus_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,36 @@
end
end
end

context 'with remote write configured' do
[
{
version: '2.0.0-rc.1',
remote_write_configs: [
'url' => 'http://domain.tld/path'
]
}
].each do |parameters|
context "with prometheus version #{parameters[:version]}" do
let(:params) do
parameters
end

it {
is_expected.to compile
}
it {
is_expected.to contain_file('prometheus.yaml').with(
'ensure' => 'present',
'path' => '/etc/prometheus/prometheus.yaml',
'owner' => 'prometheus',
'group' => 'prometheus',
'content' => %r{http://domain.tld/path}
)
}
end
end
end
end
end
end
1 change: 1 addition & 0 deletions spec/fixtures/files/prometheus2.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,4 @@ alerting:
alert_relabel_configs: []
alertmanagers: []
remote_read: []
remote_write: []
11 changes: 10 additions & 1 deletion templates/prometheus.yaml.erb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
<% rule_files = scope.lookupvar('::prometheus::rule_files') -%>
<% scrape_configs = scope.lookupvar('::prometheus::scrape_configs') -%>
<% remote_read_configs = scope.lookupvar('::prometheus::remote_read_configs') -%>
<% remote_write_configs = scope.lookupvar('::prometheus::remote_write_configs') -%>
<% full_config = {
'global'=>global_config,
'rule_files'=>rule_files,
Expand All @@ -15,6 +16,14 @@
if @prometheus_v2
# this variable has to be absent on 1.X, so we filter using the helper variable
full_config['remote_read'] = remote_read_configs
end
if @prometheus_v2
full_config['remote_write'] = remote_write_configs
end
-%>
<%= if @prometheus_v2
full_config.to_yaml
else
full_config.to_yaml(options = {:line_width => -1}).gsub(/source_labels: ".+?"/) { |x| x.gsub('"', '') }
end
-%>
<%= full_config.to_yaml(options = {:line_width => -1}).gsub(/source_labels: ".+?"/) { |x| x.gsub('"', '') } -%>

0 comments on commit ce4f890

Please sign in to comment.