把接口调用打成jar包的类怎么写_如何实时主动监控你的网站接口是否挂掉并及时报警...

news/2024/5/20 23:22:45/文章来源:https://blog.csdn.net/weixin_39538451/article/details/111131983

阅读本文大概需要 10 分钟。

最近我在公司负责的业务已经正式投入上线了,既然是线上环境,那么就需要保证其可用性。

我负责的业务其中就包括一个 Web Service,我需要保证 Service 的每个接口都是可用的,如果某个时间流量大了或者服务器挂掉了,那需要第一时间通知到我。

这时候可能我有这些需求:

1.定时测试和监控服务器每个接口是否是可用的,包括返回的数据、状态码是不是正确的。2.我可以随时查看到每个接口的响应时间、可用率等信息,最好是有可视化的图表呈现,一目了然。3.如果接口的错误率超过某一阈值一段时间,及时通知我,包括电话、短信或邮件。4.需要主动去监测接口的可用性,注意这里是主动监测而不是被动监测,不是等用户用的时候报错才提醒我。比如在没有用户用的时候,我也能及时知道每个接口的可用性。

其实,国内的一些服务商已经提供了这些功能,即主动型服务监控,比如「监控宝」,但我并不想用这些服务,一是需要额外花钱,二是数据上并不安全,三是我需要把我的服务集成到公司内部的监控体系下。

有了这些需求,我就结合公司内部现有的一些基础设施先确定一个技术选型,然后实施就好了。

目前公司内部使用的一套监控体系是基于 Kubernetes + Prometheus + Grafana + Alert Manager 的,那么基于我的需求来分析下我怎样利用这一套体系来搭建我想要的监控设施。

解决方案分析:

1.首先关于第四个需求比较特殊,现有的监控体系其实已经可以做到服务的被动监测,比如某个 Service 的 API 被调用了,那么相应的调用数据都会被汇总到 Prometheus 上面,Prometheus 里面会计算接口调用的可用率,如果一段时间内如果错误率超过一定阈值,那就报警,追错误的时候去查下 log 就好了。但其实这个不能做到主动监测,比如在凌晨三四点,当没有用户使用的时候,如果这时候服务器出现问题了,我也需要第一时间能知道,所以我需要有一个定时的主动监测程序来实时监测我的所有接口是否是可用的。要做到主动监控,那我一定需要一个接口监测程序定时运行并校验每个接口的结果,这里我选用的就是开源的 JMeter,它大多数情况下是被用来做压测的,但绝对能满足接口调用和检测的需求,只要我定时跑 JMeter 来检测就好了。2.关于第一个需求,我需要监测我的每个接口都是可用的,包括返回的数据也需要是想要的结果。这时候我们可能想到直接跑一些 test case 之类的,但这些其实大多数都是在部署或运行时校验的,如果我要实时跑或者 test case 有 update 了,也不太方便。另外为了写接口测试的时候,如果没有现成的工具,我们可能得写一堆代码,每个接口都写一个,包括 GET 请求的 URL 参数、POST 请求的 Body 信息等等,然后校验接口的返回结果是不是对的,也太麻烦了。所以我们需要找到一个可用的工具来帮助我们快速地完成这些功能。所以,我选择的 JMeter 也提供了可视化界面,我只需要配置一些接口和参数即可,另外它还带有定时器、断言、动态参数、多线程等功能,这样我们也可以做到并发测试、随机等待、动态构造请求参数、返回结果判断等功能了。3.其次再说第二个和第三个需求,其实用现有的 Prometheus + Grafana 就能解决了,这里最关键的则是我的接口监控结果能发给 Prometheus 才行。既然我选用了 JMeter,那么我怎样把 JMeter 的数据发送给 Prometheus 呢?这里需要借助于 JMeter 的一个插件 jmeter-prometheus-plugin,https://github.com/johrstrom/jmeter-prometheus-plugin,利用它就能将 JMeter 变成一个 Data Exporter,Prometheus 来抓取就好了。

所以,综上所述,我利用的一套服务监控体系就是 JMeter + Kubernetes + Prometheus + Grafana + Alert Manager,那么就开干吧。

这里先放一张图,看下最终的监控 Grafana 面板吧:

0012f7aea692707e919d34fcccf3fb9d.png
监控面板

这里一些接口的名称和 URL 我就打码了,这里我可以在 Grafana 中每时每刻都看到每个接口的可用率、响应(包括平均、最快、最慢)时间、状态码等信息,这些信息就是 JMeter 定时检测得到的结果,监控数据转到 Prometheus 里面然后经过 Grafana 可视化出来,并能通过一些指标来实现报警机制。

