Computer >> Máy Tính >  >> Lập trình >> Cơ sở dữ liệu

Không bao giờ hết cà phê pha lạnh nữa với cảnh báo Elasticsearch

Không bao giờ hết cà phê pha lạnh nữa với cảnh báo Elasticsearch

Sử dụng cảnh báo Elasticsearch để cho chúng tôi biết khi nào chúng tôi "gần như trống rỗng"

Tại ObjectRocket, chúng tôi cung cấp năng lượng cho văn phòng của mình bằng cà phê pha lạnh ngay trên vòi. Ở đây, ở Austin, TX vào tháng 8, trời rất nóng. Chúng tôi cần caffeine lạnh.

Vì chúng tôi chỉ giữ một thùng duy nhất tại một thời điểm, nên việc lên lịch đơn đặt hàng của chúng tôi mà không hết có thể rất khó khăn, vì vậy khi ai đó trong văn phòng ObjectRocket đề cập rằng họ “ước gì chúng tôi có dữ liệu tốt hơn về việc sử dụng bia lạnh của chúng tôi”, tôi đã hoàn thành việc đó. Tôi luôn tìm kiếm một số cách mới để thể hiện những gì Elastic Stack có thể làm, vì vậy, tôi bắt đầu tạo một hệ thống cảnh báo và giám sát bán tự trị để chúng tôi không bao giờ hết lạnh nữa.

Những gì chúng tôi đã kết thúc là sự kết hợp của Raspberry Pi, Elasticsearch, Kibana và Sentinl / ElastAlert để kích hoạt cảnh báo cho Slack khi có điều gì đó quan trọng xảy ra với thùng. Sentinl và ElastAlert là những ngôi sao của chương trình, vì vậy chúng ta sẽ tìm hiểu những điều đó sau.

Không bao giờ hết cà phê pha lạnh nữa với cảnh báo Elasticsearch Không bao giờ hết cà phê pha lạnh nữa với cảnh báo Elasticsearch

Trong phần đầu tiên của loạt bài gồm hai phần này, chúng ta sẽ khám phá cách tôi tạo hệ thống cảnh báo với dữ liệu được thu thập từ giải pháp kegerator của chúng tôi. Tôi hy vọng rằng bạn có một số ý tưởng và một số kiến ​​thức về các tùy chọn cảnh báo mã nguồn mở cho Elasticsearch. Tôi sẽ lưu các chi tiết về cách tôi xây dựng hệ thống một cách vật lý cho bài đăng tiếp theo.

Dữ liệu (không chỉ ủ lạnh) từ Keg

Như tôi đã lưu ý, chúng ta sẽ thảo luận về việc xây dựng kegerator trong blog tiếp theo và lý do tại sao chúng tôi chọn sử dụng giải pháp cân-keg-weight thay vì xây dựng hệ thống giám sát tốc độ dòng chảy.

Tất cả những gì bạn cần biết cho blog này là tôi đã thiết lập một thang đo do Raspberry Pi cung cấp để gửi một luồng tài liệu thường xuyên tới Elasticsearch ở định dạng như bên dưới.


