AWS IoT 规则 - Elasticsearch 的时间戳

AWS IoT rule - timestamp for Elasticsearch

有一堆物联网设备(ESP32)发布一个JSON对象给things/THING_NAME/log用于一般调试(将来扩展到其他有价值的主题)。

以下是适用的物联网规则。

{
  "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 以允许基于时间的搜索。

也许我的做法全错了,但它几乎行得通!

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

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

如果出于某种原因您仍然需要将其称为 @timestamp,您可以立即在 AS 部分中使用该前缀 SELECT 它(可能是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",
            }
        }
    }
}

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

The default value for dynamic_date_formats is:

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