診斷

Fuchsia 具備多個觀測能力系統,可協助您診斷元件,例如:

記錄

記錄是 Fuchsia 程式發出的診斷資料串流,按時間排序。最常見的形式是低頻率、以人為導向的文字字串,用於描述子系統中的狀態變更。

目錄

記錄包含多個中繼資料,大多由產生特定記錄的各個元件自行回報。記錄訊息至少包含時間戳記和字串內容。

此外,如果使用支援的程式庫將記錄訊息寫入 LogSink 通訊協定,則會包含嚴重性、PID、TID、先前捨棄的記錄數量,以及字串標記清單。並非所有中繼資料都是必要,但支援的程式庫可確保在將記錄寫入透過 LogSink 取得的通訊端時,每個欄位都有值。

Archivist 會將額外的中繼資料插入元件寫入通訊端的資料。如要進一步瞭解 Archivist 為 Fuchsia 裝置記錄提供的欄位,請參閱記錄。

儲存空間

目前所有記錄儲存區都會以先進先出 (FIFO) 的方式輪替,較新的訊息會覆寫較舊的訊息。任何元件的訊息都可以推出其他元件的訊息。

Fuchsia 中的記錄可儲存在下列類型的記憶體中:

Volatile

Fuchsia 裝置上有兩個記憶體內儲存區,用於儲存記錄:

處理記錄時,請務必瞭解 Fuchsia 如何寫入記錄,以便找出記錄可能儲存的位置,因為這會說明哪些緩衝區是訊息的預定傳輸點。

持續

意見回饋資料元件會維護系統先前啟動時訊息的 persistent_disk_store。

使用 ffx target snapshot 指定 Fuchsia 裝置時,就會看到這些訊息。

使用記錄

如要開始使用記錄功能,建議您:

檢查

Inspect 可讓元件在執行階段公開其狀態的結構化階層資訊。元件會使用 Inspect 格式託管對應的虛擬記憶體物件 (VMO),以公開包含這個內部狀態的 Inspect 階層。注意:如要進一步瞭解 Inspect VMO 檔案格式,請參閱「Inspect VMO 檔案格式」。

使用「檢查」

如要開始使用「檢查」功能,建議您:

Archivist

Archivist 會從 Inspect 和 Fuchsia 記錄中擷取資料,並透過 fuchsia.diagnostics/ArchiveAccessor 通訊協定提供這些資料。

Archivist 會透過 fuchsia.component.EventStream 擷取元件架構的生命週期事件:

  • 要求的權限:Archivist 會收到 Capability requested 事件,用於連線至 fuchsia.logger.LogSink 和 fuchsia.inspect.InspectSink,以便歸因檢查和記錄。

CapabilityRequested 個事件

CapabilityRequested 事件是提供記錄和 Inspect 的機制,並附有歸因中繼資料,例如路徑名稱和元件網址。

Archivist-manifest exposes fuchsia.logger.LogSink 就像任何其他通訊協定能力一樣,但它也會 uses 來自架構的事件,並將其繫結至其命名空間中的通訊協定:

如要進一步瞭解運作方式,請查看 Archivist 的 CML 檔案:

// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This shard is meant to contain stuff that is meant to be shared across all flavors of the
// archivist.
{
    program: {
        runner: "elf",
        binary: "bin/archivist",
        lifecycle: { stop_event: "notify" },
        forward_stdout_to: "none",
        forward_stderr_to: "none",
        use_next_vdso: "true",
    },
    capabilities: [
        {
            dictionary: "diagnostics-accessors",
            path: "/svc/fuchsia.component.runtime.DictionaryRouter",
        },
        {
            // NOTE: fuchsia.diagnostics.ArchiveAccessor.logs exposes unredacted
            // system logs prior to redaction by Feedback. Routing this protocol
            // to any component other than /core/feedback is restricted by
            // security policy in //src/security/policy/component_manager_policy_base.json5
            // and requires a Fuchsia Privacy review.
            protocol: [
                "fuchsia.diagnostics.ArchiveAccessor.logs",
                "fuchsia.diagnostics.LogFlusher",
                "fuchsia.diagnostics.LogSettings",
                "fuchsia.diagnostics.SaltProvider",
                "fuchsia.diagnostics.system.SerialLogControl",
                "fuchsia.inspect.InspectSink",
                "fuchsia.logger.Log",
                "fuchsia.logger.LogSink",
            ],
        },
    ],
    use: [
        {
            event_stream: [ "capability_requested" ],
            from: "parent",
            path: "/events/log_sink_requested_event_stream",
            filter: { name: "fuchsia.logger.LogSink" },
        },
        {
            event_stream: [ "capability_requested" ],
            from: "parent",
            path: "/events/inspect_sink_requested_event_stream",
            filter: { name: "fuchsia.inspect.InspectSink" },
        },
        {
            protocol: [ "fuchsia.tracing.provider.Registry" ],
            availability: "optional",
        },
        {
            protocol: [ "fuchsia.inspect.InspectSink" ],
            from: "self",
        },
        {
            protocol: [ "fuchsia.component.runtime.Capabilities" ],
            from: "framework",
        },
    ],
    expose: [
        {
            protocol: [
                "fuchsia.diagnostics.ArchiveAccessor.logs",
                "fuchsia.diagnostics.LogFlusher",
                "fuchsia.diagnostics.LogSettings",
                "fuchsia.diagnostics.SaltProvider",
                "fuchsia.diagnostics.system.SerialLogControl",
                "fuchsia.inspect.InspectSink",
                "fuchsia.logger.Log",
                "fuchsia.logger.LogSink",
            ],
            from: "self",
        },
        {
            dictionary: "diagnostics-accessors",
            from: "self",
        },
    ],
}

這會導致元件管理服務將傳入要求從預設 fuchsia.io 命名空間通訊協定重新導向至 fuchsia.component.EventStream 通訊協定。Archivist 會透過這個通訊協定接收事件,並從元件管理服務傳送的 EventHeader 和 LogSink 管道控制代碼中擷取歸因中繼資料。描述元中包含的路徑名稱是在事件標頭中建構。

為 LogSink 設定 capability_requested 事件不會影響能力轉送本身,只會影響管道傳送至 Archivist 的方式,即以事件而非 Open() 的形式傳送。這表示在元件拓撲的其他部分,傳遞歸因 LogSink 的 CML 仍維持不變。詳情請參閱「通訊協定開啟的生命週期」和事件說明文件。

歸因 LogSink 連線

當 Fuchsia 元件想要寫入記錄時,必須在其傳入目錄中取得與 fuchsia.logger.LogSink 的連線,通常由 Archivist 的執行個體提供。

一般 Fuchsia 服務連線為匿名,因此伺服器和用戶端不會有彼此的識別資訊。用戶端只會看到命名空間中的服務 (例如 /svc/fuchsia.logger.LogSink),而伺服器會看到傳入命名空間的匿名 Open() 要求。

歸因記錄功能提供可靠的歸因中繼資料,可更有效地監控、儲存、查詢及呈現記錄。這項歸因中繼資料會識別傳入 LogSink 連線的來源,這是透過 CapabilityRequested 事件完成。