อัปเดต 29/3/21: https://coronavirusapi.com/ ปิดการเข้าถึงฟรีข้อมูลล่าสุด ทำให้มีให้เฉพาะ first-responders ที่ลงทะเบียน แม้จะน่าเสียดายที่โปรเจกต์สาธิตการแสดงผลกรณีโคโรนาจะไม่ทำงานแล้ว แต่คำแนะนำของเรายังคงมีประโยชน์สำหรับการนำไปปฏิบัติอื่นๆ เมื่อคุณต้องการแสดงข้อมูล RedisTimeSeries บน Grafana Worldmap panel
ในโพสต์ก่อนหน้า เราแนะนำและแสดงวิธีใช้ Redis Data Source ใหม่สำหรับ Grafana:
- Introducing the Redis Data Source Plug-in for Grafana
- How to Use the New Redis Data Source for Grafana Plug-in
ในโพสต์นี้ เราอยากสำรวจตัวอย่างจากชีวิตจริงบางอย่าง ที่ออกแบบมาเพื่อให้คุณได้ไอเดียเกี่ยวกับชุดข้อมูลน่าสนใจมากมายที่คุณสามารถจัดเก็บใน Redis และแสดงผลใน Grafana เราจะครอบคลุม 3 แอปพลิเคชันที่แตกต่างกัน:
- Weather dashboard
- Coronavirus cases visualization
- Pop-up store demo
1. Weather dashboard
ผมคิดจริงๆ ว่าลโลกต้องการ weather dashboard อีกตัวไหม? ใช่ ผมคิดว่าใช่!
แน่นอน 大部分ของเวลา ผมไม่ค่อยเป็น weather geek ผมมักไม่สนใจอากาศเป็นอย่างไร และแม้ตอนที่สนใจ dashboard อากาศที่ดีที่สุดมักเป็นแค่หน้าต่างที่มองออกไปจากบ้านของผม แต่บางครั้ง อาจจะตอนที่ผมมีเวลาว่างไปถ่ายรูปหรือบินโดรน ภายใน weather geek ของผมก็甦醒
คำถามใหญ่คือ ผมควรไปไหน? มีสถานที่น่าสนใจมากภายในขับรถ 2 ชั่วโมงจากบ้านผมใน New Jersey และอากาศอาจแตกต่างกันมากจากที่หนึ่งไปอีกที่หนึ่ง สิ่งที่ผมอยากได้จริงๆ คือ dashboard ที่แสดงอากาศใน 12 สถานที่บนหน้าจอเดียว เพื่อให้ผมเปรียบเทียบสภาพแวดล้อมได้ในทีเดียว สำคัญคือ ผมไม่ได้อยากแค่เปรียบเทียบสถานที่ที่อยู่ใกล้กัน
สำคัญไม่แพ้กัน ผมชอบทำงานกับตัวเลข ผมรู้ว่าการถ่ายภาพภูมิทัศน์ทำงานได้ดีที่สุดเมื่อปริมาณเมฆคลุมอยู่ระหว่าง 20% – 50% สำหรับการบินโดรน ความเร็วลมต่ำกว่า 10 mph เป็นที่เหมาะสม 10 – 20 mph ยาก และอะไรเกิน 20 mph อันตราย ดังนั้นไอคอนอากาศน่ารักแบบนี้จึงไม่ช่วยผมได้มาก:
ด้วยความคิดนี้ นี่คือวิธีที่ผมสร้าง weather dashboard โดยใช้ Redis
โชคดีที่ข้อมูลอากาศดิบ (raw weather data) พร้อมใช้งานอย่างกว้างขวางผ่าน weather APIs หลากหลาย หลายตัวฟรี (มีข้อจำกัดบางอย่าง) ผมเลือกใช้ OpenWeatherMap API เพราะแผนฟรีให้ทุกอย่างที่ผมต้องการ: การพยากรณ์รายชั่วโมง 48 ชั่วโมง การพยากรณ์รายวัน 7 วัน และสภาพปัจจุบัน
ผมเขียน Python script เรียบง่ายเพื่อดึงข้อมูลจาก API และใส่ hourly/daily forecasts ลงในฐานข้อมูล Redis โดยใช้โมดูล RedisTimeSeries และสภาพปัจจุบันลงในชุด time series อื่นสำหรับประวัติ
Weather dashboard ของผมปฏิบัติตามกฎ dashboard บังคับ 2 ข้อของผม:
- ข้อมูลทั้งหมดควรแสดงบนหน้าจอเดียว ไม่ต้อง scroll
- บุคคลควรเข้าใจสถานการณ์ที่แสดงบน dashboard ได้เร็วที่สุด
ส่วนบนของ dashboard แสดงสภาพปัจจุบันสำหรับสถานที่หนึ่ง ซึ่งอาจเป็น primary หรือ favorite หรือเพียงแค่เลือกจากรายการสถานที่ที่มี (มี Grafana template variable selection list ที่มุมซ้ายบนของ dashboard) มันยังแสดงช่วงเวลาที่ดีสำหรับกิจกรรมเฉพาะที่สถานที่นั้น Grafana อนุญาตให้ผม highlight โซนต่ำ/สูงสำหรับอุณหภูมิ โซนอันตรายสำหรับความเร็วลม แสดงระดับเมฆ และ mark ช่วงกลางวันและกลางคืน
ส่วนล่างจัดกลุ่มสถานที่ตามกิจกรรม ทำให้เปรียบเทียบได้ง่าย ยิ่งวงกลมใหญ่ ยิ่งชั่วโมงที่ดีสำหรับกิจกรรมเฉพาะในสถานที่เฉพาะมาก
2. Coronavirus cases visualization
ผมชอบเดินทาง แตปี 2020 ทำให้หลายล้านคนต้องอยู่บ้านหลายเดือน (หวังว่าไม่ใช่ตลอดกาล!) ตอนนี้ หลายรัฐเริ่มเปิดประเทศค่อยเป็นค่อยไป การเดินทางอย่างฉลาดและเข้าใจสถานการณ์ COVID-19 ในทั้งต้นทางและปลายทางจึงสำคัญมาก นั่นหมายถึงการให้ความสนใจไม่แค่ภาพปัจจุบัน แต่แนวโน้มระยะยาวด้วย
นี่คือสิ่งที่ Grafana U.S. States Coronavirus Dashboard ของผมแสดง มันพัฒนาจากข้อมูล Coronavirus API ที่โหลดเข้าโมดูล RedisTimeSeries
นอกจากการแสดงผลแบบกราฟมาตรฐาน ข้อมูลยังถูกวาดบนแผนที่ Redis Data Source plug-in ไม่ได้รับการรองรับอย่างเป็นทางการโดย Grafana Worldmap panel แตคุณสามารถทำให้มันทำงานได้ใน 2 ขั้นตอนง่ายๆ:
ขั้นตอน 1: ใช้ transformation "Labels to fields" กับผลลัพธ์ time-series output:
ขั้นตอน 2: เปลี่ยนพารามิเตอร์แผนที่ "Location Data" เป็น table mode และ map ฟิลด์ที่เกี่ยวข้อง:
สองขั้นตอนนี้จะช่วยให้คุณติดค่า time-series ไปยังจุดที่เกี่ยวข้องบนแผนที่ ซึ่งตั้งค่าโดย label "geohash" ของ RedisTimeSeries Label "state" ใช้แสดงชื่อสถานที่บนแผนที่
3. Pop-up store demo
ผมแฟนใหญ่ของ Redis Streams ชนิดข้อมูลใหม่ที่นำมารับใน Redis 5.0 และผมกำลังมองหาโซลูชันที่รวดเร็วและเรียบง่ายสำหรับการ monitor queues สำหรับการประมวลผลข้อมูล ในขณะที่ทำงานบน Redis Data Source ทีมของเราเริ่มสำรวจ RedisGears—เฟรมเวิร์กไดนามิกที่ให้ผู้พัฒนาเขียนและรันฟังก์ชันที่นำไปสู่การไหลของข้อมูลใน Redis ในขณะที่กำจัดความซับซ้อนของการกระจายและการปรับใช้ข้อมูล—สำหรับโปรเจกต์อื่น และเราตัดสินใจใช้พวกเขาร่วมกันสำหรับ data-pipeline demo สำหรับ pop-up store
RedisGears รองรับหลายประเภทของ readers ที่ทำงานบนประเภทข้อมูล input ที่แตกต่างกัน เพื่อดู stream messages เราใช้ StreamReader ใน event mode ในโหมดนี้ reader ถูก execute ตอบสนองต่อ events ที่ถูกสร้างโดย messages ใหม่ที่เพิ่มเข้าไปใน stream
# Add Time-Series def tsAdd(x): xlen = execute('XLEN', x['key']) execute('TS.ADD', 'ts:len:'+x['key'], '*', xlen) execute('TS.ADD', 'ts:enqueue:' + x['key'], '*', x['value']) # Stream Reader for any Queue gb = GearsBuilder('StreamReader') gb.countby(lambda x: x['key']).map(tsAdd) gb.register(prefix='queue:*', duration=5000, batch=10000, trimStream=False)
StreamReader ยอมรับหลายอาร์กิวเมนต์ที่ควบคุมวิธีที่มันถูก trigger ในกรณีของเรา เราอยากให้ reader ถูก trigger ทุก 5 วินาที หรือหลังจากได้รับ 10,000 messages ตัวเลือกสุดท้าย trimStream ระบุว่าไม่ต้อง trim stream หลัง execution
เราใช้ RedisTimeSeries เพื่อจัดเก็บจำนวนข้อความที่เข้ามา และตัวอย่างขนาดคิว ตามที่อธิบายในบล็อกโพสต์แนะนำ Redis Data Source Plug-in for Grafana time series สามารถแสดงผลใน Grafana ได้ง่าย
เพื่อสาธิตว่า Redis Streams, RedisTimeSeries, RedisGears และ Redis Data Source สามารถทำงานร่วมกันได้อย่างไร เราสร้าง Pop-up store demo พร้อม dynamic dashboard:
Grafana dashboard นี้แสดง:
- Product Available: ค่าของ product key ซึ่งลดลงเมื่อคำสั่งซื้อเสร็จสิ้น
- Customers Ordering, Orders Processing, และ Orders Completed: ความยาวของ queue:customers, queue:orders, และ queue:complete streams
- Customers Overflow: ความแตกต่างระหว่างคำสั่งซื้อที่ลูกค้าส่ง และคำสั่งซื้อที่เสร็จสิ้น
- Customers Ordering: คำสั่งซื้อที่สร้างใน 5 วินาที
- Orders In Queue: คำสั่งซื้อที่รอการประมวลผล
- Completed Flow: คำสั่งซื้อที่เสร็จสิ้นใน 5 วินาที
โปรดดู GitHub repository สำหรับโปรเจกต์นี้ เพื่อดูว่าเราสร้าง load อย่างไร RedisGears scripts ที่เราใช้ และวิธีกำหนดค่า Redis Data Source เพื่อสอบถามข้อมูล RedisTimeSeries โดยใช้คำสั่ง TS.RANGE
สรุป
สถานการณ์จริง 3 อย่างนี้แสดงวิธีการใช้ Redis Data Source for Grafana กับโมดูล Redis ต่างๆ เราหวังว่าพวกเขาจะแรงบันดาลใจคุณให้ใช้เทคโนโลยีนี้และสร้างแอปพลิเคชันของคุณเอง
คุณจะอยู่ในกลุ่มที่ดี ตั้งแต่ Redis Data Source plug-in เผยแพร่ใน Grafana repository มันถูกดาวน์โหลดมากกว่า 10,000 ครั้ง รวมอยู่ใน community plug-ins ยอดนิยมที่สามารถปรับปรุง Grafana dashboard ของคุณได้ เพิ่มการรองรับ Redis cluster, Sentinel, Unix socket และ access control lists (ACLs):
แต่นั่นไม่ใช่ทั้งหมด อย่าลืมติดตาม Redis Tech blog เพื่อเรียนรู้เกี่ยวกับโปรเจกต์น่าตื่นเต้นที่รวมความสามารถ streaming ของ Grafana กับ interactivity เพื่อนำ Grafana ไปไกลกว่า observability ด้วย redis-cli panel