""" Monitoring & alerting. - Prometheus Node Exporter - Prometheus server - Grafana - node_exporter + alertmanager bundle - logrotate helper """ from . import register, Generator, Field from . import bash_header, quote, bool_str, yes # ========================== Node Exporter ========================== class NodeExporter(Generator): id = "node_exporter" title = "Prometheus Node Exporter" category = "monitoring" icon = "📊" tags = ["prometheus", "node_exporter", "monitoring"] description = "安装 Prometheus node_exporter,默认监听 9100。" fields = [ Field("version", "版本", "text", default="1.8.2"), Field("port", "监听端口", "number", default="9100", min_=1, max_=65535), Field("extra_args", "额外参数", "text", default="--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)"), ] def render(self, p): ver = p.get("version", "1.8.2") port = str(p.get("port", "9100")) extra = p.get("extra_args", "") out = [bash_header(self.title)] out.append('log "Installing node_exporter ' + ver + '..."') out.append('useradd -r -s /bin/false node_exporter 2>/dev/null || true') out.append('cd /tmp') out.append('curl -fsSL -O https://github.com/prometheus/node_exporter/releases/download/v' + ver + '/node_exporter-' + ver + '.linux-amd64.tar.gz') out.append('tar -xzf node_exporter-' + ver + '.linux-amd64.tar.gz') out.append('cp node_exporter-' + ver + '.linux-amd64/node_exporter /usr/local/bin/') out.append('rm -rf node_exporter-' + ver + '.linux-amd64*') out.append('cat > /etc/systemd/system/node_exporter.service </dev/null || true') out.append('mkdir -p /etc/prometheus /var/lib/prometheus') out.append('cd /tmp') out.append('curl -fsSL -O https://github.com/prometheus/prometheus/releases/download/v' + ver + '/prometheus-' + ver + '.linux-amd64.tar.gz') out.append('tar -xzf prometheus-' + ver + '.linux-amd64.tar.gz') out.append('cp prometheus-' + ver + '.linux-amd64/prometheus /usr/local/bin/') out.append('cp prometheus-' + ver + '.linux-amd64/promtool /usr/local/bin/') out.append('cp -r prometheus-' + ver + '.linux-amd64/console_libraries /etc/prometheus/') out.append('cp -r prometheus-' + ver + '.linux-amd64/consoles /etc/prometheus/') out.append('rm -rf prometheus-' + ver + '.linux-amd64*') out.append('chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus') out.append('') cfg = ['global:', ' scrape_interval: 15s', ' evaluation_interval: 15s', '', 'rule_files:', ' - "rules/*.yml"', '', 'scrape_configs:', ' - job_name: prometheus', ' static_configs:', ' - targets: [\'localhost:' + port + '\']'] for line in lines: if ':' not in line: continue name, targets = line.split(':', 1) name = name.strip() tg = [t.strip().strip("'").strip('"') for t in targets.strip().lstrip('[').rstrip(']').split(',') if t.strip()] cfg.append(f' - job_name: {name}') cfg.append(' static_configs:') cfg.append(' - targets: ' + str(tg).replace("'", '"')) out.append('cat > /etc/prometheus/prometheus.yml < /etc/systemd/system/prometheus.service < /dev/null\n' ' echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" > /etc/apt/sources.list.d/grafana.list\n' ' apt-get update\n' ' PKG_INSTALL grafana\n' ' ;;\n' ' yum|dnf)\n' ' cat > /etc/yum.repos.d/grafana.repo < /etc/grafana/provisioning/datasources/prometheus.yaml < /etc/logrotate.d/99-shellgen <