0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Prometheus、InfluxDB与Grafana打造监控平台怎么样

马哥Linux运维 来源:博客园 作者:丝瓜呆呆 2021-11-01 10:05 次阅读

在本文中,我将把几个常用的监控部分给梳理一下。前面我们提到过,在性能监控图谱中,有操作系统、应用服务器、中间件、队列、缓存、数据库、网络、前端、负载均衡、Web 服务器、存储、代码等很多需要监控的点。显然这些监控点不能在一个专栏中全部覆盖并一一细化,我只能找最常用的几个,做些逻辑思路的说明,同时也把具体的实现描述出来。如果你遇到了其他的组件,也需要一一实现这些监控。

在本篇中,主要想说明白下图的这个监控逻辑。

这应该是现在最流行的一套监控逻辑了吧。我今天把常见的使用 Grafana、Prometheus、InfluxDB、Exporters 的数据展示方式说一下,如果你刚进入性能测试领域,也能有一个感性的认识。

有测试工具,有监控工具,才能做后续的性能分析和瓶颈定位,所以有必要把这些工具的逻辑跟你摆一摆。

所有做性能的人都应该知道一点,不管数据以什么样的形式展示,最要紧的还是看数据的来源和含义,以便做出正确的判断。

我先说明一下 JMeter 和 node_exporter 到 Grafana 的数据展示逻辑。至于其他的 Exporter,我就不再解释这个逻辑了,只说监控分析的部分。

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

一般情况下,我们用 JMeter 做压力测试时,都是使用 JMeter 的控制台来查看结果。如下图所示:

或者装个插件来看结果:

或者用 JMeter 来生成 HTML:

这样看都没有问题,我们在前面也强调过,对于压力工具来说,我们最多只关心三条曲线的数据:TPS(T 由测试目标定义)、响应时间、错误率。这里的错误率还只是辅助排查问题的曲线,没有问题时,只看 TPS 和响应时间即可。不过采取以上三种方式有几个方面的问题。

整理结果时比较浪费时间。

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

在场景运行时间比较长的时候,采用生成 HTML 的方式,会出现消耗内存过大的情况,而实际上,在生成的结果图中,有很多生成的图我们并不是那么关注。

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

那么如何解决这几个问题呢?

用 JMeter 的 Backend Listener 帮我们实时发送数据到 InfluxDB 或 Graphite 可以解决这样的问题。

Graphite Backend Listener 的支持是在 JMeter 2.13 版本,InfluxdDB Backend Listener 的支持是在 JMeter 3.3 的版本,它们都是用异步的方式把数据发送出来,以便查看。

其实有这个 JMeter 发送给 InfluxDB 的数据之后,我们不需要看上面的那些 HTML 数据,也可以直观地看到系统性能的性能趋势。

并且这样保存下来的数据,在测试结束后想再次查看也比较方便比对。

JMeter + InfluxDB + Grafana 的结构如下:

