添加 使用说明.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