frp监控与告警系统搭建:实时掌握服务运行状态
你是否曾因frp服务突然中断而影响业务?是否想实时了解内网穿透的流量变化?本文将带你从零构建frp全链路监控告警体系,通过Prometheus+Grafana实现可视化监控,搭配简单脚本完成异常告警,让你轻松掌控服务状态。
监控体系架构
frp监控系统主要包含三个核心组件:
- 数据采集层:frps内置Prometheus指标暴露
- 数据存储与可视化层:Prometheus+Grafana
- 告警层:Prometheus Alertmanager或自定义脚本
核心监控指标说明
frp提供丰富的原生指标,主要分为以下几类:
- 代理连接状态(在线/离线数量)
- 流量统计(入站/出站带宽、总传输量)
- 系统性能(CPU/内存占用、连接数)
- 错误统计(认证失败、连接超时次数)
服务端监控配置
启用Prometheus指标暴露
修改frps配置文件启用监控功能,完整配置示例可参考conf/frps_full_example.toml:
# 启用Dashboard和Prometheus
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin"
enablePrometheus = true # 关键配置:开启Prometheus指标
# 基础认证配置(可选)
auth.method = "token"
auth.token = "your_secure_token"
启动frps后,访问http://frps_ip:7500/metrics即可获取指标数据,例如:
# HELP frp_server_proxy_total Total number of proxies
# TYPE frp_server_proxy_total gauge
frp_server_proxy_total{type="tcp"} 3
# HELP frp_server_traffic_incoming_bytes Total incoming traffic in bytes
# TYPE frp_server_traffic_incoming_bytes counter
frp_server_traffic_incoming_bytes{proxy_name="ssh_proxy"} 12560
配置Prometheus采集
创建Prometheus配置文件frp-prometheus.yml:
scrape_configs:
- job_name: 'frp'
static_configs:
- targets: ['frps_ip:7500']
basic_auth:
username: 'admin'
password: 'admin'
启动Prometheus:
prometheus --config.file=frp-prometheus.yml
可视化监控面板
Grafana面板导入
- 访问Grafana控制台(默认地址
http://localhost:3000) - 导入frp专用仪表盘(Dashboard ID: 13978)
- 配置Prometheus数据源,完成面板加载
关键监控面板说明
Grafana仪表盘主要包含以下视图:
- 代理状态概览:所有代理的在线状态和流量排行
- 流量趋势图:入站/出站带宽实时监控
- 连接统计:活跃连接数、连接成功率
- 错误告警:认证失败、连接超时等异常指标
告警配置
自定义告警脚本
创建简单的Python告警脚本frp_alert.py,监控代理离线状态:
import requests
import smtplib
from email.mime.text import MIMEText
# 配置
FRPS_METRICS_URL = "http://frps_ip:7500/metrics"
ADMIN_EMAIL = "your@email.com"
ALERT_THRESHOLD = 5 # 连续5次检测失败触发告警
def check_proxy_status():
try:
response = requests.get(FRPS_METRICS_URL, auth=('admin', 'admin'))
metrics = response.text
# 检查关键代理是否在线
if 'frp_server_proxy_online{proxy_name="web_proxy"} 1' not in metrics:
send_alert("web_proxy离线", "web_proxy已超过5分钟未连接")
except Exception as e:
send_alert("监控异常", f"无法获取指标数据: {str(e)}")
def send_alert(subject, content):
# 实现邮件发送逻辑
msg = MIMEText(content)
msg['Subject'] = subject
msg['From'] = ADMIN_EMAIL
msg['To'] = ADMIN_EMAIL
with smtplib.SMTP('smtp.example.com', 587) as server:
server.starttls()
server.login("your_email", "your_password")
server.send_message(msg)
if __name__ == "__main__":
check_proxy_status()
添加crontab定时任务:
*/5 * * * * python3 /path/to/frp_alert.py
Prometheus Alertmanager配置(进阶)
对于生产环境,推荐使用Prometheus Alertmanager,创建告警规则文件alert.rules.yml:
groups:
- name: frp_alerts
rules:
- alert: ProxyOffline
expr: frp_server_proxy_online{proxy_name=~"web_proxy|ssh_proxy"} == 0
for: 5m
labels:
severity: critical
annotations:
summary: "代理 {{ $labels.proxy_name }} 离线"
description: "代理已离线超过5分钟,请检查服务状态"
最佳实践与注意事项
性能优化建议
- 监控采样间隔建议设置为15-30秒,避免影响frps性能
- 对流量大的代理单独配置流量告警阈值
- 定期清理Prometheus历史数据(建议保留7天)
安全加固措施
- 通过防火墙限制7500端口仅允许Prometheus服务器访问
- 使用HTTPS加密Dashboard流量(配置webServer.tls.certFile)
- 定期轮换认证token和Dashboard密码
总结
通过本文配置,你已拥有:
- 实时可视化监控面板,直观掌握服务状态
- 多维度性能指标,提前发现潜在问题
- 灵活的告警机制,及时响应异常情况
完整监控方案代码和配置示例可在frp官方文档中找到更多细节。如需进一步定制监控指标,可参考server/metrics/metrics.go中的指标定义实现自定义扩展。
提示:关注frp项目Release.md获取最新监控功能更新,v0.52+版本新增了更多流量分析指标。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考





