有一堆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
以允许基于时间的搜索。
也许我要解决所有这些错误,但是几乎可以正常工作!
答案 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")}
dynamic_date_formats的默认值为:
[“ strict_date_optional_time”,“ yyyy / MM / dd HH:mm:ss Z || yyyy / MM / dd Z”]