前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >性能平台之Jmeter通过influxdb在Grafana中的数据展现逻辑

性能平台之Jmeter通过influxdb在Grafana中的数据展现逻辑

作者头像
高楼Zee
发布2019-08-01 11:12:31
2K0
发布2019-08-01 11:12:31
举报
文章被收录于专栏:7DGroup7DGroup

这几天在重新部署我的云服务器上的k8s新版本玩,打算试一下k8s新版本的特性。

一堆服务的装,过程也是艰辛。总是会遇到网上都查不着的问题。还有一些是网上说的错误的解决方法。不再多说,否则跟文章名不相符了。

加了prometheus和influxdb、grafana做监控之后,也是想测试一下,看一下有数据的样子,于是拿出jmeter,配置上backend listener。

在grafana中加上个dashboard等步骤。这些网上都有详细的说明文档。

简单的跑起来之后,大概看到这样的监控页面。

之所以要写这个文章是要说明这些数据为什么要这样展现。

这里分成两个部分,一部分是summary的,一部分是针对具体事务的。非常直观。

然后再看筛选器。

我们知道这些数据都来自于backend listener。所以来看看Backend listener的配置。

这里的application是对应着的,transaction也是脚本中自己定义的。

jmeter要发给influxdb,怎么发呢。有两个关键部分。如下所示:

代码语言:javascript
复制
    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));
    }

上面是取到数据,然后通过下面这一段发给influxdb。

代码语言:javascript
复制
 protected void sendMetrics() {


        synchronized (LOCK) {
            for (Map.Entry<String, SamplerMetric> entry : getMetricsInfluxdbPerSampler().entrySet()) {
                SamplerMetric metric = entry.getValue();
                if (entry.getKey().equals(CUMULATED_METRICS)) {
                    addCumulatedMetrics(metric);
                } else {
                    addMetrics(AbstractInfluxdbMetricsSender.tagToStringValue(entry.getKey()), metric);
                }
                // We are computing on interval basis so cleanup
                metric.resetForTimeInterval();
            }
        }


        UserMetric userMetrics = getUserMetrics();
        // For JMETER context
        StringBuilder tag = new StringBuilder(80);
        tag.append(TAG_APPLICATION).append(application);
        tag.append(TAG_TRANSACTION).append("internal");
        tag.append(userTag);
        StringBuilder field = new StringBuilder(80);
        field.append(METRIC_MIN_ACTIVE_THREADS).append(userMetrics.getMinActiveThreads()).append(',');
        field.append(METRIC_MAX_ACTIVE_THREADS).append(userMetrics.getMaxActiveThreads()).append(',');
        field.append(METRIC_MEAN_ACTIVE_THREADS).append(userMetrics.getMeanActiveThreads()).append(',');
        field.append(METRIC_STARTED_THREADS).append(userMetrics.getStartedThreads()).append(',');
        field.append(METRIC_ENDED_THREADS).append(userMetrics.getFinishedThreads());


        influxdbMetricsManager.addMetric(measurement, tag.toString(), field.toString());


        influxdbMetricsManager.writeAndSendMetrics();
    }

然后我们再来看influxdb中如何存。

代码语言:javascript
复制
> show databases
name: databases
name
----
_internal
jmeter
> use jmeter
Using database jmeter
>
> show MEASUREMENTS
name: measurements
name
----
events
jmeter
> select * from events where application='7DgroupApp'
name: events
time                application tags         text                  title
----                ----------- ----         ----                  -----
1564536336377000000 7DgroupApp  Round1       PerfBenchmark started ApacheJMeter
..............
> select * from jmeter where application='7DgroupApp' 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
----                ----------- ---                ----- ---------- ------ --- --- ----- ------ --- ----- -------            -------            -------           -- ------------ --------------- -- -------- ------ -----------
1564536336387000000 7DgroupApp                                      5              0     0          0                                                                                                5               internal
1564536341382000000 7DgroupApp  33.8               165                         52               22        43.900000000000006 47.89999999999998  52                0                               0           all    Transaction2
1564536341382000000 7DgroupApp  38.17              332   0                 996 60               22        49                 52                 59.93999999999997 0                               0           all    all
1564536341383000000 7DgroupApp  43.02              167                         80               30        52                 55.89999999999998  79.90999999999995                                             ok     Transaction1
............

也就是说在influxdb中,创建了两个MEASUREMENTS,events和jmeter。里面各自存了数据,我们在界面中配置的testtile和eventTags放在了events这个measurement中。在很多模板中这个表都是不用的。我们在配置dashboard的时候,会有这样的选择。

这里就写明了要从哪个measurement取数据。

其实在项目的具体实施的角度上来看,testtile和eventTags还是有用的。一般我们都大概会用:

项目 - 场景 - 业务脚本(事务也在这里定义) - 轮次

这样的结构来确定某个测试结果。

这里的testtile就可以对应到场景中去。但是现在这样的表设计并不能实现这一点。拿来主义总是有不尽如人意的地方。

还有一个eventTags也是可以扩展来用的。为什么会需要这样的场景呢。

因为现在的云服务器基本上,在各地都会有,在不同的城市的数据中心,如果我们有一个场景是要这样来做云架构的测试场景。

在测试结果中,我们希望能确定各压力机的区域以及所运行的相同事务在响应时间上的区分。这些过滤参数就会比较有用了。

再来说一下数据。这些数据还是比较简单和笼统的,如果要定位的更细一些。像loadrunner中的webpage diagnostics的功能。

那就要求的太多了。既然不能这样,只能通过其他的手段来做。也就是微服务中必然要做的链路监控和日志分析。

看两个重要的图中的数据query吧。

代码语言:javascript
复制
SELECT last("count") / $send_interval FROM "$measurement_name" WHERE ("transaction" =~ /^$transaction$/ AND "statut" = 'ok') AND $timeFilter GROUP BY time($__interval)

上面这个就是TPS了。在这里称为throughput。

代码语言:javascript
复制
SELECT mean("pct95.0") FROM "$measurement_name" WHERE ("application" =~ /^$application$/) AND $timeFilter GROUP BY "transaction", time($__interval) fill(null)

这是95 pct的响应时间。

后面我会把jmeter做成容器,再指定node来运行。因为jmeter做为java的应用,在做gc的时候不可避免地影响TPS。多实例运行是必然的。

今天先写到这吧。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 7DGroup 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档