ElasticSearch / Kibana : 특정 날짜보다 최근 항목에서 찾을 수없는 값 가져 오기

Ionut

다음 형식의 항목을 정기적으로 (10 분마다) ElasticSearch로 푸시하는 장치가 있습니다.

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

저는 일반적으로 지난 7 일간의 데이터를 필터링 한 다음 디바이스 ID 또는 페이로드의 다른 데이터로 드릴 다운하여 Kibana를 통해이를 확인합니다.

이제 지난 한 시간 동안 아무것도보고하지 않은 장치를 찾아서이 함대의 상태를 파악하려고합니다. 나는 모든 종류의 필터와 시각화를 엉망으로 만들어 왔으며 여기에 가장 가까운 것은 장치 ID가있는 데이터 테이블과 각각에 대한 마지막 항목의 타임 스탬프가 타임 스탬프별로 정렬되어 있습니다. 이것은 유용하지만 수천 개의 장치가 있으므로 작업하기가 다소 어렵습니다.

내가 꿈꾸는 것은 위에서 언급 한 표에 지난 1 시간 동안보고되지 않은 장치 ID 만 포함하거나 두 개의 숫자 만 가져 오는 것입니다. 지난 7 일 동안 본 고유 장치 ID의 총 개수와 총 개수 지난 1 시간 동안 기기 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가 있으며 다음과 같은 조건이 있습니다.

  1. 모두 지난 7 일에 나타났습니다
  2. 둘 다 지난 2 시간 동안
  3. 그 중 하나만 지난 1 시간 동안

그래서 나는 지난 2 시간 동안 나타난 정확히 1 deviceId찾는 데 관심이 있지만 지난 1 시간이 아닙니다 .

의 조합을 사용하여 필터 (범위 필터), 기수 (별개의 카운트 용) 및 버킷 스크립트 집계 (카운트 차이를).

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
      }
    }
  }

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관