AWS IoT规则-Elasticsearch的时间戳

时间:2018-11-26 21:17:42

标签: amazon-web-services elasticsearch aws-iot

有一堆IoT设备(ESP32),它们将JSON对象发布到things/THING_NAME/log进行常规调试(将来会扩展到其他具有值的主题)。

这是IoT规则的工作原理。

{
  "sql": "SELECT *, parse_time(\"yyyy-mm-dd'T'hh:mm:ss\", timestamp()) AS timestamp, topic(2) AS deviceId FROM 'things/+/stdout'",
  "ruleDisabled": false,
  "awsIotSqlVersion": "2016-03-23",
  "actions": [
    {
      "elasticsearch": {
        "roleArn": "arn:aws:iam::xxx:role/iot-es-action-role",
        "endpoint": "https://xxxx.eu-west-1.es.amazonaws.com",
        "index": "devices",
        "type": "device",
        "id": "${newuuid()}"
      }
    }
  ]
}

我不确定如何在Elasticsearch中设置@timestamp以允许基于时间的搜索。

也许我要解决所有这些错误,但是几乎可以正常工作!

2 个答案:

答案 0 :(得分:1)

@timestamp只是一个约定,因为@前缀是Logstash生成的字段的默认前缀。因为您没有使用Logstash作为IoT和Elasticsearch之间的中间人,所以您没有@timestamp的默认映射。

但是,基本上,它只是一个名称,因此可以随意命名,唯一重要的是,您可以在Elasticsearch索引的mappings部分中将其声明为timestamp字段。

如果由于某种原因您仍然需要将其称为@timestamp,则可以立即在SELECT部分中使用带有该前缀的AS(可能是IoT的sql问题)限制,不确定):

SELECT *, parse_time(\"yyyy-mm-dd'T'hh:mm:ss\", timestamp()) AS @timestamp, topic(2) AS deviceId FROM 'things/+/stdout'

或者在声明要映射时使用copy_to功能:

PUT devices/device
{
    "mappings": {
        "properties": {
            "timestamp": {
                "type": "date",
                "copy_to": "@timestamp" 
            },
            "@timestamp": {
                "type": "date",
            }
        }
    }
}

答案 1 :(得分:1)

Elasticsearch可以识别与dynamic_date_formats匹配的日期字符串。 以下格式自动映射为AWS Elasticsearch 7.1中的date字段:

SELECT *, parse_time("yyyy/MM/dd HH:mm:ss", timestamp()) AS timestamp FROM 'events/job/#'

此方法不需要创建预配置的索引,这对于动态创建的索引(例如,每天轮换日志:

devices-${parse_time("yyyy.MM.dd", timestamp(), "UTC")}

根据elastic.co documentation

dynamic_date_formats的默认值为:

[“ strict_date_optional_time”,“ yyyy / MM / dd HH:mm:ss Z || yyyy / MM / dd Z”]