Blog
Thoughts on engineering, design, and building great products.

AWS-native Observability for EC2 với CloudWatch Agent
Thực hành xây dựng observability pipeline cho EC2 bằng CloudWatch Agent, CloudWatch Logs, CloudWatch Metrics, Alarm, SNS Email và Dashboard qua hai case thực tế: cài agent trên EC2 đã có sẵn và bootstrap agent ngay khi launch EC2 mới.
CloudWatch: Alarm, Dashboard và SLO Cho API
Có log, trace và metric rồi thì bước tiếp là tự động biết khi nào hệ thống có vấn đề. Định nghĩa SLO cho API, dựng alarm trên CloudWatch để cảnh báo khi lỗi hay throttle vượt ngưỡng, gom metric vào một dashboard, và dùng Logs Insights để tính chỉ số từ log có cấu trúc. Kích một alarm thật sang trạng thái ALARM bằng cách tạo throttle.
Quan Sát Hệ Thống: Lambda Powertools và X-Ray Tracing
Bắt đầu phần vận hành như production bằng việc nhìn được vào bên trong. Gắn Lambda Powertools để có log JSON có cấu trúc và đẩy metric, bật X-Ray để theo dấu một request đi qua những dịch vụ nào. Đọc một trace thật cho thấy resolve gọi DynamoDB và EventBridge thành các subsegment, và một dòng log mang sẵn trace id để nối log với trace.
Hubble Bên Trong: Từ Sự Kiện eBPF Tới Luồng Mạng Toàn Cụm
Hubble cho ta xem mọi kết nối trong cụm Kubernetes theo tên pod, service, verdict policy — mà không cài sidecar vào pod nào. Bài này mổ cơ chế: datapath eBPF của Cilium (74 chương trình sched_cls ở Bài 12) gọi bpf_perf_event_output đẩy sự kiện vào một perf ring buffer tên cilium_events; cilium-agent đọc ra (cilium monitor cho thấy sự kiện thô với identity dạng số); rồi Hubble giàu hóa — biến identity 18203 thành kube-system/coredns — bằng cách tra kho identity-nhãn. Ta xem cả ba tầng chạy thật.
Capstone: Tự Viết connmon — Monitor Kết Nối TCP Toàn Node
Bài cuối: ghép mọi thứ đã học thành một công cụ thật. connmon gắn kprobe vào tcp_connect trong nhân, đẩy mỗi kết nối TCP mới qua ring buffer, và một loader Go in chúng ra theo thời gian thực — pid, tiến trình, đích IP:port. Chỉ hơn trăm dòng, một binary tĩnh, chạy trên cụm thấy ngay coredns, kubelet, curl đang kết nối đi đâu. Kèm một cái bẫy build thật của kprobe. Rồi nhìn lại toàn bộ hành trình eBPF từ số không.
bpftrace: Viết Tracing Trong Một Dòng
Part I tự viết chương trình eBPF bằng C, clang, bpftool — nhiều bước cho một câu hỏi đơn giản như 'tiến trình nào đang mở file nào'. bpftrace là đường tắt: một dòng lệnh trả lời ngay, không C không clang. Nhưng bên dưới vẫn là eBPF — bài này chứng minh điều đó (bpftool thấy chương trình bpftrace nạp vào rồi biến mất), rồi đi qua cú pháp probe/filter/action, kho 122 nghìn probe gắn được, và các biến dựng sẵn, qua các one-liner chạy thật trên cụm.
Node Log Query và Phân Quyền Kubelet Chi Tiết
Bài 65 xem log thành phần hệ thống bằng cách SSH vào từng node chạy journalctl. v1.36 cho query log đó thẳng qua API kubelet, không cần SSH. Và đi kèm là một thay đổi bảo mật: quyền truy cập API kubelet, trước đây gộp một cục trong nodes/proxy, nay tách chi tiết từng endpoint — cho phép cấp đúng nodes/metrics cho agent giám sát mà không trao luôn quyền đọc log hay exec. Bài cuối Part XIV, cả hai chạm tới thành phần ta tự dựng ở Part I.