TL;DR InfluxDB技术技巧 - InfluxDB Kapacitor

导航至

在这篇博文中,我们回顾了本周最有趣的InfluxDB Kapacitor和TICK-stack相关的问题、解决方案、教程和问答,这些问题、解决方案、教程和问答可能被您忽略了。

使用INTO查询保留标签

问题:我正在使用INTO查询将数据移动到新的度量。InfluxDB表示已正确写入正确数量的点,但当我查询新度量中的数据时,我发现丢失了一个点。

在我的数据中,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去哪里了?

答案:如果您在INTO中使用SELECT *,InfluxDB会将当前度量中的任何标签转换为新度量中的字段。这可能导致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用户组中自由提问。

接下来是什么?

  • 下载开始使用 InfluxDB v0.13
  • 安排与解决方案架构师进行免费的20分钟咨询,以审查您的InfluxDB项目
  • 参加我们免费的虚拟培训研讨会
  • 在您的基础设施上寻找InfluxDB集群? 联系销售以获取InfluxDB Enterprise演示以及定价信息。