1、服务配置脚本
自动化创建 Prometheus 服务,确保其随系统启动并平稳运行。
#!/bin/bash
# 配置 Prometheus 为 systemd 服务并验证
SERVICE_FILE="/etc/systemd/system/prometheus.service"
echo "配置 Prometheus systemd 服务..."
cat <<EOF | sudo tee $SERVICE_FILE
[Unit]
Description=Prometheus 监控系统
After=network.target
[Service]
User=nobody
ExecStart=/usr/local/bin/prometheus --config.file=/opt/prometheus/prometheus.yml --storage.tsdb.path=/opt/prometheus/data
Restart=always
[Install]
WantedBy=multi-user.target
EOF
# 重载并启用服务
if sudo systemctl daemon-reload && sudo systemctl enable prometheus && sudo systemctl start prometheus; then
echo "Prometheus 服务成功配置并启动。"
else
echo "错误:配置或启动 Prometheus 服务失败。检查日志获取详情。"
exit 1
fi
为 Prometheus 设置 systemd 服务。
Prometheus 随系统启动,可像其他服务一样管理。
2、Alertmanager 集成
此脚本自动化 Alertmanager 与 Prometheus 的集成,用于报警。
#!/bin/bash
# 集成 Alertmanager 到 Prometheus 配置
PROMETHEUS_CONFIG="/opt/prometheus/prometheus.yml"
echo "集成 Alertmanager 到 Prometheus..."
if grep -q "alertmanagers" $PROMETHEUS_CONFIG; then
echo "Alertmanager 配置已存在于 $PROMETHEUS_CONFIG。"
else
cat <<EOF | sudo tee -a $PROMETHEUS_CONFIG
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093']
EOF
echo "Alertmanager 配置已添加到 $PROMETHEUS_CONFIG。"
sudo systemctl restart prometheus && echo "Prometheus 重启成功。"
fi
将 Alertmanager 配置添加到 prometheus.yml 文件。
重启 Prometheus 以应用更改。
3、自动化导出器设置
Prometheus 使用导出器抓取指标。此脚本自动化安装和配置 Node Exporter。
#!/bin/bash
# 安装并配置 Node Exporter
VERSION=${1:-"1.7.0"} # 默认 Node Exporter 版本
BIN_DIR="/usr/local/bin"
SERVICE_FILE="/etc/systemd/system/node_exporter.service"
echo "安装 Node Exporter 版本 $VERSION..."
if wget -q https://github.com/prometheus/node_exporter/releases/download/v$VERSION/node_exporter-$VERSION.linux-amd64.tar.gz; then
tar -xzf node_exporter-$VERSION.linux-amd64.tar.gz
sudo mv node_exporter-$VERSION.linux-amd64/node_exporter $BIN_DIR/
sudo useradd -M -r -s /bin/false node_exporter || echo "用户 node_exporter 已存在。"
# 创建 systemd 服务
cat <<EOF | sudo tee $SERVICE_FILE
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
ExecStart=$BIN_DIR/node_exporter
Restart=always
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable node_exporter && sudo systemctl start node_exporter
echo "Node Exporter 已安装并作为服务运行。"
else
echo "错误:下载 Node Exporter 版本 $VERSION 失败。检查版本并重试。"
exit 1
fi
安装 Node Exporter 并为其设置 systemd 服务。
系统指标可供 Prometheus 使用。
4、自动化规则创建
此脚本为 Prometheus 创建报警规则,如监控 CPU 使用率或内存消耗。
#!/bin/bash
# 添加报警规则到 Prometheus 并验证
RULES_FILE="/opt/prometheus/alert_rules.yml"
PROMETHEUS_CONFIG="/opt/prometheus/prometheus.yml"
echo "添加报警规则..."
if ! grep -q "alert_rules.yml" $PROMETHEUS_CONFIG; then
cat <<EOF | sudo tee -a $PROMETHEUS_CONFIG
rule_files:
- $RULES_FILE
EOF
echo "规则文件已链接到 Prometheus 配置。"
fi
# 创建报警规则
cat <<EOF | sudo tee $RULES_FILE
groups:
- name: example_alerts
rules:
- alert: HighCPUUsage
expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 2m
labels:
severity: warning
annotations:
summary: "检测到高 CPU 使用率"
description: "实例 {{ $labels.instance }} 在过去 2 分钟内 CPU 使用率超过 80%。"
EOF
sudo systemctl restart prometheus && echo "报警规则已添加,Prometheus 已重启。"
创建规则文件以监控系统性能。
Prometheus 根据定义的阈值触发报警。
5、Grafana 仪表盘导入
此脚本使用 Grafana API 自动化仪表盘导入。
#!/bin/bash
# 导入 Grafana 仪表盘 JSON 文件
GRAFANA_URL=${1:-"http://localhost:3000"}
DASHBOARD_FILE=${2:-"/path/to/dashboard.json"}
API_KEY=${3:-"your_api_key"}
echo "从 $DASHBOARD_FILE 导入 Grafana 仪表盘到 $GRAFANA_URL..."
if [ ! -f "$DASHBOARD_FILE" ]; then
echo "错误:仪表盘文件 $DASHBOARD_FILE 不存在。"
exit 1
fi
response=$(curl -s -o /dev/null -w "%{http_code}" -X POST -H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d @"$DASHBOARD_FILE" "$GRAFANA_URL/api/dashboards/db")
if [ "$response" -eq 200 ]; then
echo "仪表盘导入成功。"
else
echo "错误:导入仪表盘失败。HTTP 状态码:$response"
exit 1
fi
使用 Grafana API 上传预定义的仪表盘 JSON 文件。
简化仪表盘配置。
6、自动化 PromQL 查询
安排定期 PromQL 查询以生成报告或健康检查。
#!/bin/bash
# 运行 PromQL 查询并显示结果
PROMETHEUS_URL=${1:-"http://localhost:9090"}
QUERY=${2:-"up"}
QUERY_ENDPOINT="$PROMETHEUS_URL/api/v1/query"
echo "运行 PromQL 查询:$QUERY..."
response=$(curl -s "$QUERY_ENDPOINT?query=$QUERY")
if jq -e . >/dev/null 2>&1 <<<"$response"; then
echo "查询结果:"
echo "$response" | jq '.data.result[] | {metric: .metric, value: .value}'
else
echo "错误:获取查询结果失败。确保 Prometheus 在 $PROMETHEUS_URL 可访问。"
exit 1
fi
自动化 PromQL 查询并格式化输出以提高可读性。
适用于定期健康检查。
7、Slack 报警通知
将 Slack 与 Alertmanager 集成,提供实时报警通知。
#!/bin/bash
# 配置 Slack 通知
cat <<EOF | sudo tee /opt/alertmanager/alertmanager.yml
global:
slack_api_url: 'https://hooks.slack.com/services/your/slack/webhook'
route:
receiver: slack
receivers:
- name: slack
slack_configs:
- channel: '#alerts'
text: "{{ .CommonAnnotations.summary }}"
EOF
sudo systemctl restart alertmanager
echo "Slack 通知已配置。"
设置 Alertmanager 向 Slack 频道发送通知。
8、备份脚本
备份 Prometheus 数据和配置。
#!/bin/bash
# 备份 Prometheus 数据目录
DATA_DIR=${1:-"/opt/prometheus/data"}
BACKUP_DIR=${2:-"/backups/prometheus"}
TIMESTAMP=$(date +"%Y%m%d%H%M%S")
echo "从 $DATA_DIR 备份 Prometheus 数据到 $BACKUP_DIR..."
if [ ! -d "$DATA_DIR" ]; then
echo "错误:Prometheus 数据目录 $DATA_DIR 不存在。"
exit 1
fi
sudo mkdir -p "$BACKUP_DIR"
sudo tar -czvf "$BACKUP_DIR/prometheus_backup_$TIMESTAMP.tar.gz" "$DATA_DIR"
if [ $? -eq 0 ]; then
echo "备份完成:$BACKUP_DIR/prometheus_backup_$TIMESTAMP.tar.gz"
else
echo "错误:备份失败。检查权限和磁盘空间。"
exit 1
fi
压缩并保存 Prometheus 数据,以备恢复。
9、自动化配置验证
在应用更改前验证 prometheus.yml,避免错误。
#!/bin/bash
# 验证 Prometheus 配置
CONFIG_FILE="/opt/prometheus/prometheus.yml"
PROMTOOL_CMD="promtool"
# 检查 promtool 是否已安装
if ! command -v $PROMTOOL_CMD &> /dev/null; then
echo "错误:promtool 未安装或不在 PATH 中。"
exit 1
fi
# 检查配置文件是否存在
if [ ! -f "$CONFIG_FILE" ]; then
echo "错误:配置文件 '$CONFIG_FILE' 未找到。"
exit 1
fi
# 验证 Prometheus 配置
$PROMTOOL_CMD check config "$CONFIG_FILE"
if [ $? -eq 0 ]; then
echo "配置有效。"
else
echo "配置验证失败。"
fi
使用 promtool 检查 Prometheus 配置语法。
防止配置错误导致服务中断。
10、Alertmanager 接收器测试脚本
此脚本向 Alertmanager 发送测试报警,检查其是否按预期工作或查找并修复错误。
#!/bin/bash
# 向 Alertmanager 发送测试报警
ALERTMANAGER_URL=${1:-"http://localhost:9093"}
RECEIVER=${2:-"default"}
ALERT_FILE=${3:-"/tmp/test_alert.json"}
echo "向 Alertmanager 发送测试报警到 $ALERTMANAGER_URL..."
# 创建测试报警负载
cat <<EOF > $ALERT_FILE
[\
{\
"labels": {\
"alertname": "TestAlert",\
"severity": "info"\
},\
"annotations": {\
"summary": "这是一个测试报警。"\
},\
"startsAt": "$(date -Iseconds)"\
}\
]
EOF
response=$(curl -s -o /dev/null -w "%{http_code}" -X POST -H "Content-Type: application/json" \
-d @"$ALERT_FILE" "$ALERTMANAGER_URL/api/v1/alerts")
if [ "$response" -eq 200 ]; then
echo "测试报警成功发送到接收器:$RECEIVER。"
else
echo "错误:发送测试报警失败。HTTP 状态码:$response"
exit 1
fi
创建可自定义的测试报警 JSON 文件。
11、Prometheus 日志监控脚本
#!/bin/bash
# 监控 Prometheus 日志中的错误
LOG_FILE=${1:-"/var/log/prometheus/prometheus.log"}
TAIL_LINES=${2:-100}
echo "检查 Prometheus 日志 $LOG_FILE 中最后 $TAIL_LINES 行的错误..."
if [ ! -f "$LOG_FILE" ]; then
echo "错误:日志文件 $LOG_FILE 不存在。"
exit 1
fi
grep -i "error" <(tail -n $TAIL_LINES "$LOG_FILE") || echo "最后 $TAIL_LINES 行中未发现错误。"