診斷選取器

總覽

Fuchsia 內的診斷平台含有多項服務,每項服務 (例如 例如竊取資料、指標輪詢和錯誤狀態分析) 其診斷資料的特定屬性。

我們建立了名為「診斷選取器」的特定網域特定語言 (DSL), 能夠描述元件公開的診斷屬性選取器的用途 會根據診斷結構定義採取行動,且會在下列情況下使用:

  1. 診斷資料會編碼為「資料階層」,而具名節點同時代管兩個子節點 和命名的診斷屬性
  2. 診斷階層可歸因於公開資料的特定元件,並按 中,如果能找到想要的影像內容

診斷選取器具有下列高階語法:

<component_selector>:<hierarchy_path_selector>:<property_selector>

上述語法的三個部分可用來逐步建立 Fuchsia 診斷資料索引。 資料來源:

  • component_selector:以生產者為準,指定診斷資料的生產者 moniker
  • hierarchy_path_selector:指定生產端所公開資料階層的路徑 特定節點的流量
  • property_selector:針對您在 階層

有些是以診斷平台為建構基礎的工具 (例如「分類」偵測) 需要透過選取器來區分資料類型。這些工具 選取器 DSL,並使用指定資料類型的額外語法:

INSPECT|LOG|LIFECYCLE:<component_selector>:<hierarchy_path_selector>:<property_selector>

下文會詳細說明語法的各個部分。

匯出為 Files

留言

診斷選取器可以寫入平面目錄中的 cfg 檔案。在這些範圍內 檔案和註解,可使用 // 撰寫。例如:

// a comment
core/sessions/foo

core2/session:foo  // inline comment

元件選取器

語法

元件選取器會定義模式,用來描述一或多個路徑名稱 元件拓撲元件元件選取器是一組正斜線 (/) 分隔字串,用來說明從根元件到所需元件的路徑。

以下元件拓撲可用於示範元件選取器語法:

選取器的視覺化呈現方式如下方說明

基於這個拓撲,請考慮使用下列元件選取器:

core/sessions/foo

這個元件選取器可明確識別名為 foo 的元件 相對於其上層 core

元件選取器的每個片段 (以正斜線分隔的區段) 只會描述元件拓撲的一個「層級」

元件選取器區隔只能包含元件可接受的字元 路徑名稱。每個元件選取器區隔都是 執行個體名稱或含有執行個體名稱的集合名稱 符合一組允許的字元和長度限制。集合之間的冒號 : 名稱和執行個體名稱必須以反斜線 (\) 逸出。

外卡

元件選取器支援萬用字元,其將比對單一「level」元件的組成 選取器程式碼請參考適用於上述拓撲範例的 component_selector:

core/other_comp/*

此選取器比對系統上針對該父項名稱下執行的所有元件 other_comp,在父項 core 下執行。下列為各種內容:

  • core/other_comp/foo
  • core/other_comp/bar

萬用字元也可以用來當成字串完成的規則運算式,用於計算 元件選取器以下是相對於上述拓撲的元件選取器 圖表:

core/*_comp

這符合系統上在名為 core 的父項下執行的所有元件。 以及名稱結尾為 _runner 的名稱包括下列魔鬼人物:

  • core/some_comp
  • core/other_comp

元件選取器可以使用遞迴萬用字元 **,其符合所有元件 在指定領域下:

core/**

這符合系統在 core 下執行的所有元件,或 core 的任何子領域。

元件選取器 ** 只會比對系統中的所有元件。

階層路徑選取器

語法

階層路徑選取器會定義用來描述結構化資料路徑的模式 移至一或多個已命名節點這個子選取器的語法與 元件選取器的組合,因為兩者都描述透過具名節點樹狀結構的路徑。只有 差別在於前述的選用樹狀名稱篩選器

建議您採用下列 JSON 編碼診斷資料階層。在這個例子中 來自檢查報告

"root": {
    "reverser_service": {
        "connection-0x0": {
            "request_count": 1,
        },
        connection_validity: {
            "is_valid": true
        },
        "connection_count": 1,
        "connection_validity": "connection_xyz"

    },
    "version": "part1"
}

使用這個資料階層結構時,請考慮採用以下階層路徑選取器:

root/reverser_service/connection-0x0

此階層路徑選取器會明確描述資料階層根部的路徑 將資料導向資料階層中的特定節點

選取器的每個線段 (以正斜線分隔的區段) 都只會描述一個 資料階層層級或節點階層路徑選取器區隔可能包含任何字元 但如果區隔需要包含星號 (*)、正斜線 (/), 反斜線 (\)、空白字元 (\t) 或冒號 (:) 必須逸出。

請注意,階層路徑選取器獨有,不是元件選取器 指定節點共用相同名稱的子項和屬性的情況。假設 一個選取器:

root/reverser_service/connection_validity

這個路徑階層選取器說明從根到 connection_validity 個節點。這與 reverser_service 節點上的 connection_validity 屬性, 可以透過資源選取器選取: root/reverser_service:connection_validity

外卡

階層路徑選取器支援萬用字元,其將比對單一「層級」元件的組成 選取器程式碼以下範例會比對資料階層中屬於以下子項的所有節點: 在根目錄底下建立節點 verser_service:

root/reverser_service/*

萬用字元也可以用來當成字串完成的規則運算式,用於計算 元件選取器以下範例會比對 reverse_service 下所有啟動 connection-

core/reverser_service/connection-*

在上述範例中,唯一相符的節點為 connection-0x0,但如有更多連線節點 那麼這些模型也會符合

樹狀名稱篩選器

當元件發布多個 fucshia.inspect.Tree 通訊協定時,選取器語法 支援使用通訊協定中繼資料中的 name 值篩選這些樹狀結構。

假設您先前建立的「檢查」階層 ffx inspect show core/my_component:

core/my_component:
  metadata:
    name = root
    component_url = fuchsia-boot:///my_component#meta/my_component.cm
    timestamp = 70863435581892
  payload:
    root:
      connections:
        connections_closed = 7
core/my_component:
  metadata:
    name = second_tree
    component_url = fuchsia-boot:///my_component#meta/my_component.cm
    timestamp = 70863435581892
  payload:
    root:
      data:
        values = [0, 1, 2]

如果您知道自己需要 root/data:values 屬性,可以使用樹狀結構名稱篩選器: 避免使用以下語法製作兩棵樹的負擔 (省略屬性) :

[name=second_tree]root/data

如果您不知道要選取哪個樹狀結構,或確定要從所有選項中選取 那麼您可以使用這個階層選取器:

[...]root

等同於列出所有名稱:

[name=root, name=second_tree]root

目前,省略清單會視為與 [...] 相同,但屬於柔性轉換。 如果您知道元件會匯出多個名稱不同的樹狀結構,請使用明確語法。

如果元件在發布檢查時未指定名稱,就會隱含 root。 這個錯誤追蹤讓省略的名稱篩選清單等同於 [name=root]

名稱篩選器清單中的值沒有字元限制,但 :* 和空格 都必須逸出。如果名稱含有 [a-zA-Z0-9-_] 以外的值,就必須將名稱加上引號。

名稱篩選器須區分大小寫;

資源選取器

語法

屬性選取器是最簡單的所有子選取器。會定義要比對的模式 單一字串,這是診斷階層中的屬性名稱。診斷中的所有房源 階層都有字串名稱省略屬性選取器實際上是 階層路徑選取器

和先前的選取器區隔一樣,如果您想與星號 (*) 比對, 正斜線 (/)、反斜線 (\)、空白字元 (分頁 \t), 或冒號 (:) 必須使用反斜線 (\) 逸出。

外卡

萬用字元可用來比對整個屬性字串,或用做完成字串的 glob。

eg: abc will match any string with the exact name "abc".
eg: a\* will match any string with the exact name "a*".
eg: a\\* will match any that starts with exactly "a\".
eg: a* will match any string that starts with "a".
eg: a*b will match any string that starts with a and ends with b.
eg: a*b*c will match any string that starts with a and ends with c, with b in the middle.

完整選取器範例

以下選取器會從現有系統中的任一 echo.cm 執行個體選取資料 任何屬於 realm1 的領域。擷取的資料會是「active_connections」 位於 a/b/c 的節點上。

realm1/*/echo:a/b/c:active_connections

以下選取器會從系統上的任何 echo.cm 例項中選取檢查資料: 存在於 realm1 底下的任何領域中。檢查資料會是 節點的 memory_usage property 權限,位於 a/b/c/d

realm1/echo:a/b/c/d:*