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

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

3天内不再提示

如何利用Prometheus+InfluxDB+Grafana打造高逼格监控平台

马哥Linux运维 来源:51cto博客 作者:youerning 2021-09-01 15:36 次阅读

在本模块中,我将把几个常用的监控部分给梳理一下。前面我们提到过,在性能监控图谱中,有操作系统、应用服务器、中间件、队列、缓存、数据库、网络、前端、负载均衡、Web 服务器、存储、代码等很多需要监控的点。

显然这些监控点不能在一个专栏中全部覆盖并一一细化,我只能找最常用的几个,做些逻辑思路的说明,同时也把具体的实现描述出来。如果你遇到了其他的组件,也需要一一实现这些监控。

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

d850b2d4-0acf-11ec-911a-12bb97331649.png

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

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

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

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

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

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

d862d7e8-0acf-11ec-911a-12bb97331649.png

或者装个插件来看结果:

d87b3a7c-0acf-11ec-911a-12bb97331649.png

或者用 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 的结构如下:

d8b369b0-0acf-11ec-911a-12bb97331649.png

在这个结构中,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 呢?请看源码中的关键代码,如下所示:

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(“

”); //$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,就将所有保存的 metrics 都发给了 InfluxDB。

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

。。。。。。。。。。。。。。

n》 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 中显示的时候,就是从这个表中取出的数据,根据时序做的曲线。

Grafana 中的配置

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

d907566a-0acf-11ec-911a-12bb97331649.png

在这里配置好 URL、Database、User、Password 之后,直接点击保存即可。

然后添加一个 JMeter dashboard,我们常用的 dashboard 是 Grafana 官方 ID 为 5496 的模板。导入进来后,选择好对应的数据源。

然后就看到界面了。

这时还没有数据,我们稍后做个示例,看下 JMeter 中的数据怎么和这个界面的数据对应起来。我们先看下图中两个重要的数据查询语句吧。

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 中成功状态的所有事务。

响应时间曲线:

SELECT mean(“pct95.0”) FROM “$measurement_name” WHERE (“application” =~ /^$application$/) AND $timeFilter GROUP BY “transaction”, time($__interval) fill(null)

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

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

d9986218-0acf-11ec-911a-12bb97331649.png

数据比对

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

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

d9e756c0-0acf-11ec-911a-12bb97331649.png

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

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

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

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

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

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

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

da3f5ed8-0acf-11ec-911a-12bb97331649.png

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

配置 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

启动:

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

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

配置 Prometheus

下载 Prometheus:

[root@7dgroup2 data]# wget -c https://github.com/prometheus/prometheus/releases/download/v2.14.0/prometheus-2.14.0.linux-amd64.tar.gz

。。。。。。。。。。

100%[=============================================================================================》] 58,625,125 465KB/s in 6m 4s

2019-11-29 15:40:16 (157 KB/s) - ‘prometheus-2.14.0.linux-amd64.tar.gz’ saved [58625125/58625125]

[root@7dgroup2 data]

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

