某沿海风电场部署了100台风力发电机,每台风机每秒产生3条运行数据,整个场站的数据量每秒超过300条。作为风电场的技术架构师,我面临的最大挑战不是数据采集,而是当某台风机出现异常振动时,如何快速定位问题根源。

传统的监控方式已经无法满足这个规模的需求——零散的日志、孤立的服务监控、分散的告警,让故障排查变成了一场灾难。直到我们引入了基于Prometheus+Grafana的完整监控体系,才真正实现了”秒级发现、分钟级定位”的可观测性目标。

监控体系建设的痛点

在项目初期,我们的监控系统存在三个核心问题:

1. 监控数据孤岛化

  • 每个业务系统都有自己的监控方案
  • 数据格式不统一,难以横向对比
  • 缺乏统一的时序数据存储

2. 告警泛滥成灾

  • 没有智能的告警聚合机制
  • 同一个问题重复触发上百次告警
  • 告警风暴导致真正的紧急事件被淹没

3. 故障排查效率低下

  • 无法快速关联上下游服务的状态
  • 缺乏业务维度的监控视角
  • 历史数据查询困难,难以定位根因

最典型的一次故障是:2号风机出现振动异常,由于缺乏完整的监控链路,我们花了3个多小时才定位到是润滑油泵的问题。这3个小时里,风机停机造成了超过10万元的经济损失。

Prometheus核心架构选择

面对风电场的复杂环境,我们选择了Prometheus作为核心监控引擎,主要原因有三个:

1. 多维度数据模型
Prometheus的时序数据模型非常适合风机这种设备监控场景:

1
2
3
4
5
6
7
8
9
10
11
12
# 时序数据格式
{
"metric_name": "wind_vibration_frequency",
"labels": {
"风机编号": "002",
"传感器类型": "振动传感器",
"安装位置": "叶片轴承",
"数据来源": "SCADA系统"
},
"value": 2.34,
"timestamp": "2026-05-30T10:30:00+08:00"
}

2. 强大的查询语言
PromQL让我们可以灵活地分析风机数据:

1
2
3
4
5
6
7
8
# 查询所有风机的平均振动频率
avg(wind_vibration_frequency) by (风机编号)

# 筛选出异常振动风机
wind_vibration_frequency > {风机编号=~"00[0-9]"} 3.5

# 计算风机集群的振动趋势
rate(wind_vibration_frequency[5m]) by (风机编号)

3. 无中心化的架构
风电场往往分布在偏远地区,网络连接不稳定。Prometheus的本地采集能力确保了即使与中心服务器断开,监控数据也不会丢失。

监控数据采集方案

1. Push vs Pull策略选择

我们针对不同类型的服务采用了不同的采集策略:

Pull模式(适用于业务服务)

1
2
3
4
5
6
7
# prometheus.yml 配置
scrape_configs:
- job_name: 'wind-farm-api'
static_configs:
- targets: ['10.0.1.10:8080', '10.0.1.11:8080']
scrape_interval: 15s
metrics_path: /metrics

Push模式(适用于边缘设备)

1
2
3
4
5
6
7
8
9
10
11
# 风机数据推送
curl -X POST -d '{
"series": [{
"metric": "wind_temperature",
"points": [[1633245600, 25.6]],
"tags": {
"风机编号": "002",
"传感器": "温度传感器"
}
}]
}' http://prometheus-pushgateway:9091/metrics/job/wind-farm/instance/002

2. 多级监控部署架构

为了适应风电场的网络环境,我们设计了三级监控架构:

边缘层监控

  • 直接部署在风机控制柜边缘计算节点
  • 采集风机SCADA系统数据
  • 本地缓存网络中断时的数据
    1
    2
    3
    4
    5
    6
    # 边缘节点配置
    edge_monitoring:
    采集频率: 1s
    缓存容量: 1小时
    数据压缩: true
    优先级: 1 # 最高优先级

