Computer >> 컴퓨터 >  >> 프로그램 작성 >> 데이터 베이스

Elasticsearch 알림으로 다시는 콜드 브루 커피를 다 써버리지 마세요

Elasticsearch 알림으로 다시는 콜드 브루 커피를 다 써버리지 마세요

Elasticsearch 알림을 사용하여 "거의 비어 있음"을 알려줍니다.

ObjectRocket에서는 콜드브루 커피로 사무실에 활력을 불어넣고 있습니다. 이곳 텍사스 오스틴은 8월에 덥습니다. 우리는 카페인 감기가 필요합니다.

우리는 한 번에 하나의 통만 보관하기 때문에 소진 없이 주문을 예약하는 것이 까다로울 수 있습니다. 그래서 ObjectRocket 사무실의 누군가가 "콜드 브루 사용량에 대한 더 나은 데이터가 있었으면 좋겠다"고 말했을 때 나는 완전히 끝났습니다. 저는 항상 Elastic Stack이 무엇을 할 수 있는지 보여줄 새로운 방법을 찾고 있습니다. 그래서 다시는 콜드 브루가 부족하지 않도록 반자율 모니터링 및 경고 시스템을 만들기 시작했습니다.

결국 우리는 Raspberry Pi, Elasticsearch, Kibana 및 Sentinl/ElastAlert를 조합하여 통에 중요한 일이 발생했을 때 Slack에 경고를 보냅니다. Sentinl과 ElastAlert는 쇼의 스타였으므로 나중에 자세히 살펴보겠습니다.

Elasticsearch 알림으로 다시는 콜드 브루 커피를 다 써버리지 마세요 Elasticsearch 알림으로 다시는 콜드 브루 커피를 다 써버리지 마세요

2부로 구성된 이 시리즈의 첫 번째 부분에서는 kegerator 솔루션에서 캡처한 데이터를 사용하여 경고 시스템을 만든 방법을 살펴보겠습니다. Elasticsearch를 위한 오픈 소스 알림 옵션에 대한 몇 가지 아이디어와 지식을 가지고 떠나시기 바랍니다. 시스템을 물리적으로 구축한 방법에 대한 자세한 내용은 다음 게시물을 위해 저장하겠습니다.

Keg의 데이터(콜드 브루뿐만 아니라)

제가 언급했듯이, 우리는 다음 블로그에서 케거레이터 구축에 대해 논의할 것이며, 왜 우리가 유량 모니터링 시스템을 구축하는 대신 스케일 케그 중량 솔루션을 사용하기로 결정했는지에 대해 논의할 것입니다.

이 블로그에 대해 알아야 할 사항은 아래 형식으로 Elasticsearch에 일반 문서 스트림을 보내는 Raspberry Pi 기반 규모를 설정했다는 것뿐입니다.


{
  "_index": "filebeat-6.2.4-2018.05.15",
  "_type": "doc",
  "_source": {
    "@timestamp": "2018-05-15T16:50:49.000Z",
    "beat": {
      "hostname": "raspberrypi",
      "name": "raspberrypi",
      "version": "6.2.4"
    },
    "weight": 58.4,
    "message": "2018-05-15T16:50:49+0000 - -0.4"
  }
}

Filebeat는 데이터를 수집하고 관심 있는 두 가지 주요 필드를 포함합니다.

  • 각 가중치 판독값의 "@timestamp"
  • 해당 타임스탬프의 실제 "무게" 판독값

알림 옵션

가장 먼저 해야 할 일:술통에 문제가 생겼을 때 조치를 취하려면 핵심 인물에게 알림을 보낼 방법이 필요했습니다. 이때 알림 패키지가 작동합니다.

다행히 Elasticsearch 클러스터에 경고를 추가할 수 있는 Apache 2.0 라이선스 옵션이 많이 있습니다. ElastAlert 및 Sentinl입니다.

ElastAlert
ElastAlert는 Elasticsearch와 별도로 실행되며 주로 기본 구성 파일을 통해 구성되는 Yelp에서 만든 Elasticsearch용 유연한 알림 프레임워크입니다. 사용자는 모든 경고에 대해 전역 매개변수가 있는 기본 구성 파일을 생성한 다음 ElastAlert 관련 YAML을 포함하는 각 규칙에 대한 규칙 파일을 생성하여 규칙 및 결과 경고를 구성할 수 있습니다. 각 "규칙"에는 다음이 포함됩니다.

  • 표준 규칙 목록을 기반으로 하는 규칙 구성(예:"플랫라인", "스파이크" 및 "메트릭 집계")
  • 각 규칙이 사용하는 쿼리 적중을 제한하는 Elasticsearch 필터
  • 규칙 부분이 양수일 때 발생하는 경고(예:이메일, Jira, Slack 등)

