另外由于内容比较多,这里很多地方没有展开讲解,比如JMeter的配置、Grafana的配置、Prometheus-Operator的配置、AlertManager的配置等等,不知道大家感不感兴趣,如果感兴趣的话,后面可以继续深入写一个小系列来讲解哈。
首先关于第四个需求比较特殊,现有的监控体系其实已经可以做到服务的被动监测,比如某个Service的API被调用了,那么相应的调用数据都会被汇总到Prometheus上面,Prometheus里面会计算券商股票交易接口 关闭,接口调用的可用率,如果一段时间内如果错误率超过一定阈值,那就报警,追错误的时候去查下log就好了。但其实这个不能做到主动监测,比如在凌晨三四点,当没有用户使用的时候,如果这时候服务器出现问题了,我也需要第一时间能知道,所以我需要有一个定时的主动监测程序来实时监测我的所有券商股票交易接口 关闭,接口是否是可用的。要做到主动监控,那我一定需要一个券商股票交易接口 关闭,接口监测程序定时运行并校验每个券商股票交易接口 关闭,接口的结果,这里我选用的就是开源的JMeter,它大多数情况下是被用来做压测的,但绝对能满足券商股票交易接口 关闭,接口调用和检测的需求,只要我定时跑JMeter来检测就好了。关于第一个需求,我需要监测我的每个券商股票交易接口 关闭,接口都是可用的,包括返回的数据也需要是想要的结果。这时候我们可能想到直接跑一些testcase之类的,但这些其实大多数都是在部署或运行时校验的,如果我要实时跑或者testcase有update了,也不太方便。另外为了写券商股票交易接口 关闭,接口测试的时候,如果没有现成的工具,我们可能得写一堆代码,每个券商股票交易接口 关闭,接口都写一个,包括GET请求的URL参数、POST请求的Body信息等等,然后校验券商股票交易接口 关闭,接口的返回结果是不是对的,也太麻烦了。所以我们需要找到一个可用的工具来帮助我们快速地完成这些功能。我选择的JMeter也提供了可视化界面,我只需要配置一些券商股票交易接口 关闭,接口和参数即可,另外它还带有定时器、断言、动态参数、多线程等功能,这样我们也可以做到并发测试、随机等待、动态构造请求参数、返回结果判断等功能了。其次再说第二个和第三个需求,其实用现有的Prometheus+Grafana就能解决了,这里最关键的则是我的券商股票交易接口 关闭,接口监控结果能发给Prometheus才行。既然我选用了JMeter,那么我怎样把JMeter的数据发送给Prometheus呢?这里需要借助于JMeter的一个插件jmeter-prometheus-plugin,https://githucom/johrstrom/jmeter-prometheus-plugin,利用它就能将JMeter变成一个DataExporter,Prometheus来抓取就好了。
JMeter是有GUI的,我们在编写的时候在GUI里面设置就好了,界面样例如下所示:
这里提示几点:
其具体的配置字段可以参见:https://prometheus.io/docs/prometheus/latest/configuration/configuration/。
对于AlertManager来说,其监控的规则这里推荐使用Prometheus-Operator里面自带的PrometheusRule来实现,比如可以定义这么一个PrometheusRule:
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
labels:
app: monitor
name: monitor-rules
spec:
groups:
- name: monitor
rules:
- alert: ServiceErroring
labels:
severity: warning
annotations:
message: Service 连续5分钟错误率过高。
expr: |
avg(1- jmeter_test_can_fail_success{job='service-monitor'} / jmeter_test_can_fail_total{job='service-monitor'}) > 0
for: 5m
有了这些需求,我就结合公司内部现有的一些基础设施先确定一个技术选型,然后实施就好了。
最后我配置成的一些监控面板如下所示:
关于JMeter的功能这里就不再展开讲了,反正几乎你想实现的任何测试功能都可以实现,具体的用法可以参考JMeter的官方文档:https://jmeter.apachorg/usermanual/get-startehtml。
另外command就是jmx文件的名称,这里需要修改成你的jmx文件。
另外对于一些规则的管理,我们可以使用一些开源的Dashboard来管理,如Krama,https://githucom/prymitive/karma,利用它我们可以方便配置、禁用和筛选一些报警规则,界面如下:
目前公司内部使用的一套监控体系是基于Kubernetes+Prometheus+Grafana+AlertManager的,那么基于我的需求来分析下我怎样利用这一套体系来搭建我想要的监控设施。
运行所需要的docker-compose文件如下:
version: '3'
services:
jmeter:
restart: always
image: 'germey/jmeter'
volumes:
- ./jmx:/app
command:
- sample.jmx
ports:
- '80:80'
如果部署好了Prometheus之后,可以把它放在Prometheus的scrape_configs,比如Service的URL为jmeter-monitor.com,可以修改prometheus.yml:
global:
scrape_interval: 15s # By default, scrape targets every 15 seconds.
# Attach these labels to any time series or alerts when communicating with
# external systems (federation, remote storage, Alertmanager).
external_labels:
monitor: 'codelab-monitor'
# 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=` to any timeseries scraped from this config.
- job_name: 'jmeter-monitor'
# Override the global default and scrape targets from this job every 5 seconds.
scrape_interval: 5s
static_configs:
- targets: ['jmeter-monitor.com']
部署JMeter
Grafana可视化
对于报警来说,可以使用两种方式配置,一个是直接使用Grafana自带的报警机制,另外是可以通过AlertManager,后者功能更加强大,推荐使用后者。
那么JMeter写好了,怎么来部署呢?可以用crontab,放某台服务器上,不过这里最理想的方式当然是部署到Kubernetes里面了。
我负责的业务其中就包括一个WebService,我需要保证Service的每个券商股票交易接口 关闭,接口都是可用的,如果某个时间流量大了或者服务器挂掉了,那需要第一时间通知到我。
监控面板
报警
这样我要是什么时候想看Service券商股票交易接口 关闭,接口的情况,随时上来看就好了。
Prometheus收集完数据之后,我们可以将其可视化出来了。
这时候可能我有这些需求:
配置完成之后,运行JMeter之后,我们就能在http://localhost:9270上看到Exporter的信息,如所示:
这里面就包含了JMeter的一些券商股票交易接口 关闭,接口测试结果,包括成功次数、失败次数、状态码等等,另外还有JVM、处理器等各种环境信息。
目前我是利用了组内已经提供的报警机制,组内已经对接好了电话、短信、邮件报警,并可以把每个人的信息进行管理和分组,然后应用到某个报警规则里面,这样一旦有问题,就可以实现报警啦。
效果如下:
这里我们就需要借助于jmeter-prometheus-plugin这个插件了,其GitHub地址是https://githucom/johrstrom/jmeter-prometheus-plugin,具体的用法可以参考其官方说明。
由于内容比较多,整个流程我实践下来然后测试通总共花了两天左右的时间,在这里就不完全展开说了,只提关键点了。
这样配置好一个PrometheusRule之后,Prometheus会自动应用这个Rule然后监控。
部署之后把对应的URL交由Prometheus就可以把监控数据收集到Prometheus里面了。
报警方式的话可以通过配置AlertManger的Receiver来实现,包括打电话、邮件、短信等等,配置规则可以见:https://prometheus.io/docs/alerting/configuration/。
JMeter测试
另外部署到Kubernetes的话可以参考这里的yml文件:https://githucom/Germey/JMeterMonitor/tree/master/kubernetes。
定时测试和监控服务器每个券商股票交易接口 关闭,接口是否是可用的,包括返回的数据、状态码是不是正确的。我可以随时查看到每个券商股票交易接口 关闭,接口的响应时间、可用率等信息,最好是有可视化的表呈现,一目了然。如果券商股票交易接口 关闭,接口的错误率超过某一阈值一段时间,及时通知我,包括电话、短信或邮件。需要主动去监测券商股票交易接口 关闭,接口的可用性,注意这里是主动监测而不是被动监测,不是等用户用的时候报错才提醒我。比如在没有用户用的时候,我也能及时知道每个券商股票交易接口 关闭,接口的可用性。
Prometheus收集数据
第一步那就是用JMeter来完成券商股票交易接口 关闭,接口的测试了,券商股票交易接口 关闭,接口的调用形式肯定都有相应的规范的,比如GET请求设置啥参数,POST请求发送什么数据,我们利用JMeter都能方便地配置。
监控面板
比如这里有些字段,jmeter_test_can_fail_success代表成功请求的次数,jmeter_test_can_fail_total代表总的测试次数。
不过公司内部已经实现了一套了,对接了公司的员工账号,更加方便,所以我就没有再用这个了。
定时重启
另外呢,这种方式其实并不怎么好,修改Prometheus挺麻烦的,推荐使用Helm+Prometheus-Operator来安装Prometheus,然后修改values.yml即可修改配置文件了,比如修改https://githucom/helm/charts/blob/master/stable/prometheus-operator/values.yaml里面的additionalScrapeConfigs即可。
感兴趣的话,可以继续往下看哈。
这里有几个地方值得注意:
这里一些券商股票交易接口 关闭,接口的名称和URL我就打码了,这里我可以在Grafana中每时每刻都看到每个券商股票交易接口 关闭,接口的可用率、响应时间、状态码等信息,这些信息就是JMeter定时检测得到的结果,监控数据转到Prometheus里面然后经过Grafana可视化出来,并能通过一些指标来实现报警机制。
我利用的一套服务监控体系就是JMeter+Kubernetes+Prometheus+Grafana+AlertManager,那么就开干吧。
我基于https://githucom/justb4/docker-jmeter进行了二次改写,最后打包了一个镜像,已经开源了,地址为:https://githucom/Germey/JMeterMonitor,镜像名称为germey/jmeter,这里就不再展开讲细节了,有点复杂。
国内的一些服务商已经提供了这些功能,即主动型服务监控,比如「监控宝」,但我并不想用这些服务,一是需要额外花钱,二是数据上并不安全,三是我需要把我的服务集成到公司内部的监控体系下。
那么就可以用一个表达式来计算ErrorRate了:
1- jmeter_test_can_fail_success{instance='$instance'} / jmeter_test_can_fail_total{instance='$instance'}
这里重启就可以利用Kubernetes的Cronjob,比如我们可以每隔10分钟让JMeter重启一次,类似配置如下:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: jmeter-monitor
spec:
successfulJobsHistoryLimit: 0
failedJobsHistoryLimit: 0
concurrencyPolicy: Replace
schedule: '*/10 * * * *'
jobTemplate:
spec:
template:
metadata:
labels:
service: jmeter-monitor
spec:
containers:
- args:
- jmeter-monitor.jmx
image: germey/jmeter:1
name: jmeter-monitor
volumeMounts:
- mountPath: /app
name: jmeter-storage
ports:
- containerPort: 80
imagePullPolicy: IfNotPresent
resources:
requests:
memory: '4Gi'
cpu: '250m'
limits:
memory: '4Gi'
cpu: '250m'
restartPolicy: OnFailure
volumes:
- name: jmeter-storage
persistentVolumeClaim:
claimName: jmeter
接下来就是如何把数据对接到Prometheus里面了。
完成上述两步,我们就能成功测试Service的每个券商股票交易接口 关闭,接口并能生成测试结果的Exporter了。
•动态参数,JMeter里面是支持动态参数设置的,比如循环测试id从1到100,或者动态POST的数据替换,都是可以做到的,这个可以满足你花样测试券商股票交易接口 关闭,接口的需求。•定时器,JMeter里面有很多Timer,可以设置各种各样的延时操作,比如每3分钟测一次,随机等待多少秒测一次都行。•断言,测试了券商股票交易接口 关闭,接口之后,我们不仅要知道是否是可用的,同时也要判断其结果是不是正确的,如果返回状态码是正确的但是结果不对,那也白搭,所以可以使用断言来检查返回结果。
下面我们就来一个个总结说一下。
•一个是concurrencyPolicy,这里配置为Replace,意思是重启后新建的Pod会替换原来的Pod,保证JMeter的Pod只有一个。•另外一个是imagePullPolicy配置为IfNotPresent,这样可以每次重启的时候不用重新拉镜像。
这样的话,就能避免发生错误的时候ErrorRate无法降为0的状态了。
为了达成这些功能,我需要解决如下问题:
默认情况下,JMeter是能导出数据到诸如InfluxDB这样的数据库的,借助于它自带的Listener即可实现。它并不带导出到Prometheus的功能。
这里字段名如jsr223_rt_as_summary可以自行修改,比如这里我就统一修改为了jmeter_test_xxx这样的字段。
解决方案分析:
这里另外遇到了一个问题,就是JMeter导出的监控数据是不断累积的,而监控的数据则是需要监控最近几分钟的数据,这样一旦发生了Error,那么ErrorRate由于历史数据的原因,在服务恢复之后永远不会降为0,这就导致一些问题。另外如果JMeter如果一直运行,其占用的内存会越来越大。
这里就能实时可视化展示出来错误率了,更多的一些配置可以自行修改这些表达式进行定制。
配置面板
Listener的配置示例如所示:
这里就需要把JMeter打包成一个镜像了,GitHub找来找去没找到几个合适的,另外也没有把jmeter-prometheus-plugin包括进去,那只有自己来了。
这里提示几点可能用到的东西:
嗯,写好了之后,可以用JMeter在本地进行测试,测试好了时候,可以把JMeter的这个TestPlan存成一个jmx文件,留作后面备用。
所以一个最好的方式就是定时将JMeter重启,这样可以定时清空历史监控数据,保证在新的一段时间内测试获取到最近的监控数据,而不是混杂历史数据。
•如何使用JMeter来测试每个券商股票交易接口 关闭,接口的使用情况。•JMeter如何和Prometheus对接起来,即如何集成jmeter-prometheus-plugin到JMeter。•JMeter怎样去部署,部署到哪里。•可视化数据怎样来呈现。•错误状态怎样来快速查看。•出错通知如何实现,比如打电话、发邮件等等。
这里我把本地的jmx文件夹mount到了Docker的app文件夹,所以这里在运行时需要在项目文件夹下新建jmx文件夹,用于存放jmx文件,把刚才写好的jmx文件放过来就好了。
这里先放一张,看下最终的监控Grafana面板吧:
在成功部署JMeter之后呢,它肯定会提供一个WebService来暴露JMeter的测试数据。
文章为作者独立观点,不代表股票交易接口观点