diff --git a/manifests/prometheus/export_scrape_config.pp b/manifests/prometheus/export_scrape_config.pp new file mode 100644 index 0000000..471e4cf --- /dev/null +++ b/manifests/prometheus/export_scrape_config.pp @@ -0,0 +1,14 @@ +# Export a scrape config to the configured prometheus server +define profile::prometheus::export_scrape_config ( + String $target, + String $job = $name, + Optional[String] $prometheus_server = undef, + Hash[String, String] $labels = {}, +) { + @@profile::prometheus::scrape_config {"${facts['swh_hostname']['short']}_${name}": + prometheus_server => pick($prometheus_server, lookup('prometheus::server::certname')), + target => $target, + job => $job, + labels => $labels, + } +} diff --git a/manifests/prometheus/node.pp b/manifests/prometheus/node.pp index 7e34537..983e3d0 100644 --- a/manifests/prometheus/node.pp +++ b/manifests/prometheus/node.pp @@ -1,46 +1,51 @@ # Prometheus configuration for nodes class profile::prometheus::node { include profile::prometheus::apt_config $defaults_file = '/etc/default/prometheus-node-exporter' package {'prometheus-node-exporter': ensure => latest, notify => Service['prometheus-node-exporter'], } service {'prometheus-node-exporter': ensure => 'running', enable => true, require => [ Package['prometheus-node-exporter'], File[$defaults_file], ] } $lookup_defaults_config = lookup('prometheus::node::defaults_config', Hash) $listen_network = lookup('prometheus::node::listen_network', Optional[String], 'first', undef) $listen_address = lookup('prometheus::node::listen_address', Optional[String], 'first', undef) $actual_listen_address = pick($listen_address, ip_for_network($listen_network)) $listen_port = lookup('prometheus::node::listen_port') + $target = "${actual_listen_address}:${listen_port}" $defaults_config = deep_merge( $lookup_defaults_config, { web => { - listen_address => "${actual_listen_address}:${listen_port}", + listen_address => $target, }, } ) # Uses $defaults_config file {$defaults_file: ensure => 'present', owner => 'root', group => 'root', mode => '0644', content => template('profile/prometheus/node/prometheus-node-exporter.defaults.erb'), require => Package['prometheus-node-exporter'], notify => Service['prometheus-node-exporter'], } + + profile::prometheus::export_scrape_config {'node': + target => $target, + } } diff --git a/manifests/prometheus/scrape_config.pp b/manifests/prometheus/scrape_config.pp new file mode 100644 index 0000000..314fdae --- /dev/null +++ b/manifests/prometheus/scrape_config.pp @@ -0,0 +1,26 @@ +# Scrape configuration for a prometheus exporter +define profile::prometheus::scrape_config ( + String $prometheus_server, + String $target, + String $job, + Hash[String, String] $labels = {}, + +){ + $directory = $profile::prometheus::server::scrape_configs_dir + file {"${directory}/${name}.yaml": + ensure => 'present', + owner => 'root', + group => 'root', + mode => '0644', + content => inline_yaml( + [ + { + targets => [$target], + labels => { + job => $job, + } + $labels, + }, + ] + ), + } +} diff --git a/manifests/prometheus/server.pp b/manifests/prometheus/server.pp index 6e6ab13..01e53c0 100644 --- a/manifests/prometheus/server.pp +++ b/manifests/prometheus/server.pp @@ -1,79 +1,109 @@ # Configure the Prometheus server class profile::prometheus::server { include profile::prometheus::apt_config - $config_file = '/etc/prometheus/prometheus.yml' + $config_dir = '/etc/prometheus' + $config_file = "${config_dir}/prometheus.yml" $defaults_file = '/etc/default/prometheus' + $scrape_configs_dirname = 'exported-configs' + $scrape_configs_dir = "${config_dir}/${scrape_configs_dirname}" $global_config = {} $rule_files = [] $scrape_configs = [] $remote_read = [] $remote_write = [] $alert_relabel_configs = [] $alertmanagers = [] $full_config = { global => $global_config, rule_files => $rule_files, - scrape_configs => $scrape_configs, + scrape_configs => $scrape_configs + [ + { + job_name => 'exported', + file_sd_configs => [ + { + files => [ + "${scrape_configs_dirname}/*.yaml", + ] + }, + ] + }, + ], alerting => { alert_relabel_configs => $alert_relabel_configs, alertmanagers => $alertmanagers, }, remote_read => $remote_read, remote_write => $remote_write, } $lookup_defaults_config = lookup('prometheus::server::defaults_config', Hash) $listen_network = lookup('prometheus::server::listen_network', Optional[String], 'first', undef) $listen_address = lookup('prometheus::server::listen_address', Optional[String], 'first', undef) $actual_listen_address = pick($listen_address, ip_for_network($listen_network)) $listen_port = lookup('prometheus::server::listen_port') + $target = "${actual_listen_address}:${listen_port}" $defaults_config = deep_merge( $lookup_defaults_config, { web => { - listen_address => "${actual_listen_address}:${listen_port}", + listen_address => $target, }, } ) + profile::prometheus::export_scrape_config {'prometheus': + target => $target, + } + package {'prometheus': ensure => latest, notify => Service['prometheus'], } service {'prometheus': ensure => 'running', enable => true, require => [ Package['prometheus'], File[$config_file], File[$defaults_file] ], } file {$config_file: ensure => 'present', owner => 'root', group => 'root', mode => '0644', require => Package['prometheus'], notify => Service['prometheus'], content => inline_yaml($full_config), } + file {$scrape_configs_dir: + ensure => 'directory', + owner => 'root', + group => 'root', + mode => '0644', + require => Package['prometheus'], + recurse => true, + purge => true, + } + # Uses $defaults_config file {$defaults_file: ensure => 'present', owner => 'root', group => 'root', mode => '0644', content => template('profile/prometheus/server/prometheus.defaults.erb'), require => Package['prometheus'], notify => Service['prometheus'], } + Profile::Prometheus::Scrape_config <<| prometheus_server == $::certname |>> }