Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> ฐานข้อมูล

กาแฟสกัดเย็นจะไม่มีวันหมดอีกต่อไปด้วยการแจ้งเตือนของ Elasticsearch

กาแฟสกัดเย็นจะไม่มีวันหมดอีกต่อไปด้วยการแจ้งเตือนของ Elasticsearch

การใช้การแจ้งเตือนของ Elasticsearch เพื่อแจ้งให้เราทราบเมื่อเรา “เกือบว่างเปล่า”

ที่ ObjectRocket เราเติมพลังให้สำนักงานของเราด้วยกาแฟสกัดเย็นแบบแตะ ที่ออสติน รัฐเท็กซัสอากาศร้อนในเดือนสิงหาคม เราต้องการคาเฟอีนเย็น

เนื่องจากเราเก็บถังไว้ทีละถังเท่านั้น การจัดตารางคำสั่งซื้อของเราโดยไม่หมดจึงอาจเป็นเรื่องยาก ดังนั้นเมื่อมีคนในสำนักงาน ObjectRocket กล่าวว่าพวกเขา "หวังว่าเราจะมีข้อมูลที่ดีขึ้นเกี่ยวกับการใช้เบียร์เย็น ๆ ของเรา" ฉันจึงทำทุกอย่าง ฉันมองหาวิธีใหม่ๆ ในการแสดงสิ่งที่ Elastic Stack ทำได้อยู่เสมอ ดังนั้นฉันจึงตั้งเป้าหมายที่จะสร้างระบบตรวจสอบและแจ้งเตือนกึ่งอัตโนมัติ เพื่อที่เราจะได้ไม่ต้องชง Cold brew อีกต่อไป

สิ่งที่เราลงเอยด้วยคือการรวมกันของ Raspberry Pi, Elasticsearch, Kibana และ Sentinl/ElastAlert เพื่อแจ้งเตือนไปยัง Slack เมื่อมีสิ่งที่สำคัญเกิดขึ้นกับถัง Sentinl และ ElastAlert เป็นดาวเด่นของรายการ ดังนั้นเราจะมาเจาะลึกกันในภายหลัง

กาแฟสกัดเย็นจะไม่มีวันหมดอีกต่อไปด้วยการแจ้งเตือนของ Elasticsearch กาแฟสกัดเย็นจะไม่มีวันหมดอีกต่อไปด้วยการแจ้งเตือนของ Elasticsearch

ในชุดสองส่วนแรกนี้ เราจะสำรวจวิธีที่ฉันสร้างระบบแจ้งเตือนด้วยข้อมูลที่รวบรวมจากโซลูชัน 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
ข้อดี
  • เร่งความเร็วด้วยกฎที่กำหนดไว้ล่วงหน้า
  • ตัวเลือกการแจ้งเตือนจำนวนมากขึ้น
  • รวมเครื่องมือทดสอบที่เป็นประโยชน์
  • Super-Flexible – หากค้นหาได้ใน Elasticsearch คุณสามารถแจ้งเตือนได้
  • UI ที่ผสานรวมกับ Kibana
  • รวมการรายงานด้วย
ข้อเสีย
  • มีความยืดหยุ่นน้อยกว่าเมื่อนำออกจากกล่อง เนื่องจากใช้กฎที่กำหนดไว้ล่วงหน้า
  • ทำงานแยกกัน (ไม่ใช่ปลั๊กอิน)
  • ไม่มี 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

ข้อมูลป้อนเข้าคือข้อความค้นหาของ Elasticsearch เพื่อดึงข้อมูลที่คุณต้องการ:เอกสารใดๆ ที่รวมน้ำหนักและการสร้างการรวมเฉลี่ยในฟิลด์น้ำหนัก

กาแฟสกัดเย็นจะไม่มีวันหมดอีกต่อไปด้วยการแจ้งเตือนของ Elasticsearch

