最强性能监控工具之Grafana+Prometheus+Exporters

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
可观测监控 Prometheus 版,每月50GB免费额度
性能测试 PTS,5000VUM额度
简介: 有测试工具、监控工具,才能做性能分析和瓶颈定位。不管数据啥形式展示,最要紧还是数据来源和含义,以做正确判断。

1 监控逻辑


最流行的监控逻辑:

1121.jpeg



有测试工具、监控工具,才能做性能分析和瓶颈定位。


不管数据啥形式展示,最要紧还是数据来源和含义,以做正确判断。


2 JMeter+InfluxDB+Grafana数据展示逻辑

JMeter压测时,使用JMeter控制台查看结果:

1120.png


1115.png


或装插件看结果:



11114.png

或JMeter生成HTML:



1113.png

压力工具只关心三条曲线:TPS(T由测试目标定义)、响应时间、错误率。错误率还只是辅助排查问题的曲线,没问题时,只看TPS、响应时间。


2.1 传统方案的缺陷

整理结果费时

在GUI用插件看曲线,高并发时不现实

在场景运行时间比较长时,采用生成HTML,会出现消耗内存过大的情况。有很多生成的图也并不关注

生成的结果保存之后再查看比较麻烦,还一个个找

2.2 解决方案

用JMeter的Backend Listener实时发数据到InfluxDB或Graphite。Graphite Backend Listener支持在JMeter 2.13版本,InfluxdDB Backend Listener的支持在JMeter 3.3,都是异步发数据,以便查看。


有这JMeter发给InfluxDB的数据,无需看上面的那些HTML数据,也能直观看到系统的性能趋势。以后复看也方便比对。


3 JMeter+InfluxDB+Grafana结构


1112.jpeg

JMeter发送压力到服务器的同时,统计TPS、响应时间、线程数、错误率等信息。