[root@7dgroup2 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

[root@7dgroup2 prometheus-2.11.1.linux-amd64]#

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

da67b446-0acf-11ec-911a-12bb97331649.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暴露出来的计数器。

这些值和 top 一样,都来自于/proc/目录。

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

总结

为什么要解释数据的逻辑呢?因为最近在工作中遇到一些情况,有人觉得有了 Prometheus+Grafana+Exportor 这样的组合工具之后,基本上都不再用手工执行什么命令了。但我们要了解的是。

对于监控平台来说,它取的所有的数据必然是被监控者可以提供的数据,像 node_exporter 这样小巧的监控收集器,它可以获取的监控数据,并不是整个系统全部的性能数据,只是取到了常见的计数器而已。

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

编辑:jq

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

    关注

    8

    文章

    6853

    浏览量

    88765
  • 服务器
    +关注

    关注

    12

    文章

    8986

    浏览量

    85119
  • 计数器
    +关注

    关注

    32

    文章

    2253

    浏览量

    94310
  • TPS
    TPS
    +关注

    关注

    0

    文章

    83

    浏览量

    36176
  • GUI
    GUI
    +关注

    关注

    3

    文章

    641

    浏览量

    39501

原文标题:Prometheus+InfluxDB+Grafana 打造高逼格监控平台

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

收藏 人收藏

    评论

    相关推荐

    Prometheus的架构原理从“监控”谈起

    。 去年10月我们快速落地了一套易用、灵活、有亮点的业务监控平台,其中使用到了Prometheus。从技术选型阶段,Pr
    的头像 发表于 10-10 15:47 4436次阅读
    <b class='flag-5'>Prometheus</b>的架构原理从“<b class='flag-5'>监控</b>”谈起

    阿里云容器Kubernetes监控(二) - 使用Grafana展现Pod监控数据

    摘要: 简介 在kubernetes的监控方案中,Heapster+Influxdb+Grafana的组合相比prometheus等开源方案而言更为简单直接。而且Heapster在
    发表于 05-10 15:28

    最简单的设备,也能拍摄的照片

    ,根据自己的情况有个度就行了。今天就教大家如何用最简单的、普通的设备,拍摄的照片。第一,没有做不到,只有想不到第二、后期创意处理,效果惊人摄影是一门艺术,创意比器材重要,初学摄影者,不需要一门心思的升级设备,好的作品是需要
    发表于 08-25 16:15

    云栖深度干货 | 打造“云边一体化”,时序时空数据库TSDB技术原理深度解密

    工具展示influxDB中的数据阿里云influxDB提供“一键式”的数据采集工具,用户可以非常方便的安装、启动数据采集工具,并且在阿里云管理平台上管理数据采集工具阿里云influxDB
    发表于 10-21 18:04

    prometheus监控服务的整个流程介绍

    :alerting安装与配置下面看一个几个核心组件的安装包括:Prometheus,AlertManager,Exporter,Grafana;所有组件的安装都是基于k8s平台Prometh
    发表于 12-23 17:34

    NodeMCU+Influxdb+Grafana主要由哪几部分构成

    电力计量——NodeMCU+Influxdb+Grafana主要由一下几个部分构成:-数据库:Influxdb——开源的时序数据库 -前端:Grafana——开源的图表展示 -数据采集
    发表于 02-16 06:42

    简述linux-arm64 UOS安装开源Grafana的步骤

    Graphite、elasticsearch、zabbix、InfluxDBPrometheus和OpenTSDB作为数据源。Grafana主要特性:灵活丰富的图形化选项;可以混合多种风格;支持白天和夜间模式;多个数据源 原作
    发表于 06-16 15:00

    PrometheusInfluxDBGrafana打造监控平台怎么样

    在本文中,我将把几个常用的监控部分给梳理一下。前面我们提到过,在性能监控图谱中,有操作系统、应用服务器、中间件、队列、缓存、数据库、网络、前端、负载均衡、Web 服务器、存储、代码等很多需要监控的点
    的头像 发表于 11-01 10:05 1607次阅读
    <b class='flag-5'>Prometheus</b>、<b class='flag-5'>InfluxDB</b>与<b class='flag-5'>Grafana</b><b class='flag-5'>打造</b><b class='flag-5'>监控</b><b class='flag-5'>平台</b>怎么样

    influxdb+grafana+nodemcu

    电力计量——NodeMCU+Influxdb+Grafana主要由一下几个部分构成:-数据库:Influxdb——开源的时序数据库 -前端:Grafana——开源的图表展示 -数据采集
    发表于 12-17 18:01 8次下载
    <b class='flag-5'>influxdb+grafana</b>+nodemcu

    使用Thanos+Prometheus+Grafana构建监控系统

    对于弹性伸缩和可用的系统来说,一般有大量的指标数据需要收集和存储,如何为这样的系统打造一个监控方案呢?本文介绍了如何使用 Thanos+Prometheus+Grafana 构建
    的头像 发表于 05-05 21:14 2580次阅读

    SpringBoot+Prometheus+Grafana实现自定义监控

    为 /actuator/Prometheus 的 HTTP 服务来供 Prometheus 抓取数据,不过默认该服务是关闭的,该配置将打开所有的 Actuator 服务。
    的头像 发表于 12-26 16:02 1566次阅读

    prometheus下载安装教程

    Prometheus 是一个开放性的监控解决方案,用户可以非常方便的安装和使用 Prometheus 并且能够非常方便的对其进行扩展。 在Prometheus的架构设计中,
    的头像 发表于 01-13 16:07 7859次阅读
    <b class='flag-5'>prometheus</b>下载安装教程

    Grafana 9泰酷了吧

    Grafana 9.0 的主要重点是改善 Grafana 的用户体验,使可观察性和数据可视化更易用也更容易获得。无论是通过 Prometheus 和 Loki 可视化查询生成器还是面板和仪表板搜索
    的头像 发表于 05-30 11:30 535次阅读
    <b class='flag-5'>Grafana</b> 9泰酷了吧

    基于kube-prometheus的大数据平台监控系统设计

    本文介绍了如何基于 kube-prometheus 设计一个监控系统, 以灵活简单的方式对 kubernetes 上的应用进行指标采集,并实现监控报警功能。
    的头像 发表于 05-30 17:02 637次阅读

    基于Prometheus开源的完整监控解决方案

    每一个被 Prometheus 监控的服务都是一个 Job,Prometheus 为这些 Job 提供了官方的 SDK ,利用这个 SDK 可以自定义并导出自己的业务指标,也可以
    发表于 10-18 09:15 425次阅读
    基于<b class='flag-5'>Prometheus</b>开源的完整<b class='flag-5'>监控</b>解决方案