Dùng Elasticsearch Alerts báo khi "Gần hết"
Tại ObjectRocket, chúng tôi cấp năng lượng cho Văn phòng bằng Cold Brew Coffee On Tap. Nóng ở Austin, TX tháng 8. Chúng tôi cần Caffeine Lạnh.
Vì chỉ giữ 1 Keg tại một thời điểm, lên lịch Order không bị hết hơi Tricky, nên khi ai đó ở ObjectRocket Office nói "Wish we had better data on cold brew usage" tôi toàn tâm đầu tư. Tôi luôn tìm cách mới Show what Elastic Stack can do, nên xây dựng hệ thống Monitoring và Alerting bán tự động để không bao giờ hết Cold Brew.
Kết quả là sự kết hợp Raspberry Pi, Elasticsearch, Kibana, và Sentinl/ElastAlert bắn Alerts Slack khi sự kiện quan trọng xảy ra trên Keg. Sentinl và ElastAlert là ngôi sao chính nên chúng ta đào sâu sau.
Trong Phần 1 Series 2 phần này, khám phá cách tạo Alert System từ Data Capture Kegerator Solution. Hy vọng bạn mang về ý tưởng và kiến thức về Open Source Alerting Options cho Elasticsearch. Chi tiết Build vật lý sẽ để bài sau.
Data (Không chỉ Cold Brew) từ Keg
Như ghi, ta sẽ bàn Build Kegerator ở Blog sau, và tại sao chọn Scale-Keg-Weight Solution thay vì Flow Rate Monitoring.
Tất cả cần biết cho Blog này: Tôi Setup Raspberry Pi-powered Scale gửi Stream Documents đều đặn đến Elasticsearch định dạng như sau.
{ "_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 Grab Data và Include 2 Field chính chúng ta quan tâm:
- "@TIMESTAMP" của mỗi Weight Reading
- Thực tế "WEIGHT" Reading tại Timestamp đó
Alerting Options
Trước hết: Để Action khi Keg có vấn đề, cần cách gửi Notification cho Key Persons. Đó là lúc Alerting Package xuất hiện.
May mắn có vài Option Apache 2.0 License thêm Alerting vào Elasticsearch Cluster: ElastAlert và Sentinl.
ElastAlert
ElastAlert là Alerting Framework linh hoạt cho Elasticsearch do Yelp tạo, chạy riêng biệt Elasticsearch, cấu hình chủ yếu qua Config Files cơ bản. User tạo Main Config File với Global Params cho tất cả Alerts, rồi tạo Rules Files cho mỗi Rule chứa ElastAlert-specific YAML cấu hình Rules và Alerts kết quả. Mỗi "Rule" chứa:
- Rule Configuration dựa trên Standard Rules List (như "FLATLINE", "SPIKE", "METRIC AGGREGATION")
- Elasticsearch Filters giới hạn Query Hits mỗi Rule dùng
- Alert bắn khi Rule Positive (như Email, Jira, Slack, etc.)
Sentinl
Sentinl mới hơn ElastAlert. ObjectRocket tìm thấy Sentinl – do Siren Solutions tạo – khi tìm Alerting Options mới cho Khách hàng ObjectRocket Service. Sentinl là Kibana Plugin cung cấp Reporting thêm Alerting cho Elasticsearch. Nó gọi mỗi Job là "Watcher" (không nhầm với Plugin cũ cùng tên) bao gồm:
- Schedule (Tần suất và khi nào Check)
- Input Query (Elasticsearch Query cho Data muốn Check)
- Condition (Logic quyết định Alert trên Data hay không)
- Transform (Code Modify Data trước Alert)
- Actions (Làm gì khi Alert: Slack, Email, Webhook)
Alerting Option nào phù hợp bạn?
Cả hai đều tuyệt, chỉ phụ thuộc loại Alert bạn cần. Phát hiện của tôi:
| ElastAlert | Sentinl | |
| Pros |
|
|
| Cons |
|
|
Tạo Alerts
Giờ cần Define loại Alerts cần tạo. Mục tiêu cuối: Biết khi nào Order thêm Cold-brew. Cần Alerts báo:
Keg Empty / Gần Empty
Đơn giản: Báo nếu Weight dưới Threshold "Empty".
Keg đã Refill
Aha, Coffee mới: Phát hiện Sharp Increase Weight.
Monitoring Broken
No Data, No Alerts: Cần biết khi Scale ngừng gửi Data.
Keg Empty / Gần Empty
Trong Scenario này, set Alert nếu Weight dưới Threshold "Empty", và Warning nếu Weight cho thấy ~20% Keg còn lại.
ElastAlert
ElastAlert dễ dàng với Metric Aggregation Rule Type: Tạo Aggregation từ Metric rồi xác định Above/Below Threshold 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:"
Setup nhìn qua 1 giờ qua (buffer_time) Max Weight dưới 41 (Keg Empty) và chỉ gửi Alert 1 lần/24h. Sau đó cấu hình Slack Alerts, loại Data gửi, Color, Emoji.
Warning Alerts hơi Tricky. Chỉ muốn biết khi trong Warning Threshold: Trên 41 (Empty) nhưng dưới 65 (25% Mark bắt đầu Warning gần hết). Vì ElastAlert chỉ cho Single Threshold, dùng Filters fix.
METRIC_AGG_KEY: WEIGHT
METRIC_AGG_TYPE: AVG
MIN_THRESHOLD: 65
FILTER:
- RANGE:
WEIGHT:
GTE: 41
Filter evaluate Weights >= 41 vì nếu All Weights < 41, không muốn Alert này Trigger (vì Empty Alert sẽ Trigger). Tuy nhiên, nếu có Weights >= 41, Empty Alert không Trigger, và tôi xác định Average có Meet < 65 Requirement không.
Sentinl
Sentinl cung cấp GUI dễ dùng cấu hình Watcher.
Màn hình đầu: Đặt tên Watcher và Schedule.
Input là Elasticsearch Query Grab Data: Docs có Weight và tạo Average Aggregation trên Weight Field.
Màn hình Condition: Xác định Trigger Alert: Ít nhất Some Hits Returned và Average Weight < 41.
Console Alert (cũng Store Document trong Special Index) bắn Message khi Condition True.
Sentinl có UI, nhưng cần viết Query nhiều hơn (một chút). Tuy nhiên, chủ yếu chỉ Elasticsearch Queries, nên bạn có thể thoải mái.
Keg đã Refill
Cần cách gửi Announcement chung cho Office Keg đã Refill. Vì đôi khi nhận Keg Size khác nhau, thay vì chỉ Look Threshold trên, muốn Look Sharp Increase Weight.
ElastAlert
ElastAlert có Built-in "SPIKE" xác định Upward Increase Weight Keg:
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
Rule này nhìn Values Weight Field, Bucket vào 10-minute Windows. Nếu Mean Weight bất kỳ Window > 2x (spike_height) Previous 10-minute Window, bắn Alert. Lưu ý: 10-minute Window "Valid" phải có ít nhất 100 Samples (threshold_ref/threshold_cur) và Alert không bắn > 6h/lần.
Sentinl
Phía Sentinl hơi phức tạp hơn, dùng Serial Difference Aggregation xác định Buckets có Huge Increase Previous Buckets:
{ "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 } } } }
Watcher này Scan 5 phút qua, chia 30s Buckets, xem Difference Across 3 Buckets có Increase >= 40 không. Lại phức tạp hơn ElastAlert Equivalent, nhưng chạy tốt.
Tôi không show Alert thứ 3 (Broken Data Feed) ở đây, nhưng cả hai trường hợp đều Simple Alert. ElastAlert Flatline xử lý tốt, Sentinl đơn giản Grab All Weight Readings trong Window Count Hits. Ai muốn xem Code, cho chúng tôi biết.
Sử dụng Data Alert
Bonus của cả 2 Alerting Systems: Khả năng Query Actual Alerts, vì Log Alerts lưu trong Elasticsearch, cho phép tạo Visualizations dựa trên Alerts.
Refills
Tôi dùng Refill Alerts plot khi nào Refill trên Kibana Dashboard. Thay vì nhìn Weight Data tạo Visualization Last Refill Time, chỉ cần nhìn Last Refill Alert cho Visualization. Sentinl store All Alerts trong Local Indexes "WATCHER_ALERTS-*" theo Date.
Tạo Visualization Last Refill: Filter Events bằng "WATCHER" Field, chỉ lấy Refill Events, chọn Max Date.
Báo cáo hàng ngày
Option tuyệt vời khác: Dùng Regular Alert tạo Behavior giống Roll-up để Report sau.
Ví dụ: Muốn xem Daily Consumption, nhìn Decrease Weight Day-to-day, Filter Out Large Spikes (Refills/Events), Convert Weight sang Ounces.
Hơi Tricky với Single Kibana Visualization. (Tuy nhiên Vega Look Promising.)
Thay vào đó, tạo Daily Alert chạy mỗi đêm trước Midnight tạo Sum Consumption ngày đó. Sau đó tạo Simple Visualization đọc Daily Sums từ "WATCHER_ALERTS" Indexes.
Kết quả cuối cùng
Sau khi cài đặt xong, Slack báo khi Order thêm Cold Brew Keg. Không chỉ gửi cho IT/Admins hoặc vài người chọn lọc. Cả Office giờ biết khi Keg mới đến.
Không còn Cold Sweats cho Cold Brew: Staff Happiness và Productivity ở All-time High.
Elasticsearch + Sentinl/ElastAlert Alerting FTW!