在这个结构中,JMeter 发送压力到服务器的同时,统计下 TPS、响应时间、线程数、错误率等信息。默认每 30 秒在控制台输出一次结果(在 jmeter.properties 中有一个参数 #summariser.interval=30 可以控制)。

配置了 Backend Listener 之后,将统计出的结果异步发送到 InfluxDB 中。最后在 Grafana 中配置 InfluxDB 数据源和 JMeter 显示模板。

然后就可以实时查看 JMeter 的测试结果了,这里看到的数据和控制台的数据是一样。

但如果这么简单就说完了,这篇文章也就没价值了。下面我们来说一下,数据的传输和展示逻辑。

JMeter 中 Backend Listener 的配置

下面我们就 InfluxDB 的 Backend Listener 做个说明。它的配置比较简单,在脚本中加上即可。

我们先配置好 InfluxDB URL、Application 等信息,Application 这个配置可以看成是场景名。

那么 JMeter 如何将数据发给 InfluxDB 呢?请看源码中的关键代码,如下所示:


	

privatevoidaddMetrics(Stringtransaction,SamplerMetricmetric){ //FORALLSTATUS addMetric(transaction,metric.getTotal(),metric.getSentBytes(),metric.getReceivedBytes(),TAG_ALL,metric.getAllMean(),metric.getAllMinTime(), metric.getAllMaxTime(),allPercentiles.values(),metric::getAllPercentile); //FOROKSTATUS addMetric(transaction,metric.getSuccesses(),null,null,TAG_OK,metric.getOkMean(),metric.getOkMinTime(), metric.getOkMaxTime(),okPercentiles.values(),metric::getOkPercentile); //FORKOSTATUS 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 中去。发送关键代码如下:

	

@OverridepublicvoidwriteAndSendMetrics(){ ........if(!copyMetrics.isEmpty()){try{if(httpRequest==null){ httpRequest=createRequest(url); } StringBuildersb=newStringBuilder(copyMetrics.size()*35);for(MetricTuplemetric:copyMetrics){//AddTimeStampinnanosecondfromepoch(defaultinInfluxDB) sb.append(metric.measurement) .append(metric.tag) .append("")//$NON-NLS-1$ .append(metric.field) .append("") .append(metric.timestamp+"000000") .append(" ");//$NON-NLS-1$ } StringEntityentity=newStringEntity(sb.toString(),StandardCharsets.UTF_8); httpRequest.setEntity(entity); lastRequest=httpClient.execute(httpRequest,newFutureCallback(){ @Overridepublicvoidcompleted(finalHttpResponseresponse){intcode=response.getStatusLine().getStatusCode();/**HTTPresponsesummary2xx:Ifyourwriterequestreceived *HTTP204NoContent,itwasasuccess!4xx:InfluxDB *couldnotunderstandtherequest.5xx:Thesystemis *overloadedorsignificantlyimpaired.*/ if(MetricUtils.isSuccessCode(code)){if(log.isDebugEnabled()){ log.debug("Success,numberofmetricswritten:{}",copyMetrics.size()); } }else{ log.error("ErrorwritingmetricstoinfluxDBUrl:{},responseCode:{},responseBody:{}",url,code,getBody(response)); } } @Overridepublicvoidfailed(finalExceptionex){ log.error("failedtosenddatatoinfluxDBserver:{}",ex.getMessage()); } @Overridepublicvoidcancelled(){ log.warn("RequesttoinfluxDBserverwascancelled"); } }); ........ } } }

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

InfluxDB 中的存储结构

然后我们再来看下 InfluxDB 中如何存储:

	
		>showdatabases name:databases name ---- _internal jmeter >usejmeter Usingdatabasejmeter > >showMEASUREMENTS name:measurements name ---- events jmeter >select*fromeventswhereapplication='7ddemo' name:events timeapplicationtexttitle ------------------------ 15752554628060000007ddemoTestCycle1startedApacheJMeter 15752564638200000007ddemoTestCycle1endedApacheJMeter .............. n>select*fromjmeterwhereapplication='7ddemo'limit10 name:jmeter timeapplicationavgcountcountErrorendedThitmaxmaxATmeanATminminATpct90.0pct95.0pct99.0rbresponseCoderesponseMessagesbstartedTstatuttransaction --------------------------------------------------------------------------------------------------------------------------------------------- 15752554628210000007ddemo00000internal 15752554678180000007ddemo232.8235294117647217017849122384.999999999999684984900allall 15752554678240000007ddemo232.8235294117647217849122384.999999999999684984900all0_openIndexPage 15752554678260000007ddemo232.8235294117647217849122384.9999999999996849849ok0_openIndexPage 15752554678290000007ddemo01111internal 15752554728110000007ddemo205.441860465116326026849122252.6271.484900allall 15752554728120000007ddemo01111internal 15752554728120000007ddemo205.441860465116326849122252.6271.4849ok0_openIndexPage 15752554728120000007ddemo205.441860465116326849122252.6271.484900all0_openIndexPage 15752554778110000007ddemo198.214285714285727027849117263.79999999999995292.350000000000184900allall
				这段代码也就是说,在 InfluxDB 中,创建了两个 MEASUREMENTS,分别是 events 和 jmeter。这两个各自存了数据,我们在界面中配置的 testtile 和 eventTags 放在了 events 这个 MEASUREMENTS 中。在模板中这两个值暂时都是不用的。
				
				在 JMeter 这个 MEASUREMENTS 中,我们可以看到 application 和事务的统计信息,这些值和控制台一致。在 Grafana 中显示的时候,就是从这个表中取出的数据,根据时序做的曲线。

Grafana 中的配置

有了 JMeter 发送到 InfluxDB 中的数据,下面就来配置一下 Grafana 中的展示。首先,要配置一个 InfluxDB 数据源。如下所示

173a7d26-3a2e-11ec-82a9-dac502259ad0.png

在这里配置好 URL、Database、User、Password 之后,直接点击保存即可。 然后添加一个 JMeter Dashboard,我们常用的 Dashboard 是 Grafana 官方 ID 为 5496 的模板。导入进来后,选择好对应的数据源。
然后就看到界面了。
这时还没有数据,我们稍后做个示例,看下 JMeter 中的数据怎么和这个界面的数据对应起来。我们先看下图中两个重要的数据查询语句吧。TPS 曲线

	

SELECTlast("count")/$send_intervalFROM"$measurement_name"WHERE("transaction"=~/^$transaction$/AND"statut"='ok')AND$timeFilterGROUPBYtime($__interval)

上面这个就是 Total TPS 了,在这里称为 throughput。 关于这个概念,我在第一篇中就已经有了说明,这里再次提醒,概念的使用在团队中要有统一的认识,不要受行业内一些传统信息的误导。 这里取的数据来自 MEASUREMENTS 中成功状态的所有事务。 响应时间曲线:

	
		SELECTmean("pct95.0")FROM"$measurement_name"WHERE("application"=~/^$application$/)AND$timeFilterGROUPBY"transaction",time($__interval)fill(null)

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

整体展示出来的效果如下:

数据比对

首先,我们在 JMeter 中配置一个简单的场景。10 个线程,每个线程迭代 10 次,以及两个 HTTP 请求。

也就是说,这时会产生 10x10x2=200 次请求。我们用 JMeter 跑起来看一下。

看到了吧,这个请求数和我们预想的一样。下面我们看一下 Grafana 中展示出来的结果。

还有针对每个事务的统计情况。

至此,JMeter 到 Grafana 的展示过程就完成了。以后我们就不用再保存 JMeter 的执行结果了,也不用等着 JMeter 输出 HTML 了。

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

对性能测试来说,在常用的 Grafana + Prometheus + Exporter 的逻辑中,第一步要看的就是操作系统资源了。所以在这一篇中,我们将以 node_exporter 为例来说明一下操作系统抽取数据的逻辑,以便知道监控数据的来源,至于数据的含义,我们将在后续的文章中继续描述。

首先,我们还是要画一个图。

现在 node_exporter 可以支持很多个操作系统了。官方列表如下:

当然不是说只支持这些,你也可以扩展自己的 Exporter。

配置 node_exporter

node_exporter 目录如下:


	

[root@7dgroup2node_exporter-0.18.1.linux-amd64]#ll total16524 -rw-r--r--13434343411357Jun500:50LICENSE -rwxr-xr-x13434343416878582Jun500:41node_exporter -rw-r--r--134343434463Jun500:50NOTICE}

启动:

	

[root@7dgroup2node_exporter-0.18.1.linux-amd64]#./node_exporter--web.listen-address=:9200&

是不是很简洁?如果想看更多的功能 ,可以查看下它的帮助。 配置 Prometheus下载 Prometheus:

	

[root@7dgroup2data]#wget-chttps://github.com/prometheus/prometheus/releases/download/v2.14.0/prometheus-2.14.0.linux-amd64.tar.gz .......... 100%[=============================================================================================>]58,625,125465KB/sin6m4s 2019-11-291516(157KB/s)-‘prometheus-2.14.0.linux-amd64.tar.gz’saved[58625125/58625125] [root@7dgroup2data]

解压之后,我们可以看到目录结构如下:

	

[root@7dgroup2prometheus-2.11.1.linux-amd64]#ll total120288 drwxr-xr-x.2343434344096Jul1023:26console_libraries drwxr-xr-x.2343434344096Jul1023:26consoles drwxr-xr-x.3rootroot4096Nov3012:55data -rw-r--r--.13434343411357Jul1023:26LICENSE -rw-r--r--.1rootroot35Aug723:19node.yml -rw-r--r--.1343434342770Jul1023:26NOTICE -rwxr-xr-x.13434343476328852Jul1021:53prometheus -rw-r--r--1343434341864Sep2109:36prometheus.yml -rwxr-xr-x.13434343446672881Jul1021:54promtool [root@7dgroup2prometheus-2.11.1.linux-amd64]#

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

	

-job_name:'s1' static_configs: -targets:['172.17.211.143:9200']

启动:

	

[root@7dgroup2data]#./prometheus--config.file=prometheus.yml&

这样就行了吗?当然不是。根据上面的流程图,我们还需要配置 Grafana。 配置 Grafana 首先配置一个数据源,非常简单。如下所示:

18a9dcd8-3a2e-11ec-82a9-dac502259ad0.png

再配置一个 node_exporter 的模板,比如我这里选择了官方模板(ID:11074),展示如下:

18e4c366-3a2e-11ec-82a9-dac502259ad0.png

数据逻辑说明 说明完上面的过程之后,对我们做性能测试和分析的人来说,最重要的,就是要知道数据的来源和含义了。 拿上面图中的 CPU 使用率来说吧(因为 CPU 使用率是非常重要的一个计数器,所以我们今天先拿它来开刀)。 我们先点一下 title 上的 edit,看一下它的 query 语句。

	

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 中取出来的数据,查询语句读了 Prometheus 中node_cpu_seconds_total的不同的模块数据。 下面我们来看一下,node_exporter暴露出来的计数器。

194968fc-3a2e-11ec-82a9-dac502259ad0.png

这些值和 top 一样,都来自于/proc/目录。下面这张图是 top 数据,我们可以比对一下。

19bf9554-3a2e-11ec-82a9-dac502259ad0.png

到此,我们就了解到了操作系统中监控数据的取值逻辑了,也就是从操作系统本身的计数器中取出值来,然后传给 Prometheus,再由 Grafana 中的 query 语句查出相应的数据,最后由 Grafana 展示在界面上。

总结

为什么要解释数据的逻辑呢?因为最近在工作中遇到一些情况,有人觉得有了 Prometheus + Grafana + Exportor 这样的组合工具之后,基本上都不再用手工执行什么命令了。但我们要了解的是,对于监控平台来说,它取的所有的数据必然是被监控者可以提供的数据,像 node_exporter 这样小巧的监控收集器,它可以获取的监控数据,并不是整个系统全部的性能数据,只是取到了常见的计数器而已。这些计数器不管是用命令查看,还是用这样炫酷的工具查看,它的值本身都不会变。所以不管是在监控平台上看到的数据,还是在命令行中看到的数据,我们最重要的是要知道含义以及这些值的变化对性能测试和分析的下一步骤的影响。

原文链接:https://www.cnblogs.com/siguadd/p/14878035.html
编辑:jq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6853

    浏览量

    88765
  • 网络
    +关注

    关注

    14

    文章

    7494

    浏览量

    88574
  • GUI
    GUI
    +关注

    关注

    3

    文章

    641

    浏览量

    39501
  • Web 服务器
    +关注

    关注

    0

    文章

    3

    浏览量

    1449

原文标题:基于 Prometheus、InfluxDB 与 Grafana 打造监控平台

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    安科瑞电力智能监控平台的应用

    0.引言 随着社会和科学技术的发展,配电系统的智能化已经成为一种发展趋势。医院建设电力智能监控平台,可对供电系统进行集中管理和调度、实时控制和数据采集,监控供电系统设备的运行情况,及时掌握和处理
    的头像 发表于 11-01 09:30 74次阅读
    安科瑞电力智能<b class='flag-5'>监控</b><b class='flag-5'>平台</b>的应用

    监控平台设计思路

    电子发烧友网站提供《监控平台设计思路.pptx》资料免费下载
    发表于 10-09 11:18 0次下载

    泵站远程监控物联网平台有什么功能

    泵站作为供水与排水系统中的重要设施,其运行状态直接影响着民生和工业生产的安全与效率。随着物联网、大数据和云计算等技术的快速发展,泵站远程监控物联网平台应运而生,为泵站的智能化管理和自动化操作提供了
    的头像 发表于 09-12 13:56 168次阅读

    工业互联网远程监控平台是什么

    工业互联网远程监控平台:赋能智能制造的利器 在当今快速发展的工业领域,工业互联网远程监控平台正逐渐成为推动工业升级和数字化转型的重要力量。工业互联网
    的头像 发表于 08-29 14:11 170次阅读

    动环监控系统平台功能

    全面监控,因此,一套可对机房环境进行7×24小时实时监控的物联网系统,非常必要。 动环监控系统是一套基于动环监控平台的的物联网综合管控解决方
    的头像 发表于 07-19 16:35 303次阅读

    设备监控物联网SaaS平台是什么?设备监控物联网SaaS平台的功能

    设备监控物联网SaaS平台是一种基于云计算技术,专为设备监控和管理设计的软件即服务(Software as a Service)解决方案。这种平台允许企业无需自行搭建和维护复杂的IT基
    的头像 发表于 05-15 16:17 435次阅读

    PLC远程监控维护平台是什么

    售后服务的关键工具。 数之能推出的PLC远程监控维护平台可以实现西门子、三菱、欧姆龙、施耐德、台达、汇川等PLC的远程维护,旨在帮助工程师跨越地理界限,对分布在全球各地的PLC系统进行监控、诊断以及修复。通过这个
    的头像 发表于 05-11 13:40 418次阅读

    LabVIEW操作InfluxDB数据库应用特点和原理概念

    InfluxDB的行协议是一种写入数据点到InfluxDB的文本格式。必须要是这样的格式的数据点才能被Influxdb解析和写入成功,当然除非你使用一些其他服务插件。
    的头像 发表于 04-12 12:21 1176次阅读
    LabVIEW操作<b class='flag-5'>InfluxDB</b>数据库应用特点和原理概念

    电缆隧道综合监控管理平台的规划设置和特性

    电缆隧道作为城市电力供应、信息传输和能源输送的重要通道,其安全和稳定性对城市的正常运行至关重要。因此,一个高效、智能的电缆隧道综合监控管理平台的规划设置就显得尤为关键。本文深圳鼎信智慧科技将详细探讨
    的头像 发表于 04-09 18:01 478次阅读

    基于物联网平台与边缘计算网关,打造高效能工厂设备监控系统方案

    ,利用边缘计算网关与物联网平台构建工厂车间在线检测设备监控系统,实现实时监控成为迫切需求。 二、方案介绍 万物 物联网设备监控方案旨在利用EG8000mini边缘计算网关与Things
    的头像 发表于 03-08 15:21 411次阅读
    基于物联网<b class='flag-5'>平台</b>与边缘计算网关,<b class='flag-5'>打造</b>高效能工厂设备<b class='flag-5'>监控</b>系统方案

    如何快速打造属于自己的工业物联网云平台

    如何快速打造属于自己的工业物联网云平台 工业物联网云平台是工业4.0的核心,是实现智能制造、智能物流、智能工厂的重要手段。在快速发展的信息化时代,如何快速打造属于自己的工业物联网云
    的头像 发表于 01-25 16:51 567次阅读
    如何快速<b class='flag-5'>打造</b>属于自己的工业物联网云<b class='flag-5'>平台</b>

    Prometheus监控业务指标详解

    在 Kubernetes 已经成了事实上的容器编排标准之下,微服务的部署变得非常容易。但随着微服务规模的扩大,服务治理带来的挑战也会越来越大。在这样的背景下出现了服务可观测性(observability)的概念。
    的头像 发表于 01-24 10:32 531次阅读
    <b class='flag-5'>Prometheus</b><b class='flag-5'>监控</b>业务指标详解

    远程监控平台,让你的数据无处可藏!

    远程监控平台,让你的数据无处可藏! 云平台远程监控是一种通过云平台实现对设备的远程监控和管理的
    的头像 发表于 01-05 17:00 520次阅读

    Prometheus新手常犯的6项错误你知道吗?

    这是 Prometheus 使用者经常会犯的一个错,因为 Prometheus 时序是基于多标签的,它非常灵活,有时你想新增一个标签,从而将一个粗粒度的指标进行拆分,但切记添加的标签的值应该做到尽量收敛
    的头像 发表于 12-26 10:18 606次阅读
    <b class='flag-5'>Prometheus</b>新手常犯的6项错误你知道吗?

    Prometheus实战篇:Exporter知识概述

    所有可以向Prometheus提供监控样本数据的程序都可以被称为一个Exporter.而Exporter的一个实例称为target,如图下所示
    的头像 发表于 12-25 09:57 943次阅读
    <b class='flag-5'>Prometheus</b>实战篇:Exporter知识概述