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")}
The default value for dynamic_date_formats is:
[ "strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"]
有一堆物联网设备(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")}
The default value for dynamic_date_formats is:
[ "strict_date_optional_time","yyyy/MM/dd HH:mm:ss Z||yyyy/MM/dd Z"]