Files
2026-08-24 10:30:23 +08:00

371 lines
12 KiB
Plaintext

# /etc/systemd/system/veeam-exporter.service
[Unit]
Description=Veeam Backup Prometheus Exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/python3 /opt/veeam_exporter/veeam_exporter.py \
--port 9199 \
--vbr 10.115.13.219 \
--user veeamuser01 \
--password 'Qazx1234!@#$qwer2'
Restart=always
RestartSec=30
[Install]
WantedBy=multi-user.target
# 部署
mkdir -p /opt/veeam_exporter
cp veeam_exporter.py /opt/veeam_exporter/
chmod +x /opt/veeam_exporter/veeam_exporter.py
systemctl daemon-reload
systemctl enable --now veeam-exporter
# 验证
curl http://localhost:9199/metrics
# prometheus.yml
scrape_configs:
- job_name: 'veeam_backup'
scrape_interval: 5m # 备份不需要太频繁
scrape_timeout: 30s
static_configs:
- targets: ['10.150.117.190:9199'] # exporter 所在机器
labels:
vbr_server: 'ussjcvbr01'
{
"annotations": { "list": [] },
"description": "Veeam Backup & Replication 监控面板",
"editable": true,
"fiscalYearStartMonth": 0,
"graphTooltip": 1,
"id": null,
"links": [],
"panels": [
{
"title": "API 状态",
"type": "stat",
"gridPos": { "h": 4, "w": 3, "x": 0, "y": 0 },
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"targets": [{ "expr": "veeam_api_up", "refId": "A" }],
"fieldConfig": {
"defaults": {
"mappings": [
{ "options": { "0": { "text": "DOWN", "color": "red" }, "1": { "text": "UP", "color": "green" } }, "type": "value" }
],
"thresholds": { "steps": [{ "color": "red", "value": null }, { "color": "green", "value": 1 }] }
}
}
},
{
"title": "备份任务总数",
"type": "stat",
"gridPos": { "h": 4, "w": 3, "x": 3, "y": 0 },
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"targets": [{ "expr": "veeam_backup_jobs_total", "refId": "A" }],
"fieldConfig": { "defaults": { "color": { "mode": "fixed", "fixedColor": "blue" } } }
},
{
"title": "24h 成功",
"type": "stat",
"gridPos": { "h": 4, "w": 3, "x": 6, "y": 0 },
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"targets": [{ "expr": "veeam_sessions_success_24h", "refId": "A" }],
"fieldConfig": { "defaults": { "color": { "mode": "fixed", "fixedColor": "green" } } }
},
{
"title": "24h 失败",
"type": "stat",
"gridPos": { "h": 4, "w": 3, "x": 9, "y": 0 },
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"targets": [{ "expr": "veeam_sessions_failed_24h", "refId": "A" }],
"fieldConfig": {
"defaults": {
"thresholds": { "steps": [{ "color": "green", "value": null }, { "color": "red", "value": 1 }] }
}
}
},
{
"title": "24h 警告",
"type": "stat",
"gridPos": { "h": 4, "w": 3, "x": 12, "y": 0 },
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"targets": [{ "expr": "veeam_sessions_warning_24h", "refId": "A" }],
"fieldConfig": {
"defaults": {
"thresholds": { "steps": [{ "color": "green", "value": null }, { "color": "orange", "value": 1 }] }
}
}
},
{
"title": "采集耗时",
"type": "stat",
"gridPos": { "h": 4, "w": 3, "x": 15, "y": 0 },
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"targets": [{ "expr": "veeam_collector_duration_seconds", "refId": "A" }],
"fieldConfig": { "defaults": { "unit": "s" } }
},
{
"title": "备份任务状态总览",
"type": "table",
"gridPos": { "h": 10, "w": 24, "x": 0, "y": 4 },
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"targets": [
{
"expr": "veeam_job_status",
"refId": "A",
"format": "table",
"instant": true
},
{
"expr": "veeam_job_duration_seconds",
"refId": "B",
"format": "table",
"instant": true
},
{
"expr": "veeam_job_last_run_timestamp",
"refId": "C",
"format": "table",
"instant": true
},
{
"expr": "veeam_job_processed_bytes",
"refId": "D",
"format": "table",
"instant": true
}
],
"transformations": [
{
"id": "seriesToColumns",
"options": { "byField": "job_name" }
},
{
"id": "organize",
"options": {
"excludeByName": { "Time 1": true, "Time 2": true, "Time 3": true, "Time 4": true, "__name__ 1": true, "__name__ 2": true, "__name__ 3": true, "__name__ 4": true, "instance 1": true, "instance 2": true, "instance 3": true, "instance 4": true, "job_id 1": true, "job_id 2": true, "job_id 3": true, "job_id 4": true, "type 2": true, "type 3": true, "type 4": true, "platform 2": true, "platform 3": true, "platform 4": true, "Value #2": false, "Value #3": false, "Value #4": false },
"renameByName": {
"job_name": "任务名称",
"platform": "平台",
"type": "类型",
"Value #1": "状态",
"Value #2": "耗时(秒)",
"Value #3": "最后运行",
"Value #4": "处理数据量"
}
}
}
],
"options": {
"sortBy": [{ "displayName": "状态", "desc": true }]
},
"fieldConfig": {
"overrides": [
{
"matcher": { "id": "byName", "options": "状态" },
"properties": [
{
"id": "mappings",
"value": [
{ "options": { "0": { "text": "未知", "color": "gray" }, "1": { "text": "成功", "color": "green" }, "2": { "text": "警告", "color": "orange" }, "3": { "text": "失败", "color": "red" } }, "type": "value" }
]
}
]
},
{
"matcher": { "id": "byName", "options": "耗时(秒)" },
"properties": [{ "id": "unit", "value": "s" }]
},
{
"matcher": { "id": "byName", "options": "最后运行" },
"properties": [{ "id": "unit", "value": "dateTimeFromNow" }]
},
{
"matcher": { "id": "byName", "options": "处理数据量" },
"properties": [{ "id": "unit", "value": "bytes" }]
}
]
}
},
{
"title": "任务状态历史",
"type": "state-timeline",
"gridPos": { "h": 8, "w": 24, "x": 0, "y": 14 },
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"targets": [
{
"expr": "veeam_job_status",
"legendFormat": "{{job_name}}",
"refId": "A"
}
],
"fieldConfig": {
"defaults": {
"mappings": [
{ "options": { "0": { "text": "未知", "color": "gray" }, "1": { "text": "成功", "color": "green" }, "2": { "text": "警告", "color": "orange" }, "3": { "text": "失败", "color": "red" } }, "type": "value" }
],
"color": { "mode": "thresholds" },
"thresholds": { "steps": [{ "color": "gray", "value": null }, { "color": "green", "value": 1 }, { "color": "orange", "value": 2 }, { "color": "red", "value": 3 }] }
}
},
"options": {
"showValue": "always",
"mergeValues": true,
"alignValue": "center"
}
},
{
"title": "任务耗时趋势",
"type": "timeseries",
"gridPos": { "h": 8, "w": 12, "x": 0, "y": 22 },
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"targets": [
{
"expr": "veeam_job_duration_seconds",
"legendFormat": "{{job_name}}",
"refId": "A"
}
],
"fieldConfig": {
"defaults": {
"unit": "s",
"custom": { "lineWidth": 2, "fillOpacity": 10, "pointSize": 5, "showPoints": "auto" }
}
}
},
{
"title": "处理数据量",
"type": "timeseries",
"gridPos": { "h": 8, "w": 12, "x": 12, "y": 22 },
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"targets": [
{
"expr": "veeam_job_processed_bytes",
"legendFormat": "{{job_name}}",
"refId": "A"
}
],
"fieldConfig": {
"defaults": {
"unit": "bytes",
"custom": { "lineWidth": 2, "fillOpacity": 10 }
}
}
},
{
"title": "24h 会话统计趋势",
"type": "timeseries",
"gridPos": { "h": 8, "w": 24, "x": 0, "y": 30 },
"datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" },
"targets": [
{ "expr": "veeam_sessions_success_24h", "legendFormat": "成功", "refId": "A" },
{ "expr": "veeam_sessions_failed_24h", "legendFormat": "失败", "refId": "B" },
{ "expr": "veeam_sessions_warning_24h", "legendFormat": "警告", "refId": "C" }
],
"fieldConfig": {
"defaults": {
"custom": { "lineWidth": 2, "fillOpacity": 20 }
},
"overrides": [
{ "matcher": { "id": "byName", "options": "成功" }, "properties": [{ "id": "color", "value": { "fixedColor": "green", "mode": "fixed" } }] },
{ "matcher": { "id": "byName", "options": "失败" }, "properties": [{ "id": "color", "value": { "fixedColor": "red", "mode": "fixed" } }] },
{ "matcher": { "id": "byName", "options": "警告" }, "properties": [{ "id": "color", "value": { "fixedColor": "orange", "mode": "fixed" } }] }
]
}
}
],
"refresh": "5m",
"schemaVersion": 39,
"templating": {
"list": [
{
"name": "DS_PROMETHEUS",
"type": "datasource",
"query": "prometheus"
}
]
},
"time": { "from": "now-24h", "to": "now" },
"title": "Veeam Backup Monitor",
"uid": "veeam-backup-monitor"
}
# veeam_alerts.yml
groups:
- name: veeam_backup
rules:
# API 不可达
- alert: VeeamAPIUnreachable
expr: veeam_api_up == 0
for: 5m
labels:
severity: critical
annotations:
summary: "Veeam API 不可达"
description: "无法连接 VBR REST API,请检查 VBR 服务状态"
# 备份任务失败
- alert: VeeamBackupFailed
expr: veam_job_status == 3
for: 0m
labels:
severity: critical
annotations:
summary: "备份任务失败: {{ $labels.job_name }}"
description: "任务 {{ $labels.job_name }} ({{ $labels.platform }}) 最近一次执行失败"
# 备份任务警告
- alert: VeeamBackupWarning
expr: veeam_job_status == 2
for: 0m
labels:
severity: warning
annotations:
summary: "备份任务警告: {{ $labels.job_name }}"
# 备份任务超过24小时未运行
- alert: VeeamBackupStale
expr: (time() - veeam_job_last_run_timestamp) > 86400
for: 30m
labels:
severity: warning
annotations:
summary: "备份任务超过24小时未运行: {{ $labels.job_name }}"
description: "任务 {{ $labels.job_name }} 最后运行于 {{ $value | humanizeDuration }} 前"
# 24小时内有失败
- alert: VeeamFailedSessionsExist
expr: veeam_sessions_failed_24h > 0
for: 0m
labels:
severity: warning
annotations:
summary: "过去24小时有 {{ $value }} 个备份任务失败"
# 1. 安装 exporter
mkdir -p /opt/veeam_exporter
cp veeam_exporter.py /opt/veeam_exporter/
# 2. 测试运行
python3 /opt/veeam_exporter/veeam_exporter.py \
--port 9199 \
--vbr 10.115.13.219 \
--user veeamuser01 \
--password 'Qazx1234!@#$qwer2'
# 3. 验证指标
curl http://localhost:9199/metrics
# 4. 配置 systemd
cp veeam-exporter.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable --now veeam-exporter
# 5. Prometheus 添加 target
# 6. Grafana 导入 dashboard JSON
# 7. 配置告警规则