Fuchsia 具備多個觀測能力系統,可協助您診斷元件,例如:
記錄
記錄是 Fuchsia 程式發出的診斷資料串流,按時間排序。最常見的形式是低頻率、以人為導向的文字字串,用於描述子系統中的狀態變更。
目錄
記錄包含多個中繼資料,大多由產生特定記錄的各個元件自行回報。記錄訊息至少包含時間戳記和字串內容。
此外,如果使用支援的程式庫將記錄訊息寫入 LogSink 通訊協定,則會包含嚴重性、PID、TID、先前捨棄的記錄數量,以及字串標記清單。並非所有中繼資料都是必要,但支援的程式庫可確保在將記錄寫入透過 LogSink 取得的通訊端時,每個欄位都有值。
Archivist 會將額外的中繼資料插入元件寫入通訊端的資料。如要進一步瞭解 Archivist 為 Fuchsia 裝置記錄提供的欄位,請參閱記錄。
儲存空間
目前所有記錄儲存區都會以先進先出 (FIFO) 的方式輪替,較新的訊息會覆寫較舊的訊息。任何元件的訊息都可以推出其他元件的訊息。
Fuchsia 中的記錄可儲存在下列類型的記憶體中:
Volatile
Fuchsia 裝置上有兩個記憶體內儲存區,用於儲存記錄:
klog或 debuglog,這是核心中的 128 KB 緩衝區。syslog:Archivist 中的緩衝區,可設定。
處理記錄時,請務必瞭解 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 事件完成。