15.2.3 Xem hoạt động của ứng dụng
Việc theo dõi hoạt động của một ứng dụng đang chạy có thể rất hữu ích, bao gồm các loại yêu cầu HTTP mà ứng dụng đang xử lý và hoạt động của tất cả các luồng trong ứng dụng. Để làm điều này, Actuator cung cấp các endpoint: /httptrace, /threaddump, và /heapdump.
Endpoint /heapdump có lẽ là endpoint Actuator khó mô tả chi tiết nhất. Nói ngắn gọn, nó tải xuống một tệp heap dump HPROF được nén bằng gzip có thể được sử dụng để truy vết các vấn đề về bộ nhớ hoặc luồng. Do tính chất nâng cao của tính năng này và để tiết kiệm không gian, phần trình bày về endpoint /heapdump sẽ chỉ giới hạn trong đoạn văn này.
TRUY VẾT HOẠT ĐỘNG HTTP
Endpoint /httptrace cung cấp thông tin chi tiết về 100 yêu cầu gần nhất được ứng dụng xử lý. Thông tin bao gồm phương thức và đường dẫn yêu cầu, dấu thời gian cho biết khi nào yêu cầu được xử lý, các header từ cả yêu cầu và phản hồi, và thời gian xử lý yêu cầu.
Đoạn mã JSON sau minh họa một mục từ phản hồi của endpoint /httptrace:
{
"traces": [
{
"timestamp": "2020-06-03T23:41:24.494Z",
"principal": null,
"session": null,
"request": {
"method": "GET",
"uri": "http://localhost:8081/ingredients",
"headers": {
"Host": ["localhost:8081"],
"User-Agent": ["curl/7.54.0"],
"Accept": ["*/*"]
},
"remoteAddress": null
},
"response": {
"status": 200,
"headers": {
"Content-Type": ["application/json;charset=UTF-8"]
}
},
"timeTaken": 4
},
...
]
}Mặc dù thông tin này có thể hữu ích trong việc gỡ lỗi, nhưng nó còn thú vị hơn khi dữ liệu trace được theo dõi theo thời gian, cung cấp cái nhìn sâu sắc về mức độ bận rộn của ứng dụng tại một thời điểm nhất định cũng như tỷ lệ thành công và thất bại của các yêu cầu, dựa trên mã trạng thái phản hồi. Trong chương 16, bạn sẽ thấy cách Spring Boot Admin thu thập thông tin này thành một biểu đồ trực tiếp hiển thị dữ liệu trace HTTP theo thời gian.
GIÁM SÁT CÁC LUỒNG
Ngoài việc truy vết yêu cầu HTTP, hoạt động của các luồng cũng có thể hữu ích trong việc xác định điều gì đang xảy ra trong một ứng dụng đang chạy. Endpoint /threaddump tạo ra một ảnh chụp nhanh về hoạt động luồng hiện tại. Đoạn mã từ phản hồi của /threaddump sau đây cho thấy một phần những gì endpoint này cung cấp:
{
"threadName": "reactor-http-nio-8",
"threadId": 338,
"blockedTime": -1,
"blockedCount": 0,
"waitedTime": -1,
"waitedCount": 0,
"lockName": null,
"lockOwnerId": -1,
"lockOwnerName": null,
"inNative": true,
"suspended": false,
"threadState": "RUNNABLE",
"stackTrace": [
{
"methodName": "kevent0",
"fileName": "KQueueArrayWrapper.java",
"lineNumber": -2,
"className": "sun.nio.ch.KQueueArrayWrapper",
"nativeMethod": true
},
{
"methodName": "poll",
"fileName": "KQueueArrayWrapper.java",
"lineNumber": 198,
"className": "sun.nio.ch.KQueueArrayWrapper",
"nativeMethod": false
},
...
],
"lockedMonitors": [
{
"className": "io.netty.channel.nio.SelectedSelectionKeySet",
"identityHashCode": 1039768944,
"lockedStackDepth": 3,
"lockedStackFrame": {
"methodName": "lockAndDoSelect",
"fileName": "SelectorImpl.java",
"lineNumber": 86,
"className": "sun.nio.ch.SelectorImpl",
"nativeMethod": false
}
},
...
],
"lockedSynchronizers": [],
"lockInfo": null
}Báo cáo dump luồng đầy đủ bao gồm mọi luồng trong ứng dụng đang chạy. Để tiết kiệm không gian, phần dump luồng ở đây chỉ hiển thị một mục rút gọn cho một luồng duy nhất. Như bạn có thể thấy, nó bao gồm các chi tiết liên quan đến trạng thái chặn và khóa của luồng, cùng với các thông tin cụ thể khác. Ngoài ra còn có stack trace cung cấp cái nhìn về phần mã mà luồng đang thực thi.
Vì endpoint /threaddump chỉ cung cấp ảnh chụp nhanh tại thời điểm yêu cầu, nên có thể khó để có được cái nhìn toàn cảnh về hành vi của các luồng theo thời gian. Trong chương 16, bạn sẽ thấy cách Spring Boot Admin có thể giám sát endpoint /threaddump trong chế độ xem trực tiếp.