感兴趣的话,可以继续往下看哈。

为了达成这些功能,我需要解决如下问题:

•如何使用 JMeter 来测试每个接口的使用情况。•JMeter 如何和 Prometheus 对接起来,即如何集成 jmeter-prometheus-plugin 到 JMeter。•JMeter 怎样去部署,部署到哪里。•可视化数据怎样来呈现。•错误状态怎样来快速查看。•出错通知如何实现,比如打电话、发邮件等等。

下面我们就来一个个总结说一下。

由于内容比较多,整个流程我实践下来然后测试通总共花了两天左右的时间,在这里就不完全展开说了,只提关键点了。

JMeter 测试

第一步那就是用 JMeter 来完成接口的测试了,接口的调用形式肯定都有相应的规范的,比如 GET 请求设置啥参数,POST 请求发送什么数据,我们利用 JMeter 都能方便地配置。

JMeter 是有 GUI 的,我们在编写的时候在 GUI 里面设置就好了,界面样例如下所示:

aaed3de282f9bf536e11a151e337f6ff.png
JMeter界面(图源:https://www.jianshu.com/p/0349441da3c4)

这里提示几点可能用到的东西:

•动态参数,JMeter 里面是支持动态参数设置的,比如循环测试 id 从 1 到 100,或者动态 POST 的数据替换,都是可以做到的,这个可以满足你花样测试接口的需求。•定时器,JMeter 里面有很多 Timer,可以设置各种各样的延时操作,比如每 3 分钟测一次,随机等待多少秒测一次都行。•断言,测试了接口之后,我们不仅要知道是否是可用的,同时也要判断其结果是不是正确的,如果返回状态码是正确的但是结果不对,那也白搭,所以可以使用断言来检查返回结果。

关于 JMeter 的功能这里就不再展开讲了,反正几乎你想实现的任何测试功能都可以实现,具体的用法可以参考 JMeter 的官方文档:https://jmeter.apache.org/usermanual/get-started.html。

嗯,写好了之后,可以用 JMeter 在本地进行测试,测试好了时候,可以把 JMeter 的这个 Test Plan 存成一个 jmx 文件,留作后面备用。

对接 Prometheus

接下来就是如何把数据对接到 Prometheus 里面了。

默认情况下,JMeter 是能导出数据到诸如 InfluxDB 这样的数据库的,借助于它自带的 Listener 即可实现。它并不带导出到 Prometheus 的功能。

这里我们就需要借助于 jmeter-prometheus-plugin 这个插件了,其 GitHub 地址是 https://github.com/johrstrom/jmeter-prometheus-plugin,具体的用法可以参考其官方说明。

这里提示几点:

•jmeter-prometheus-plugin 安装的时候把 jar 文件放到 JMeter 目录下就好了,jar 文件可以直接看这里下载:https://github.com/johrstrom/jmeter-prometheus-plugin#programatically。•安装好这个插件之后,需要增加一个 Listener,然后配置各种导出字段和参数,可以参考这个 jmx 文件的配置:https://github.com/johrstrom/jmeter-prometheus-plugin/blob/master/docs/examples/simple_prometheus_example.jmx,可以把这个 jmx 打开,然后把 Listener 拷贝到你的 Test Plan 即可。•jmeter-prometheus-plugin 这个插件会把 JMeter 变成一个 Data Exporter,而不是通过 Prometheus Push Gateway 来主动推送监控信息,所以它会在本地启动一个端口,默认是 9270。

Listener 的配置示例如图所示:

375efbc3b3623db69de3462fee572fad.png
JMeter Listener

这里字段名如 jsr223_rt_as_summary 可以自行修改,比如这里我就统一修改为了 jmeter_test_xxx 这样的字段。

配置完成之后,运行 JMeter 之后,我们就能在 http://localhost:9270 上看到 Exporter 的信息,如图所示:

4428f6bb63373e694cdd8d6879d9338d.png
Exporter

这里面就包含了 JMeter 的一些接口测试结果,包括成功次数、失败次数、状态码等等,另外还有 JVM、处理器等各种环境信息。

部署之后把对应的 URL 交由 Prometheus 就可以把监控数据收集到 Prometheus 里面了。

部署 JMeter

完成上述两步,我们就能成功测试 Service 的每个接口并能生成测试结果的 Exporter 了。

那么 JMeter 写好了,怎么来部署呢?可以用 crontab,放某台服务器上,不过这里最理想的方式当然是部署到 Kubernetes 里面了。

这里就需要把 JMeter 打包成一个镜像了,GitHub 找来找去没找到几个合适的,另外也没有把 jmeter-prometheus-plugin 包括进去,那只有自己来了。

我基于 https://github.com/justb4/docker-jmeter 进行了二次改写,最后打包了一个镜像,已经开源了,地址为:https://github.com/Germey/JMeterMonitor,镜像名称为 germey/jmeter,这里就不再展开讲细节了,有点复杂。

运行所需要的 docker-compose 文件如下:

version: '3'services:  jmeter:    restart: always    image: 'germey/jmeter'    volumes:      - ./jmx:/app    command:      - sample.jmx    ports:      - "80:80"

这里我把本地的 jmx 文件夹 mount 到了 Docker 的 app 文件夹,所以这里在运行时需要在项目文件夹下新建 jmx 文件夹,用于存放 jmx 文件,把刚才写好的 jmx 文件放过来就好了。

另外 command 就是 jmx 文件的名称,这里需要修改成你的 jmx 文件。

另外部署到 Kubernetes 的话可以参考这里的 yml 文件:https://github.com/Germey/JMeterMonitor/tree/master/kubernetes。

Prometheus 收集数据

在成功部署 JMeter 之后呢,它肯定会提供一个 Web Service 来暴露 JMeter 的测试数据。

如果部署好了 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']

其具体的配置字段可以参见:https://prometheus.io/docs/prometheus/latest/configuration/configuration/。

另外呢,这种方式其实并不怎么好,修改 Prometheus 挺麻烦的,推荐使用 Helm + Prometheus-Operator 来安装 Prometheus,然后修改 values.yml 即可修改配置文件了,比如修改 https://github.com/helm/charts/blob/master/stable/prometheus-operator/values.yaml 里面的 additionalScrapeConfigs 即可。

Grafana 可视化

Prometheus 收集完数据之后,我们可以将其可视化出来了。

比如这里有些字段,jmeter_test_can_fail_success 代表成功请求的次数,jmeter_test_can_fail_total 代表总的测试次数。

那么就可以用一个表达式来计算 Error Rate 了:

1- jmeter_test_can_fail_success{instance="$instance"} / jmeter_test_can_fail_total{instance="$instance"}

效果如下:

67ce329427a06d8ae3220109755f3752.png
配置面板

这里就能实时可视化展示出来错误率了,更多的一些配置可以自行修改这些表达式进行定制。

最后我配置成的一些监控面板如下所示:

91c529803e991b4bec0a87bc712945dc.png
监控面板

这样我要是什么时候想看 Service 接口的情况,随时上来看就好了。

报警

对于报警来说,可以使用两种方式配置,一个是直接使用 Grafana 自带的报警机制,另外是可以通过 Alert Manager,后者功能更加强大,推荐使用后者。

对于 Alert Manager 来说,其监控的规则这里推荐使用 Prometheus-Operator 里面自带的 PrometheusRule 来实现,比如可以定义这么一个 PrometheusRule:

apiVersion: monitoring.coreos.com/v1kind: PrometheusRulemetadata:  labels:    app: monitor  name: monitor-rulesspec:  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

这样配置好一个 PrometheusRule 之后,Prometheus 会自动应用这个 Rule 然后监控。

报警方式的话可以通过配置 Alert Manger 的 Receiver 来实现,包括打电话、邮件、短信等等,配置规则可以见:https://prometheus.io/docs/alerting/configuration/。

目前我是利用了组内已经提供的报警机制,组内已经对接好了电话、短信、邮件报警,并可以把每个人的信息进行管理和分组,然后应用到某个报警规则里面,这样一旦有问题,就可以实现报警啦。

另外对于一些规则的管理,我们可以使用一些开源的 Dashboard 来管理,如 Krama,https://github.com/prymitive/karma,利用它我们可以方便配置、禁用和筛选一些报警规则,界面如下:

5b13405adbb840308c9628ded67d2c4b.png
Krama

不过公司内部已经实现了一套了,对接了公司的员工账号,更加方便,所以我就没有再用这个了。

定时重启

这里另外遇到了一个问题,就是 JMeter 导出的监控数据是不断累积的,而监控的数据则是需要监控最近几分钟的数据,这样一旦发生了 Error,那么 Error Rate 由于历史数据的原因,在服务恢复之后永远不会降为 0,这就导致一些问题。另外如果 JMeter 如果一直运行,其占用的内存会越来越大。

所以一个最好的方式就是定时将 JMeter 重启,这样可以定时清空历史监控数据,保证在新的一段时间内测试获取到最近的监控数据,而不是混杂历史数据。

这里重启就可以利用 Kubernetes 的 Cronjob,比如我们可以每隔 10 分钟让 JMeter 重启一次,类似配置如下:

apiVersion: batch/v1beta1kind: CronJobmetadata:  name: jmeter-monitorspec:  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

这里有几个地方值得注意:

•一个是 concurrencyPolicy,这里配置为 Replace,意思是重启后新建的 Pod 会替换原来的 Pod,保证 JMeter 的 Pod 只有一个。•另外一个是 imagePullPolicy 配置为 IfNotPresent,这样可以每次重启的时候不用重新拉镜像。

这样的话,就能避免发生错误的时候 Error Rate 无法降为 0 的状态了。

好了,到此为止呢,我们就介绍完了使用 JMeter + Kubernetes + Prometheus + Grafana + Alert Manager 进行监控的整体思路了,希望对大家有帮助。

另外由于内容比较多,这里很多地方没有展开讲解,比如 JMeter 的配置、Grafana 的配置、Prometheus-Operator 的配置、Alert Manager 的配置等等,不知道大家感不感兴趣,如果感兴趣的话,后面可以继续深入写一个小系列来讲解哈。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_813693.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php织梦导航被选中,PHP网站分类目录程序 网址导航程序 织梦二次开发

织梦二次开发的PHP网站分类目录程序介绍:现在网络上很多的网站分类目录都是ASP格式,唯一一个PHP的程序因为文章功能和可扩展性太弱,小菜考虑到自己一个网站运营需要类似程序,而考虑到织梦程序的大众性和易优化性,就花2…

通州网站服务器,用光明为黄城根小学通州校区照亮希望

2019年8月1日,由北京住总集团承建的北京城市副中心职工周转房北区二标六号地块即黄城根小学通州校区,顺利通过五方验收,确保了九月入学条件。黄城根小学通州校区位于城市副中心职工周转房北区院内,是按照北京城市副中心整体规划部…

vue第一次加载慢怎么优化_Vue 网站首页加载优化

Vue 网站首页加载优化本篇主要讲解 Vue项目打包后 vendor.js 文件很大 如何对它进行优化 以及开启Vue的压缩 和 nginx gzip 压缩的使用,其他就是对接口优化等1. vendor.js 优化由于Vue项目随着功能变多 依赖也会随之变多,减少vendor.js的主要方法就是将其…

win7 iis安装php mysql_WIN7下配置IIS7.5+PHP5.3+MySQL动态网站服务器环境

比APPPSERV傻瓜建站包操作更简便、更智能、更科学的建站方法声明:采用环境及各软件版本,以下软件均采用当前最新版1.操作系统Windows7 英文旗舰版,自带IIS7.5;2.PHP软件版本:php-5.3.2-nts-Win32-VC9-x86.msi&#xff…

thinkphp5项目--企业单车网站(三)

thinkphp5项目--企业单车网站(三) 项目地址 fry404006308/BicycleEnterpriseWebsite: Bicycle Enterprise Websitehttps://github.com/fry404006308/BicycleEnterpriseWebsite 一、动态查询 thinkphp支持动态查询,这就很方便了,可…

【网站前端】第02章 HTML常用标签

一、标题标签<h1> - <h6> &#xff08;重要&#xff09; 1、例&#xff1a;<h1> 我是一级标题 </h1> 2、语义&#xff1a;作为标题使用&#xff0c;并且依据重要性递减。 二、段落标签&#xff08;重要&#xff09; 1、例&#xff1a;<p> 我…

DotNetCore 结合 Nginx 将网站部署到阿里云

基础环境配置 域名和服务器请先自行购买 基于 云服务器ECS 创建一个应用实例&#xff0c;选择系统镜像为 Ubuntu 16.04&#xff0c;在本机通过 SSH 进行远程连接&#xff0c;并进行相关配置 ssh roothttp://39.108.48.203/...sudo apt-get update sudp apt-get upgrade sudo ap…

html点击按钮跳转到另一个界面_点击查看本周SEO功能优化

SEO是搜索引擎优化&#xff0c;是利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名。目的是让网站在行业内占据领先地位&#xff0c;获得品牌收益。本周快站针对SEO功能进行了若干优化&#xff0c;现在您可以一键检测您的网站哪里需要进行SEO优化。SEO功能更新使用场景&a…

php记录网站访问,PHP简单实现记录网站访问量功能示例

本文实例讲述了PHP简单实现记录网站访问量功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;tongji/index.php文件&#xff1a;$file dirname(__FILE__)./tongji.db;//$data unserialize(file_get_contents($file));$fpfopen($file,r);$content;if (flock($fp,LOC…

cn域名多少钱_一个常规的企业网站建设大概需要多少钱?企业网站建设价格明细...

一个常规的企业网站建设大概需要多少钱?我们都知道&#xff0c;如果想要把公司网站搭建得更好&#xff0c;只有找专业、正规的网站建设公司来搭建是最省时、省精力、省钱的&#xff0c;下面角点科技的小编就来告诉大家一个常规的企业网站建设大概需要多少钱。一个常规的企业网…

winhttp 访问https_「winhttp」C++用winhttp实现https访问服务器 - seo实验室

winhttp由于项目升级&#xff0c;在数据传输过程中需要经过oauth2.0认证&#xff0c;访问服务器需要https协议。首先&#xff0c;实现C代码访问https 服务器&#xff0c;实现Get和post功能&#xff0c;在网上搜索一通&#xff0c;发现各种各样的都有&#xff0c;有的很简单&…

Linux中什么是动态网站环境及如何部署

当谈论起网站时&#xff0c;我们可能听说过静态和动态这两个词&#xff0c;但却不知道它们的含义&#xff0c;或者从字面意思了解一些却不知道它们的区别。 这一切可以追溯到网站和网络应用程序&#xff0c;Web应用程序是一个网站&#xff0c;但很多网站不是Web应用程序&#x…

外贸资源推荐:做外链做分类-61个高人气英国免费分类广告列表网站

外贸资源推荐&#xff1a;做外链做分类-61个高人气英国免费分类广告列表网站以下内容适合外贸网商&#xff0c;做外链 做分类广告-61个高人气英国免费分类广告列表网站<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr></wbr>&…

Zencart_SEO插件:ultimate_seo_urls的htaccess重写url规则

Zencart_SEO插件ultimate_seo_urls的htaccess伪静态重写url规则 #####NOTE:Replace/shop/withtherelativewebpathofyourcataloginthe"RewriteBase"linebelow: //启用重写规则 OptionsFollowSymLinks RewriteEngineOn //重写目录 RewriteBase/ #FromUltimateSEOURL…

ASP.NET 网站路径[转载]

文章来源:http://blog.csdn.net/winnerzone/archive/2007/05/10/1603044.aspx

重建索引要多久_网站关键词多久更新一次-top推

说起关键词&#xff0c;相信大多seoer都有非常深刻的认识&#xff0c;因为要做好网站&#xff0c;关键词的优化是最重要的一环&#xff0c;那么网站关键词多久更新一次对搜索引擎来说比较友好呢&#xff1f;接下去top推的小编就带大家一起来分析一下吧。网站关键词多久更新一次…

ufo帧率测试网站_帧率担当,i5-9600KF与电竞粉更配哦

嗨&#xff01;艾维巴蒂!这里是懂装机和爱玩游戏的雕哥&#xff01;作为一名电竞猛男&#xff0c;我的兴趣爱好无非就是开开黑、搞搞机&#xff0c;偶尔还会研究下Intel14mm拉链技术。不过呢&#xff0c;生活不只有游戏&#xff0c;还有诗和远方啊&#xff01;要攒机咱就得一步…

一步一步SharePoint 2007之六:改变一个网站的导航栏

一步一步操作过的朋友一定会发现&#xff0c;在Site Actions菜单中有两个有些类似的菜单项&#xff0c;一个是Modify Navigation&#xff0c;另外一个是Manager Content and Structure&#xff0c;这两个项目似乎都跟本篇文章要解决的问题有关。不过&#xff0c;在需要改变网站…

一步一步SharePoint 2007之十九:解决实现注册用户后,自动具备访问网站的权限的问题(1)——配置Provider...

摘要  前面的文章中&#xff0c;我们注册一个新用户后&#xff0c;需要手动加到网站的Members用户组中&#xff0c;这个用户才能真正可以访问网站&#xff0c;这点非常不符合我们的习惯&#xff0c;我们希望能够注册后&#xff0c;自动具备访问网站的权限。那么能不能实现这点…

zencart周末在线外贸建站实战案例练习交流-左栏菜单边框制作视频详解

左栏制作主要要熟悉和掌握边框的标题和边框容器内容的编辑与修改的技巧和经验 本视频任务完成如下图所示: 左栏制作 具体步骤和流程 整体到部分/局部 将目标站的css加到主站主样式 在前台调用 leftBoxContainer------box内容对换 详情请看在线 http://v.youku.com/v_show/id_…