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

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
可观测可视化 Grafana 版,10个用户账号 1个月
性能测试 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
自定义grafana_table(数据源Prometheus)
综上所述,自定义 Grafana 表格并将 Prometheus 作为数据源的关键是理解 PromQL 的查询机制、熟悉 Grafana 面板的配置选项,并利用 Grafana 强大的转换和自定义功能使数据展示更为直观和有洞见性。随着对这些工具更深入的了解,您将可以创建出更高级的监控仪表盘,以支持复杂的业务监控需求。
172 1
|
2月前
|
Prometheus 监控 Cloud Native
prometheus学习笔记之Grafana安装与配置
prometheus学习笔记之Grafana安装与配置
|
2月前
|
存储 Linux 数据库
性能工具之JMeter + Grafana + InfluxDB 性能平台搭建
【8月更文挑战第7天】性能工具之JMeter + Grafana + InfluxDB 性能平台搭建
64 1
性能工具之JMeter + Grafana + InfluxDB 性能平台搭建
|
2月前
|
存储 Prometheus 监控
Grafana 与 Prometheus 集成:打造高效监控系统
【8月更文第29天】在现代软件开发和运维领域,监控系统已成为不可或缺的一部分。Prometheus 和 Grafana 作为两个非常流行且互补的开源工具,可以协同工作来构建强大的实时监控解决方案。Prometheus 负责收集和存储时间序列数据,而 Grafana 则提供直观的数据可视化功能。本文将详细介绍如何集成这两个工具,构建一个高效、灵活的监控系统。
279 1
|
2月前
|
Prometheus 监控 Cloud Native
Spring Boot 性能护航!Prometheus、Grafana、ELK 组合拳,点燃数字化时代应用稳定之火
【8月更文挑战第29天】在现代软件开发中,保证应用性能与稳定至关重要。Spring Boot 作为流行的 Java 框架,结合 Prometheus、Grafana 和 ELK 可显著提升监控与分析能力。Prometheus 负责收集时间序列数据,Grafana 将数据可视化,而 ELK (Elasticsearch、Logstash、Kibana)则管理并分析应用日志。通过具体实例演示了如何在 Spring Boot 应用中集成这些工具:配置 Prometheus 获取度量信息、Grafana 显示结果及 ELK 分析日志,从而帮助开发者快速定位问题,确保应用稳定高效运行。
88 1
|
2月前
|
Prometheus Kubernetes 监控
Kubernetes(K8S) 监控 Prometheus + Grafana
Kubernetes(K8S) 监控 Prometheus + Grafana
192 2
|
2月前
|
监控 Java 开发者
揭秘Struts 2性能监控:选对工具与方法,让你的应用跑得更快,赢在起跑线上!
【8月更文挑战第31天】在企业级应用开发中,性能监控对系统的稳定运行至关重要。针对流行的Java EE框架Struts 2,本文探讨了性能监控的工具与方法,包括商用的JProfiler、免费的VisualVM以及Struts 2自带的性能监控插件。通过示例代码展示了如何在实际项目中实施这些监控手段,帮助开发者发现和解决性能瓶颈,确保应用在高并发、高负载环境下稳定运行。选择合适的监控工具需综合考虑项目需求、成本、易用性和可扩展性等因素。
37 0
|
2月前
|
Java 开发者 前端开发
Struts 2、Spring MVC、Play Framework 上演巅峰之战,Web 开发的未来何去何从?
【8月更文挑战第31天】在Web应用开发中,Struts 2框架因强大功能和灵活配置备受青睐,但开发者常遇配置错误、类型转换失败、标签属性设置不当及异常处理等问题。本文通过实例解析常见难题与解决方案,如配置文件中遗漏`result`元素致页面跳转失败、日期格式不匹配需自定义转换器、`&lt;s:checkbox&gt;`标签缺少`label`属性致显示不全及Action中未捕获异常影响用户体验等,助您有效应对挑战。
80 0
|
2月前
|
SQL 监控 关系型数据库
SQL性能监控与调优工具的神奇之处:如何用最佳实践选择最适合你的那一个,让你的数据库飞起来?
【8月更文挑战第31天】在现代软件开发中,数据库性能监控与调优对应用稳定性至关重要。本文对比了数据库内置工具、第三方工具及云服务工具等几种常用SQL性能监控与调优工具,并通过示例代码展示了如何利用MySQL的EXPLAIN功能分析查询性能。选择最适合的工具需综合考虑功能需求、数据库类型及成本预算等因素。遵循了解工具功能、试用工具及定期维护工具等最佳实践,可帮助开发者更高效地管理和优化数据库性能,迎接未来软件开发中的挑战与机遇。
47 0
|
2月前
|
Prometheus 监控 Cloud Native
性能监控之 Golang 应用接入 Prometheus 监控
【8月更文挑战第4天】性能监控之 Golang 应用接入 Prometheus 监控
175 0
性能监控之 Golang 应用接入 Prometheus 监控