InfluxDB&Grafana实战总结
前言
本文就使用InfluxDB和Grafana的过程中遇到的问题、知识点进行总结记录,不会涉及InfluxDB和Grafana的基本用法,读者需要对InfluxDB和Grafana有一定了解。
- InfluxDB是一个开源的时序数据库,使用GO语言开发,特别适合用于处理和分析资源监控数据这种时序相关数据。InfluxDB自带的各种特殊函数如求标准差、随机取样数据、统计数据变化比等,使数据统计和实时分析变得十分方便。
- Grafana是一个跨平台的开源度量分析和可视化工具,可以查询采集的数据然后可视化展示。Grafana支持许多不同的数据源,官方支持以下数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB。
- 基于InfluxDB和Grafana可以快速搭建一套时序数据存储、展示系统。
下拉框动态取值
表metric_data存储有监控数据,有两个tag:hostname和metric_type。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
> select * from metric_data; name: metric_data time hostname metric_type value ---- -------- ----------- ----- 1567094400000000000 hostA cpu 1 1567094400000000000 hostA mem 2 1567094400000000000 hostB cpu 3 1567094400000000000 hostB mem 4 1567094400000000000 hostC cpu 5 1567094400000000000 hostC mem 6 > show tag values from metric_data with key="hostname" name: metric_data key value --- ----- hostname hostA hostname hostB hostname hostC > show tag values from metric_data with key="metric_type" name: metric_data key value --- ----- metric_type cpu metric_type mem |
希望查看数据时可以选择hostname和metric_type。效果如下图:
首先配置数据源
针对tag hostname和metric_type定义两个Variables,将tag的取值作为下拉选项
然后在Query的where语句中使用变量作为条件
下拉框支持中文
如图实现“metric类型”下拉框显示“CPU使用率”和“内存使用率”。
首先创建一张映射表,将“cpu”映射成“CPU使用率”;“mem”映射成“内存使用率”
1 2 3 4 5 6 |
> select * from metric_type_name_mapping name: metric_type_name_mapping time metric_type name value ---- ----------- ---- ----- 1567216170324226055 cpu 'CPU使用率' 1 1567216170356800234 mem '内存使用率' 1 |
然后创建两个Variables,metric_type_name和metric_type
metric_type_name的取值对应中文名,定义如下图
metric_type的取值根据中文名映射成原始名,定义如下图
最后,修改Query
参考资料:https://community.grafana.com/t/how-to-alias-a-template-variable-value/10929/7
注意:这个方案需要在metric_type_name_mapping中维护metric_type的信息
增加timeshift功能
如图,希望对比展示今日和昨日同一时间点的数据。
InfluxDB默认不支持timeshift的功能,要实现这个功能需要借助一个代理influxdb-timeshift-proxy。其原理是修改查询sql的时间区间,再转发给InfluxDB。
参照https://github.com/maxsivanov/influxdb-timeshift-proxy安装完成后,配置新的数据源连接influxdb-timeshift-proxy。
修改查询数据源,并使用alias指定shift信息
influxdb-timeshift-proxy优化
在使用influxdb-timeshift-proxy实现timeshift功能时,发现查询性能存在问题,原因是influxdb-timeshift-proxy会查询多余的数据,导致性能问题,详见bug fix: avoid query unnecessary data。
修改了sql替换逻辑,解决了该问题,代码见:https://github.com/winway/influxdb-timeshift-proxy
CQ预聚合
为了提高查询性能,可以使用CONTINUOUS QUERY对原始数据进行预聚合,将秒/分钟级数据聚合成更粗粒度的分钟/小时级数据,减少查询数据量。
1 2 3 4 5 6 7 8 |
# 查看现有CQ > SHOW CONTINUOUS QUERIES # 创建CQ > CREATE CONTINUOUS QUERY metric_data_min ON test RESAMPLE EVERY 1m FOR 3m BEGIN SELECT MEAN(value) AS value INTO metric_data_min FROM metric_data GROUP BY time(1m), * END # 删除CQ > DROP CONTINUOUS QUERY metric_data_min ON test |
控制tag数量和取值范围
tag的数量太多,tag的取值范围太广会严重影响InfluxDB的性能,因为这些信息会占用大量内存。详见Discouraged schema design
InfluxDB数据覆盖问题
具有相同时间戳和tag取值的记录在插入InfluxDB时会产生覆盖,这一点需要结合业务逻辑来考虑处理方式。详见data with same timestamp and tags gets overwritten