檢查探索與託管

檢查是 Fuchsia 元件強大的診斷功能。

本文件將詳細說明元件如何代管檢查資料,以及各種工具如何探索這些資料。

託管檢查資料

元件可能會透過以下方式公開檢查資料:

元件不必與其他服務聯繫,即可公開檢查資料。

一般來說,元件不需考量哪一個方法 用戶端程式庫會選出 代管服務。幾乎所有實作方式最終都會使用 Tree

功能 fuchsia.inspect.Tree VmoFile fuchsia.inspect.deprecated.Inspect 說明
非延遲值 可轉移 元件可以記錄字串和整數等值。
Lazy 值 元件可能會在讀取期間動態產生值。
可變動樹 可轉移 元件可能會修改儲存在輸出內容中的值。
事後檢查 元件記錄的值可在元件關閉後使用。
低延遲快照 可透過低延遲取得資料的完整快照。
一致的快照 是* 我們可以保證樹狀結構快照代表其在某個時間點的狀態。

(*: 每個樹狀圖的快照都一致,但不保證樹狀圖之間的一致性)

fuchsia.inspect.Tree

fuchsia.inspect.Tree 支援 Inspect API 的所有功能,也是從元件公開 Inspect 資料的建議方式。

元件會使用 fuchsia.inspect.InspectSink 通訊協定發布 fuchsia.inspect.Tree

實作

fuchsia.inspect.Tree FIDL 檔案會定義通訊協定 這個程式碼

Tree 通訊協定會將多個 Inspect VMOs 連結成「樹狀結構」。

圖:樹狀範例

在上圖中,名為「root」的樹狀結構處理通訊協定 fuchsia.inspect.Tree 用於託管頂層服務的連線 低於 fuchsia.inspect.Tree。子項樹狀結構可能會列舉 並以通訊協定上的方法開啟舉例來說,「child B」可能在開啟及讀取前,不會存在於記憶體中。

通訊協定會以下列方式支援這項行為:

  • GetContent

    這個方法會取得樹狀結構的內容,目前形式為 檢查 VMO。依慣例,在根目錄樹狀結構上呼叫這個方法時,應傳回 VMO,並持續使用新資料更新。用戶端不需重新閱讀 來讀取新值

  • ListChildNames

    這個方法會接受迭代器,並傳回樹狀結構的子項名稱。例如上圖中的樹木 會傳回「子項 A」的名稱以及「子 B」當在根樹上執行時

  • OpenChild

    這個方法會接受 fuchsia.inspect.Tree 的要求,該要求會繫結至以特定名稱指定的樹狀結構。使用此方法,用戶端可透過根層級介面檢視公開的所有樹狀結構。

fuchsia.inspect.deprecated.Inspect

Go 會使用這個已淘汰的介面來公開檢查資料。fuchsia.inspect.Tree 會公開「樹狀結構的樹狀結構」,但這個介面只會公開單一樹狀結構,其中的子樹狀結構可透過動態方式建立。

這個介面已淘汰,改為採用由檢查樹狀結構代管的 VMO 格式,原因如下:

  • VMO 格式支援低延遲快照,且無需與 由主控程式提供
  • VMO 格式的快照在整個樹狀結構中始終保持一致。
  • VMO 格式支援檢討報告,所有使用 已淘汰的介面。
  • Tree 通訊協定支援與已淘汰相同的動態功能 存取 API

讀取檢查資料

讀取檢查資料的兩種主要方式為:

  1. iquery
  2. Archivist

iquery

iquery (檢查查詢) 是用於與檢查資料互動的 CLI。

iquery 的主要作業模式採用檢查資料的選取器清單 並印出所含資訊選取器由三個部分組成 並以 : 分隔:

  1. 元件選取器:這是 v2 中的路徑名稱,或領域路徑加上 元件名稱
  2. 節點路徑:檢查階層中節點的路徑。
  3. 屬性路徑:屬性的名稱。

只有 iquery (1) 是必要項目。如果只提供 (1) 值 (例如 realm/component),則 iquery 會使用選取器 realm/component:* 來 擷取所有檢查資料

iquery 包含兩個公用程式指令,可協助您瞭解有哪些元件可用 可以使用的選取器:

  • list:iquery 會列印所有可用的元件選取器,這個項目 所有 v2 Monikers 以及所有包含元件名稱的 v1 領域路徑
  • selectors:iquery 會列印所提供項目下的所有可用選取器 選取器位置

這些模式可搭配使用,如下所示:

$ iquery show `iquery list | grep component_name`

或者,iquery 也能列印特定位置的檢查資料。A 罩杯 位置是由 .inspect 檔案的路徑或 包含 fuchsia.inspect.Tree 的目錄。iquery 包含公用程式指令,可列出所有包含檢查資料的檔案 (list-files)。

iquery 的次要作業模式 (由 list-files 觸發) 指定從指定目錄路徑檢查資料的位置。 以下兩種模式可以一起使用:

$ iquery list-files [component_moniker]
bootstrap/driver_manager
  class/display-coordinator/000.inspect
  ... additional output


$ iquery show --file 'class/display-coordinator/000.inspect'

在上述範例中,系統會執行 iquery list-files 來找出檢查位置清單。接著,系統會在其中一個輸出項目上執行 iquery,以遞迴方式列出相符位置中的資料。您可以改為編寫以下內容:

$ fx iquery show --manifest component_name

阿奇維斯特

Archivist 代管的 Fuchsia Diagnostics 平台負責監控及匯總 Inspect 資料。

在元件管理員下執行時,系統會透過事件功能將診斷資料提供給 Archivist。

「阿奇維斯」是由根領域提供的活動。因此,它會發現 整個系統允許查看及訂閱的事件如下:

  • CapabilityRequested:當元件連線至 InspectSinkLogSink 時,會傳送至 Archivist,而非一般目錄連線。這樣一來,Archivist 就能知道連結至這些通訊協定的元件名稱和網址。

要公開檢查的元件必須使用 fuchsia.inspect.InspectSink 通訊協定相當卓越通常會如下所示:

{
    use: [
        {
            protocol: "fuchsia.inspect.InspectSink",
            from: "parent",
        },
    ],
}

檢查程式庫需要的資訊清單包含實用資訊,可簡化這項作業:

{
    include: [
        "inspect/client.shard.cml",
    ]
}

從 Archivis 讀取檢查項目

Archivist 會代管 fuchsia.diagnostics.ArchiveAccessor,提供 StreamDiagnostics 方法,可從執行中的元件取得檢查資料。