TL;DR InfluxDB 技术技巧 - 使用 Kapacitor 比较数据

导航至

在这篇文章中,我们回顾了本周最有趣的 InfluxDB 和 TICK-stack 相关问题、使用 Kapacitor 比较数据时的解决方案、来自 GitHub、IRC 和 InfluxDB Google Group 的教程和问答,这些您可能已经错过了。

使用相同的标签键和字段键查询数据

问:我能够成功写入数据,但当我尝试在 WHERE 子句中指定一个标签时,总是得到空响应。有什么建议吗?

写入数据

> INSERT candied,almonds=true almonds=50,half_almonds=51 1465317610000000000
> INSERT candied,almonds=true almonds=55,half_almonds=56 1465317620000000000

查看它们都在那里

> SELECT * FROM "candied"
name: candied
-------------
time                   almonds  almonds_1  half_almonds
2016-06-07T16:40:10Z   50       true       51
2016-06-07T16:40:20Z   55       true       56

在 WHERE 子句中指定一个标签

> SELECT * FROM "candied" WHERE "almonds"='true'
> SELECT * FROM "candied" WHERE "almonds_1"='true'
>

答:您遇到问题是因为您的模式中包含匹配的标签键和字段键。

使用语法 almonds::tag='true' 在 WHERE 子句中指定 almonds 标签。

> SELECT * FROM "candied" WHERE "almonds"::tag='true'
name: candied
-------------
time                   almonds  almonds_1  half_almonds
2016-06-07T16:40:10Z   50       true       51
2016-06-07T16:40:20Z   55       true       56

为了避免这种查询混淆,我们建议从您的模式中删除相同的标签键和字段键。根据您的其他数据和您计划如何查询数据,以下模式可能适用

> INSERT candied,status=full almonds=50 1465317610000000000
> INSERT candied,status=half almonds=51 1465317610000000000
> INSERT candied,status=full almonds=55 1465317620000000000
> INSERT candied,status=half almonds=56 1465317620000000000
> SELECT * FROM "candied"
name: candied
-------------
time                   almonds  status
2016-06-07T16:40:10Z   50       full
2016-06-07T16:40:10Z   51       half
2016-06-07T16:40:20Z   55       full
2016-06-07T16:40:20Z   56       half

使用 Kapacitor 在时间上比较数据

问:我试图使用 Kapacitor 将上周的数据与本周的数据进行比较。我通过创建两个 var(一个用于上周的数据,一个用于本周的数据),将 var 合并,并将合并后的数据写回 InfluxDB 来完成。

唯一的问题是 join 总是使用时间作为连接键 - 当然,两个 var 中的数据有不同的时间戳。有没有办法更改连接键或以其他方式合并这两组数据?

这是我的 TICKscript

var this_week = batch
  | query('SELECT mean("cups") FROM "caffeine"."default"."coffee_consumption"')
    .period(7d)
    .groupBy(time(1d))
    .every(30m)

var last_week = batch
  | query('SELECT mean("cups") FROM "caffeine"."default"."coffee_consumption"')
    .period(7d)
    .groupBy(time(1d))
    .every(30m)
    .offset(7d)

this_week
  |join(last_week)
   .as('this_week','last_week')
  |influxDBOut()
   .database('caffeine')
   .retentionPolicy('default')
   .measurement('joined_coffee_data')

答:是的!使用 shift 使上周的时间戳匹配本周的时间戳,然后执行 join

var this_week = batch
  | query('SELECT mean("cups") FROM "caffeine"."default"."coffee_consumption"')
    .period(7d)
    .groupBy(time(1d))
    .every(30m)

var last_week = batch
  | query('SELECT mean("cups") FROM "caffeine"."default"."coffee_consumption"')
    .period(7d)
    .groupBy(time(1d))
    .every(30m)
    .offset(7d)
  // Shift the data to match this week's data ?
  | shift(7d)

this_week
  |join(last_week)
   .as('this_week','last_week')
  |influxDBOut()
   .database('caffeine')
   .retentionPolicy('default')
   .measurement('joined_coffee_data')

转换功能

问:我已将所有数据都写为浮点数,但我想让查询返回整数。使用 InfluxQL 有什么方法可以实现这一点?

答:使用 <field_key>::<type> 语法将浮点数转换为整数。

例如

> INSERT blueberries value=20.890
> INSERT blueberries value=34.00812
> INSERT blueberries value=12.90

> SELECT "value"::integer FROM "blueberries"
name: blueberries
-----------------
time                             value
2016-06-07T18:43:52.875822901Z   20
2016-06-07T18:43:59.18983841Z    34
2016-06-07T18:44:07.778144875Z   12

更多 InfluxDB 技巧,请参阅我们的 常见问题解答 页面,并在 InfluxDB 用户组 中自由提问。

下一步是什么?