Files
mgmt/modules/prometheus/main.mcl
James Shubin bdc46648ff modules: Add prometheus and grafana modules
These are really stubs, and need some more testing and integration, but
there were some people who expressed interest in this, so let's push it
early.
2025-02-03 04:46:44 -05:00

252 lines
5.8 KiB
Plaintext

import "deploy"
import "fmt"
import "golang"
import "golang/strings" as golang_strings
import "golang/strconv" as golang_strconv
import "local"
import "os"
import "strings"
class server() {
pkg "golang-github-prometheus" { # fedora
state => "installed",
Before => File["/etc/prometheus/"],
Before => Svc["prometheus"],
}
file "/etc/prometheus/" {
state => $const.res.file.state.exists,
recurse => true,
purge => true,
owner => "prometheus",
group => "root",
mode => "u=rwx,g=rx,o=", # dir
}
file "${vardir}prometheus.yml.header" {
state => $const.res.file.state.exists,
content => golang.template(deploy.readfile("/files/prometheus.yml.tmpl")),
owner => "root",
group => "root",
mode => "u=rw,go=",
}
file "/etc/prometheus/prometheus.yml" {
state => $const.res.file.state.exists,
fragments => [
"${vardir}prometheus.yml.header", # also pull this one file
"${vardir}jobs.d/", # pull from this dir
],
owner => "prometheus",
group => "root",
mode => "u=rw,g=r,o=",
Notify => Svc["prometheus"],
}
svc "prometheus" {
state => "running",
startup => "enabled",
}
# permissions are important for this dir, make sure they're correct
file "/var/lib/prometheus/" {
state => $const.res.file.state.exists,
owner => "prometheus",
group => "root",
mode => "u=rwx,g=rx,o=", # dir
}
$vardir = local.vardir("prometheus/")
# Add the default exporter.
include job("node", struct{
#host => "localhost",
#port => 9100,
})
}
class server:job_base() {
file "${vardir}jobs.d/" {
state => $const.res.file.state.exists,
recurse => true,
purge => true,
owner => "root",
group => "root",
mode => "u=rwx,go=", # dir
}
}
class server:job($name, $st) {
# XXX: document why this is named job_base instead of base:job_base or
# change the compiler to use the second version?
include job_base
$host = $st->host || "localhost"
$port = $st->port || 9100
$comment = $st->comment || ""
$tmpl = struct{
name => "${name}",
host => "${host}",
port => fmt.printf("%d", $port),
comment => "${comment}",
}
file "${vardir}jobs.d/${name}.job" {
state => $const.res.file.state.exists,
content => golang.template(deploy.readfile("/files/prometheus.yml.frag.tmpl"), $tmpl),
owner => "root",
group => "root",
mode => "u=rw,go=",
}
}
class exporter() {
if os.is_family_redhat() { # we only use fedora atm
pkg "node-exporter" { # fedora
state => "installed",
#Before => File["/etc/default/prometheus-node-exporter"],
Before => Svc["prometheus-node-exporter"],
}
}
if os.is_family_debian() {
pkg "prometheus-node-exporter" { # debian
state => "installed",
#Before => File["/etc/default/prometheus-node-exporter"],
Before => Svc["prometheus-node-exporter"],
}
}
# TODO: manage /etc/default/prometheus-node-exporter
svc "prometheus-node-exporter" {
state => "running",
startup => "enabled",
}
}
class postgresql_base() {
#if os.is_family_redhat() {
# pkg [
# "", # XXX: No obvious Fedora package available
# ] {
# state => "installed",
# }
#}
if os.is_family_debian() {
pkg [
"prometheus-postgres-exporter",
] {
state => "installed",
Before => Svc["prometheus-postgres-exporter"],
}
}
# systemd service template file to allow for multiple of these
file "/etc/systemd/system/prometheus-postgres-exporter@.service" {
state => $const.res.file.state.exists,
content => deploy.readfile("/files/prometheus-postgres-exporter.service.tmpl"),
owner => "root",
group => "root",
mode => "u=rw,go=r",
# Depend => Pkg["prometheus-postgres-exporter"],
# Before => Svc["prometheus-postgres-exporter"],
}
}
# We call this postgresql instead of postgres.
# XXX: you may not wish to have spaces in your passwords
class postgresql($config) {
include postgresql_base
$host = $config->host || "127.0.0.1"
$port = $config->port || 5432
$user = $config->user || "prometheus"
$pass = $config->pass || ""
$dbname = $config->dbname || ""
$sslmode = $config->sslmode || false
$listen_port = $config->listen_port || 9187
panic($port <= 0)
$h = if $host == "" {
""
} else {
"host=${host}"
}
$o = fmt.printf("port=%d", $port)
$u = if $user == "" {
""
} else {
"user=${user}"
}
$p = if $pass == "" {
""
} else {
"password=${pass}"
}
$d = if $dbname == "" {
""
} else {
"dbname=${dbname}"
}
$m = if $sslmode {
""
} else {
"sslmode=disable"
}
$l = [$h, $o, $u, $p, $d, $m,] # filter out empties first (IT'S REQUIRED)
$dsn = strings.join_nonempty($l, " ") # trailing spaces break this exporter
$str_port = golang_strconv.itoa($port)
$str_listen_port = golang_strconv.itoa($listen_port)
$args = "--web.listen-address=:${str_listen_port}"
$tmpl = struct{
# DATA_SOURCE_NAME='postgresql://login:password@hostname:port/' # untested?
# DATA_SOURCE_NAME='user=prometheus host=/run/postgresql dbname=postgres' # untested?
# DATA_SOURCE_NAME='host=127.0.0.1 port=5432 user=prometheus password=hunter2 dbname=postgres sslmode=disable' # works
port => $port,
dsn => $dsn,
args => $args,
}
file "/etc/default/prometheus-postgres-exporter-${str_port}" {
state => $const.res.file.state.exists,
content => golang.template(deploy.readfile("/files/prometheus-postgres-exporter.default.tmpl"), $tmpl),
owner => "prometheus",
group => "root",
mode => "ug=rw,o=",
Depend => Pkg["prometheus-postgres-exporter"],
Before => Svc["prometheus-postgres-exporter@${str_port}"],
}
svc "prometheus-postgres-exporter@${str_port}" {
state => "running",
startup => "enabled",
}
$vardir = local.vardir("prometheus/")
# there can only be one on each listen port!
# if more than one of these is set on the same machine we'd error
file "${vardir}postgresql-${str_listen_port}" {
state => $const.res.file.state.exists,
content => "${str_port}",
owner => "root",
group => "root",
mode => "u=rw,go=",
}
}