센틴
Sentinl은 ElastAlert보다 약간 최신입니다. ObjectRocket은 ObjectRocket 서비스에서 고객을 위한 새로운 경고 옵션을 찾는 동안 Siren Solutions에서 만든 Sentinl을 우연히 발견했습니다. Sentinl은 Elasticsearch에 대한 경고 외에 보고 기능을 제공하는 Kibana 플러그인입니다. 다음을 포함하여 각 작업을 "감시자"(동일한 이름의 이전 플러그인과 혼동하지 말 것)라고 부릅니다.

  • 일정(얼마나 자주, 언제 확인해야 하는지)
  • 입력 쿼리(확인하려는 데이터에 대한 Elasticsearch 쿼리)
  • 조건(데이터에 대한 경고 여부를 결정하는 논리)
  • 변환(알림 전에 데이터를 수정하는 코드)
  • 작업(Slack, 이메일 또는 웹훅과 같은 알림이 표시될 때 수행할 작업)

어떤 알림 옵션이 나에게 적합합니까?

둘 다 정말 훌륭하므로 찾고 있는 알림 유형에 따라 다릅니다. 여기 내 발견이 있습니다:

ElastAlert 센틴
장점
  • 사전 정의된 규칙으로 더 빠르게 시작
  • 더 많은 수의 베이크 인 알림 옵션
  • 유용한 테스트 도구 포함
  • 매우 유연함 – Elasticsearch에서 쿼리할 수 있는 경우 경고할 수 있음
  • Kibana와 통합되는 매끄러운 UI
  • 보고 기능도 포함
단점
  • 사전 정의된 규칙을 사용하므로 기본적으로 유연성이 떨어짐
  • 별도로 실행(플러그인 아님)
  • 공식 UI 없음(bitsensor의 멋진 플러그인이 있음에도 불구하고)
  • 작성 규칙에는 더 많은 "코드"가 필요합니다.
  • 더 적은 알림 옵션
  • 플러그인이기 때문에 Kibana 버전 수하물

알림 생성

이제 생성해야 하는 경고 유형을 정의해야 합니다. 내가 궁극적으로 알고 싶은 것은 우리가 콜드브루를 더 주문해야 하는 때였습니다. 다음과 같은 알림을 생성해야 했습니다.

통 비어 있음/거의 비어 있음
매우 간단합니다. 무게가 특정 임계값 아래로 떨어지면 보고합니다.

통이 교체되었습니다.
아, 신선한 커피가 있습니다. 체중이 급격히 증가할 때 감지합니다.

모니터링이 중단되었습니다.
데이터 없음, 알림 없음:체중계가 데이터 전송을 중지한 시점을 알아야 합니다.

통 비어 있음/거의 비어 있음

이 시나리오에서는 무게가 "비어 있음"으로 간주되는 지정된 임계값 미만인 경우 경고를 설정하고, 무게가 통의 약 20%가 남아 있음을 나타내면 경고합니다.

ElastAlert
ElastAlert는 메트릭 집계 규칙 유형을 사용하여 이를 매우 쉽게 만듭니다. 메트릭에서 집계를 생성한 다음 특정 임계값 위 또는 아래인지 확인합니다.


# (Required)
# Rule name, must be unique
name: Empty Alarm

# (Required)
# Type of alert.
type: metric_aggregation

# (Required)
# Index to search, wildcard supported
index: filebeat-*

# How much data should we use
buffer_time:
  hours: 1

# How often can we send this alert?
realert:
  hours: 24

# Type of elasticsearch document to use
doc_type: doc

metric_agg_key: weight
metric_agg_type: max
min_threshold: 41

# (Required)
# The alert is use when a match is found
alert:
- "slack"
alert_subject: The cold brew keg is empty
alert_text_type: alert_text_only
alert_text: "The cold brew keg is empty. Panic."
slack:
slack_webhook_url: "https://hooks.slack.com/services/foo/bar"
slack_msg_color: danger
slack_emoji_override: ":torch-and-pitchfork:"

