上次我们讲过普罗米修斯(prometheus)这个接近完美的监控系统,有很多读者不了解它到底要如何搭建、应用,需要一篇 Prometheus 实战教程。今天我们就结合普罗米修斯、Grafana和Python采集脚本,写一个小小的东方财富人气榜 TOP100监控系统。
跟着本文的教程耐心往下走,你可能只需要花30分钟便可完成环境的搭建,非常舒服,下面先介绍基本概念。
普罗米修斯(prometheus)上次我们已经使用一整篇文章介绍过了,它是一个开源监控报警系统和时序列数据库。如果你没有阅读过这篇文章,请花五分钟读一下:
Grafana 是一个开源的数据可视化网络应用程序平台。用户配置连接的数据源之后,Grafana可以在网络浏览器里显示数据图表和警告。
比如说我基于 普罗米修斯(prometheus) + node_exporter 监控主机性能指标,然后由Grafana构建主机实时监控仪表盘,它是长这样的:
至于东方财富人气榜,指的是这个:
它能将市场目前最活跃的一些股票提取出来,可供我们作为投资的一种参考。
而我们今天要做的,就是自己搭建一套监控系统,实时监控某只股票在TOP100上的排名变化。
1.Prometheus 安装教程
创建 Prometheus 安装目录并添加 promethus 用户:
PROM_PATH='/data/prometheus' mkdir -p ${PROM_PATH} mkdir -p ${PROM_PATH}/{data,conf,logs,bin} useradd prometheus cd /usr/local/src
下载解压 prometheus, 这里我们选用2021年5月18日更新的最新版 v2.27.1:
wget https://github.com/prometheus/prometheus/releases/download/v2.27.1/prometheus-2.27.1.linux-amd64.tar.gz tar -xvf prometheus-2.27.1.linux-amd64.tar.gz cd prometheus-2.27.1.linux-amd64/ cp prometheus promtool ${PROM_PATH}/bin/ cp prometheus.yml ${PROM_PATH}/conf/ chown -R prometheus.prometheus /data/prometheus
设置环境变量:
cat >> /etc/profile <<EOF PATH=/data/prometheus/bin:$PATH:$HOME/bin EOF
将 Promethus 配置为系统服务之一,以便使用 systemctl 命令管控服务:
cat >>/etc/systemd/system/prometheus.service <<EOF [Unit] Description=Prometheus Documentation=https://prometheus.io/ After=network.target [Service] Type=simple User=prometheus ExecStart=/data/prometheus/bin/prometheus --config.file=/data/prometheus/conf/prometheus.yml --storage.tsdb.path=/data/prometheus/data --storage.tsdb.retention=90d Restart=on-failure [Install] WantedBy=multi-user.target EOF
现在使用下面的systemctl命令重新加载systemd系统,并查看服务是否启动:
systemctl daemon-reload systemctl enable prometheus systemctl start prometheus systemctl status prometheus
看到 running 状态说明一切正常:
记得开放9090端口,这样才可以访问 Prometheus 的 Web 端,访问 http://服务器IP:9090 查看得到 Prometheus Web界面,说明安装成功:
2.Grafana 安装教程
Grafana 我们也使用最新的 8.0.1 版本,安装方式如下:
CentOS系列系统使用以下命令安装:
cd /usr/local/src wget https://dl.grafana.com/oss/release/grafana-8.0.1-1.x86_64.rpm sudo yum localinstall grafana-6.5.2-1.x86_64.rpm
Ubuntu和Debian系列系统使用以下命令安装:
cd /usr/local/src sudo apt-get install -y adduser libfontconfig1 wget https://dl.grafana.com/oss/release/grafana_8.0.1_amd64.deb sudo dpkg -i grafana_8.0.1_amd64.deb
然后启动系统服务即可:
systemctl start grafana-server systemctl status grafana-server
看到 running 状态说明一切正常:
记得开放3000端口,这样你才可以访问你的Grafana: http://你的服务器IP:3000 如下所示:
输入用户名,密码登录系统。用户名与密码都是”admin”,如果能打开页面则已经安装成功了。
3.初尝Grafana+Prometheus实战教程
为了初步尝试这套系统,我们可以通过简单的采集主机性能数据开始。Node_exporter是一个Prometheus推出的官方主机性能采集工具。通过它我们能很方便地输出主机性能指标到Prometheus.
3.1 下载安装Node_Exporter:
NODE_PATH='/data/prometheus/node_exporter/' cd /usr/local/src/ mkdir -p ${NODE_PATH} wget https://github.com/prometheus/node_exporter/releases/download/v1.1.2/node_exporter-1.1.2.linux-amd64.tar.gz tar -xvf node_exporter-1.1.2.linux-amd64.tar.gz cp node_exporter-1.1.2.linux-amd64/node_exporter ${NODE_PATH} chown -R prometheus.prometheus ${NODE_PATH}
配置node_exporter为系统服务:
cat > /lib/systemd/system/node_exporter.service <<EOF [Unit] Description=node_exporter Documentation=https://prometheus.io/ After=network.target [Service] Type=simple User=prometheus ExecStart=/data/prometheus/node_exporter/node_exporter Restart=on-failure [Install] WantedBy=multi-user.target EOF
现在使用systemctl命令重新加载系统命令,并查看服务是否启动:
systemctl daemon-reload systemctl enable node_exporter systemctl start node_exporter systemctl status node_exporter
看到如下图的状态说明启动成功。
放行9100端口,访问http://你的服务器地址:9100/metrics 看到如下指标页面说明安装成功:
配置 prometheus.yaml (ubuntu 下为 prometheus.yml), 让 prometheus 采集 node_exporter 输出的指标数据:
vim /data/prometheus/conf/prometheus.yml
配置如下:
# my global config global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # scrape_timeout is set to the global default (10s). # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # - "first_rules.yml" # - "second_rules.yml" # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: 'prometheus' # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ['localhost:9090'] # 主要是新增了node_exporter的job,如果有多个node_exporter,在targets数组后面加即可 - job_name: 'node_exporter' static_configs: - targets: ['localhost:9100']
保存后重启prometheus:
systemctl restart prometheus
最后配置Grafana:
然后选择 Prometheus 数据源:
输入 Prometheus url 然后点击 save&test 保存:
然后导入官方仪表盘,官方提供的模板号为8919:
然后你就能看见本机非常漂亮的性能指标数据仪表盘了。
不看不知道,一看吓一跳,看来我需要升级这台机器的内存了。
4.编写采集脚本
为了能够采集东方财富人气榜前100名,我们需要用Python编写一个人气榜采集脚本,并使其像 node_exporter 一样输出指标信息:
为了达到这个目的,我们必须安装 prometheus_client 模块:
pip3 install prometheus_client
获取股票排名的代码如下:
# Python实用宝典 # 2021-06-13 # 文件名: fetch_stock.py import time import requests from prometheus_client import start_http_server, CollectorRegistry, Gauge reg = CollectorRegistry() gauge = Gauge( 'rank', '人气榜排名', ['stock_id'], registry=reg ) def process_request(): url = "https://emappdata.eastmoney.com/stockrank/getAllCurrentList" kwargs = { "appId": "appId01", "pageNo": 1, "pageSize": "100", } result = requests.post(url, json=kwargs).json() for i in result.get("data", []): gauge.labels(stock_id=i["sc"]).set(i["rk"]) time.sleep(60) if __name__ == '__main__': start_http_server(8000, registry=reg) while True: process_request()
这里我们只捕获人气榜前100名,并通过Prometheus客户端的start_http_server开启一个Web服务,这样你通过http服务访问8000端口的时候就能输出这些指标。
为了让其能持续输出指标数据,我们要用nohup使其成为一个常驻进程:
nohup python3 fetch_stock.py &
开放8000端口,访问 http://你的服务器IP:8000 就能查看输出的指标:
5.应用采集脚本
同配置Node_exporter一样,我们需要将自己编写好的采集脚本落入Prometheus,配置prometheus.yaml:
配置 prometheus.yaml, 让 prometheus 采集 node_exporter 输出的指标数据:
#(CentOS) vim /data/prometheus/conf/prometheus.yaml vim /data/prometheus/conf/prometheus.yml # ubuntu
配置如下:
# my global config global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # scrape_timeout is set to the global default (10s). # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # - "first_rules.yml" # - "second_rules.yml" # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: 'prometheus' # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ['localhost:9090'] # 主要是新增了node_exporter的job,如果有多个node_exporter,在targets数组后面加即可 - job_name: 'node_exporter' static_configs: - targets: ['localhost:9100'] # 新增我们的Python股票采集脚本 - job_name: 'hot_list' static_configs: - targets: ['localhost:8000']
保存后重启prometheus:
systemctl restart prometheus
最后配置Grafana, 选择新建一个dashboard:
然后选择rank指标:
点击 Use query 就能获取所有股票的排名曲线:
6.配置Grafana告警
为了在某只股票达到某种排名的时候触发通知,我们需要先配置好告警渠道:
然后配置邮件告警,点击 Test, 此时 Grafana 会告诉你一个错误:
就是我们还没有配置好 SMTP 相关服务,需要配置 SMTP 相关服务才能正常发送邮件,如果你是按照本文按照Grafana的教程走下来的,那么Grafana.ini的文件位于 /etc/grafana/grafana.ini.
vim /etc/grafana/grafana.ini
然后在 smtp 部分配置你的 host、user、password、from_address、from_name,并打开 enabled 如下图所示:
然后重启 Grafana-server
systemctl restart grafana-server
再点击Test,你的邮箱里收到这样的邮件说明通知可以正常发送了:
然后我们进入正题,监控某只股票的排名变化,比如 SH600070:
然后点击 Alert 配置告警,一旦其排名高于65名则发送邮件通知:
完成后点击右上角的 save 保存即可:
然后进入 Alerting 告警中心,你会看到刚刚配置的告警规则在这里可以进行管控:
点击Pause可以暂停这个告警,Edit alert可以去更改告警条件。
一旦触发告警,这个状态便会更改,你就会收到邮件:
邮件效果如下:
邮件里的告警图片没显示出来,因为我们没有安装 “grafana image renderer”, 需要在你的服务器执行以下命令安装并重启 Grafana:
grafana-cli plugins install grafana-image-renderer systemctl restart grafana-server
新的告警邮件便能看到图片了:
怎么样,用Prometheus+Grafana+Python采集搭建一个股票监控系统还是非常简单的吧?创新性地监控东方财富人气榜上某只股票的变化并产生告警,能让你熟悉监控策略的配置,见微知著。跟着本文的教程走,相信你会有不少收获。
如果我们延伸一下,结合量化投资系列教程的可转债交易策略 — Python 量化投资实战教程(10),是否可以构建一些更有意义的策略?答案是肯定的。
我们可以监控所有100元以下的可转债对应的股票,如果这些股票进入了人气榜TOP100或者飙升榜(本文没有采集,有兴趣的读者可以自行采集),就购入这些低价可转债,这种买入策略或许也不错。
你也可以抛弃东方财富的榜单分类,构建自己的排名环比增长买入策略,环比下跌卖出策略,我相信这会非常有意思。
我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。
有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。
原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!
Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典
评论(0)