ทำงานง่ายด้วยการแจ้งเตือนที่ซับซ้อน หรือประวัติของบาเลอร์แตร์

ทำงานง่ายด้วยการแจ้งเตือนที่ซับซ้อน หรือประวัติของบาเลอร์แตร์

ทุกคนรักการแจ้งเตือน

แน่นอนว่าการได้รับแจ้งเมื่อมีบางอย่างเกิดขึ้น (หรือได้รับการแก้ไขแล้ว) ย่อมดีกว่าการนั่งดูกราฟและมองหาความผิดปกติ

และมีการสร้างเครื่องมือมากมายสำหรับสิ่งนี้ Alertmanager จากระบบนิเวศของ Prometheus และ vmalert จากกลุ่มผลิตภัณฑ์ VictoriaMetrics การแจ้งเตือนและการแจ้งเตือนของ Zabbix ใน Grafana สคริปต์ที่เขียนเองในบอท bash และ Telegram ซึ่งจะดึง URL บางส่วนขึ้นมาเป็นระยะๆ และแจ้งให้คุณทราบหากมีสิ่งผิดปกติเกิดขึ้น ทุกอย่างมากมาย

เรายังใช้โซลูชันที่แตกต่างกันในบริษัทของเราจนกระทั่งพบความซับซ้อน หรือเป็นไปไม่ได้เลยที่จะสร้างการแจ้งเตือนแบบผสมที่ซับซ้อน สิ่งที่เราต้องการและสิ่งที่เราทำอยู่ต่ำกว่าการตัด TLDR: นี่คือลักษณะของโครงการโอเพ่นซอร์ส บาเลอร์เตอร์

เป็นเวลานานแล้วที่เราใช้ชีวิตได้ดีกับการแจ้งเตือนที่กำหนดค่าใน Grafana ใช่ นี่ไม่ใช่วิธีที่ดีที่สุด ขอแนะนำให้ใช้โซลูชันพิเศษบางอย่างเสมอ เช่น Alertmanager และเรายังมองไปที่การเคลื่อนไหวมากกว่าหนึ่งครั้งด้วย แล้วเราก็ต้องการมากขึ้นทีละน้อย

พูดว่าเมื่อกราฟใดกราฟหนึ่งลดลง/เพิ่มขึ้น XX% และอยู่ที่นั่นเป็นเวลา N นาที เมื่อเทียบกับช่วงก่อนหน้าของ M ชั่วโมง ดูเหมือนว่าคุณสามารถลองใช้ Grafana หรือ Alertmanager ได้ แต่มันไม่ง่ายเลย (หรืออาจจะเป็นไปไม่ได้ผมไม่บอกตอนนี้)

สิ่งต่างๆ จะซับซ้อนยิ่งขึ้นเมื่อการตัดสินใจแจ้งเตือนต้องทำตามข้อมูลจากแหล่งต่างๆ ตัวอย่างสด:

เราตรวจสอบข้อมูลจากฐานข้อมูล Clickhouse สองแห่ง จากนั้นเปรียบเทียบกับข้อมูลบางส่วนจาก Postgres และตัดสินใจเกี่ยวกับการแจ้งเตือน ให้สัญญาณหรือยกเลิก

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

  • เข้าถึงแหล่งข้อมูลที่แตกต่างกัน ตัวอย่างเช่น Prometheus, Clickhouse, Postgres

  • ส่งการแจ้งเตือนไปยังช่องทางต่างๆ - โทรเลข, หย่อน, ฯลฯ

  • ในกระบวนการคิดก็ชัดเจนว่าฉันไม่ต้องการคำอธิบายที่เปิดเผย แต่ความสามารถในการเขียนสคริปต์

  • การรันสคริปต์ตามกำหนดเวลา

  • อัปเดตสคริปต์ได้ง่ายโดยไม่ต้องเริ่มบริการใหม่

  • ความสามารถในการขยายฟังก์ชันการทำงานโดยไม่ต้องสร้างบริการใหม่จากซอร์สโค้ด

รายการนี้เป็นเพียงการประมาณและมีแนวโน้มว่าจะไม่ถูกต้องมากนัก บางจุดเปลี่ยนไป บางจุดเสียชีวิต ทุกอย่างเป็นไปตามปกติ

ที่จริงแล้วนี่คือจุดเริ่มต้นของประวัติศาสตร์ของ Balerter

