Prometheus和Grafana来监控代理协议的健康状况

1- 安装Prometheus和Grafana

1.1- 安装Prometheus

1.1.1- 使用Docker安装Prometheus

docker run -d --name prometheus -p 9090:9090 prom/prometheus

1.1.2- 验证Prometheus是否运行

打开浏览器,访问http://localhost:9090,你应该能看到Prometheus的Web界面。

1.2- 安装Grafana

1.2.1- 使用Docker安装Grafana

docker run -d --name grafana -p 3000:3000 grafana/grafana

1.2.2- 验证Grafana是否运行

打开浏览器,访问http://localhost:3000,默认的用户名和密码都是admin

2- 配置Prometheus

2.1- 创建Prometheus配置文件

在Prometheus容器中,配置文件通常位于/etc/prometheus/prometheus.yml。你可以通过以下命令将配置文件复制到本地:

docker cp prometheus:/etc/prometheus/prometheus.yml .

2.2- 编辑配置文件

编辑prometheus.yml文件,添加一个job来定期检查代理协议的健康状况。

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'proxy_health_check'
    static_configs:
      - targets: ['localhost:9091']

2.3- 将配置文件复制回容器

docker cp prometheus.yml prometheus:/etc/prometheus/prometheus.yml

2.4- 重启Prometheus容器

docker restart prometheus

3- 创建一个简单的HTTP服务来执行健康检查

3.1- 安装Python和Flask

pip install Flask prometheus_client requests

3.2- 创建HTTP服务

创建一个名为app.py的文件,内容如下:

from flask import Flask, Response
from prometheus_client import generate_latest, Gauge
import requests
import time

app = Flask(__name__)

# 定义一个Gauge指标
proxy_health = Gauge('proxy_health', 'Health status of the proxy', ['protocol', 'ip', 'port'])

def check_proxy(protocol, ip, port):
    try:
        if protocol == 'http':
            response = requests.get(f'http://{ip}:{port}/', timeout=10)
        elif protocol == 'https':
            response = requests.get(f'https://{ip}:{port}/', timeout=10)
        elif protocol == 'socks5':
            response = requests.get('http://www.example.com', proxies={'http': f'socks5://{ip}:{port}', 'https': f'socks5://{ip}:{port}'}, timeout=10)
        else:
            return False

        if response.status_code == 200:
            proxy_health.labels(protocol=protocol, ip=ip, port=port).set(1)
            return True
        else:
            proxy_health.labels(protocol=protocol, ip=ip, port=port).set(0)
            return False
    except requests.RequestException as e:
        proxy_health.labels(protocol=protocol, ip=ip, port=port).set(0)
        return False

@app.route('/metrics')
def metrics():
    check_proxy('http', '代理IP', '代理端口')
    check_proxy('https', '代理IP', '代理端口')
    check_proxy('socks5', '代理IP', '代理端口')
    return Response(generate_latest(), mimetype='text/plain')

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=9091)

3.3- 运行HTTP服务

python app.py

4- 配置Grafana

4.1- 登录Grafana

打开浏览器,访问http://localhost:3000,默认的用户名和密码都是admin

4.2- 添加数据源

  • 点击左侧菜单的"配置"图标(齿轮图标),选择"数据源"。
  • 点击"添加数据源"。
  • 选择"Prometheus"。
  • 在"HTTP"部分,填写Prometheus的URL(默认是http://localhost:9090)。
  • 点击"保存并测试"。如果配置正确,Grafana会显示"数据源已成功保存并已通过测试"。

5- 创建仪表盘

5.1- 创建新仪表盘

  • 点击左侧菜单的"+“图标,选择"仪表盘”。
  • 点击"添加新面板"。

5.2- 配置查询

  • 在"查询"选项卡中,选择之前添加的Prometheus数据源。

  • 输入PromQL查询语句来获取代理协议的健康状况指标。例如:

    proxy_health
    
  • 点击"应用"以查看查询结果。

5.3- 配置图表类型

  • 在"可视化"选项卡中,选择合适的图表类型。例如,可以选择"图表"(Graph)来显示时间序列数据,或者选择"统计"(Stat)来显示当前值。
  • 根据需要调整图表的样式和格式。

5.4- 保存仪表盘

  • 点击页面右上角的"保存"按钮,保存仪表盘。

6- 设置警报

6.1- 配置警报

  • 在仪表盘中,点击你创建的面板。
  • 点击右上角的"编辑"按钮。
  • 点击"警报"选项卡。
  • 填写警报名称和条件。例如:
    • 条件proxy_health == 0
    • 持续时间1m
    • 通知方式:可以选择通过电子邮件、Slack等方式发送警报。

6.2- 保存警报

  • 点击"保存并关闭"以保存警报配置。

7- 示例仪表盘

以下是一个示例仪表盘的配置,包含多个面板来显示不同代理协议的健康状况:

7.1- 总览面板

  • 查询

    proxy_health
    
  • 图表类型:图表(Graph)

  • 显示:时间序列数据,显示代理协议的健康状况随时间的变化。

7.2- 当前状态面板

  • 查询

    proxy_health
    
  • 图表类型:统计(Stat)

  • 显示:当前值,显示代理协议的当前健康状况。

7.3- 警报面板

  • 查询

    proxy_health == 0
    
  • 图表类型:统计(Stat)

  • 显示:当前值,显示哪些代理协议出现问题。

8- 测试和验证

8.1- 测试代理协议

  • 启动你的代理服务,并确保它们在运行。
  • 访问http://localhost:9091/metrics,查看Prometheus指标是否正确暴露。

8.2- 验证Grafana仪表盘

  • 在Grafana仪表盘中,查看代理协议的健康状况图表。
  • 模拟代理协议失效(例如,关闭代理服务),查看Grafana仪表盘和警报是否正常工作。