지난 시간(buffer_time)에서 41(빈 통) 미만의 최대 무게를 확인하도록 설정했으며 24시간마다 한 번씩만 경고를 보내고 싶습니다. 그런 다음 Slack의 알림, 알림으로 보낼 데이터 유형, 사용된 색상 및 이모티콘에 대한 세부 정보까지 구성할 수 있습니다.

경고 경고에서 조금 더 까다로워집니다. 경고 임계값 내에 있을 때만 알고 싶습니다. 41 이상(비어 있음), 65 미만(25% 표시로 콜드 브루가 거의 없음을 경고하기 시작함). ElastAlert는 단일 임계값만 제공하므로 해당 필터를 사용하여 이 문제를 수정합니다.


metric_agg_key: weight
metric_agg_type: avg
min_threshold: 65

filter:
- range:
    weight:
      gte: 41

모든 가중치가 41 미만인 경우 이 경고가 트리거되는 것을 원하지 않기 때문에 41보다 크거나 같은 가중치를 평가하도록 필터링합니다("빈" 경고가 실행될 것이기 때문에). 그러나 가중치가 41 이상인 경우 "빈" 경고가 트리거되지 않으며 평균이 65 미만 요구 사항을 충족하는지 확인할 수 있습니다.

센틴
Sentinl은 감시자를 구성하기 위한 사용하기 쉬운 GUI를 제공합니다.

첫 번째 화면에서 관찰자의 이름을 지정하고 일정을 설정하기만 하면 됩니다.

Elasticsearch 알림으로 다시는 콜드 브루 커피를 다 써버리지 마세요

Input은 원하는 데이터를 가져오기 위한 Elasticsearch 쿼리입니다. 가중치를 포함하고 가중치 필드에 대한 평균 집계를 생성하는 모든 문서입니다.

Elasticsearch 알림으로 다시는 콜드 브루 커피를 다 써버리지 마세요

조건 화면에서 경고를 트리거하는 항목을 결정합니다. 최소한 일부 히트는 반환되어야 하고 평균 가중치는 41 미만이어야 합니다.

Elasticsearch 알림으로 다시는 콜드 브루 커피를 다 써버리지 마세요

다음은 조건이 true일 때 메시지를 실행하는 콘솔 경고(특수 색인에 문서를 저장하기도 함)입니다.

Elasticsearch 알림으로 다시는 콜드 브루 커피를 다 써버리지 마세요

Sentinl은 UI와 함께 제공되지만 (약간) 더 많은 쿼리를 작성해야 합니다. 그러나 그것들은 대부분 Elasticsearch 쿼리일 뿐이므로 당신은 아마 그것들에 익숙할 것입니다.

통이 리필되었습니다

이제 술통이 다시 채워졌다는 일반 안내문을 사무실에 보낼 방법이 필요합니다. 때때로 우리는 다른 크기의 통을 받기 때문에 특정 임계값 이상의 수준을 찾는 것이 아니라 급격한 무게 증가를 찾고 싶었습니다.

ElastAlert
ElastAlert에는 통의 무게 증가를 결정하기 위해 "스파이크"라는 내장 기능이 포함되어 있습니다.


name: Refill Detector
type: spike
index: filebeat-*

field_value: weight

spike_height: 2

spike_type: 'up'

timeframe:
  minutes: 10

threshold_ref: 100
threshold_cur: 100

realert:
  hours: 6

이 규칙은 가중치 필드의 값을 확인하고 이를 10분 창으로 묶습니다. 어떤 창에 대한 가중치의 평균이 이전 10분 창보다 2배(spike_height)보다 크면 경고를 발생시키고 싶습니다. 또한 10분 창이 "유효"하려면 최소 100개의 샘플(threshold_ref 및 threshold_cur 설정)이 있어야 하며 경고가 6시간보다 더 자주 실행될 수는 없습니다.

센틴
Sentinl 측에서는 조금 더 복잡하지만 직렬 차이 집계를 사용하여 이전 버킷보다 크게 증가한 버킷이 있는지 확인했습니다.


