非同步追蹤

本指南說明如何在程式碼中加入非同步追蹤。

必要條件

開始之前,請確認已完成下列步驟:

新增非同步追蹤

系統提供一組非同步追蹤函式, 這項作業涵蓋多個執行緒。

舉例來說,在多執行緒伺服器中,要求會由一個執行緒處理 然後重新排入佇列。 一段時間後,其他執行緒會收到作業已執行的通知 系統已完成,並「釘選」處理該要求的處理程序 非同步追蹤的目的是讓這些不相交的關係 追蹤事件

非同步追蹤會將相同的程式碼路徑納入考量 瞭解不同處理流程的差異 在先前的範例中,我們想瞭解 或特定值在特定時間點出現的結果。 若是非同步追蹤,我們希望追蹤相同的資料 邏輯處理流程,而非以程式位置為基礎的流程。

在佇列處理範例中,接收要求的程式碼會標記每個 傳回「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() 結束流程。

例如,在用戶端和伺服器之間,流程可用於追蹤 用戶端、伺服器和用戶端,都無法要求端對端。