场站层监控

  • 部署在风电场中心控制室
  • 汇聚所有风机的数据
  • 提供本地的实时监控仪表板
  • 执行基础的数据聚合和告警

云端监控

  • 连接到公司总部的监控系统
  • 跨风电场的统一监控视角
  • 长期数据存储和趋势分析
  • AI驱动的异常检测

3. 关键指标采集设计

风机运行指标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
风机振动频率:
- name: wind_vibration_frequency
type: gauge
unit: "Hz"
description: "风机叶片轴承振动频率"
采集间隔: 1s
告警阈值: [2.5, 3.5, 4.5] # 正常/警告/严重

发电功率:
- name: wind_power_output
type: counter
unit: "kW"
description: "风机实时发电功率"
采集间隔: 5s
聚合方式: sum

环境温度:
- name: wind_environment_temp
type: gauge
unit: "°C"
description: "风机周围环境温度"
采集间隔: 30s
数据源: SCADA系统

系统健康指标

1
2
3
4
5
6
7
8
9
10
11
12
13
风机在线状态:
- name: wind_farm_online
type: gauge
unit: "boolean"
description: "风机是否在线"
告警规则: 离线超过5分钟

网络延迟:
- name: wind_farm_network_latency
type: gauge
unit: "ms"
description: "风机数据传输网络延迟"
告警阈值: [1000, 3000] # 正常/警告

Grafana可视化设计

1. 仪表板分层设计

我们设计了五个层级的仪表板,从宏观到微观:

集群总览仪表板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"dashboard": {
"title": "风电场总览",
"panels": [
{
"title": "发电功率趋势",
"type": "graph",
"targets": [
{
"expr": "sum(wind_power_output)",
"legendFormat": "总功率"
}
]
},
{
"title": "风机状态分布",
"type": "stat",
"targets": [
{
"expr": "count(wind_farm_online{value=\"1\"})",
"legendFormat": "在线风机"
}
]
}
]
}
}

单风机详细监控

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
{
"dashboard": {
"title": "风机002 - 详细监控",
"panels": [
{
"title": "振动频谱分析",
"type": "timeseries",
"targets": [
{
"expr": "wind_vibration_frequency{风机编号=\"002\"}",
"legendFormat": "振动频率"
}
],
"yaxes": [
{
"label": "频率 (Hz)"
},
{
"label": "状态"
}
]
},
{
"title": "温度监控",
"type": "graph",
"targets": [
{
"expr": "wind_environment_temp{风机编号=\"002\"}",
"legendFormat": "环境温度"
},
{
"expr": "wind_bearing_temp{风机编号=\"002\"}",
"legendFormat": "轴承温度"
}
]
}
]
}
}

2. 自定义可视化组件

振动频谱热力图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"panel": {
"title": "振动频谱热力图",
"type": "heatmap",
"targets": [
{
"expr": "wind_vibration_frequency",
"legendFormat": "{{风机编号}}-{{传感器类型}}"
}
],
"heatmap": {
"yAxis": {
"label": "风机编号"
},
"xAxis": {
"label": "时间"
}
}
}
}

地理信息展示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"panel": {
"title": "风电场地理分布",
"type": "geo_map",
"targets": [
{
"expr": "wind_power_output",
"legendFormat": "{{风机编号}}"
}
],
"map": {
"center": [39.9042, 116.4074], // 北京坐标示例
"zoom": 10
}
}
}

3. 告警与通知集成

告警面板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"dashboard": {
"title": "实时告警",
"panels": [
{
"title": "紧急告警",
"type": "alert_list",
"targets": [
{
"expr": "ALERTS{severity=\"critical\"}",
"legendFormat": "{{告警名称}}"
}
]
},
{
"title": "告警趋势",
"type": "graph",
"targets": [
{
"expr": "rate(ALERTS[5m])",
"legendFormat": "告警数量"
}
]
}
]
}
}

监控体系落地实战

1. 基础设施监控搭建

服务器监控配置

