本文概览:如何设计表,合理使用tag和field。
1 建议
1.1 tag和field
在表设计时,最重要的就是哪些字段使用tag保存,哪些使用field来保存。这里有些建议,参考官网:https://docs.influxdata.com/influxdb/v1.3/concepts/schema_and_data_layout/#discouraged-schema-design
- 出现在where条件中,此时可以使用tag类型来保存此值,如 select * from monitor where uri=/app/query.json。那么uri应该就是一个tag列。
- 如果需要进行group操作,此时也需要设置为tag。
- 如果要用到influx的函数操作,此时需要设置为field。
- 如果保存值类型为数字类型,不为string,此时使用filed保存,因为tag都是保存字符串类型数据。
综上,指标名称需要使用tag来保存,这样在where条件中使用时查询速度很快。指标有CPU使用信息、http接口信息、jvm信息等。以统计一个接口的成功次数、失败次数、执行时间为例来说明保存方式,
方式1:一个接口的三个指标信息在一行中保存
使用如下命令,在monitor表中保存指标名称为/app/intrest.json,对应的field属性有访问次数sucessCount、平均时间meanTime、失败次数
1 |
montior,tagName=/app/intreasht.json suceeScount=13,meanTime=1s,failCount=0 |
在查询的weher条件中可以使用如下格式
1 2 3 4 5 6 7 8 |
# 查询成功次数 select mean(xx_SUCESS_COUNT) where tagName=xx; # 查询失败次数 select mean(xx_FAIL_COUNT) where tagName=xx; # 查询成功时间 select mean(xx_SUCCES_TIME) where tagName=xx; |
方式2 对于一个接口三个指标信息,使用三行数据来保存
如下是defaultPage接口的成功访问次数、失败次数和成功时执行时间
1 2 3 4 5 6 7 |
> select * from monitor ; name: monitor time name value ---- ---- ----- 1510246687573333520 defaultPage_SUCCESS_COUNT 1 1510246687573333520 defaultPage_FAIL_COUNT 0 1510246687573333520 defaultPage_SUCCESS_TIME 47 |
比较两种方式
这两种方式都是可以的。都保证where条件中使用了tag。因为tag是有索引的,查询速度特别快。
1.2 database和measurements划分策略
1、每一个服务的监控信息对应一个databases。
2、每一个服务一类监控信息对应一个measuerements,如业务类、JVM类、系统类等,这是因为一类监控信息的需要字段属性是一样的。
在使用Micrometer时,对于一个应用监控信息建立的表有如下:
1 2 3 4 5 6 7 8 9 10 |
> show measurements; coreSingle_connections_active coreSingle_connections_max http_server_requests jvm_buffer_count jvm_buffer_memory_used tomcat_global_error tomcat_global_received ........... ........... |
2 注意事项
1、不要使用tag的like操作,要使用”=”操作。
1 |
SELECT mean("temp") FROM "weather_sensor" WHERE location =~ /\.north$/ |
一般使用like操作时,都是因为建表时,tag没有设计好,上面的问题就是由于使用了如下sql建表,将多个信息放在同一个tag中。
1 2 |
weather_sensor,crop=blueberries,location=plot-1.north temp=50.1 1472515200000000000 weather_sensor,crop=blueberries,location=plot-2.midwest temp=49.8 1472515200000000000 |
可以通过如下sql进行建表:
1 2 |
weather_sensor,crop=blueberries,plot=1,region=north temp=50.1 1472515200000000000 weather_sensor,crop=blueberries,plot=2,region=midwest temp=49.8 1472515200000000000 |
此时上面的查询就可以改下为:
1 |
SELECT mean("temp") FROM "weather_sensor" WHERE region = 'north' |