gpt4 book ai didi

Elasticsearch /Kibana : get values that are not found in entries more recent than a certain date

转载 作者:行者123 更新时间:2023-12-02 23:10:21 24 4
gpt4 key购买 nike

我有一组设备定期(比如说每 10 分钟)推送到 ElasticSearch,这种形式的条目:

{
"deviceId": "unique-device-id",
"timestamp": 1586390031,
"payload" : { various data }
}

我通常通过 Kibana 过滤过去 7 天的数据,然后通过设备 ID 或来自有效负载的其他一些数据向下钻取。

现在我试图通过查找在过去一小时内没有报告任何内容的设备来了解这支舰队的健康状况。我一直在搞乱各种过滤器和可视化,最接近这个的是一个数据表,其中包含设备 ID 和每个条目的最后一个条目的时间戳,按时间戳排序。这很有用,但有点难以使用,因为我有几千台设备。

我的梦想是让上述表格仅包含过去一小时内未报告的设备 ID,或仅获得两个数字:过去 7 天看到的不同设备 ID 的总数和过去一小时内未看到的设备 ID。

如果其中任何一个是可能的,你能指出我正确的方向吗?

最佳答案

我将跳过表格并采用第二种方法——只计算计数。我认为有可能从计数倒退到行。

注意:我将使用人类可读的时间格式而不是时间戳,但 epoch_seconds在您的实际用例中也可以正常工作。另外,我添加了 comment字段为每个文档提供一些背景。

首先,设置您的索引:

PUT fleet
{
"mappings": {
"properties": {
"timestamp": {
"type": "date",
"format": "epoch_second||yyyy-MM-dd HH:mm:ss"
},
"comment": {
"type": "text"
},
"deviceId": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}

同步一些文档——我在 UTC+2,所以我选择了这些时间戳:
POST fleet/_doc
{
"deviceId": "asdjhfa343",
"timestamp": "2020-04-05 10:00:00",
"comment": "in the last week"
}

POST fleet/_doc
{
"deviceId": "asdjhfa343",
"timestamp": "2020-04-10 13:05:00",
"comment": "#asdjhfa343 in the last hour"
}

POST fleet/_doc
{
"deviceId": "asdjhfa343",
"timestamp": "2020-04-10 12:05:00",
"comment": "#asdjhfa343 in the 2 hours"
}

POST fleet/_doc
{
"deviceId": "asdjhfa343sdas",
"timestamp": "2020-04-07 09:00:00",
"comment": "in the last week"
}

POST fleet/_doc
{
"deviceId": "asdjhfa343sdas",
"timestamp": "2020-04-10 12:35:00",
"comment": "in last 2hrs"
}

总的来说,我们有 5 个文档和 2 个不同的设备 ID,具有以下条件
  • 都出现在最后 7d
  • 两者都在最后 2 小时和
  • 最后一小时只有一个

  • 所以我有兴趣准确地找到 1 deviceId其中 在过去 2 小时内出现,但在 1 小时内未出现 .

    使用 filter 的组合(用于范围过滤器), cardinality (用于不同计数)和 bucket script (用于计数差异)聚合。
    GET fleet/_search
    {
    "size": 0,
    "aggs": {
    "distinct_devices_last7d": {
    "filter": {
    "range": {
    "timestamp": {
    "gte": "now-7d"
    }
    }
    },
    "aggs": {
    "uniq_device_count": {
    "cardinality": {
    "field": "deviceId.keyword"
    }
    }
    }
    },
    "not_seen_last1h": {
    "filter": {
    "range": {
    "timestamp": {
    "gte": "now-2h"
    }
    }
    },
    "aggs": {
    "device_ids_per_hour": {
    "date_histogram": {
    "field": "timestamp",
    "calendar_interval": "day",
    "format": "'disregard' -- yyyy-MM-dd"
    },
    "aggs": {
    "total_uniq_count": {
    "cardinality": {
    "field": "deviceId.keyword"
    }
    },
    "in_last_hour": {
    "filter": {
    "range": {
    "timestamp": {
    "gte": "now-1h"
    }
    }
    },
    "aggs": {
    "uniq_count": {
    "cardinality": {
    "field": "deviceId.keyword"
    }
    }
    }
    },
    "uniq_difference": {
    "bucket_script": {
    "buckets_path": {
    "in_last_1h": "in_last_hour>uniq_count",
    "in_last2h": "total_uniq_count"
    },
    "script": "params.in_last2h - params.in_last_1h"
    }
    }
    }
    }
    }
    }
    }
    }
    date_histogram聚合只是一个占位符,使我们能够使用 bucket script获得最终差异,无需进行任何后期处理。

    由于我们通过了 size: 0 ,我们对 hits 不感兴趣部分。所以只取聚合,这里是带注释的结果:
    ...
    "aggregations" : {
    "not_seen_last1h" : {
    "doc_count" : 3,
    "device_ids_per_hour" : {
    "buckets" : [
    {
    "key_as_string" : "disregard -- 2020-04-10",
    "key" : 1586476800000,
    "doc_count" : 3, <-- 3 device messages in the last 2hrs
    "total_uniq_count" : {
    "value" : 2 <-- 2 distinct IDs
    },
    "in_last_hour" : {
    "doc_count" : 1,
    "uniq_count" : {
    "value" : 1 <-- 1 distict ID in the last hour
    }
    },
    "uniq_difference" : {
    "value" : 1.0 <-- 1 == final result !
    }
    }
    ]
    }
    },
    "distinct_devices_last7d" : {
    "meta" : { },
    "doc_count" : 5, <-- 5 device messages in the last 7d
    "uniq_device_count" : {
    "value" : 2 <-- 2 unique IDs
    }
    }
    }

    关于 Elasticsearch /Kibana : get values that are not found in entries more recent than a certain date,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61112108/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com