1
2
3
4
5
6
7
8
9
10
11
# node-exporter配置
node_exporter:
采集内容:
- CPU使用率
- 内存使用情况
- 磁盘I/O
- 网络连接数
告警规则:
CPU使用率 > 80%: 警告
CPU使用率 > 90%: 严重
磁盘使用率 > 85%: 警告

数据库监控

1
2
3
4
5
6
7
8
# postgres-exporter配置
postgres_exporter:
数据库连接: "postgres://user:pass@wind-farm-db:5432/wind_farm"
采集指标:
- 连接池使用情况
- 查询响应时间
- 索引效率
- 表空间使用

2. 应用监控集成

Spring Boot应用监控

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 配置Prometheus指标收集
@Component
public class WindFarmMetrics {
private final Counter windPowerCounter;
private final Gauge windVibrationGauge;

@Autowired
public WindFarmMetrics(MeterRegistry meterRegistry) {
this.windPowerCounter = Counter.builder("wind_power_output")
.description("风机发电功率")
.tag("风机编号", "002")
.register(meterRegistry);

this.windVibrationGauge = Gauge.builder("wind_vibration_frequency")
.description("风机振动频率")
.tag("风机编号", "002")
.register(meterRegistry);
}

public void recordPowerOutput(double power) {
windPowerCounter.increment(power);
}

public void recordVibration(double frequency) {
windVibrationGauge.set(frequency);
}
}

中间件监控

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Redis监控
redis_exporter:
端点: "redis://wind-farm-redis:6379"
采集指标:
- 内存使用情况
- 连接数
- 命令执行频率

# 消息队列监控
kafka_exporter:
集群地址: "wind-farm-kafka:9092"
采集指标:
- Topic消息积压
- 消费者偏移量
- 网络传输速率

3. 告警规则配置

基础告警规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
groups:
- name: wind_farm_alerts
rules:
- alert: 风机离线
expr: wind_farm_online == 0
for: 5m
labels:
severity: warning
annotations:
summary: "风机 {{ $labels.风机编号 }} 已离线超过5分钟"
description: "风机 {{ $labels.风机编号 }}{{ $labels.instance }} 上已离线 {{ $value }} 分钟"

- alert: 风机振动异常
expr: wind_vibration_frequency > 3.5
for: 2m
labels:
severity: critical
annotations:
summary: "风机 {{ $labels.风机编号 }} 振动异常"
description: "风机 {{ $labels.风机编号 }} 振动频率为 {{ $value }} Hz,超过正常阈值"

- alert: 发电功率异常
expr: rate(wind_power_output[5m]) < 100
for: 10m
labels:
severity: warning
annotations:
summary: "风机 {{ $labels.风机编号 }} 发电功率异常低"
description: "风机 {{ $labels.风机编号 }} 5分钟平均功率为 {{ $value }} kW"

复合告警规则

1
2
3
4
5
6
7
8
- alert: 风机集群故障
expr: count(wind_farm_online{value="1"}) < 80
for: 15m
labels:
severity: critical
annotations:
summary: "风电场风机大量离线"
description: "当前在线风机数量: {{ $value }}, 总风机数量: 100"

运维流程优化

1. 监控自动化部署

容器化部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# docker-compose.yml
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--storage.tsdb.retention.time=15d'

grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin123
volumes:
- grafana_data:/var/lib/grafana
- ./grafana/provisioning:/etc/grafana/provisioning

2. 监控数据管理

数据保留策略

1
2
3
4
5
6
7
8
9
# prometheus.yml
retention:
本地存储: 30
云端备份: 365
数据压缩: true
清理策略:
- 保留最近30天高频数据(1秒间隔)
- 保留最近90天中频数据(5秒间隔)
- 保留365天低频数据(1分钟间隔)

数据备份方案

1
2
3
4
5
6
7
8
# 每日备份脚本
backup_prometheus_data() {
DATE=$(date +%Y%m%d)
docker exec prometheus tar -czf /tmp/prometheus_backup_${DATE}.tar.gz /prometheus
docker cp prometheus:/tmp/prometheus_backup_${DATE}.tar.gz /backup/prometheus/
# 上传到云端存储
aws s3 cp /backup/prometheus/prometheus_backup_${DATE}.tar.gz s3://wind-farm-backup/prometheus/
}

