檢查是 Fuchsia 元件強大的診斷功能。
本文件將詳細說明元件如何代管檢查資料,以及各種工具如何探索這些資料。
託管檢查資料
元件可能會透過以下方式公開檢查資料:
fuchsia.inspect.Tree
(C++、Rust)VmoFile
(飛鏢)fuchsia.inspect.deprecated.Inspect
(Go)
元件不必與其他服務聯繫,即可公開檢查資料。
一般來說,元件不需考量哪一個方法
用戶端程式庫會選出
代管服務。幾乎所有實作方式最終都會使用 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
讀取檢查資料
讀取檢查資料的兩種主要方式為:
iquery
iquery (檢查查詢) 是用於與檢查資料互動的 CLI。
iquery
的主要作業模式採用檢查資料的選取器清單
並印出所含資訊選取器由三個部分組成
並以 :
分隔:
- 元件選取器:這是 v2 中的路徑名稱,或領域路徑加上 元件名稱
- 節點路徑:檢查階層中節點的路徑。
- 屬性路徑:屬性的名稱。
只有 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:當元件連線至
InspectSink
或LogSink
時,會傳送至 Archivist,而非一般目錄連線。這樣一來,Archivist 就能知道連結至這些通訊協定的元件名稱和網址。
要公開檢查的元件必須使用 fuchsia.inspect.InspectSink
通訊協定相當卓越通常會如下所示:
{
use: [
{
protocol: "fuchsia.inspect.InspectSink",
from: "parent",
},
],
}
檢查程式庫需要的資訊清單包含實用資訊,可簡化這項作業:
{
include: [
"inspect/client.shard.cml",
]
}
從 Archivis 讀取檢查項目
Archivist 會代管 fuchsia.diagnostics.ArchiveAccessor
,提供 StreamDiagnostics
方法,可從執行中的元件取得檢查資料。