要点总结: InfluxDB 技术提示 - InfluxDB Kapacitor

导航至

在这篇文章中,我们回顾了本周最有趣的 InfluxDB Kapacitor 和 TICK-stack 相关问题、解决方法、操作指南和问答,这些内容来自 GitHub、IRC 和您可能错过的 InfluxDB Google Group

使用 INTO 查询保留标签

问: 我正在使用 INTO 查询将数据移动到新的 measurement。InfluxDB 说它写入了正确数量的点,但是当我查询新 measurement 中的数据时,我缺少一个点。

在我的数据中,color 是一个标签,name 是一个字段。

> SELECT * FROM "french_bulldogs"
name: french_bulldogs
---------------------
time                  color  name
2016-05-25T00:05:00Z  peach  nugget
2016-05-25T00:05:00Z  grey   rumple
2016-05-25T00:10:00Z  black  prince

> SELECT * INTO "all_dogs" FROM "french_bulldogs"
name: result
------------
time                  written
1970-01-01T00:00:00Z  3

> SELECT * FROM "all_dogs"
name: all_dogs
--------------
time                  color  name
2016-05-25T00:05:00Z  grey   rumple
2016-05-25T00:10:00Z  black  prince

nugget 发生了什么?

答: 如果您将 SELECT *INTO 一起使用,InfluxDB 会将当前 measurement 中的任何标签转换为新 measurement 中的字段。这可能会导致 InfluxDB 覆盖先前由标签区分的点。

在您的情况下,当 InfluxDB 将数据写入 all_dogs 时,它会将 color 从标签转换为字段。因为 nuggetrumple 具有相同的时间戳,并且不再通过标签区分,所以 InfluxDB 使用 rumple 点覆盖了 nugget 点。

使用 GROUP BY * 将标签保留为带有 INTO 查询的标签

> SELECT "name" INTO "all_dogs" FROM "french_bulldogs" GROUP BY *
name: result
------------
time                  written
1970-01-01T00:00:00Z  3

> SELECT * FROM "all_dogs"
name: all_dogs
--------------
time                  color  name
2016-05-25T00:05:00Z  peach  nugget
2016-05-25T00:05:00Z  grey   rumple
2016-05-25T00:10:00Z  black  prince

Kapacitor 是否要流式传输

问: 我正在使用 Kapacitor 将流数据与移位的流数据连接起来,并将连接的数据写回 InfluxDB。如果偏移覆盖了很长的时间范围(例如,24 小时),这会起作用吗?Kapacitor 可以处理 RAM 中的数据量吗?

var current_data = stream
   | from()
     .measurement('sparkle_trees')

var previous_data = stream
   | from()
     .measurement('sparkle_trees')
   | shift(24h)

current_data
   |join(previous_data)
    .tolerance(10s)
    .as('current_data','previous_data')
   |influxDBOut()
    .database('enchanted_forest')
    .retentionPolicy('default')
    .measurement('joined_data')

答: 您的 TICKscript 可以工作,但实际上,这不是一个好主意。首先,每次您重新启动 Kapacitor 时,您都必须等待 24 小时才能进行任何连接。其次,您将不得不在 RAM 中缓冲 24 小时的数据;除非您的摄取速率非常小,否则这是不切实际的。

我们建议使用批处理任务而不是流任务。使用批处理任务,Kapacitor 可以简单地查询旧数据,并在 Kapacitor 首次启动时立即开始处理连接。此外,Kapacitor 只需要将单个批次的数据放入 RAM 中。

例如

var current_data = batch
   | query('SELECT * FROM "enchanted_forest"."default"."sparkle_trees"')
     .period(5m)
     .every(5m)

var previous_data = batch
   | query('SELECT * FROM "enchanted_forest"."default"."sparkle_trees"')
     .period(5m)
     .every(5m)
     // Select data -24h from the current time
     .offset(24h)
   // Shift data to match current time
   | shift(24h)

current_data
   |join(previous_data)
    .as('current_data','previous_data')
   |influxDBOut()
    .database('enchanted_forest')
    .retentionPolicy('default')
    .measurement('joined_data')

何时在查询中双引号标识符

问: 我已成功将数据写入 InfluxDB,但是当我查询数据时出现意外错误

> INSERT monsters exists=true
> SELECT exists FROM monsters
ERR: error parsing query: found EXISTS, expected identifier, string, number, bool at line 1, char 8

答: 字段键 exists 是一个 InfluxQL 关键字。也是 InfluxQL 关键字的标识符必须在查询中用双引号引起来

> SELECT "exists" FROM monsters
name: monsters
--------------
time				             exists
2016-05-25T00:36:01.714188435Z   true
2016-05-25T00:36:19.30227374Z	 true

请参阅我们的文档以获取 InfluxQL 关键字的完整列表。

有关更多 InfluxDB 提示,请查看我们的常见问题页面,并随时在 InfluxDB 用户组中发布您的问题。

下一步是什么?