InfluxDB&Grafana实战总结

  • 前言
  • 下拉框动态取值
  • 下拉框支持中文
  • 增加timeshift功能
  • influxdb-timeshift-proxy优化
  • CQ预聚合
  • 控制tag数量和取值范围
  • InfluxDB数据覆盖问题

前言

本文就使用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。效果如下图:
InfluxDB&Grafana实战总结_第1张图片

首先配置数据源
InfluxDB&Grafana实战总结_第2张图片

针对tag hostname和metric_type定义两个Variables,将tag的取值作为下拉选项
InfluxDB&Grafana实战总结_第3张图片

然后在Query的where语句中使用变量作为条件

下拉框支持中文

如图实现“metric类型”下拉框显示“CPU使用率”和“内存使用率”。
InfluxDB&Grafana实战总结_第4张图片

首先创建一张映射表,将“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
InfluxDB&Grafana实战总结_第5张图片

metric_type_name的取值对应中文名,定义如下图
InfluxDB&Grafana实战总结_第6张图片

metric_type的取值根据中文名映射成原始名,定义如下图
InfluxDB&Grafana实战总结_第7张图片

最后,修改Query

参考资料:https://community.grafana.com/t/how-to-alias-a-template-variable-value/10929/7

注意:这个方案需要在metric_type_name_mapping中维护metric_type的信息

增加timeshift功能

如图,希望对比展示今日和昨日同一时间点的数据。
InfluxDB&Grafana实战总结_第8张图片

InfluxDB默认不支持timeshift的功能,要实现这个功能需要借助一个代理influxdb-timeshift-proxy。其原理是修改查询sql的时间区间,再转发给InfluxDB。
参照https://github.com/maxsivanov/influxdb-timeshift-proxy安装完成后,配置新的数据源连接influxdb-timeshift-proxy。
InfluxDB&Grafana实战总结_第9张图片

修改查询数据源,并使用alias指定shift信息
InfluxDB&Grafana实战总结_第10张图片

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

你可能感兴趣的:(数据库,influxdb)