ทำงานง่ายด้วยการแจ้งเตือนที่ซับซ้อน หรือประวัติของบาเลอร์แตร์

ฉันจะพยายามอธิบายสั้นๆ ว่าเกิดอะไรขึ้นในท้ายที่สุดและวิธีการทำงาน (ใช่ครับ นี่ไม่ใช่จุดจบ มีแผนพัฒนาผลิตภัณฑ์มากมาย ผมขอหยุดแค่วันนี้)

มันทำงานอย่างไร

คุณเขียนสคริปต์ใน Lua โดยที่คุณส่งคำขออย่างชัดเจน (ไปยัง Prometheus, Clickhouse ฯลฯ) คุณได้รับคำตอบและประมวลผลและเปรียบเทียบ จากนั้นเปิด/ปิดการแจ้งเตือนบางประเภท Balerter จะส่งการแจ้งเตือนไปยังช่องทางที่คุณได้กำหนดค่าไว้ (อีเมล โทรเลข slack ฯลฯ) สคริปต์ถูกดำเนินการตามช่วงเวลาที่กำหนด และ... โดยทั่วไปนั่นคือทั้งหมด)

วิธีที่ดีที่สุดคือแสดงพร้อมตัวอย่าง:

-- @interval 10s
-- @name script1

local minRequestsRPS = 100

local log = require("log")
local ch1 = require("datasource.clickhouse.ch1")

local res, err = ch1.query("SELECT sum(requests) AS rps FROM some_table WHERE date = now()")
if err ~= nil then
    log.error("clickhouse 'ch1' query error: " .. err)
    return
end

local resultRPS = res[1].rps

if resultRPS < minResultRPS then
    alert.error("rps-min-limit", "Requests RPS are very small: " .. tostring(resultRPS))
else
    alert.success("rps-min-limit", "Requests RPS ok")
end 

เกิดอะไรขึ้นที่นี่:

  • เราระบุว่าควรดำเนินการสคริปต์นี้ทุกๆ 10 วินาที

  • ระบุชื่อของสคริปต์ (สำหรับ API สำหรับแสดงในบันทึก สำหรับใช้ในการทดสอบ)

  • เชื่อมต่อโมดูลเพื่อส่งออกบันทึก

  • เชื่อมต่อโมดูลเพื่อเข้าถึงคลิกเฮาส์ด้วยชื่อ ch1 (การเชื่อมต่อนั้นได้รับการกำหนดค่าในการกำหนดค่า)

  • ส่งคำขอไปที่ clickhouse

  • ในกรณีที่มีข้อผิดพลาด เราจะแสดงข้อความในบันทึกและออก

  • เปรียบเทียบผลลัพธ์การสืบค้นกับค่าคงที่ (ในตัวอย่างสด เราสามารถรับค่านี้ได้ เช่น จากฐานข้อมูล Postgres)

  • เปิดหรือปิดการแจ้งเตือนด้วย ID rps-min-limit

  • คุณจะได้รับการแจ้งเตือนหากสถานะการแจ้งเตือนมีการเปลี่ยนแปลง

ตัวอย่างค่อนข้างง่ายและเข้าใจได้ อย่างไรก็ตาม แน่นอนว่าสคริปต์ในชีวิตจริงอาจจะค่อนข้างยาวและซับซ้อนก็ได้ มันง่ายที่จะสับสนและทำผิดพลาด

ดังนั้นความปรารถนาเชิงตรรกะจึงสุกงอม - เพื่อให้สามารถเขียนการทดสอบสำหรับสคริปต์ของคุณได้ และในเวอร์ชัน v0.4.0 สิ่งนี้ก็ปรากฏขึ้น

สคริปต์ทดสอบ

ตัวอย่างการทดสอบสคริปต์ของเราจากตัวอย่างด้านบน:

-- @test script1
-- @name script1-test

test = require('test')

local resp = {
    {
        rps = 10
    }
} 

test.datasource('clickhouse.ch1').on('query', 'SELECT sum(requests) AS rps FROM some_table WHERE date = now()').response(resp)

test.alert().assertCalled('error', 'rps-min-limit', 'Requests RPS are very small: 10')
test.alert().assertNotCalled('success', 'rps-min-limit', 'Requests RPS ok')

