Fast and flexible observability with canonical log lines
Bài tóm tắt Stripe 2019 3. Quy mô lớn Độ khó: Dễ
Stripe · 2019 · 3. Quy mô lớn · Độ khó: Dễ — bài gốc
Bối cảnh
- Log có cấu trúc (
key=value) linh hoạt hơn metric (metric và dashboard phải thiết kế trước, khó hỏi câu bất ngờ). Nhưng thông tin của một request rải trên nhiều dòng: muốn hỏi "user nào bị rate limit nhiều nhất" phải ghép các dòng theo request ID lúc query, quét nhiều dữ liệu, cú pháp khó nhớ khi đang có sự cố.
Thay đổi chính
- Canonical log line: ngoài log thường, mỗi request (hoặc đơn vị việc) phát thêm một dòng dài ở cuối gom mọi thông tin chính: verb, path, status; user và cách xác thực, ID API key; rate limiter cho qua hay không, quota còn lại; tổng thời gian, thời gian trong DB, số query DB, số object VM cấp phát. Một dòng mỗi request mỗi service.
- Dùng gần như ở mọi service: API chính, mỗi webhook gửi đi, mỗi lần token hoá thẻ trong PCI vault, mỗi lần tải trang Dashboard.
- Cài đặt: middleware có bước sau request; các module trong vòng đời request ghi thông tin vào môi trường request, middleware gom lại khi xong. Ghi trong khối
ensuređể vẫn phát khi có exception; việc dựng dòng log tự bọcrescueđể lỗi của nó không làm hỏng request, và báo ngay cho người phụ trách. - Hợp đồng ổn định: tên trường đã thành phản xạ của kỹ sư, nên được chốt bằng Protocol Buffers. API gửi bất đồng bộ bản protobuf vào Kafka; consumer gom lô ghi S3; định kỳ nạp vào Presto và Redshift để phân tích nhiều tháng bằng SQL (ví dụ: tỉ lệ phiên bản Go của client).
- Cùng dữ liệu đó còn nuôi Developer Dashboard cho khách (MapReduce trên S3), nhờ schema ổn định.
Vì sao
- Gom sẵn lúc ghi thì đọc rẻ: hệ log không phải ghép nhiều dòng lúc query, người viết query đơn giản lúc căng thẳng (Observability và monitoring).
- Một dòng mỗi request là bản tóm tắt gọn đủ để lưu lâu dài, khác với log chi tiết đắt khi giữ lâu (Pipeline dữ liệu và analytics).
Bài học cho SWE
- Trước khi dựng tracing, một dòng log tổng hợp cho mỗi request mỗi service đã trả lời được phần lớn câu hỏi khi điều tra (Tracing phân tán và log theo request).
- Đường ghi telemetry không được làm hỏng request, nhưng lỗi của nó phải được báo ngay.
- Khi dữ liệu vận hành bắt đầu được dùng cho analytics và sản phẩm, chốt schema bằng hợp đồng (protobuf) và gửi bất đồng bộ.
Liên quan
#Structured logging#logfmt#Canonical log line#Wide event#Splunk#Middleware#Protocol Buffers#Kafka#S3#Redshift#Presto
Được nhắc tới trong
Chủ đề (3)
Công ty (1)
Bài tóm tắt (5)