前言
本文主要介绍了在用户遗留系统上快速搭建简易监控系统以提高对系统掌控力和响应速度的案例,这个案例的特点首先是遗留系统,其次所能提供的机器的操作系统也都是windows,最后由于处于内网中无法连接互联网。当然罗马不是一天建成的,本着精益思想,首先解决最大的痛点,再逐步优化,在这简单留下搭建监控系统的思路,如果能帮着大家解决一些问题当然更好了。
背景
最近公司的一个系统被用户推荐扩大使用范围,本来是件好事,但没想到系统用户量在短期内暴涨,使得原有系统问题频出,原来小范围使用时闻所未闻的问题呈爆发式增长。更为致命的是这个系统是部署在用户内网,开发和运维团队访问起来很是费劲,有好几次是用户在群里反应,我们的开发和运维人员才意识到,再加上访问服务器很不方便,需要专门的用户负责人审批才能获得相应权限,花费了很长时间才能定位和修复问题,用户满意度也是有所降低。所以为了解决当前的窘境,一方面安排研发团队排除潜在问题,一方面考虑到用户特殊情况和系统规模的扩张,确定是时候搭建一套监控系统了,目的是为了在系统发生或即将发生问题时第一时间获得通知采取行动,最大限度的减轻问题所带来的的影响。
于是监控系统搭建行动开始,首先是分析现状。
1)系统部署于用户内网,无法连接互联网
2)遗留系统的机器全部都是windows
3)遗留系统的应用尽量避免修改,因为研发团队已经上了另一条火线。
技术选型考虑
其实以前研发团队考虑过监控的问题,尝试过java melody进行接口和方法的监控,但目前这个技术栈显然不适合,首先这个是侵入式的,而且只能监测java 应用。我们需要监测的不但包括多个java应用还包括多台数据服务postgrelsql,redis以及mysql。考虑到我们监测目标的多样性,我们需要一个不需要依赖具体技术栈的独立的监控系统,于是Prometheus进入选项。
Prometheus是一个开源的系统监测以及报警工具集由SoundCloud构建. 值得注意到是Prometheus是继Kubernetes的第二个CNCF推荐的开源项目。其实最开始Prometheus没有被第一时间提上来主要是其大名鼎鼎的Kubernetes的首选监控系统,让人认为它需要Kubernetes至少是docker的支持。实际上经过实际的摸索发现,虽然Prometheus在Kubernetes上使用起来确实很顺手,但它难能可贵的是也为老旧的环境提供了支持,进行了windows下的兼容性测试后当即决定就决定了,毫不夸张的说你可以在15分钟内在Kubernetes集群上部署好Prometheus,但在30分钟也可以把系统搭建起来,当然前提是你需要知道怎么做,并其提前下载好资源。
既然使用了Prometheus,那么与其配套的展示服务Grafana也是自然的选择,好在grafana也提供了windows监控的版本,最后就是要使用各种Prometheus的exporter来获取监控数据了。
实战过程
监控系统组成
Prometheus作为核心组件,Granfana作为展示组件jmx_exporter作为JVM应用的采集终端,还有mysql_exporter,redis_exporter等作为存储服务的采集终端,最后pushgateway作为推的网关。
搭建核心组件Prometheus
- 从下载地址下载Prometheus
- 解压
- 修改prometheus.yml,
- 以管理员身份运行prometheus.exe --config.file=prometheus.yml
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).
# 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']
正常启动的示意图如下所示:
搭建展示组件Grafana
- 从下载地址下载Granfana
- 直接运行grafana-server.exe即可
- 访问系统,默认端口是3000,默认账号admin/admin
正常运行结果:
准备数据收集组件
数据收集组件就看各位的需要了
jmx_exporter
Github传送门 jmx_exporter是通过javaagenet的形式关联到启动应用上,可以通过JMX的接口获取相应监测数据。
示例启动命令行
java -javaagent:./jmx_prometheus_javaagent-0.12.0.jar=8080:config.yaml -jar yourJar.jar
其中 jmx_prometheus_javaagent-0.12.0.jar是你需要下载的jar报,8080是暴露的监测端口,后面在配置Prometheus时使用
config.yaml是具体的配置文件,这个尤为重要,建议多看看URL
mysql_exporter
mysql-exporter是一个mysql监控终端,需要设置mysql对应的账号和权限才能正常工作。
- 下载exporter,url
- 配置数据库的用户和权限
CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'XXXXXXXX' WITH MAX_USER_CONNECTIONS 3; GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
- 设置环境变量DATA_SOURCE_NAME=‘user:password@(hostname:3306)/’
- 启动exporter,
./mysqld_exporter <flags>
,默认端口好像是9104
pushgateway
前面几个都有官方发exporter支持,都是比较好处理的,但有一些应用就不是那么好处理的比如emqx,虽然在3.0主版本上增加了Prometheus监控的支持,但是以插件和pushgateway形式实现的,而且官方文档也说的不清楚,下面就以emqx为例说明pushagateway的用法。
- 下载Prometheus pushgateway,URL
- 直接双击或脚本启动,默认端口是9091
- 下载emqx(必须>3.0)URL
- 进入bin目录,输入 emqx start
- 浏览器访问localhost:18083,默认账号admin/public
- 进入插件管理界面,找到下图的那一行,启动,并修改配置statsd.push.gateway.server项至你的pushgateway的地址
修改prometheus.yml
根据你的监控项更新Prometheus的配置
# 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).
# 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']
- job_name: 'mysql-metrics'
# metrics_path: '/actuator/prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9104']
labels:
instance: db1
- job_name: pushgateway
static_configs:
- targets: ['localhost:9091']
labels:
instance: pushgateway
- job_name: jmx
static_configs:
- targets: ['localhost:9092']
配置reload
通过curl发送更新请求
curl -XPOST http://ip:9090/-/reload
PS要注意在启动时加上以上所说的--web.enable-lifecycle
启动参数
当然你也可以手动关掉exe再启动exe。
重启之后你的Prometheus的targets界面大概如下所示。
自定义Grafana表盘
接下来你就可以来到localhost:3000新建一个dashboard接入Prometheus的数据发挥你的创意定制你的界面了,这方面就不多说,初期找各模板其实就不错,删删减减再编辑一下就齐活了。如下所示。
总结
有些事是看起来困难,但做起来容易,比如搭建一套监控系统,
有些事是看起来容易但做起来困难,比如把搭建一套好用的监控系统。
由于Prometheus的良好的设计以及兼容性让我们能够在30分钟内搭建一套监控系统,但它的完善还是漫漫长路了。