การใช้การแจ้งเตือนของ Elasticsearch เพื่อแจ้งให้เราทราบเมื่อเรา “เกือบว่างเปล่า”
ที่ ObjectRocket เราเติมพลังให้สำนักงานของเราด้วยกาแฟสกัดเย็นแบบแตะ ที่ออสติน รัฐเท็กซัสอากาศร้อนในเดือนสิงหาคม เราต้องการคาเฟอีนเย็น
เนื่องจากเราเก็บถังไว้ทีละถังเท่านั้น การจัดตารางคำสั่งซื้อของเราโดยไม่หมดจึงอาจเป็นเรื่องยาก ดังนั้นเมื่อมีคนในสำนักงาน ObjectRocket กล่าวว่าพวกเขา "หวังว่าเราจะมีข้อมูลที่ดีขึ้นเกี่ยวกับการใช้เบียร์เย็น ๆ ของเรา" ฉันจึงทำทุกอย่าง ฉันมองหาวิธีใหม่ๆ ในการแสดงสิ่งที่ Elastic Stack ทำได้อยู่เสมอ ดังนั้นฉันจึงตั้งเป้าหมายที่จะสร้างระบบตรวจสอบและแจ้งเตือนกึ่งอัตโนมัติ เพื่อที่เราจะได้ไม่ต้องชง Cold brew อีกต่อไป
สิ่งที่เราลงเอยด้วยคือการรวมกันของ Raspberry Pi, Elasticsearch, Kibana และ Sentinl/ElastAlert เพื่อแจ้งเตือนไปยัง Slack เมื่อมีสิ่งที่สำคัญเกิดขึ้นกับถัง Sentinl และ ElastAlert เป็นดาวเด่นของรายการ ดังนั้นเราจะมาเจาะลึกกันในภายหลัง
ในชุดสองส่วนแรกนี้ เราจะสำรวจวิธีที่ฉันสร้างระบบแจ้งเตือนด้วยข้อมูลที่รวบรวมจากโซลูชัน kegerator ของเรา ความหวังของฉันคือการที่คุณเดินออกไปพร้อมกับแนวคิดและความรู้บางอย่างเกี่ยวกับตัวเลือกการแจ้งเตือนโอเพนซอร์สสำหรับ Elasticsearch ฉันจะบันทึกรายละเอียดเกี่ยวกับวิธีที่ฉันสร้างระบบสำหรับโพสต์ถัดไป
ข้อมูล (ไม่ใช่แค่การชงแบบเย็น) จากถัง
ดังที่ฉันได้กล่าวไว้ เราจะพูดถึงการสร้าง kegerator ในบล็อกถัดไป และเหตุผลที่เราเลือกใช้โซลูชัน scale-keg-weight แทนการสร้างระบบตรวจสอบอัตราการไหล
สิ่งที่คุณต้องรู้สำหรับบล็อกนี้คือฉันได้ตั้งค่ามาตราส่วนที่ขับเคลื่อนด้วย Raspberry Pi ซึ่งจะส่งสตรีมเอกสารปกติไปยัง Elasticsearch ในรูปแบบด้านล่าง
{
"_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” ของการอ่านน้ำหนักแต่ละครั้ง
- การอ่าน "น้ำหนัก" จริง ณ เวลานั้น
ตัวเลือกการแจ้งเตือน
อย่างแรกเลย:เพื่อดำเนินการเมื่อมีบางอย่างเกิดขึ้นกับถัง ฉันต้องการวิธีส่งการแจ้งเตือนไปยังบุคคลสำคัญ นั่นคือที่มาของแพ็คเกจแจ้งเตือน
โชคดีที่มีตัวเลือกลิขสิทธิ์ Apache 2.0 จำนวนหนึ่งเพื่อเพิ่มการแจ้งเตือนไปยังคลัสเตอร์ Elasticsearch:ElastAlert และ Sentinl
ElastAlert
ElastAlert เป็นเฟรมเวิร์กการแจ้งเตือนที่ยืดหยุ่นสำหรับ Elasticsearch ที่สร้างโดย Yelp ซึ่งทำงานแยกจาก Elasticsearch และกำหนดค่าผ่านไฟล์กำหนดค่าพื้นฐานเป็นหลัก ผู้ใช้สามารถสร้างไฟล์กำหนดค่าหลักที่มีพารามิเตอร์ร่วมในการแจ้งเตือนทั้งหมด จากนั้นจึงสร้างไฟล์กฎสำหรับแต่ละกฎที่มี YAML เฉพาะของ ElastAlert เพื่อกำหนดค่ากฎและการแจ้งเตือนที่เป็นผลลัพธ์ แต่ละ “กฎ” ประกอบด้วย:
- การกำหนดค่ากฎตามรายการกฎมาตรฐาน (เช่น "แฟลตไลน์" "สไปค์" และ "การรวมเมตริก")
- ตัวกรอง Elasticsearch เพื่อจำกัดการค้นหาที่แต่ละกฎใช้
- การแจ้งเตือนให้เริ่มทำงานเมื่อส่วนของกฎเป็นค่าบวก (เช่น อีเมล, Jira, Slack เป็นต้น)
เซนตินล์
Sentinl ใหม่กว่า ElastAlert เล็กน้อย ObjectRocket พบกับ Sentinl ซึ่งสร้างโดย Siren Solutions ในขณะที่มองหาตัวเลือกการแจ้งเตือนใหม่ๆ สำหรับลูกค้าบน ObjectRocket Service Sentinl เป็นปลั๊กอิน Kibana ที่นำเสนอการรายงานนอกเหนือจากการแจ้งเตือนสำหรับ Elasticsearch โดยเรียกแต่ละงานว่า “ผู้เฝ้ามอง” (อย่าสับสนกับปลั๊กอินเก่าที่มีชื่อเดียวกัน) ได้แก่:
- กำหนดการ (ตรวจสอบบ่อยและเมื่อไร)
- แบบสอบถามอินพุต (แบบสอบถาม Elasticsearch สำหรับข้อมูลที่คุณต้องการตรวจสอบ)
- เงื่อนไข (ตรรกะที่กำหนดว่าจะแจ้งเตือนข้อมูลหรือไม่)
- การแปลงรูปแบบ (รหัสเพื่อแก้ไขข้อมูลก่อนที่จะแจ้งเตือน)
- การดำเนินการ (จะทำอย่างไรเมื่อคุณแจ้งเตือน เช่น Slack, Email หรือ webhook)
ตัวเลือกการแจ้งเตือนใดที่เหมาะกับคุณ
ทั้งคู่ยอดเยี่ยมมาก ดังนั้นมันจึงขึ้นอยู่กับประเภทของการแจ้งเตือนที่คุณกำลังมองหา นี่คือการค้นพบของฉัน:
ElastAlert | Sentinl | |
ข้อดี |
|
|
ข้อเสีย |
|
|
การสร้างการแจ้งเตือน
ตอนนี้ฉันต้องกำหนดประเภทการแจ้งเตือนที่เราต้องสร้าง สิ่งที่ฉันอยากรู้ในที่สุดคือเมื่อไหร่เราควรสั่งเบียร์เย็น ๆ มากกว่านี้ ฉันต้องสร้างการแจ้งเตือนที่บอกเราว่า:
ถังว่างเปล่า / ใกล้จะว่างเปล่า
ค่อนข้างง่าย:รายงานว่าน้ำหนักลดลงต่ำกว่าเกณฑ์ที่กำหนด
เปลี่ยนถังแล้ว
อ่า มีกาแฟสด:ตรวจจับเมื่อน้ำหนักเพิ่มขึ้นอย่างรวดเร็ว
การตรวจสอบใช้งานไม่ได้
ไม่มีข้อมูล ไม่มีการแจ้งเตือน:เราจำเป็นต้องทราบเมื่อเครื่องชั่งหยุดส่งข้อมูล
ถังว่างเปล่า / ใกล้จะว่างเปล่า
ในสถานการณ์นี้ ฉันตั้งค่าการแจ้งเตือนหากน้ำหนักต่ำกว่าเกณฑ์ที่กำหนดซึ่งถือว่า "ว่างเปล่า" และเตือนเราหากน้ำหนักระบุว่ามีถังเหลืออยู่ประมาณ 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 เพื่อดึงข้อมูลที่คุณต้องการ:เอกสารใดๆ ที่รวมน้ำหนักและการสร้างการรวมเฉลี่ยในฟิลด์น้ำหนัก
ในหน้าจอเงื่อนไข ให้กำหนดสิ่งที่ทำให้เกิดการแจ้งเตือน:อย่างน้อยบาง Hit ต้องถูกส่งกลับและน้ำหนักเฉลี่ยต้องต่ำกว่า 41
นี่คือการแจ้งเตือนคอนโซล (ซึ่งจัดเก็บเอกสารไว้ในดัชนีพิเศษด้วย) ซึ่งจะส่งข้อความเมื่อเงื่อนไขเป็นจริง
Sentinl มาพร้อมกับ UI แต่คุณต้องเขียนข้อความค้นหาเพิ่มเติม (เล็กน้อย) อย่างไรก็ตาม ส่วนใหญ่เป็นเพียงข้อความค้นหาของ Elasticsearch ดังนั้นคุณจึงน่าจะพอใจกับคำถามเหล่านี้
เติมถังแล้ว
ตอนนี้ฉันต้องการวิธีส่งประกาศทั่วไปไปยังสำนักงานว่ามีการเติมถังแล้ว เนื่องจากบางครั้งเราได้รับถังขนาดต่างๆ กัน แทนที่จะเพียงแค่มองหาระดับที่สูงกว่าเกณฑ์ที่กำหนด ฉันต้องการมองหาน้ำหนักที่เพิ่มขึ้นอย่างรวดเร็ว
ElastAlert
ElastAlert มี "spike" ในตัวเพื่อพิจารณาการเพิ่มน้ำหนักของถัง:
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 นาที หากค่าเฉลี่ยของน้ำหนักสำหรับหน้าต่างใดๆ มากกว่า 2x (spike_height) ของหน้าต่าง 10 นาทีก่อนหน้า ฉันต้องการเริ่มการแจ้งเตือน นอกจากนี้ โปรดทราบว่าสำหรับกรอบเวลา 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 ที่เทียบเท่ากันเล็กน้อย แต่ก็ใช้งานได้ ค่อนข้างดี
ฉันไม่ได้แสดงการแจ้งเตือนครั้งที่สามซึ่งมองหาฟีดข้อมูลที่เสียที่นี่ แต่ในทั้งสองกรณีเป็นการแจ้งเตือนที่ง่ายมาก Flatline ของ ElastAlert จัดการได้อย่างดี และ Sentinl นั้นง่ายพอๆ กับการอ่านน้ำหนักทั้งหมดในหน้าต่างและนับจำนวนครั้ง ถ้าใครอยากดูโค้ดบอกเราได้เลย
การใช้ข้อมูลการแจ้งเตือน
โบนัสของระบบการแจ้งเตือนทั้งสองระบบคือมีคุณสมบัติในการสืบค้นการแจ้งเตือนจริง เนื่องจากบันทึกการแจ้งเตือนถูกจัดเก็บไว้ใน Elasticsearch ช่วยให้คุณสร้างการแสดงข้อมูลตามการแจ้งเตือนได้
เติมเงิน
ฉันใช้การแจ้งเตือนการเติมเงินเพื่อวางแผนเมื่อเราเห็นการเติมเงินบนแดชบอร์ด Kibana ของเรา แทนที่จะดูข้อมูลน้ำหนักเพื่อสร้างภาพเวลาเติมครั้งสุดท้าย ฉันสามารถดูการแจ้งเตือนการเติมครั้งสุดท้ายสำหรับการแสดงภาพของฉันได้ ตัวอย่างเช่น Sentinl จัดเก็บการแจ้งเตือนทั้งหมดในดัชนีท้องถิ่นที่เรียกว่า “watcher_alerts-*” ตามวันที่
หากต้องการสร้างภาพเมื่อเติมครั้งสุดท้าย ให้กรองเหตุการณ์ตามฟิลด์ "ผู้เฝ้าดู" เพื่อให้คุณได้เฉพาะเหตุการณ์เติมเงิน แล้วเลือกวันที่สูงสุด
รายงานประจำวัน
อีกทางเลือกหนึ่งที่ดีคือ คุณสามารถใช้การแจ้งเตือนปกติเพื่อสร้างพฤติกรรมที่คล้ายกับภาพรวมที่คุณสามารถรายงานได้ในภายหลัง
ตัวอย่างเช่น หากฉันต้องการดูปริมาณการบริโภคในแต่ละวัน ฉันจะดูที่น้ำหนักที่ลดลงในแต่ละวัน กรองส่วนที่เพิ่มสูงขึ้น (เนื่องจากการเติมหรือเหตุการณ์อื่นๆ) แล้วแปลงน้ำหนักเป็นออนซ์
นี่อาจเป็นเรื่องยากเล็กน้อยด้วยการสร้างภาพข้อมูล Kibana เพียงครั้งเดียว (อย่างไรก็ตาม เวก้าดูมีความหวัง)
ดังนั้นฉันจึงสร้างการแจ้งเตือนรายวันที่ทำงานทุกคืนก่อนเที่ยงคืนและสร้างการบริโภครวมสำหรับวันนั้น จากนั้นฉันก็สร้างภาพอย่างง่ายที่อ่านผลรวมรายวันเหล่านั้นจากดัชนี “watcher_alerts”
ผลลัพธ์สุดท้าย
เมื่อฉันติดตั้งเสร็จแล้ว ตอนนี้ Slack จะบอกเราว่าเมื่อใดควรสั่งถังชงเย็นเพิ่ม และไม่ได้ส่งไปยังฝ่ายไอทีหรือผู้ดูแลระบบเท่านั้น หรือบางคนที่คัดเลือกมาเพียงไม่กี่ราย ตอนนี้ทั้งสำนักงานรู้เมื่อถังใหม่มาถึง
ไม่ต้องเหนื่อยกับการชงแบบเย็นอีกต่อไป:ความสุขและประสิทธิภาพการทำงานของพนักงานอยู่ในระดับสูงตลอดเวลา
Elasticsearch + Sentinl/ElastAlert แจ้งเตือน FTW!