前戏
Jmeter原生测试报告有如下缺点
- 不具备实时性
- 报告中的数据是测试时间段内的平均值
- 丑
在如上缺点中,就诞生了性能监控平台,性能监控平台比jmeter的优势如下
- 实时展示Jmeter压测数据
- 数据范围可选
- 界面美观
性能监控平台的组成如下
- Jmeter:压测工具,产生压测数据
- InfluxDB:开源时序数据库,特别适合用于处理和分析资源监控数据,用于存储压测数据。
- Grefana:度量分析与可视化图标展示工具,可以支持不同种类的数据源,用于存储与InfluxDB中的数据以图标的形式展示出来。
InfluxDB部署
自从学会了docker之后,所有的环境部署我都会优先考虑docker,部署起来简单方便
部署之前确保自己已经安装了docker并且启动了,如何部署查看我的docker文章。
1.下载influxDB镜像
docker pull influxdb
2.下载完查看镜像
docker images
3.启动 influxDB 容器,将新 influxDB 容器命名为 jmeterdb, 执⾏docker创建容易命令:
docker run -d -p 8086:8086 -p 8083:8083 --name=jmeterdb influxdb
4.执⾏如下命令进⼊容器内部
docker exec -it jmeterdb /bin/bash
5.在容器内部创建一个数据库,用于收集jmeter发送的压测数据
执行influx命令进入命令台
使用 show databases; 查看已存在的数据库,只有一个_internal
6.我们创建一个名为jmeter的数据库,用来存放我们的数据
将jmeter收集到的数据发送给influxdb
上面我们已经在我们的服务器上搭建好了influxdb,并且创建了一个数据库,名为jmeter。现在我们就用jmeter往influxdb里发送数据。
在Jmeter中添加Backend Listener组件,用于收集数据并发送给influxdb
默认页面如下
在 Backend Listener implementation 中选择InfluxdbBackendListenerClient (注意:必须使⽤jmeter 5.0以上版本,否则需要单独装插件才可以看到这个组件)
- 在influxdbURL中将实际的influxdb hostname填写进去
- 在application中填写你的应用名称,也可以不改
- 在 tetestTile 中可以修改,也可以不改
- 其他配置保存不变
运行Jmeter,然后在influxdb中检验是否已经能够接收到数据
搭建grafana
上面我们已经搭建好了influxdb,并且将jmeter产生的数据存在了influxdb的数据库里。这时候就需要一个工具将influxdb的数据读取出来并展示。grafana就是用来展示数据的
这里我们也是使用docker部署
1.下载镜像
docker pull grafana/grafana
2.启动镜像
docker run -d -p 3000:3000 --name=jmeterGrafana grafana/grafana
3.访问Grafana的控制台,验证是否正常运行
默认用户名/密码: admin/admin,登录之后跳过修改密码
直接跳过修改密码就可以了
我们已经登录成功了,这时候我们就要配置我们的grafana了,步骤如下
单击 Save & Test 按钮,确认返回消息提示正确确认信息
如果测试通过的话,我们点击左边的+,选择jmeter,导入 Jmeter Dashboard
{ "__inputs": [ { "name": "JMETER_DASHBOARD", "label": "DB name", "description": "Create a Datasource in Grafana that points to jmeter database", "type": "datasource", "pluginId": "influxdb", "pluginName": "InfluxDB" }, { "name": "VAR_MEASUREMENT_NAME", "type": "constant", "label": "Measurement name", "value": "jmeter", "description": "InfluxDB measurement name" }, { "name": "VAR_SEND_INTERVAL", "type": "constant", "label": "Backend send interval", "value": "5", "description": "in second, should match JMeter property \"backend_influxdb.send_interval\"" } ], "__requires": [ { "type": "grafana", "id": "grafana", "name": "Grafana", "version": "4.6.2" }, { "type": "datasource", "id": "influxdb", "name": "InfluxDB", "version": "1.4.0" }, { "type": "panel", "id": "graph", "name": "Graph", "version": "" }, { "type": "panel", "id": "singlestat", "name": "Singlestat", "version": "" }, { "type": "panel", "id": "table", "name": "Table", "version": "" } ], "annotations": { "list": [ { "$$hashKey": "object:4298", "builtIn": 1, "datasource": "$data_source", "enable": true, "hide": false, "iconColor": "rgba(0, 211, 255, 1)", "limit": 100, "name": "Start/stop marker", "query": "select text from events where $timeFilter", "showIn": 0, "textColumn": "", "type": "dashboard" } ] }, "description": "Monitor your Apache JMeter load test in real time with InfluxDB and Grafana.\r\nGet overall summary, errors details and particular transaction response times.", "editable": true, "gnetId": 5496, "graphTooltip": 0, "id": 5, "iteration": 1523369228272, "links": [], "panels": [ { "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 }, "id": 33, "panels": [], "repeat": null, "title": "Summary", "type": "row" }, { "cacheTimeout": null, "colorBackground": false, "colorValue": true, "colors": [ "#299c46", "#e5ac0e", "#d44a3a" ], "datasource": "$data_source", "decimals": 0, "format": "none", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "gridPos": { "h": 7, "w": 4, "x": 0, "y": 1 }, "height": "", "id": 26, "interval": "[[send_interval]]s", "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": " Requests", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "#e5ac0e", "show": false }, "tableColumn": "", "targets": [ { "dsType": "influxdb", "groupBy": [ { "params": [ "$__interval" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "orderByTime": "ASC", "policy": "default", "query": "SELECT sum(\"count\") FROM \"$measurement_name\" WHERE (\"application\" =~ /^$application$/ AND \"transaction\" = 'all') AND $timeFilter GROUP BY time($__interval) fill(null)", "rawQuery": true, "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] } ], "thresholds": "", "title": "Total Requests", "type": "singlestat", "valueFontSize": "80%", "valueMaps": [ { "op": "=", "text": "0", "value": "null" } ], "valueName": "total" }, { "cacheTimeout": null, "colorBackground": false, "colorValue": true, "colors": [ "#299c46", "#e24d42", "#d44a3a" ], "datasource": "$data_source", "decimals": 0, "format": "none", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "gridPos": { "h": 7, "w": 4, "x": 4, "y": 1 }, "height": "", "id": 28, "interval": "[[send_interval]]s", "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": " Failed", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "#bf1b00", "show": false }, "tableColumn": "", "targets": [ { "dsType": "influxdb", "groupBy": [ { "params": [ "$__interval" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "orderByTime": "ASC", "policy": "default", "query": "SELECT sum(\"countError\") FROM \"$measurement_name\" WHERE (\"transaction\" = 'all' AND \"application\" =~ /^$application$/) AND $timeFilter GROUP BY time($__interval) fill(null)", "rawQuery": true, "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] } ], "thresholds": "", "title": "Failed Requests", "type": "singlestat", "valueFontSize": "80%", "valueMaps": [ { "op": "=", "text": "0", "value": "null" } ], "valueName": "total" }, { "cacheTimeout": null, "colorBackground": false, "colorValue": true, "colors": [ "#299c46", "#e24d42", "#d44a3a" ], "datasource": "$data_source", "decimals": 0, "format": "bytes", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "gridPos": { "h": 7, "w": 4, "x": 8, "y": 1 }, "height": "", "id": 38, "interval": "[[send_interval]]s", "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": " ", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "#bf1b00", "show": false }, "tableColumn": "", "targets": [ { "dsType": "influxdb", "groupBy": [ { "params": [ "$__interval" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "orderByTime": "ASC", "policy": "default", "query": "SELECT sum(\"rb\") FROM \"$measurement_name\" WHERE (\"transaction\" = 'all' AND \"application\" =~ /^$application$/) AND $timeFilter ", "rawQuery": true, "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] } ], "thresholds": "", "title": "Received Bytes", "type": "singlestat", "valueFontSize": "80%", "valueMaps": [ { "op": "=", "text": "0", "value": "null" } ], "valueName": "total" }, { "cacheTimeout": null, "colorBackground": false, "colorValue": true, "colors": [ "#299c46", "#e24d42", "#d44a3a" ], "datasource": "$data_source", "decimals": 0, "format": "bytes", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "gridPos": { "h": 7, "w": 4, "x": 12, "y": 1 }, "height": "", "id": 37, "interval": "[[send_interval]]s", "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": " ", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "#bf1b00", "show": false }, "tableColumn": "", "targets": [ { "dsType": "influxdb", "groupBy": [ { "params": [ "$__interval" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "orderByTime": "ASC", "policy": "default", "query": "SELECT max(\"sb\") FROM \"$measurement_name\" WHERE (\"transaction\" = 'all' AND \"application\" =~ /^$application$/) AND $timeFilter GROUP BY time($__interval) fill(null)", "rawQuery": true, "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] } ], "thresholds": "", "title": "Sent Bytes", "type": "singlestat", "valueFontSize": "80%", "valueMaps": [ { "op": "=", "text": "0", "value": "null" } ], "valueName": "total" }, { "cacheTimeout": null, "colorBackground": false, "colorValue": true, "colors": [ "#299c46", "#ef843c", "#e24d42" ], "datasource": "$data_source", "decimals": 2, "format": "percentunit", "gauge": { "maxValue": 1, "minValue": 0, "show": true, "thresholdLabels": false, "thresholdMarkers": true }, "gridPos": { "h": 7, "w": 8, "x": 16, "y": 1 }, "id": 29, "interval": "[[send_interval]]s", "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": "", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "rgb(31, 120, 193)", "show": false }, "tableColumn": "", "targets": [ { "dsType": "influxdb", "groupBy": [ { "params": [ "$__interval" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "orderByTime": "ASC", "policy": "default", "query": "SELECT sum(\"error\") / sum(\"all\") FROM (SELECT sum(\"count\") AS \"all\" FROM \"$measurement_name\" WHERE \"transaction\" = 'all' AND \"application\" =~ /^$application$/ AND $timeFilter GROUP BY time($__interval) fill(null)), (SELECT sum(\"countError\") AS \"error\" FROM \"$measurement_name\" WHERE \"transaction\" = 'all' AND \"application\" =~ /^$application$/ AND $timeFilter GROUP BY time($__interval) fill(null))", "rawQuery": true, "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] } ], "thresholds": "0,0.01", "title": "Error Rate %", "type": "singlestat", "valueFontSize": "50%", "valueMaps": [ { "op": "=", "text": "0", "value": "null" } ], "valueName": "total" }, { "aliasColors": { "No of Errors": "#6ED0E0", "Req / s": "#6ed0e0", "Req / sec": "#65c5db" }, "bars": false, "dashLength": 10, "dashes": false, "datasource": "$data_source", "decimals": 2, "editable": true, "error": false, "fill": 7, "gridPos": { "h": 7, "w": 8, "x": 0, "y": 8 }, "id": 4, "interval": "[[send_interval]]s", "legend": { "alignAsTable": true, "avg": true, "current": false, "max": true, "min": true, "rightSide": false, "show": true, "sort": null, "sortDesc": null, "total": false, "values": true }, "lines": true, "linewidth": 1, "links": [], "nullPointMode": "null", "percentage": false, "pointradius": 1, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "alias": "Req / s", "dsType": "influxdb", "groupBy": [ { "params": [ "$__interval" ], "type": "time" } ], "measurement": "jmeter", "orderByTime": "ASC", "policy": "default", "query": "SELECT mean(\"count\") / $send_interval FROM \"$measurement_name\" WHERE (\"transaction\" = 'all' AND \"application\" =~ /^$application$/) AND $timeFilter GROUP BY time($__interval) fill(null)", "rawQuery": true, "refId": "B", "resultFormat": "time_series", "select": [ [ { "params": [ "count" ], "type": "field" }, { "params": [], "type": "last" } ] ], "tags": [ { "key": "transaction", "operator": "=", "value": "all" }, { "condition": "AND", "key": "application", "operator": "=~", "value": "/^$application$/" } ] } ], "thresholds": [], "timeFrom": null, "timeShift": null, "title": "Total Throughput", "tooltip": { "msResolution": false, "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": false } ] }, { "aliasColors": { "No of Errors": "#BF1B00", "Num of Errors": "#bf1b00" }, "bars": false, "dashLength": 10, "dashes": false, "datasource": "$data_source", "decimals": 0, "editable": true, "error": false, "fill": 7, "gridPos": { "h": 7, "w": 8, "x": 8, "y": 8 }, "id": 2, "interval": "[[send_interval]]s", "legend": { "alignAsTable": true, "avg": false, "current": false, "max": false, "min": false, "rightSide": false, "show": true, "total": true, "values": true }, "lines": true, "linewidth": 1, "links": [], "nullPointMode": "null", "percentage": false, "pointradius": 1, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "alias": "Num of Errors", "dsType": "influxdb", "groupBy": [ { "params": [ "$aggregation" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "measurement": "jmeter", "orderByTime": "ASC", "policy": "default", "query": "SELECT sum(\"countError\") FROM \"$measurement_name\" WHERE (\"transaction\" = 'all' AND \"application\" =~ /^$application$/) AND $timeFilter GROUP BY time($__interval) fill(null)", "rawQuery": true, "refId": "B", "resultFormat": "time_series", "select": [ [ { "params": [ "countError" ], "type": "field" }, { "params": [], "type": "sum" } ] ], "tags": [ { "key": "transaction", "operator": "=", "value": "all" }, { "condition": "AND", "key": "application", "operator": "=~", "value": "/^$application$/" } ] } ], "thresholds": [], "timeFrom": null, "timeShift": null, "title": "Total Errors", "tooltip": { "msResolution": false, "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "decimals": 0, "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": false } ] }, { "aliasColors": { "Threads": "#614d93", "threads": "#614d93" }, "bars": false, "dashLength": 10, "dashes": false, "datasource": "$data_source", "decimals": 0, "fill": 7, "gridPos": { "h": 7, "w": 8, "x": 16, "y": 8 }, "id": 31, "interval": "[[send_interval]]s", "legend": { "alignAsTable": true, "avg": false, "current": true, "max": false, "min": false, "show": true, "total": false, "values": true }, "lines": true, "linewidth": 1, "links": [], "nullPointMode": "null", "percentage": false, "pointradius": 5, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "alias": "Threads", "dsType": "influxdb", "groupBy": [ { "params": [ "$__interval" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "orderByTime": "ASC", "policy": "default", "query": "SELECT last(\"maxAT\") FROM \"$measurement_name\" WHERE (\"transaction\" = 'internal' AND \"application\" =~ /^$application$/) AND $timeFilter GROUP BY time($__interval) fill(null)", "rawQuery": true, "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] } ], "thresholds": [], "timeFrom": null, "timeShift": null, "title": "Active Threads", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "decimals": 0, "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true } ] }, { "aliasColors": { "banner": "#508642" }, "bars": false, "dashLength": 10, "dashes": false, "datasource": "$data_source", "decimals": 2, "editable": true, "error": false, "fill": 1, "gridPos": { "h": 7, "w": 24, "x": 0, "y": 15 }, "height": "", "id": 23, "interval": "[[send_interval]]s", "legend": { "alignAsTable": true, "avg": true, "current": false, "hideEmpty": false, "hideZero": false, "max": true, "min": false, "rightSide": true, "show": true, "total": false, "values": true }, "lines": true, "linewidth": 1, "links": [], "nullPointMode": "null", "percentage": false, "pointradius": 1, "points": false, "renderer": "flot", "repeat": null, "repeatDirection": "h", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "alias": "$tag_transaction", "dsType": "influxdb", "groupBy": [ { "params": [ "transaction" ], "type": "tag" } ], "measurement": "jmeter", "orderByTime": "ASC", "policy": "default", "query": "SELECT mean(\"pct95.0\") FROM \"$measurement_name\" WHERE (\"application\" =~ /^$application$/) AND $timeFilter GROUP BY \"transaction\", time($__interval) fill(null)", "rawQuery": true, "refId": "B", "resultFormat": "time_series", "select": [ [ { "params": [ "pct95.0" ], "type": "field" } ] ], "tags": [ { "key": "statut", "operator": "=", "value": "ok" }, { "condition": "AND", "key": "application", "operator": "=~", "value": "/^$application$/" } ] } ], "thresholds": [ { "colorMode": "ok", "fill": true, "line": true, "op": "lt", "value": 500 }, { "colorMode": "warning", "fill": false, "line": true, "op": "gt", "value": 1500 }, { "colorMode": "critical", "fill": true, "line": true, "op": "gt", "value": 5000 } ], "timeFrom": null, "timeShift": null, "title": "Transactions Response Times (95th pct)", "tooltip": { "msResolution": false, "shared": true, "sort": 0, "value_type": "individual" }, "transparent": false, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "ms", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": false } ] }, { "aliasColors": { "banner": "#508642" }, "bars": false, "dashLength": 10, "dashes": false, "datasource": "$data_source", "decimals": 2, "editable": true, "error": false, "fill": 1, "gridPos": { "h": 7, "w": 24, "x": 0, "y": 22 }, "height": "", "id": 36, "interval": "[[send_interval]]s", "legend": { "alignAsTable": true, "avg": true, "current": false, "hideEmpty": false, "hideZero": false, "max": true, "min": false, "rightSide": true, "show": true, "total": false, "values": true }, "lines": true, "linewidth": 1, "links": [], "nullPointMode": "null", "percentage": false, "pointradius": 1, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "alias": "$tag_transaction", "groupBy": [ { "params": [ "$__interval" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "orderByTime": "ASC", "policy": "default", "query": "SELECT mean(\"sb\") FROM \"$measurement_name\" WHERE (\"application\" =~ /^$application$/) AND $timeFilter GROUP BY \"transaction\", time($__interval) fill(null)", "rawQuery": true, "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "sb" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] }, { "alias": "$tag_transaction", "groupBy": [ { "params": [ "$__interval" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "orderByTime": "ASC", "policy": "default", "query": "SELECT mean(\"rb\") FROM \"$measurement_name\" WHERE (\"application\" =~ /^$application$/) AND $timeFilter GROUP BY \"transaction\", time($__interval) fill(null)", "rawQuery": true, "refId": "B", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] } ], "thresholds": [ { "colorMode": "ok", "fill": true, "line": true, "op": "lt", "value": 500 }, { "colorMode": "warning", "fill": false, "line": true, "op": "gt", "value": 1500 }, { "colorMode": "critical", "fill": true, "line": true, "op": "gt", "value": 5000 } ], "timeFrom": null, "timeShift": null, "title": "Network Traffic", "tooltip": { "msResolution": false, "shared": true, "sort": 0, "value_type": "individual" }, "transparent": false, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "bytes", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": false } ] }, { "collapsed": true, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 29 }, "id": 34, "panels": [ { "columns": [], "datasource": "$data_source", "fontSize": "100%", "gridPos": { "h": 7, "w": 8, "x": 0, "y": 2 }, "height": "", "id": 25, "interval": "[[send_interval]]s", "links": [], "pageSize": null, "scroll": true, "showHeader": true, "sort": { "col": 2, "desc": true }, "styles": [ { "alias": "Time", "dateFormat": "YYYY-MM-DD HH:mm:ss", "pattern": "Time", "type": "hidden" }, { "alias": "", "colorMode": null, "colors": [ "rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)" ], "decimals": 0, "pattern": "/.*/", "thresholds": [], "type": "number", "unit": "short" } ], "targets": [ { "alias": "$tag_transaction", "dsType": "influxdb", "groupBy": [ { "params": [ "transaction" ], "type": "tag" } ], "measurement": "jmeter", "orderByTime": "ASC", "policy": "default", "query": "SELECT sum(\"count\") FROM \"$measurement_name\" WHERE (\"application\" =~ /^$application$/ AND \"statut\" = 'ko') AND $timeFilter GROUP BY \"transaction\"", "rawQuery": true, "refId": "A", "resultFormat": "table", "select": [ [ { "params": [ "count" ], "type": "field" }, { "params": [], "type": "sum" } ] ], "tags": [ { "key": "application", "operator": "=~", "value": "/^$application$/" }, { "condition": "AND", "key": "statut", "operator": "=", "value": "ko" } ] } ], "title": "Errors per Transaction", "transform": "table", "type": "table" }, { "columns": [], "datasource": "$data_source", "fontSize": "100%", "gridPos": { "h": 7, "w": 16, "x": 8, "y": 2 }, "id": 27, "interval": "[[send_interval]]s", "links": [], "pageSize": null, "scroll": true, "showHeader": true, "sort": { "col": 0, "desc": true }, "styles": [ { "alias": "Time", "dateFormat": "YYYY-MM-DD HH:mm:ss", "pattern": "Time", "type": "hidden" }, { "alias": "", "colorMode": null, "colors": [ "rgba(245, 54, 54, 0.9)", "rgba(237, 129, 40, 0.89)", "rgba(50, 172, 45, 0.97)" ], "decimals": 0, "pattern": "/.*/", "thresholds": [], "type": "number", "unit": "short" } ], "targets": [ { "alias": "$tag_responseCode", "dsType": "influxdb", "groupBy": [ { "params": [ "responseCode" ], "type": "tag" } ], "measurement": "jmeter", "orderByTime": "ASC", "policy": "default", "query": "SELECT sum(\"count\") FROM \"$measurement_name\" WHERE (\"application\" =~ /^$application$/ AND \"responseCode\" !~ /^$/) AND $timeFilter GROUP BY \"responseCode\",\"responseMessage\"", "rawQuery": true, "refId": "A", "resultFormat": "table", "select": [ [ { "params": [ "count" ], "type": "field" } ], [ { "params": [ "responseMessage" ], "type": "field" } ] ], "tags": [ { "key": "application", "operator": "=~", "value": "/^$application$/" }, { "condition": "AND", "key": "responseCode", "operator": "!~", "value": "/^$/" } ] } ], "title": "Error Info", "transform": "table", "type": "table" } ], "repeat": null, "title": "Errors", "type": "row" }, { "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 30 }, "id": 35, "panels": [], "repeat": null, "title": "Individual Transaction - $transaction", "type": "row" }, { "cacheTimeout": null, "colorBackground": false, "colorValue": true, "colors": [ "rgba(245, 54, 54, 0.9)", "#e5ac0e", "rgba(50, 172, 45, 0.97)" ], "datasource": "$data_source", "decimals": 0, "editable": true, "error": false, "format": "none", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "gridPos": { "h": 7, "w": 8, "x": 0, "y": 31 }, "id": 9, "interval": "[[send_interval]]s", "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": " Requests", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "#e5ac0e", "show": false }, "tableColumn": "", "targets": [ { "dsType": "influxdb", "groupBy": [ { "params": [ "$__interval" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "measurement": "jmeter", "orderByTime": "ASC", "policy": "default", "query": "SELECT sum(\"count\") FROM \"$measurement_name\" WHERE (\"application\" =~ /^$application$/ AND \"transaction\" =~ /^$transaction$/ AND \"statut\" = 'all') AND $timeFilter GROUP BY time($__interval) fill(null)", "rawQuery": true, "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "count" ], "type": "field" }, { "params": [], "type": "sum" } ] ], "tags": [ { "key": "transaction", "operator": "=~", "value": "/^$transaction$/" }, { "condition": "AND", "key": "statut", "operator": "=", "value": "all" } ] } ], "thresholds": "", "title": "Total Requests - $transaction", "type": "singlestat", "valueFontSize": "80%", "valueMaps": [ { "op": "=", "text": "0", "value": "null" } ], "valueName": "total" }, { "cacheTimeout": null, "colorBackground": false, "colorValue": true, "colors": [ "rgba(245, 54, 54, 0.9)", "#e24d42", "rgba(50, 172, 45, 0.97)" ], "datasource": "$data_source", "decimals": 0, "editable": true, "error": false, "format": "none", "gauge": { "maxValue": 100, "minValue": 0, "show": false, "thresholdLabels": false, "thresholdMarkers": true }, "gridPos": { "h": 7, "w": 8, "x": 8, "y": 31 }, "id": 6, "interval": "[[send_interval]]s", "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": " Failed", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "#e24d42", "show": false }, "tableColumn": "", "targets": [ { "dsType": "influxdb", "groupBy": [ { "params": [ "$__interval" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "measurement": "jmeter", "orderByTime": "ASC", "policy": "default", "query": "SELECT sum(\"count\") FROM \"$measurement_name\" WHERE (\"application\" =~ /^$application$/ AND \"transaction\" =~ /^$transaction$/ AND \"statut\" = 'ko') AND $timeFilter GROUP BY time($__interval) fill(null)", "rawQuery": true, "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "count" ], "type": "field" }, { "params": [], "type": "sum" } ] ], "tags": [ { "key": "transaction", "operator": "=~", "value": "/^$transaction$/" }, { "condition": "AND", "key": "statut", "operator": "=", "value": "ko" } ] } ], "thresholds": "", "title": "Failed Requests - $transaction", "type": "singlestat", "valueFontSize": "80%", "valueMaps": [ { "op": "=", "text": "0", "value": "null" } ], "valueName": "total" }, { "cacheTimeout": null, "colorBackground": false, "colorValue": true, "colors": [ "rgba(50, 172, 45, 0.97)", "#e5ac0e", "#e24d42" ], "datasource": "$data_source", "decimals": 2, "editable": true, "error": false, "format": "percentunit", "gauge": { "maxValue": 1, "minValue": 0, "show": true, "thresholdLabels": false, "thresholdMarkers": true }, "gridPos": { "h": 7, "w": 8, "x": 16, "y": 31 }, "id": 8, "interval": "[[send_interval]]s", "links": [], "mappingType": 1, "mappingTypes": [ { "name": "value to text", "value": 1 }, { "name": "range to text", "value": 2 } ], "maxDataPoints": 100, "nullPointMode": "connected", "nullText": null, "postfix": "", "postfixFontSize": "50%", "prefix": "", "prefixFontSize": "50%", "rangeMaps": [ { "from": "null", "text": "N/A", "to": "null" } ], "sparkline": { "fillColor": "rgba(31, 118, 189, 0.18)", "full": false, "lineColor": "rgb(14, 237, 45)", "show": false }, "tableColumn": "", "targets": [ { "dsType": "influxdb", "groupBy": [ { "params": [ "$__interval" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "measurement": "jmeter", "orderByTime": "ASC", "policy": "default", "query": "SELECT sum(\"error\") / sum(\"all\") FROM (SELECT sum(\"count\") AS \"all\" FROM \"$measurement_name\" WHERE \"transaction\" =~ /^$transaction$/ AND \"statut\" = 'all' AND \"application\" =~ /^$application$/ AND $timeFilter GROUP BY time($__interval) fill(null)), (SELECT sum(\"count\") AS \"error\" FROM \"$measurement_name\" WHERE \"transaction\" =~ /^$transaction$/ AND \"statut\" = 'ko' AND \"application\" =~ /^$application$/ AND $timeFilter GROUP BY time($__interval) fill(null))", "rawQuery": true, "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "count" ], "type": "field" }, { "params": [], "type": "sum" } ] ], "tags": [ { "key": "transaction", "operator": "=~", "value": "/^$transaction$/" }, { "condition": "AND", "key": "statut", "operator": "=", "value": "ok" } ] } ], "thresholds": "0,0.01", "title": "Error Rate % - $transaction", "type": "singlestat", "valueFontSize": "50%", "valueMaps": [ { "op": "=", "text": "0", "value": "null" } ], "valueName": "total" }, { "aliasColors": { "90th Percentage": "#EAB839", "95th Percentage": "#EF843C", "99th Percentage": "#99440A", "Average": "#3F6833", "Max": "#58140C", "Req / s": "#6ed0e0" }, "bars": false, "dashLength": 10, "dashes": false, "datasource": "$data_source", "decimals": 2, "editable": true, "error": false, "fill": 7, "gridPos": { "h": 7, "w": 12, "x": 0, "y": 38 }, "height": "", "id": 10, "interval": "[[send_interval]]s", "legend": { "alignAsTable": true, "avg": true, "current": false, "max": true, "min": true, "rightSide": false, "show": true, "total": false, "values": true }, "lines": true, "linewidth": 1, "links": [], "nullPointMode": "null", "percentage": false, "pointradius": 1, "points": false, "renderer": "flot", "seriesOverrides": [ { "alias": "Average", "yaxis": 1 } ], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "alias": "Req / s", "dsType": "influxdb", "groupBy": [ { "params": [ "$__interval" ], "type": "time" } ], "measurement": "jmeter", "orderByTime": "ASC", "policy": "default", "query": "SELECT last(\"count\") / $send_interval FROM \"$measurement_name\" WHERE (\"transaction\" =~ /^$transaction$/ AND \"statut\" = 'ok') AND $timeFilter GROUP BY time($__interval)", "rawQuery": true, "refId": "B", "resultFormat": "time_series", "select": [ [ { "params": [ "count" ], "type": "field" }, { "params": [], "type": "sum" }, { "params": [ "5s" ], "type": "non_negative_derivative" } ] ], "tags": [ { "key": "transaction", "operator": "=~", "value": "/^$transaction$/" }, { "condition": "AND", "key": "statut", "operator": "=", "value": "ok" } ] } ], "thresholds": [], "timeFrom": null, "timeShift": null, "title": "Throughput - $transaction", "tooltip": { "msResolution": false, "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": false } ] }, { "aliasColors": { "Num of Errors": "#bf1b00", "num of errors": "#bf1b00" }, "bars": false, "dashLength": 10, "dashes": false, "datasource": "$data_source", "decimals": 0, "fill": 7, "gridPos": { "h": 7, "w": 12, "x": 12, "y": 38 }, "id": 32, "interval": "[[send_interval]]s", "legend": { "alignAsTable": true, "avg": false, "current": false, "max": false, "min": false, "rightSide": false, "show": true, "total": true, "values": true }, "lines": true, "linewidth": 1, "links": [], "nullPointMode": "null", "percentage": false, "pointradius": 1, "points": true, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "alias": "Num of Errors", "dsType": "influxdb", "groupBy": [ { "params": [ "$__interval" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "orderByTime": "ASC", "policy": "default", "query": "SELECT sum(\"count\") FROM \"$measurement_name\" WHERE \"application\" =~ /^$application$/ AND \"transaction\" =~ /^$transaction$/ AND \"statut\" = 'ko' AND $timeFilter GROUP BY time($__interval) fill(null)", "rawQuery": true, "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] } ], "thresholds": [], "timeFrom": null, "timeShift": null, "title": "Errors", "tooltip": { "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": 1, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "decimals": 0, "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": true } ] }, { "aliasColors": { "90th Percentage": "#f2c96d", "95th Percentage": "#EF843C", "99th Percentage": "#bf1b00", "Average": "#7eb26d", "Max": "#584477", "Median": "#6ed0e0", "median": "#6ed0e0" }, "bars": false, "dashLength": 10, "dashes": false, "datasource": "$data_source", "decimals": 2, "editable": true, "error": false, "fill": 1, "gridPos": { "h": 7, "w": 24, "x": 0, "y": 45 }, "height": "", "id": 5, "interval": "[[send_interval]]s", "legend": { "alignAsTable": true, "avg": true, "current": false, "hideEmpty": true, "max": true, "min": false, "rightSide": true, "show": true, "sortDesc": true, "total": false, "values": true }, "lines": true, "linewidth": 1, "links": [], "nullPointMode": "null", "percentage": false, "pointradius": 1, "points": false, "renderer": "flot", "seriesOverrides": [ { "alias": "Average", "yaxis": 1 } ], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { "alias": "Average", "dsType": "influxdb", "groupBy": [ { "params": [ "$aggregation" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "measurement": "jmeter", "orderByTime": "ASC", "policy": "default", "query": "SELECT last(\"avg\") FROM \"$measurement_name\" WHERE (\"transaction\" =~ /^$transaction$/ AND \"statut\" = 'ok') AND $timeFilter GROUP BY time($__interval)", "rawQuery": true, "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "avg" ], "type": "field" }, { "params": [], "type": "last" } ] ], "tags": [ { "key": "transaction", "operator": "=~", "value": "/^$request$/" }, { "condition": "AND", "key": "statut", "operator": "=", "value": "ok" } ] }, { "alias": "Median", "dsType": "influxdb", "groupBy": [ { "params": [ "$aggregation" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "hide": false, "measurement": "jmeter", "orderByTime": "ASC", "policy": "default", "query": "SELECT last(\"pct50.0\") FROM \"$measurement_name\" WHERE (\"transaction\" =~ /^$transaction$/ AND \"statut\" = 'ok') AND $timeFilter GROUP BY time($__interval)", "rawQuery": true, "refId": "F", "resultFormat": "time_series", "select": [ [ { "params": [ "pct50.0" ], "type": "field" }, { "params": [], "type": "last" } ] ], "tags": [ { "key": "transaction", "operator": "=~", "value": "/^$request$/" }, { "condition": "AND", "key": "statut", "operator": "=", "value": "all" } ] }, { "alias": "90th Percentile", "dsType": "influxdb", "groupBy": [ { "params": [ "$aggregation" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "measurement": "jmeter", "orderByTime": "ASC", "policy": "default", "query": "SELECT last(\"pct90.0\") FROM \"$measurement_name\" WHERE (\"transaction\" =~ /^$transaction$/ AND \"statut\" = 'ok') AND $timeFilter GROUP BY time($__interval) fill(null)", "rawQuery": true, "refId": "B", "resultFormat": "time_series", "select": [ [ { "params": [ "pct90.0" ], "type": "field" }, { "params": [], "type": "last" } ] ], "tags": [ { "key": "transaction", "operator": "=~", "value": "/^$request$/" }, { "condition": "AND", "key": "statut", "operator": "=", "value": "all" } ] }, { "alias": "95th Percentile", "dsType": "influxdb", "groupBy": [ { "params": [ "$aggregation" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "hide": false, "measurement": "jmeter", "orderByTime": "ASC", "policy": "default", "query": "SELECT last(\"pct95.0\") FROM \"$measurement_name\" WHERE (\"transaction\" =~ /^$transaction$/ AND \"statut\" = 'ok') AND $timeFilter GROUP BY time($__interval) fill(null)", "rawQuery": true, "refId": "C", "resultFormat": "time_series", "select": [ [ { "params": [ "pct95.0" ], "type": "field" }, { "params": [], "type": "last" } ] ], "tags": [ { "key": "transaction", "operator": "=~", "value": "/^$request$/" } ] }, { "alias": "99th Percentile", "dsType": "influxdb", "groupBy": [ { "params": [ "$aggregation" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "hide": false, "measurement": "jmeter", "orderByTime": "ASC", "policy": "default", "query": "SELECT last(\"pct99.0\") FROM \"$measurement_name\" WHERE (\"transaction\" =~ /^$transaction$/ AND \"statut\" = 'ok') AND $timeFilter GROUP BY time($__interval) fill(null)", "rawQuery": true, "refId": "D", "resultFormat": "time_series", "select": [ [ { "params": [ "pct99.0" ], "type": "field" }, { "params": [], "type": "last" } ] ], "tags": [ { "key": "transaction", "operator": "=~", "value": "/^$request$/" } ] }, { "alias": "Max", "dsType": "influxdb", "groupBy": [ { "params": [ "$aggregation" ], "type": "time" }, { "params": [ "null" ], "type": "fill" } ], "measurement": "jmeter", "orderByTime": "ASC", "policy": "default", "query": "SELECT last(\"max\") FROM \"$measurement_name\" WHERE (\"transaction\" =~ /^$transaction$/ AND \"statut\" = 'ok') AND $timeFilter GROUP BY time($__interval) fill(null)", "rawQuery": true, "refId": "E", "resultFormat": "time_series", "select": [ [ { "params": [ "max" ], "type": "field" }, { "params": [], "type": "last" } ] ], "tags": [ { "key": "transaction", "operator": "=~", "value": "/^$request$/" }, { "condition": "AND", "key": "statut", "operator": "=", "value": "ok" } ] } ], "thresholds": [ { "colorMode": "ok", "fill": true, "line": true, "op": "lt", "value": 500 }, { "colorMode": "warning", "fill": false, "line": true, "op": "gt", "value": 1500 }, { "colorMode": "critical", "fill": true, "line": true, "op": "gt", "value": 5000 } ], "timeFrom": null, "timeShift": null, "title": "Response Times - $transaction", "tooltip": { "msResolution": false, "shared": true, "sort": 0, "value_type": "individual" }, "type": "graph", "xaxis": { "buckets": null, "mode": "time", "name": null, "show": true, "values": [] }, "yaxes": [ { "format": "ms", "label": null, "logBase": 1, "max": null, "min": null, "show": true }, { "format": "short", "label": null, "logBase": 1, "max": null, "min": null, "show": false } ] } ], "refresh": false, "schemaVersion": 16, "style": "dark", "tags": [ "load_test" ], "templating": { "list": [ { "current": { "text": "jmeter_influx", "value": "jmeter_influx" }, "hide": 0, "label": "", "name": "data_source", "options": [], "query": "influxdb", "refresh": 1, "regex": "", "type": "datasource" }, { "allValue": null, "current": { "text": "JMeter_demo", "value": "JMeter_demo" }, "datasource": "$data_source", "hide": 0, "includeAll": false, "label": "", "multi": false, "name": "application", "options": [], "query": "SHOW TAG VALUES FROM \"jmeter\" WITH KEY = \"application\"", "refresh": 1, "regex": "", "sort": 0, "tagValuesQuery": null, "tags": [], "tagsQuery": null, "type": "query", "useTags": false }, { "allValue": null, "current": { "text": "JR_OK", "value": "JR_OK" }, "datasource": "$data_source", "hide": 0, "includeAll": false, "label": "", "multi": false, "name": "transaction", "options": [], "query": "SHOW TAG VALUES FROM \"jmeter\" WITH KEY = \"transaction\" WHERE \"application\" =~ /^$application$/ AND \"transaction\" != 'internal' AND \"transaction\" != 'all'", "refresh": 1, "regex": "", "sort": 0, "tagValuesQuery": null, "tags": [], "tagsQuery": null, "type": "query", "useTags": false }, { "current": { "text": "jmeter", "value": "jmeter" }, "hide": 2, "label": "Measurement name", "name": "measurement_name", "options": [ { "text": "jmeter", "value": "jmeter" } ], "query": "jmeter", "type": "constant" }, { "current": { "text": "5", "value": "5" }, "hide": 2, "label": "Backend send interval in second", "name": "send_interval", "options": [ { "text": "5", "value": "5" } ], "query": "5", "type": "constant" } ] }, "time": { "from": "now-5m", "to": "now" }, "timepicker": { "refresh_intervals": [ "5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d" ], "time_options": [ "5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d" ] }, "timezone": "browser", "title": "JMeter Dashboard", "version": 4 }json文件,也可以去网上找
点击load后进入如下页面
点击import进入如下界面
更多Grafana Dashboard 可以参考官⽹:https://grafana.com/grafana/dashboards?dataSource=influxdb
InfluxDB+Grafana+Jmeter实战
前面我们已经将influxdb和Grafana搭建好了,现在我们使用jmeter施压,看Grafana上有没有数据产生。
当我们启动jmeter压测的时候,很明显可以看到grafana上的数据在发生变化,这样我们就可以根据grafana产生的报告来进行性能分析了