添加 使用说明.txt
This commit is contained in:
@@ -0,0 +1,371 @@
|
||||
# /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. 配置告警规则
|
||||
Reference in New Issue
Block a user