默认每30s在控制台输出一次(jmeter.properties参数#summariser.interval=30可以控制)。


配置Backend Listener后,将统计结果异步发到InfluxDB。最后在Grafana配置:


InfluxDB数据源

JMeter显示模板

就能实时查看JMeter测试结果,这看到的数据和控制台数据一样。


4 数据的传输和展示逻辑

4.1 JMeter中Backend Listener配置

就InfluxDB的Backend Listener做个说明。在脚本中加上即可:



1111.png

先配好influxdb Url、application等信息,application配置可看成是场景名。

4.2 JMeter如何发数据给InfluxDB

关键源码:


private void addMetrics(String transaction, SamplerMetric metric) {

 // FOR ALL STATUS

 addMetric(transaction, metric.getTotal(), metric.getSentBytes(), metric.getReceivedBytes(), TAG_ALL, metric.getAllMean(), metric.getAllMinTime(),

         metric.getAllMaxTime(), allPercentiles.values(), metric::getAllPercentile);

 // FOR OK STATUS

 addMetric(transaction, metric.getSuccesses(), null, null, TAG_OK, metric.getOkMean(), metric.getOkMinTime(),

         metric.getOkMaxTime(), okPercentiles.values(), metric::getOkPercentile);

 // FOR KO STATUS

 addMetric(transaction, metric.getFailures(), null, null, TAG_KO, metric.getKoMean(), metric.getKoMinTime(),

         metric.getKoMaxTime(), koPercentiles.values(), metric::getKoPercentile);

 metric.getErrors().forEach((error, count) -> addErrorMetric(transaction, error.getResponseCode(),

             error.getResponseMessage(), count));

}


站在全局统计视角,这里把JMeter运行的统计结果:


如事务的Total请求、发送接收字节、平均值、最大值、最小值等,都加到metric

同时也把成功/失败的事务信息加到metric

更多的添加metric的步骤看JMeter源码InfluxdbBackendListenerClient.java。


保存metric后,再用InfluxdbMetricsSender发到Influxdb:


  @Override

   public void writeAndSendMetrics() {

........

       if (!copyMetrics.isEmpty()) {

           try {

               if(httpRequest == null) {

                   httpRequest = createRequest(url);

               }

               StringBuilder sb = new StringBuilder(copyMetrics.size()*35);

               for (MetricTuple metric : copyMetrics) {

                   // Add TimeStamp in nanosecond from epoch ( default in InfluxDB )

                   sb.append(metric.measurement)

                       .append(metric.tag)

                       .append(" ") //$NON-NLS-1$

                       .append(metric.field)

                       .append(" ")

                       .append(metric.timestamp+"000000")

                       .append("\n"); //$NON-NLS-1$

               }



               StringEntity entity = new StringEntity(sb.toString(), StandardCharsets.UTF_8);

             

               httpRequest.setEntity(entity);

               lastRequest = httpClient.execute(httpRequest, new FutureCallback<HttpResponse>() {

                   @Override

                   public void completed(final HttpResponse response) {

                       int code = response.getStatusLine().getStatusCode();

                       /*

                        * HTTP response summary 2xx: If your write request received

                        * HTTP 204 No Content, it was a success! 4xx: InfluxDB

                        * could not understand the request. 5xx: The system is

                        * overloaded or significantly impaired.

                        */

                       if (MetricUtils.isSuccessCode(code)) {

                           if(log.isDebugEnabled()) {

                               log.debug("Success, number of metrics written: {}", copyMetrics.size());

                           }

                       } else {

                           log.error("Error writing metrics to influxDB Url: {}, responseCode: {}, responseBody: {}", url, code, getBody(response));

                       }

                   }

                   @Override

                   public void failed(final Exception ex) {

                       log.error("failed to send data to influxDB server : {}", ex.getMessage());

                   }

                   @Override

                   public void cancelled() {

                       log.warn("Request to influxDB server was cancelled");

                   }

               });              

........

           }

       }

   }



通过writeAndSendMetrics,就将所有保存的metrix都发给InfluxDB。


5 InfluxDB存储结构


InfluxDB如何存储:


> show databases

name: databases

name

----

_internal

jmeter

> use jmeter

Using database jmeter

> show MEASUREMENTS

name: measurements

name

----

events

jmeter

> select * from events where application='7ddemo'

name: events

time                application text                title

----                ----------- ----                -----

1575255462806000000 7ddemo      Test Cycle1 started ApacheJMeter

1575256463820000000 7ddemo      Test Cycle1 ended   ApacheJMeter

..............

> select * from jmeter where application='7ddemo' limit 10

name: jmeter

time                application avg                count countError endedT hit max maxAT meanAT min minAT pct90.0            pct95.0           pct99.0 rb responseCode responseMessage sb startedT statut transaction

----                ----------- ---                ----- ---------- ------ --- --- ----- ------ --- ----- -------            -------           ------- -- ------------ --------------- -- -------- ------ -----------

1575255462821000000 7ddemo                                          0              0     0          0                                                                                     0               internal

1575255467818000000 7ddemo      232.82352941176472 17    0                 17  849              122       384.9999999999996  849               849     0                               0           all    all

1575255467824000000 7ddemo      232.82352941176472 17                          849              122       384.9999999999996  849               849     0                               0           all    0_openIndexPage

1575255467826000000 7ddemo      232.82352941176472 17                          849              122       384.9999999999996  849               849                                                 ok     0_openIndexPage

1575255467829000000 7ddemo                                          0              1     1          1                                                                                     1               internal

1575255472811000000 7ddemo      205.4418604651163  26    0                 26  849              122       252.6              271.4             849     0                               0           all    all

1575255472812000000 7ddemo                                          0              1     1          1                                                                                     1               internal

1575255472812000000 7ddemo      205.4418604651163  26                          849              122       252.6              271.4             849                                                 ok     0_openIndexPage

1575255472812000000 7ddemo      205.4418604651163  26                          849              122       252.6              271.4             849     0                               0           all    0_openIndexPage

1575255477811000000 7ddemo      198.2142857142857  27    0                 27  849              117       263.79999999999995 292.3500000000001 849     0                               0           all    all


InfluxDB中创建两个MEASUREMENTS:


events

jmeter

这两个各自存数据,在界面中配置的testtile和eventTags放在events这个MEASUREMENTS中。在模板中这两个值暂都不用。


在jmeter这个MEASUREMENTS中,可看到application和事务的统计信息,这些值和控制台一致。


在Grafana中显示时,就是从这个表中取出数据,根据时序做曲线。


6 Grafana配置

有了JMeter发送到InfluxDB中的数据后,下面得配置Grafana展示。


6.1 配置一个InfluxDB数据源


7.png

在这配置URL、Database、User、Password,点击保存。


6.2 添加一个JMeter dashboard

常用dashboard是Grafana官方ID为5496的模板。导入进来后,选好对应数据源:

16.png



就看到界面啦:


15.png


这时还没数据,稍后做个示例,看JMeter的数据怎么对应的该界面数据。


7 数据对比


图中两个重要的数据查询语句。


7.1 TPS曲线

SELECT last("count") / $send_interval

FROM "$measurement_name"

WHERE ("transaction" =~ /^$transaction$/

      AND "statut" = 'ok')

      AND $timeFilter

      GROUP BY time($__interval)


即Total TPS,在这称为throughput。


这里取的数据来自MEASUREMENTS中成功状态的所有事务。

7.2 响应时间曲线

SELECT mean("pct95.0")

FROM "$measurement_name"

WHERE ("application" =~ /^$application$/)

AND $timeFilter

GROUP BY "transaction", time($__interval) fill(null)


这是用95 pct内的响应时间画出的曲线。


7.3 整体展示效果

155.png


7.4 JMeter配置场景

10个线程,每个线程迭代10次及两个HTTP请求:

13.png



会产生10x10x2=200次请求。JMeter跑下:


12.png


请求数和预想一样,看Grafana展示结果:

11.png



针对每个事务的统计:


10.png


7.5 意义


JMeter到Grafana的展示过程完成。以后就:


不用再保存JMeter执行结果


不用等JMeter输出HTML


8 node_exporter+Prometheus+Grafana数据展示逻辑


性能测试,在常用的Grafana+Prometheus+Exporter逻辑,第一步就要看os资源。


以node_exporter为例,说明os抽取数据的逻辑,来看监控数据的来源:



9.jpeg

node_exporter可支持很多个os:


8.png


当然你也能扩展自己的Exporter。


8.1 配置node_exporter

node_exporter目录:


[root@7dgroup2 node_exporter-0.18.1.linux-amd64]# ll

total 16524

-rw-r--r-- 1 3434 3434    11357 Jun  5 00:50 LICENSE

-rwxr-xr-x 1 3434 3434 16878582 Jun  5 00:41 node_exporter

-rw-r--r-- 1 3434 3434      463 Jun  5 00:50 NOTICE

启动:


./node_exporter --web.listen-address=:9200 &


8.2 配置Prometheus

下载:


wget -c https://github.com/prometheus/prometheus/releases/download/v2.14.0/prometheus-2.14.0.linux-amd64.tar.gz


解压后目录:


[root@ prometheus-2.11.1.linux-amd64]# ll

total 120288

drwxr-xr-x. 2 3434 3434     4096 Jul 10 23:26 console_libraries

drwxr-xr-x. 2 3434 3434     4096 Jul 10 23:26 consoles

drwxr-xr-x. 3 root root     4096 Nov 30 12:55 data

-rw-r--r--. 1 3434 3434    11357 Jul 10 23:26 LICENSE

-rw-r--r--. 1 root root       35 Aug  7 23:19 node.yml

-rw-r--r--. 1 3434 3434     2770 Jul 10 23:26 NOTICE

-rwxr-xr-x. 1 3434 3434 76328852 Jul 10 21:53 prometheus

-rw-r--r--  1 3434 3434     1864 Sep 21 09:36 prometheus.yml

-rwxr-xr-x. 1 3434 3434 46672881 Jul 10 21:54 promtool


在prometheus.yml加如下配置,以取数据:


 - job_name: 's1'

   static_configs:

   - targets: ['172.17.211.143:9200']


启动:


./prometheus --config.file=prometheus.yml &


8.3 配置Grafana

① 配置数据源

7.png


② 配置node_exporter模板

如选择官方模板(ID:11074)的展示:

6.png



8.4 数据逻辑

做性能测试和分析,最重要是知道数据来源和含义。


如上图CPU使用率,点击title上的edit,看语句:


avg(irate(node_cpu_seconds_total{instance=~"$node",mode="system"}[30m])) by (instance)

avg(irate(node_cpu_seconds_total{instance=~"$node",mode="user"}[30m])) by (instance)

avg(irate(node_cpu_seconds_total{instance=~"$node",mode="iowait"}[30m])) by (instance)

1 - avg(irate(node_cpu_seconds_total{instance=~"$node",mode="idle"}[30m])) by (instance)


都是从Prometheus取出的数据,SQL读Prometheus中node_cpu_seconds_total的不同的模块数据。


看node_exporter暴露的计数器:


5.png


值和top一样,都来自/proc/目录。如下即是top命令的数据:

3.png



因此,os中监控数据的取值逻辑:


从os本身的计数器取值

传给Prometheus

再由Grafana中的query语句查出相应的数据

最后由Grafana展示

9 总结

为何专门解释数据的逻辑?有人说有Prometheus+Grafana+Exportor,就无需再手工执行命令。


但监控平台取的所有的数据,必然是被监控者可提供的数据,像node_exporter这样小巧的监控收集器,可获取的监控数据,并非整个系统全部的性能数据,只是取到常见计数器。


这些计数器不管用命令查看,还是用花里胡哨的工具,它的值本身都不会变。所以不管在监控平台 or 命令行中看到的数据,最重要是知道含义及这些值的变化对性能测试和分析的下一步的影响。


JMeter如何把数据推送到Grafana中?

1.在JMeter中启用插件:要将JMeter数据推送到Grafana中,您需要在JMeter中启用插件。在JMeter的lib/ext目录中找到JMeter插件管理器插件文件(JMeterPlugins-Manager.jar),并将其放置在该目录中。重启JMeter后,单击“选项”菜单中的“插件管理器”,然后选择“可选插件”选项卡。在这里,选择“grafana-backendlistener”并单击“应用更改”。


2.配置Grafana:打开Grafana中的数据源列表,选择一个数据源(例如InfluxDB)并创建一个数据库。请确保将数据库名称、用户名和密码配置为与JMeter对接的数据源的名称、用户名和密码相同。


3.在JMeter中添加Backend Listener:在JMeter测试计划中添加Backend Listener。在Backend Listener的属性中,选择“InfluxDBBackendListenerClient”作为Backend Listener实现,并按照屏幕上的说明设置InfluxDB的服务器和端口。


4.在Grafana中查看测试结果:创建一个Grafana仪表板,并选择InfluxDB作为数据源。在仪表板上选择一个面板,并将其设置为在Grafana中显示JMeter测试结果的数据。


都是监控os计数器,监控平台的数据和监控命令中的数据啥区别?

1.监控平台是一个基于web或客户端的可视化平台,可以将实时的OS监控指标以图表、表格等形式展示出来,以便于管理员进行查看与分析。


2.监控命令是一种命令行方式的工具,提供了丰富的OS监控指标查询和分析功能。它通过在终端输入不同的命令参数,实时获取和显示各种系统统计和性能指标。它主要用于开发和运维人员进行诊断和分析。


3.监控平台是一种可配置、可扩展的监控方案,它可以帮助管理员实现对复杂的分布式应用的监控。而监控命令通常只能监控单个系统的指标。


4.监控平台通常要安装一个客户端,以便向平台发送数据。而在监控命令中,可以直接在终端输入命令,获取OS的监控指标。


综上:


监控平台提供GUI,便于管理员查看和管理指标数据

监控命令则更灵活,提供更多细节和具体信息

相关实践学习
通过可观测可视化Grafana版进行数据可视化展示与分析
使用可观测可视化Grafana版进行数据可视化展示与分析。
目录
相关文章
|
2月前
|
Prometheus 监控 Cloud Native
Prometheus+Grafana监控Linux主机
通过本文的步骤,我们成功地在 Linux 主机上使用 Prometheus 和 Grafana 进行了监控配置。具体包括安装 Prometheus 和 Node Exporter,配置 Grafana 数据源,并导入预设的仪表盘来展示监控数据。通过这种方式,可以轻松实现对 Linux 主机的系统指标监控,帮助及时发现和处理潜在问题。
205 7
|
2月前
|
存储 数据采集 Prometheus
Grafana Prometheus Altermanager 监控系统
Grafana、Prometheus 和 Alertmanager 是一套强大的开源监控系统组合。Prometheus 负责数据采集与存储,Alertmanager 处理告警通知,Grafana 提供可视化界面。本文简要介绍了这套系统的安装配置流程,包括各组件的下载、安装、服务配置及开机自启设置,并提供了访问地址和重启命令。适用于希望快速搭建高效监控平台的用户。
162 20
|
2月前
|
Prometheus 监控 前端开发
Grafana 安装配置教程,让你的 Prometheus 监控数据变得更美观
《Grafana安装配置教程,让你的Prometheus监控数据变得更美观》简介: Grafana是一个开源的度量分析与可视化工具,支持多种数据源(如Prometheus),提供丰富的可视化功能和警报机制。本文详细介绍了Grafana的安装、汉化方法及模板使用,帮助用户轻松创建美观、灵活的数据面板,并实现数据的协作与共享。通过Docker镜像、配置文件修改或替换前端页面等方式实现汉化,让用户更便捷地使用中文界面。此外,还提供了导入JSON格式模板的具体步骤,方便快速搭建仪表盘。
99 2
|
2月前
|
Prometheus Cloud Native Linux
Prometheus+Grafana新手友好教程:从零开始搭建轻松掌握强大的警报系统
本文介绍了使用 Prometheus 和 Grafana 实现邮件报警的方案,包括三种主要方法:1) 使用 Prometheus 的 Alertmanager 组件;2) 使用 Grafana 的内置告警通知功能;3) 使用第三方告警组件如 OneAlert。同时,详细描述了环境准备、Grafana 安装配置及预警设置的步骤,确保用户能够成功搭建并测试邮件报警功能。通过这些配置,用户可以在系统或应用出现异常时及时收到邮件通知,保障系统的稳定运行。
174 1
|
2月前
|
Prometheus 运维 监控
Prometheus+Grafana+NodeExporter:构建出色的Linux监控解决方案,让你的运维更轻松
本文介绍如何使用 Prometheus + Grafana + Node Exporter 搭建 Linux 主机监控系统。Prometheus 负责收集和存储指标数据,Grafana 用于可视化展示,Node Exporter 则采集主机的性能数据。通过 Docker 容器化部署,简化安装配置过程。完成安装后,配置 Prometheus 抓取节点数据,并在 Grafana 中添加数据源及导入仪表盘模板,实现对 Linux 主机的全面监控。整个过程简单易行,帮助运维人员轻松掌握系统状态。
291 3
|
3月前
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第27天】在智能运维中,Prometheus和Grafana的组合已成为监控和告警体系的事实标准。Prometheus负责数据收集和存储,支持灵活的查询语言PromQL;Grafana提供数据的可视化展示和告警功能。本文介绍如何配置Prometheus监控目标、Grafana数据源及告警规则,帮助运维团队实时监控系统状态,确保稳定性和可靠性。
420 0
|
3月前
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第26天】Prometheus与Grafana是智能运维中的强大组合,前者是开源的系统监控和警报工具,后者是数据可视化平台。Prometheus具备时间序列数据库、多维数据模型、PromQL查询语言等特性,而Grafana支持多数据源、丰富的可视化选项和告警功能。两者结合可实现实时监控、灵活告警和高度定制化的仪表板,广泛应用于服务器、应用和数据库的监控。
434 3
|
3月前
|
Prometheus 监控 Cloud Native
基于Docker安装Grafana和Prometheus
Grafana 是一款用 Go 语言开发的开源数据可视化工具,支持数据监控和统计,并具备告警功能。通过 Docker 部署 Grafana 和 Prometheus,可实现系统数据的采集、展示和告警。默认登录用户名和密码均为 admin。配置 Prometheus 数据源后,可导入主机监控模板(ID 8919)进行数据展示。
161 2
|
6月前
|
监控 Java 开发者
揭秘Struts 2性能监控:选对工具与方法,让你的应用跑得更快,赢在起跑线上!
【8月更文挑战第31天】在企业级应用开发中,性能监控对系统的稳定运行至关重要。针对流行的Java EE框架Struts 2,本文探讨了性能监控的工具与方法,包括商用的JProfiler、免费的VisualVM以及Struts 2自带的性能监控插件。通过示例代码展示了如何在实际项目中实施这些监控手段,帮助开发者发现和解决性能瓶颈,确保应用在高并发、高负载环境下稳定运行。选择合适的监控工具需综合考虑项目需求、成本、易用性和可扩展性等因素。
61 0
|
6月前
|
Java 开发者 前端开发
Struts 2、Spring MVC、Play Framework 上演巅峰之战,Web 开发的未来何去何从?
【8月更文挑战第31天】在Web应用开发中,Struts 2框架因强大功能和灵活配置备受青睐,但开发者常遇配置错误、类型转换失败、标签属性设置不当及异常处理等问题。本文通过实例解析常见难题与解决方案,如配置文件中遗漏`result`元素致页面跳转失败、日期格式不匹配需自定义转换器、`&lt;s:checkbox&gt;`标签缺少`label`属性致显示不全及Action中未捕获异常影响用户体验等,助您有效应对挑战。
122 0