{
  "input": {
    "search": {
      "request": {
        "index": [
          "filebeat-*"
        ],
        "body": {
          "query": {
            "bool": {
              "filter": [
                {
                  "range": {
                    "@timestamp": {
                      "gt": "now-5m/m"
                    }
                  }
                }
              ]
            }
          },
          "aggs": {
            "30s_buckets": {
              "date_histogram": {
                "field": "@timestamp",
                "interval": "30s"
              },
              "aggs": {
                "weight_avg": {
                  "avg": {
                    "field": "weight"
                  }
                },
                "weight_diff": {
                  "serial_diff": {
                    "buckets_path": "weight_avg",
                    "lag": 3
                  }
                }
              }
            },
            "max_weight_diff": {
              "max_bucket": {
                "buckets_path": "30s_buckets>weight_diff"
              }
            }
          }
        }
      }
    }
  },
  "condition": {
    "script": {
      "script": "payload.hits.total > 20"
    },
    "compare": {
      "payload.aggregations.max_weight_diff.value": {
        "gte": 40
      }
    }
  }
}

이 "감시자"는 지난 5분을 스캔하여 30개의 버킷으로 분리한 다음 3개 버킷의 차이가 최소 40 증가했는지 확인합니다. 다시 한 번 ElastAlert에 상응하는 것보다 조금 더 복잡하지만 작동합니다. 꽤 괜찮습니다.

여기서는 깨진 데이터 피드를 찾는 세 번째 경고를 표시하지 않았지만 두 경우 모두 매우 간단한 경고입니다. ElastAlert의 플랫라인은 이를 훌륭하게 처리하고 Sentinl은 창에서 모든 무게 판독값을 잡고 적중 횟수를 계산하는 것만 큼 간단합니다. 코드를 보고 싶은 사람이 있으면 알려주십시오.

경고 데이터 사용

두 경고 시스템의 보너스는 경고 로그가 Elasticsearch에 저장되어 경고를 기반으로 시각화를 생성할 수 있기 때문에 실제 경고를 쿼리하는 기능이 있다는 것입니다.

리필

저는 Kibana 대시보드에서 리필을 보았을 때 리필 알림을 사용하여 플롯합니다. 마지막 리필 시간의 시각화를 생성하기 위해 무게 데이터를 보는 대신 시각화에 대한 마지막 리필 경고를 볼 수 있습니다. 예를 들어 Sentinl은 날짜를 기준으로 "watcher_alerts-*"라는 로컬 인덱스에 모든 경고를 저장합니다.

Elasticsearch 알림으로 다시는 콜드 브루 커피를 다 써버리지 마세요

마지막 리필에 대한 시각화를 생성하려면 "감시자" 필드로 이벤트를 필터링하여 리필 이벤트만 가져온 다음 최대 날짜를 선택합니다.

Elasticsearch 알림으로 다시는 콜드 브루 커피를 다 써버리지 마세요

일일 보고

또 다른 훌륭한 옵션은 일반 알림을 사용하여 나중에 보고할 수 있는 롤업과 유사한 동작을 생성할 수 있다는 것입니다.

예를 들어, 일일 소비량을 보고 싶다면 매일 체중 감소를 보고 (보충 또는 기타 이벤트로 인한) 큰 스파이크를 걸러낸 다음 무게를 온스로 변환합니다.

단일 Kibana 시각화에서는 약간 까다로울 수 있습니다. (그러나 Vega는 유망해 보입니다.)

그래서 대신 매일 밤 자정 전에 실행되고 그날의 소비 합계를 생성하는 일일 경고를 만들었습니다. 그런 다음 "watcher_alerts" 인덱스에서 해당 일일 합계를 읽는 간단한 시각화를 만듭니다.

Elasticsearch 알림으로 다시는 콜드 브루 커피를 다 써버리지 마세요

Elasticsearch 알림으로 다시는 콜드 브루 커피를 다 써버리지 마세요

최종 결과

설치가 완료되면 이제 Slack에서 콜드 브루 케그를 언제 더 주문해야 하는지 알려줍니다. IT나 관리자, 또는 일부 선택된 소수의 개인에게만 전송되는 것이 아닙니다. 이제 사무실 전체가 새 술통이 언제 도착하는지 알 수 있습니다.

Elasticsearch 알림으로 다시는 콜드 브루 커피를 다 써버리지 마세요

더 이상 콜드브루를 위해 식은땀을 흘리지 않아도 됩니다. 직원의 행복과 생산성이 사상 최고입니다.

Elasticsearch + Sentinl/ElastAlert 경고 FTW!