Actuator, Micrometer và observability
Observability không phải bật một endpoint. Cần thiết kế health, metrics, traces và logs để trả lời câu hỏi vận hành mà không tạo security risk hoặc cardinality explosion.
Actuator endpoints và exposure
Mỗi endpoint có id, access và exposure tách biệt. Web exposure mặc định hạn chế; env, configprops, heapdump và loggers có thể lộ dữ liệu hoặc trao quyền nhạy cảm. Cần authentication, authorization, network boundary và audit; có thể chạy management server trên port riêng.
Liveness và readiness
| Probe | Nên phản ánh | Không nên |
|---|---|---|
| Liveness | Process bị kẹt hoặc state nội tại không thể tự hồi phục. | Database hoặc dependency ngoài tạm thời lỗi, vì restart cascade không sửa được dependency. |
| Readiness | Instance có sẵn sàng nhận traffic và dependency critical có usable không. | Mọi dependency phụ hoặc metric không ảnh hưởng khả năng phục vụ. |
HealthContributor tạo status và details; health groups tách probe theo use case. Detail nhạy cảm chỉ hiển thị cho principal có quyền.
Metrics với Micrometer
MeterRegistry và Observation API tạo metrics/traces. Counter chỉ tăng; gauge là snapshot; timer ghi count, total, max và histogram tùy configuration. Tag cardinality phải bounded: không dùng user ID, order ID, exception message hoặc raw URL làm tag.
Tracing và context propagation
Observation handlers bridge metrics và tracing; context propagation qua thread pool hoặc reactive chain cần instrumentation. Sampling giảm cost nhưng có thể bỏ lỡ lỗi hiếm; logs nên chứa trace/span IDs để tiếp tục điều tra. Không tạo span cho mọi method: chọn service boundary, external call và expensive operation.
Structured logging
Dùng fields ổn định như service, environment, trace ID, operation, outcome và duration; áp level, redaction và retention policy. Dynamic log level qua Actuator hữu ích trong incident nhưng endpoint phải được bảo vệ, audit và reset. Không log request/response body mặc định vì PII, credentials và chi phí.
Graceful shutdown
Readiness chuyển sang từ chối traffic, server chờ inflight requests trong graceful period, rồi lifecycle beans stop theo phase. Consumer, scheduler và executor phải drain hoặc cancel riêng. Shutdown hook không được đảm bảo khi process bị kill cứng, node mất điện hoặc container vượt termination grace period.
Custom observability và SLO
Đo use-case latency/outcome, connection pool usage, executor queue, broker lag, cache hit và external client behavior. Metric phải trả lời câu hỏi vận hành, không chỉ đếm method calls. SLO dựa trên histogram/percentile được aggregate đúng ở backend và phải phân biệt user-visible success với technical HTTP success.