ทุกคนรักการแจ้งเตือน
แน่นอนว่าการได้รับแจ้งเมื่อมีบางอย่างเกิดขึ้น (หรือได้รับการแก้ไขแล้ว) ย่อมดีกว่าการนั่งดูกราฟและมองหาความผิดปกติ
และมีการสร้างเครื่องมือมากมายสำหรับสิ่งนี้ 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 คุณสามารถดูรายละเอียดทุกอย่างได้จากเว็บไซต์อย่างเป็นทางการ
-
รับข้อมูลจาก
-
คลิกเฮาส์
-
postgres
-
MySQL
-
Prometheus
-
โลกิ
-
-
ส่งการแจ้งเตือนไปยังช่องทาง
-
หย่อน
-
โทรเลข
-
syslog
-
notify (การแจ้งเตือน UI บนคอมพิวเตอร์ของคุณ)
-
อีเมล
-
บาดหมางกัน
-
-
สร้างกราฟตามข้อมูลของคุณ อัปโหลดภาพไปยังที่จัดเก็บข้อมูลที่รองรับ S3 และแนบไปกับการแจ้งเตือน (
ตัวอย่างพร้อมรูปภาพ ) -
ช่วยให้คุณสามารถแลกเปลี่ยนข้อมูลระหว่างสคริปต์ - การจัดเก็บคีย์/ค่าส่วนกลาง
-
เขียนไลบรารีของคุณเองใน Lua และใช้ในสคริปต์ (โดยค่าเริ่มต้น ไลบรารี lua มีไว้สำหรับทำงานกับ json, csv)
-
ส่งคำขอ HTTP จากสคริปต์ของคุณ (และรับการตอบกลับแน่นอน)
-
จัดเตรียม API (ยังไม่สามารถใช้งานได้เท่าที่เราต้องการ)
-
ส่งออกตัวชี้วัดในรูปแบบ Prometheus
คุณอยากจะทำอะไรอีกบ้าง?
เป็นที่ชัดเจนแล้วว่าผู้ใช้และเราต้องการความสามารถในการควบคุมการเปิดตัวสคริปต์โดยใช้ไวยากรณ์ cron. สิ่งนี้จะดำเนินการก่อนเวอร์ชัน v1.0.0
ฉันต้องการสนับสนุนแหล่งข้อมูลเพิ่มเติมและช่องทางการส่งการแจ้งเตือน เช่น มีคนคิดถึง MongoDB อย่างแน่นอน การค้นหาแบบยืดหยุ่นสำหรับบางคน ส่ง SMS และ/หรือโทรออกไปยังโทรศัพท์มือถือของคุณ เราต้องการที่จะสามารถรับสคริปต์ไม่เพียงแต่จากไฟล์เท่านั้น แต่ยังรวมถึงจากฐานข้อมูลด้วย ท้ายที่สุดแล้ว เราต้องการเว็บไซต์ที่เป็นมิตรต่อผู้ใช้มากขึ้นและเอกสารประกอบที่ดีขึ้นสำหรับโครงการ
มีคนขาดบางสิ่งบางอย่างอยู่เสมอ) ที่นี่เราอาศัยคำขอของชุมชนเพื่อกำหนดลำดับความสำคัญอย่างถูกต้อง และเพื่อช่วยเหลือชุมชนให้ตระหนักถึงทุกสิ่ง
ในข้อสรุป
เราใช้
และยินดีต้อนรับด้วยปัญหาและการประชาสัมพันธ์ของคุณ
ที่มา: will.com