本指南說明如何在程式碼中加入非同步追蹤。
必要條件
開始之前,請確認已完成下列步驟:
新增非同步追蹤
系統提供一組非同步追蹤函式, 這項作業涵蓋多個執行緒。
舉例來說,在多執行緒伺服器中,要求會由一個執行緒處理 然後重新排入佇列。 一段時間後,其他執行緒會收到作業已執行的通知 系統已完成,並「釘選」處理該要求的處理程序 非同步追蹤的目的是讓這些不相交的關係 追蹤事件
非同步追蹤會將相同的程式碼路徑納入考量 瞭解不同處理流程的差異 在先前的範例中,我們想瞭解 或特定值在特定時間點出現的結果。 若是非同步追蹤,我們希望追蹤相同的資料 邏輯處理流程,而非以程式位置為基礎的流程。
在佇列處理範例中,接收要求的程式碼會標記每個
傳回「nonce」— 接在要求後面的唯一值。
這個 Nonce 可使用 TRACE_NONCE()
產生,它只會遞增
全域計數器
一起來看看運作方式。 首先,您要宣告一個位置存放 Nonce。 這通常在要求本身的結構定義結構中:
typedef struct {
...
// add the nonce to your context structure
trace_async_id_t async_id;
} my_request_context_t;
要求送達時,您會擷取 Nonce 並開始非同步追蹤 流程:
// a new request; start asynchronous tracing
ctx->async_id = TRACE_NONCE();
TRACE_ASYNC_BEGIN("category", "name", ctx->async_id, "key", TA_STRING("value"));
您可以使用 TRACE_ASYNC_INSTANT()
巨集定期記錄追蹤事件
(類似上述 TRACE_INSTANT()
巨集的做法):
TRACE_ASYNC_INSTANT("category", "name", ctx->async_id, "state", TA_STRING("phase2"));
並透過 TRACE_ASYNC_END()
清除所用資源:
TRACE_ASYNC_END("category", "name", ctx->async_id);
請勿混淆「非同步」的用法與容器中執行的非同步迴圈 程序;這兩個概念就毫無關聯
流量追蹤
非同步追蹤是用來在同一程序內進行追蹤, 可能是透過不同執行緒完成
第一種追蹤機制稱為「流程」也就是 適用於程序或抽象層
呼叫 TRACE_FLOW_BEGIN()
即可標記「流程」的起點。
和 TRACE_ASYNC_BEGIN()
一樣,您需要傳入 Nonce 來辨識這一點
各個流程流程 ID 是無正負號的 64 位元整數。
接著,您可以 (選擇性) 呼叫 TRACE_FLOW_STEP()
來表示
也能在此流程中追蹤作業
完成後,會以 TRACE_FLOW_END()
結束流程。
例如,在用戶端和伺服器之間,流程可用於追蹤 用戶端、伺服器和用戶端,都無法要求端對端。