{
  "_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 lấy dữ liệu và bao gồm hai trường chính mà chúng tôi quan tâm:

  • “@timestamp” của mỗi lần đọc trọng lượng
  • số đọc "trọng lượng" thực tế tại dấu thời gian đó

Tùy chọn cảnh báo

Điều đầu tiên trước tiên:để hành động khi có vấn đề gì đó xảy ra với thùng, tôi cần một cách để gửi thông báo đến những người chủ chốt. Đó là lúc gói cảnh báo phát huy tác dụng.

May mắn thay, có một số tùy chọn được cấp phép Apache 2.0 để thêm cảnh báo vào cụm Elasticsearch:ElastAlert và Sentinl.

ElastAlert
ElastAlert là một khung cảnh báo linh hoạt cho Elasticsearch được tạo bởi Yelp, chạy riêng biệt với Elasticsearch và được định cấu hình chủ yếu thông qua các tệp cấu hình cơ bản. Người dùng có thể tạo tệp cấu hình chính với các thông số chung trên tất cả các cảnh báo, sau đó tạo tệp quy tắc cho từng quy tắc có chứa YAML dành riêng cho ElastAlert để định cấu hình quy tắc và cảnh báo kết quả. Mỗi "quy tắc" chứa:

  • Cấu hình quy tắc dựa trên danh sách tiêu chuẩn của các quy tắc (như "đường phẳng", "tăng đột biến" và "tổng hợp số liệu")
  • Bộ lọc Elasticsearch để giới hạn số lần truy cập truy vấn mà mỗi quy tắc sử dụng
  • Cảnh báo kích hoạt khi phần quy tắc là tích cực (như email, Jira, Slack, v.v.)

Sentinl
Sentinl mới hơn một chút so với ElastAlert. ObjectRocket tình cờ gặp Sentinl — được tạo bởi Siren Solutions — khi đang tìm kiếm các tùy chọn cảnh báo mới cho khách hàng trên Dịch vụ ObjectRocket. Sentinl là một plugin Kibana cung cấp báo cáo ngoài cảnh báo cho Elasticsearch. Nó gọi mỗi công việc là một “người theo dõi” (không nên nhầm lẫn với một plugin cũ hơn cùng tên) bao gồm:

  • Lịch trình (tần suất và thời điểm kiểm tra)
  • Truy vấn đầu vào (truy vấn Elasticsearch cho dữ liệu bạn muốn kiểm tra)
  • Một điều kiện (logic xác định xem có nên cảnh báo trên dữ liệu hay không)
  • Một chuyển đổi (mã để sửa đổi dữ liệu trước khi cảnh báo)
  • Hành động (phải làm gì khi bạn cảnh báo như Slack, Email hoặc webhook)

Tùy chọn cảnh báo nào phù hợp với bạn?

Cả hai đều thực sự tuyệt vời, vì vậy nó chỉ phụ thuộc vào loại cảnh báo bạn đang tìm kiếm. Đây là những phát hiện của tôi:

ElastAlert Sentinl
Ưu điểm
  • Tăng tốc nhanh hơn với các quy tắc xác định trước
  • Số lượng nướng nhiều hơn trong các tùy chọn cảnh báo
  • Bao gồm các công cụ kiểm tra hữu ích
  • Siêu linh hoạt - Nếu bạn có thể truy vấn nó trong Elasticsearch, bạn có thể thông báo về nó
  • Giao diện người dùng mượt mà tích hợp với Kibana
  • Cũng bao gồm báo cáo
Nhược điểm
  • Ít linh hoạt hơn, vì nó sử dụng các quy tắc được xác định trước
  • Chạy riêng (không phải plugin)
  • Không có giao diện người dùng chính thức (mặc dù có một plugin tuyệt vời từ bitsensor)
  • Quy tắc viết yêu cầu nhiều "mã" hơn
  • Ít tùy chọn cảnh báo hơn
  • Vì là một plugin nên phiên bản Kibana là hành lý

Tạo cảnh báo

Bây giờ tôi cần xác định loại cảnh báo nào chúng ta cần tạo. Cuối cùng, điều tôi muốn biết là khi nào chúng ta nên gọi thêm món cold-brew. Tôi cần tạo cảnh báo cho chúng tôi biết:

Keg trống / Gần trống rỗng
Khá đơn giản:báo cáo nếu trọng lượng đã giảm xuống dưới một ngưỡng nhất định.

Keg đã được thay thế
Aha, có cà phê tươi:phát hiện khi cân nặng tăng mạnh.

Giám sát bị hỏng
Không có dữ liệu, không có cảnh báo:chúng ta cần biết khi nào cân ngừng gửi dữ liệu

Keg Empty / Gần Empty

Trong trường hợp này, tôi đặt cảnh báo nếu trọng lượng dưới ngưỡng được chỉ định được coi là "rỗng" và cảnh báo chúng tôi nếu trọng lượng cho biết còn khoảng 20% ​​thùng hàng.

ElastAlert
ElastAlert thực hiện điều này khá dễ dàng với loại quy tắc tổng hợp số liệu:tạo tổng hợp từ một số liệu và sau đó xác định xem nó cao hơn hay thấp hơn một ngưỡng cụ thể.


# (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:"

Tôi đã thiết lập nó để xem trọng lượng tối đa trong giờ qua (buffer_time) dưới 41 (một thùng rỗng) và chỉ muốn gửi cảnh báo mỗi 24 giờ một lần. Sau đó, tôi có thể định cấu hình cảnh báo của Slack, loại dữ liệu để gửi cảnh báo và thậm chí cả thông tin chi tiết cụ thể về màu sắc và biểu tượng cảm xúc được sử dụng.

Nó trở nên phức tạp hơn một chút đối với các cảnh báo cảnh báo. Tôi chỉ muốn biết khi nó nằm trong ngưỡng cảnh báo:trên 41 (trống) nhưng dưới 65 (mốc 25% để bắt đầu cảnh báo rằng chúng ta sắp hết thời gian ủ lạnh). Vì ElastAlert chỉ đưa ra một ngưỡng duy nhất nên tôi sử dụng bộ lọc của họ để khắc phục điều này.


metric_agg_key: weight
metric_agg_type: avg
min_threshold: 65

filter:
- range:
    weight:
      gte: 41

Tôi lọc để đánh giá các trọng số lớn hơn hoặc bằng 41 vì nếu tất cả các trọng số đều dưới 41, tôi không muốn cảnh báo này kích hoạt (vì cảnh báo "trống" sẽ xảy ra). Tuy nhiên, nếu có một số trọng số bằng 41 hoặc lớn hơn, cảnh báo "trống" sẽ không kích hoạt và tôi có thể xác định xem mức trung bình có đáp ứng yêu cầu nhỏ hơn 65 của chúng tôi hay không.

Sentinl
Sentinl cung cấp GUI dễ sử dụng để định cấu hình trình xem.

Trên màn hình đầu tiên, chỉ cần đặt tên cho người xem của bạn và đặt lịch biểu.

Không bao giờ hết cà phê pha lạnh nữa với cảnh báo Elasticsearch

Đầu vào là một truy vấn Elasticsearch để lấy dữ liệu bạn muốn:bất kỳ tài liệu nào bao gồm trọng số và tạo tổng hợp trung bình trên trường trọng số.

Không bao giờ hết cà phê pha lạnh nữa với cảnh báo Elasticsearch

Trong màn hình điều kiện, hãy xác định yếu tố nào kích hoạt cảnh báo:ít nhất một số lần truy cập phải được trả lại và trọng lượng trung bình phải dưới 41.

Không bao giờ hết cà phê pha lạnh nữa với cảnh báo Elasticsearch

Đây là cảnh báo trên bảng điều khiển (cũng lưu trữ tài liệu trong một chỉ mục đặc biệt) kích hoạt thông báo khi điều kiện là đúng.

Không bao giờ hết cà phê pha lạnh nữa với cảnh báo Elasticsearch

Sentinl đi kèm với một giao diện người dùng, nhưng bạn cần viết thêm (một chút) các truy vấn. Tuy nhiên, chúng hầu hết chỉ là các truy vấn Elasticsearch, vì vậy, rất có thể bạn cảm thấy thoải mái với chúng.

Keg đã được nạp lại

Bây giờ tôi cần một cách để gửi một thông báo chung đến văn phòng rằng thùng đã được đổ đầy. Vì đôi khi chúng tôi nhận được các thùng có kích thước khác nhau, thay vì chỉ tìm kiếm một mức cao hơn một ngưỡng nhất định, tôi muốn tìm kiếm sự gia tăng đáng kể về trọng lượng.

ElastAlert
ElastAlert bao gồm một công cụ tích hợp có tên là “spike” để xác định sự gia tăng trọng lượng của thùng hàng:


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

Quy tắc này xem xét các giá trị trong trường trọng lượng và xếp chúng vào cửa sổ 10 phút. Nếu trọng số trung bình cho bất kỳ cửa sổ nào lớn hơn 2 lần (spike_height) so với cửa sổ 10 phút trước đó, tôi muốn kích hoạt một cảnh báo. Ngoài ra, hãy lưu ý rằng để cửa sổ 10 phút "hợp lệ", cửa sổ đó phải có ít nhất 100 mẫu (cài đặt ngưỡng_ref và ngưỡng_cur) và cảnh báo không được kích hoạt thường xuyên hơn 6 giờ một lần.

Sentinl
Về phía Sentinl, phức tạp hơn một chút, nhưng chúng tôi đã sử dụng tổng hợp chênh lệch tuần tự để xác định xem chúng tôi có thấy bất kỳ nhóm nào bao gồm sự gia tăng lớn so với các nhóm trước đó hay không:


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

"Người theo dõi" này sẽ quét trong 5 phút qua, tách thành các nhóm trong 30 giây, sau đó xem liệu sự khác biệt giữa 3 nhóm có tăng ít nhất 40. Một lần nữa, nó phức tạp hơn một chút so với ElastAlert tương đương, nhưng nó hoạt động khá tốt.

Tôi chưa hiển thị cảnh báo thứ ba, tìm kiếm nguồn cấp dữ liệu bị hỏng, ở đây, nhưng trong cả hai trường hợp, đó là một cảnh báo rất đơn giản. Đường phẳng của ElastAlert xử lý nó một cách độc đáo và Sentinl đơn giản như lấy tất cả các kết quả đo trọng lượng trong một cửa sổ và đếm số lần truy cập. Nếu ai muốn xem mã, hãy cho chúng tôi biết.

Sử dụng Dữ liệu Cảnh báo

Một điểm cộng của cả hai hệ thống cảnh báo là chúng có khả năng truy vấn các cảnh báo thực tế, vì nhật ký các cảnh báo được lưu trữ trong Elasticsearch, cho phép bạn tạo hình ảnh trực quan dựa trên các cảnh báo.

Nạp tiền

Tôi sử dụng các cảnh báo nạp tiền để tìm ra thời điểm chúng tôi thấy một lần nạp tiền trên trang tổng quan Kibana của chúng tôi. Thay vì xem dữ liệu trọng lượng để tạo hình ảnh về thời gian nạp lại gần đây nhất, tôi chỉ có thể xem cảnh báo nạp lại gần đây nhất để có hình dung. Ví dụ:Sentinl lưu trữ tất cả các cảnh báo trong các chỉ mục cục bộ được gọi là “watcher_alerts- *” dựa trên ngày.

Không bao giờ hết cà phê pha lạnh nữa với cảnh báo Elasticsearch

Để tạo hình ảnh trực quan về lần nạp tiền cuối cùng, hãy lọc các sự kiện theo trường "người theo dõi", vì vậy bạn chỉ nhận được các sự kiện nạp lại, sau đó chọn ngày tối đa.

Không bao giờ hết cà phê pha lạnh nữa với cảnh báo Elasticsearch

Báo cáo hàng ngày

Một tùy chọn tuyệt vời khác là bạn có thể sử dụng cảnh báo thông thường để tạo hành vi tương tự như bản cuộn lên mà bạn có thể báo cáo sau.

Ví dụ:nếu tôi muốn xem lượng tiêu thụ hàng ngày, tôi sẽ xem trọng lượng giảm theo từng ngày, lọc ra các mức tăng đột biến lớn (do nạp lại hoặc do các sự kiện khác), sau đó chuyển đổi trọng lượng thành ounce.

Điều này có thể hơi phức tạp với một hình dung Kibana duy nhất. (Tuy nhiên, Vega có vẻ đầy hứa hẹn.)

Vì vậy, thay vào đó, tôi đã tạo một cảnh báo hàng ngày chạy vào mỗi đêm trước nửa đêm và tạo ra tổng mức tiêu thụ cho ngày đó. Sau đó, tôi tạo một hình ảnh trực quan đơn giản để đọc các khoản tiền hàng ngày đó từ chỉ mục “watcher_alerts”.

Không bao giờ hết cà phê pha lạnh nữa với cảnh báo Elasticsearch

Không bao giờ hết cà phê pha lạnh nữa với cảnh báo Elasticsearch

Kết quả cuối cùng

Sau khi tôi hoàn tất cài đặt, Slack bây giờ cho chúng tôi biết khi nào nên đặt hàng thêm thùng lạnh. Và nó không chỉ được gửi đến CNTT hoặc quản trị viên hoặc một số cá nhân được chọn khác. Giờ đây, toàn bộ văn phòng đều biết khi nào một thùng hàng mới đến.

Không bao giờ hết cà phê pha lạnh nữa với cảnh báo Elasticsearch

Không còn đổ mồ hôi lạnh cho món bia lạnh nữa ở đây:sự hạnh phúc và năng suất của nhân viên ở mức cao nhất mọi thời đại.

Elasticsearch + Sentinl / ElastAlert cảnh báo FTW!