เป็นขั้นเป็นตอน:

  • ระบุชื่อของสคริปต์ที่จะเขียนแบบทดสอบ

  • ชื่อการทดสอบ (สำหรับบันทึก)

  • เชื่อมต่อโมดูลทดสอบ

  • เราบอกว่าผลลัพธ์ใดที่ควรส่งคืนสำหรับคำขอเฉพาะไปยังคลิกเฮาส์ ch1

  • เราตรวจสอบว่ามีการเรียกการแจ้งเตือน (ข้อผิดพลาด) rps-min-limit พร้อมข้อความที่ระบุ

  • ตรวจสอบว่าไม่ได้ปิดใช้งานการแจ้งเตือน rps-min-limit (สำเร็จ)

Balerter สามารถทำอะไรได้อีก?

ฉันจะพยายามสัมผัสสิ่งที่สำคัญที่สุดในความคิดของฉัน ทักษะ Balerter คุณสามารถดูรายละเอียดทุกอย่างได้จากเว็บไซต์อย่างเป็นทางการ https://balerter.com

  • รับข้อมูลจาก

    • คลิกเฮาส์

    • postgres

    • MySQL

    • Prometheus

    • โลกิ

  • ส่งการแจ้งเตือนไปยังช่องทาง

    • หย่อน

    • โทรเลข

    • syslog

    • notify (การแจ้งเตือน UI บนคอมพิวเตอร์ของคุณ)

    • อีเมล

    • บาดหมางกัน

  • สร้างกราฟตามข้อมูลของคุณ อัปโหลดภาพไปยังที่จัดเก็บข้อมูลที่รองรับ S3 และแนบไปกับการแจ้งเตือน (ตัวอย่างพร้อมรูปภาพ)

  • ช่วยให้คุณสามารถแลกเปลี่ยนข้อมูลระหว่างสคริปต์ - การจัดเก็บคีย์/ค่าส่วนกลาง

  • เขียนไลบรารีของคุณเองใน Lua และใช้ในสคริปต์ (โดยค่าเริ่มต้น ไลบรารี lua มีไว้สำหรับทำงานกับ json, csv)

  • ส่งคำขอ HTTP จากสคริปต์ของคุณ (และรับการตอบกลับแน่นอน)

  • จัดเตรียม API (ยังไม่สามารถใช้งานได้เท่าที่เราต้องการ)

  • ส่งออกตัวชี้วัดในรูปแบบ Prometheus

คุณอยากจะทำอะไรอีกบ้าง?

เป็นที่ชัดเจนแล้วว่าผู้ใช้และเราต้องการความสามารถในการควบคุมการเปิดตัวสคริปต์โดยใช้ไวยากรณ์ cron. สิ่งนี้จะดำเนินการก่อนเวอร์ชัน v1.0.0

ฉันต้องการสนับสนุนแหล่งข้อมูลเพิ่มเติมและช่องทางการส่งการแจ้งเตือน เช่น มีคนคิดถึง MongoDB อย่างแน่นอน การค้นหาแบบยืดหยุ่นสำหรับบางคน ส่ง SMS และ/หรือโทรออกไปยังโทรศัพท์มือถือของคุณ เราต้องการที่จะสามารถรับสคริปต์ไม่เพียงแต่จากไฟล์เท่านั้น แต่ยังรวมถึงจากฐานข้อมูลด้วย ท้ายที่สุดแล้ว เราต้องการเว็บไซต์ที่เป็นมิตรต่อผู้ใช้มากขึ้นและเอกสารประกอบที่ดีขึ้นสำหรับโครงการ

มีคนขาดบางสิ่งบางอย่างอยู่เสมอ) ที่นี่เราอาศัยคำขอของชุมชนเพื่อกำหนดลำดับความสำคัญอย่างถูกต้อง และเพื่อช่วยเหลือชุมชนให้ตระหนักถึงทุกสิ่ง

ในข้อสรุป

เราใช้ บาเลอร์เตอร์ ฉันมีมันมาระยะหนึ่งแล้ว สคริปต์หลายสิบสคริปต์ช่วยปกป้องจิตใจของเรา ฉันหวังว่างานนี้คงจะเป็นประโยชน์กับคนอื่น

และยินดีต้อนรับด้วยปัญหาและการประชาสัมพันธ์ของคุณ

ที่มา: will.com

เพิ่มความคิดเห็น