如何查看InfluxDB v2.x中运行中或高资源占用的查询?
InfluxDB v2.x 高资源占用查询排查方法
InfluxDB v2.x 移除了v1版本的SHOW QUERIES指令,可通过内置API、系统监控Bucket两类方式获取运行中、历史查询的资源占用详情,具体操作如下:
查看当前正在运行的查询
- 调用内置HTTP API:直接向InfluxDB服务端发起GET请求,即可获取所有实时执行中的查询明细,返回字段包含查询ID、执行时长、关联组织/用户ID、具体查询语句、实时内存占用等信息,和v1
SHOW QUERIES效果完全一致。请求示例:
如果需要终止异常高占用的查询,向同路径发起DELETE请求并拼接查询ID即可:curl -H "Authorization: Token 你的管理员权限Token" http://<你的InfluxDB服务地址>:8086/api/v2/queriescurl -X DELETE -H "Authorization: Token 你的管理员权限Token" http://<你的InfluxDB服务地址>:8086/api/v2/queries/<待终止的查询ID> - 执行Flux查询获取:在InfluxDB UI的Data Explorer、或者influx CLI中执行以下Flux语句,可直接返回按内存占用、执行时长倒序排列的运行中查询列表:
import "influxdata/influxdb/monitor" monitor.currentQueries() |> keep(columns: ["queryID", "query", "elapsed", "database", "orgID", "userID", "memoryBytes"]) |> sort(columns: ["memoryBytes", "elapsed"], desc: true)
查看历史高资源占用查询
InfluxDB v2默认将已完成查询的统计数据存入内置_monitoring系统Bucket,默认数据保留周期为7天,可通过Flux查询筛选历史高占用记录。
例:查询过去24小时内存占用、执行时长Top20的查询:
from(bucket: "_monitoring") |> range(start: -24h) |> filter(fn: (r) => r._measurement == "query" and r._field =~ /memoryTotalBytes|totalDuration|queryText/) |> pivot(rowKey: ["_time", "queryID"], columnKey: ["_field"], valueColumn: "_value") |> sort(columns: ["memoryTotalBytes", "totalDuration"], desc: true) |> limit(n:20) |> keep(columns: ["_time", "queryID", "queryText", "totalDuration", "memoryTotalBytes", "orgID", "userID"])
注意:如果返回结果中queryText字段为空,需要在InfluxDB配置文件中开启
query-log-enabled = true配置,重启服务后才会记录完整的查询语句内容。
定位高频周期性查询
如果需要识别固定周期重复执行的查询,可对历史查询记录按语句内容分组,统计执行频次排序即可:
from(bucket: "_monitoring") |> range(start: -7d) |> filter(fn: (r) => r._measurement == "query" and r._field == "queryText") |> group(columns: ["_value"]) |> count(column: "execCount") |> sort(columns: ["execCount"], desc: true)
拿到查询关联的orgID、userID后,可直接在InfluxDB后台对应到具体组织、关联的API Token,即可追溯到发起查询的具体应用或消费端。2.4及以上版本的InfluxDB也可以直接在UI的监控看板中查看查询资源占用的趋势变化,无需手动编写Flux语句。
内容的提问来源于stack exchange,提问作者Juliën
相关产品推荐
相关产品推荐

