Healthchecks in ASP.NET Core with docker compose and K8s
สำหรับเนื้อหานี้ผมตั้งใจจะทำเป็น 3 ถึง 4 ตอน
Part 1: Health checks in ASP.NET Core(this post)
Part 2: Adding health checks with Liveness, Readiness, and Startup probes
Part 3: Running application on Docker compose
Part 4: Running application on k8s local using minikube
โดยปกติการพัฒนา Application แบบ Mini Service, Micro Service หรือ Modular Application นั้นมักจะมีขบวนการเพื่อตรวจสอบระบบงานของเราว่ายังพร้อมที่จะให้บริการมั้ย หรือมีสุขภาพที่ดีอยู่หรือป่าว (heartbeats or health checks) จากที่ผมทำระบบมาเราสามารถทำ Healthchecks ได้หลากหลายมาก บางครั้งเราก็ทำแบบ Endpoint ธรรมดาที่ return response code 200 กับ Content “Healthy” หรือจะเป็นการ CPU usage, RAM usage จนไปถึง Check สุขภาพของ Upstream service ก็ได้
แต่สำหรับ Asp.net core นั้นเราสามารถทำได้หลากหลายเช่นกัน โดยตัวอย่างที่ผมนำเสนอในบทความนี้จะเป็นตัวอย่างที่จะนำไปใช้ทดสอบบน K8sด้วยในบทความตอนสุดท้าย โดยผมจะตั้ง Project นี้ว่า “AspnetCoreHealthCheckK8sProbes” มาเริ่มกันเลยดีว่า ขันแรกเริ่มจากการสร้าง Solution และ Project files
จากนั้นทำการ add package
Step: ConfigureServices
จากนั้นทำการก็ใส่ Code ที่ ConfigureServices ตามด้านล่าง
อธิบาย code ดังนี้นะครับ
- Add WarmupService
- services.AddSingleton<WarmupState>();
- services.AddHostedService<WarmupService>();
ผมเอาไว้ทำ process จำลองว่าตอน application start จะมีการ warmup อะไรสักอย่างที่จะใช้เวลา 30 วินาทีแล้วจะทำเสร็จ โดยใช้ Hosted service ทำ back ground process ไว้ดังนี้
Note: เท่าที่ผมลองถ้าเราใช้ Task.Delay(30000) มันจะ block ไม่ให้ ้ Host start เลยเลี่ยงมาใช้ Timer แทน
2. AddHealthChecks
ผมทำ healthcheckไว้ 3 ตัวคือ memory , warmup (Startup Probe),Liveness
สำหรับเรื่อง healthcheck โดยละเอียดสามารถตามไปอ่านได้ที่ Microsoft and AspNetCore.Diagnostics.HealthChecks ให้สังเกตว่าเรามีการใส่ Tags เพื่อทำการแยกกลุ่มของ healthcheck
3. Add Healthcheck UI (Bonus สำหรับบทความนี้นะครับ)
จากนั้นให้เรา เพิ่ม configuration ไปที่ appsettings.json
Configuration นี้เพื่อบอก Angular UI ให้ทำยิงไปที่ http://localhost:5000/healthz เพื่อนำผลลัพท์มาแสดง ซึ่งจะต้องทำการ Use service ที่ Configure Method ที่จะพูดถึงต่อไป โดยให้ยิงทุก 10 secs
Step: Configure
ทำการใส่ Code ที่
จากนั้นลอง run application ไปที่ https://localhost:5000//healthchecks-ui ผลลัพท์สำหรับการทำทั้งหมดจะได้ UI ประมาณนี้
จะสังเกตว่า Startp Probe จะยังไม่ Healthy จนว่าจะผ่านไป 30 secs ก่อนครับ