ในหน้าจอเงื่อนไข ให้กำหนดสิ่งที่ทำให้เกิดการแจ้งเตือน:อย่างน้อยบาง Hit ต้องถูกส่งกลับและน้ำหนักเฉลี่ยต้องต่ำกว่า 41

กาแฟสกัดเย็นจะไม่มีวันหมดอีกต่อไปด้วยการแจ้งเตือนของ Elasticsearch

นี่คือการแจ้งเตือนคอนโซล (ซึ่งจัดเก็บเอกสารไว้ในดัชนีพิเศษด้วย) ซึ่งจะส่งข้อความเมื่อเงื่อนไขเป็นจริง

กาแฟสกัดเย็นจะไม่มีวันหมดอีกต่อไปด้วยการแจ้งเตือนของ Elasticsearch

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-*” ตามวันที่

กาแฟสกัดเย็นจะไม่มีวันหมดอีกต่อไปด้วยการแจ้งเตือนของ Elasticsearch

หากต้องการสร้างภาพเมื่อเติมครั้งสุดท้าย ให้กรองเหตุการณ์ตามฟิลด์ "ผู้เฝ้าดู" เพื่อให้คุณได้เฉพาะเหตุการณ์เติมเงิน แล้วเลือกวันที่สูงสุด

กาแฟสกัดเย็นจะไม่มีวันหมดอีกต่อไปด้วยการแจ้งเตือนของ Elasticsearch

รายงานประจำวัน

อีกทางเลือกหนึ่งที่ดีคือ คุณสามารถใช้การแจ้งเตือนปกติเพื่อสร้างพฤติกรรมที่คล้ายกับภาพรวมที่คุณสามารถรายงานได้ในภายหลัง

ตัวอย่างเช่น หากฉันต้องการดูปริมาณการบริโภคในแต่ละวัน ฉันจะดูที่น้ำหนักที่ลดลงในแต่ละวัน กรองส่วนที่เพิ่มสูงขึ้น (เนื่องจากการเติมหรือเหตุการณ์อื่นๆ) แล้วแปลงน้ำหนักเป็นออนซ์

นี่อาจเป็นเรื่องยากเล็กน้อยด้วยการสร้างภาพข้อมูล Kibana เพียงครั้งเดียว (อย่างไรก็ตาม เวก้าดูมีความหวัง)

ดังนั้นฉันจึงสร้างการแจ้งเตือนรายวันที่ทำงานทุกคืนก่อนเที่ยงคืนและสร้างการบริโภครวมสำหรับวันนั้น จากนั้นฉันก็สร้างภาพอย่างง่ายที่อ่านผลรวมรายวันเหล่านั้นจากดัชนี “watcher_alerts”

กาแฟสกัดเย็นจะไม่มีวันหมดอีกต่อไปด้วยการแจ้งเตือนของ Elasticsearch

กาแฟสกัดเย็นจะไม่มีวันหมดอีกต่อไปด้วยการแจ้งเตือนของ Elasticsearch

ผลลัพธ์สุดท้าย

เมื่อฉันติดตั้งเสร็จแล้ว ตอนนี้ Slack จะบอกเราว่าเมื่อใดควรสั่งถังชงเย็นเพิ่ม และไม่ได้ส่งไปยังฝ่ายไอทีหรือผู้ดูแลระบบเท่านั้น หรือบางคนที่คัดเลือกมาเพียงไม่กี่ราย ตอนนี้ทั้งสำนักงานรู้เมื่อถังใหม่มาถึง

กาแฟสกัดเย็นจะไม่มีวันหมดอีกต่อไปด้วยการแจ้งเตือนของ Elasticsearch

ไม่ต้องเหนื่อยกับการชงแบบเย็นอีกต่อไป:ความสุขและประสิทธิภาพการทำงานของพนักงานอยู่ในระดับสูงตลอดเวลา

Elasticsearch + Sentinl/ElastAlert แจ้งเตือน FTW!