3. 监控告警升级

告警分级机制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
告警级别:
P0 - 紧急:
- 风机离线超过30分钟
- 发电功率归零
- 系统级故障
升级方式: 电话+短信+微信

P1 - 严重:
- 风机振动异常
- 温度超过阈值
- 网络中断
升级方式: 短信+微信

P2 - 警告:
- 资源使用率过高
- 服务响应变慢
升级方式: 微信群通知

P3 - 提示:
- 定期维护提醒
- 数据质量异常
升级方式: 邮件通知

监控效果与收益

1. 可观测性指标提升

故障发现时间

  • 实施前:平均故障发现时间 45分钟
  • 实施后:平均故障发现时间 3分钟
  • 提升:93%的故障发现时间缩短

故障定位效率

  • 实施前:平均故障定位时间 120分钟
  • 实施后:平均故障定位时间 15分钟
  • 提升:87.5%的定位效率提升

告警质量

  • 实施前:日均告警 1200条(80%误报)
  • 实施后:日均告警 200条(15%误报)
  • 提升:告警数量减少83%,准确率提升65%

2. 业务价值体现

经济效益

1
2
3
4
5
6
7
8
9
10
11
12
13
经济效益计算:
故障响应时间缩短:
- 平均节省时间: 105分钟/次
- 故障次数: 12次/年
- 人工成本: 200元/小时
- 年节约: 12 * 105/60 * 200 = 42,000元

设备可用率提升:
- 可用率提升: 3%
- 单台风机容量: 2MW
- 电价: 0.5元/kWh
- 年发电量增加: 100 * 2MW * 3% * 24 * 365 = 5.256亿kWh
- 年收益增加: 5.256亿 * 0.5 = 2.628亿元

运维效率提升

  • 监控自动化率提升至85%
  • 人工运维工作量减少60%
  • 运维团队规模优化(从8人缩减至3人)

3. 持续优化方向

AI驱动的智能监控

1
2
3
4
智能监控规划:
第一步: 实现基于机器学习的异常检测
第二步: 建立故障预测模型
第三步: 实现自愈能力的初步框架

多维度监控拓展

1
2
3
4
监控维度扩展:
- 经济维度: 发电量、收益分析
- 安全维度: 设备安全、网络安全
- 环境维度: 气象条件、环境影响

总结与反思

Prometheus+Grafana监控体系在风电场的成功实施,让我们深刻体会到可观测性对于现代工业互联网的重要性。

技术选型的关键考虑

  1. 时序数据特性:Prometheus的时序数据模型完美匹配了工业监控场景
  2. 高可用架构:多级监控确保了系统的鲁棒性
  3. 生态完整性:丰富的exporter和可视化组件降低了实施成本

实施过程中的经验教训

  1. 监控指标设计:初期设计指标过多,经过筛选保留了核心业务指标
  2. 告警规则优化:需要根据实际情况调整告警阈值和聚合逻辑
  3. 团队能力建设:需要培养团队的监控意识和故障排查能力

未来展望
随着风电场规模的扩大和智能化程度的提升,监控体系需要向以下方向发展:

  1. 边缘计算与云边协同
  2. AI驱动的智能诊断
  3. 数字孪生与虚拟仿真

对于我们工控架构师而言,构建可观测性系统不仅仅是技术问题,更是业务价值的直接体现。当每个风机的振动数据都能被实时监控、每个故障都能被快速定位时,我们才能真正实现风电场的智能化运维。

这次监控体系的建设经验告诉我们:在工业互联网时代,”看不见”的系统才是最危险的系统,而”看得见、看得懂、能控制”的可观测性,才是智能运维的基石。


本文基于某沿海风电场的真实监控项目经验编写,部分数据已做脱敏处理。