診斷持續性服務

Fuchsia Diagnostics 持久性服務會在裝置重新啟動時保留診斷資料。

運作方式

服務觸發時,Persistence 會讀取一組診斷資料,並將資料儲存至磁碟。在下次啟動時,持久化會在其自身的檢查階層中發布已儲存的資料。

持久性是由設定檔中的項目設定。每個項目都會指定服務名稱、該服務中的標記和一組選取器。服務名稱會設定 FIDL 服務。

要求儲存資料會透過 FIDL 傳送至 Persistence,要求該標記的選取器應予以儲存。不會定期取樣。每則訊息都包含一個標記。

每個標記都受到兩種限制:大小上限和持久化率。

如果要求送達得太快,系統會延遲處理,直到延遲時間到期為止。在延遲期間收到的多個要求會合併為一個。

如果要求的選取器擷取過多資料,系統會改為儲存錯誤字串,並覆寫該要求先前儲存的任何資料。

如何使用 Persistence

如要儲存資料並發布,請按照下列步驟操作:

定義資料

決定要保留哪些資料。如果尚未將其寫入檢查,請新增程式碼來發布。請注意,在傳送要求後,Persistence 可能會在一段時間後擷取資料,尤其是在啟用時間延遲的情況下。

將資料加入許可清單

持久性會從 fuchsia.diagnostics.ArchiveAccessor.feedback 讀取,因此您需要在該管道的設定檔中將檢查資料加入許可清單。

設定 Persistence

將檔案放入 //src/diagnostics/config/persistence 或 //vendor/*/diagnostics/config/persistence。檔案名稱必須為 *.persist。在 BUILD.gn 中將檔案新增至 persistence_files。

.persist 檔案採用 JSON5 格式。每個檔案都包含物件陣列。每個物件都具有下列結構定義:

{
        tag: 'any-name-you-like', // lowercase and hyphens only
        service_name: 'service-name', // lowercase and hyphens only
        max_bytes: 1000, // limit on size of JSON-format data persisted
        min_seconds_between_fetch: 60, // limit on frequency
        selectors: [
            'INSPECT:core/component:root/path:leaf_name',
            'INSPECT:core/component:root/*:another_leaf',
        ],
},

所有欄位均為必填。您可以從任何元件擷取資料,但只有服務已路由至該元件的元件才能要求擷取資料。

每項服務的代碼名稱不得重複。設定檔名稱可以任意指定,但在設定檔目錄中不得重複。

取得隱私權核准

隱私權需要檢查持續性設定。如要取得評論,請按照下列步驟操作:

  • 取得 CL +2'd
  • 將 cphoenix@ 和 miguelfrde@ 新增至 CL。
  • 我們會將 CL 加 1,並將隱私權團隊加入 CL。
  • 隱私權團隊會將 CL 增加 2 分 (或提出疑慮)。
  • 隱私權審查通過後,CL 會加上 2 天 (可能需要一週的時間),系統會顯示「OWNERS」核准,您就可以提交。

路由和使用服務

每個服務名稱都會以 fuchsia.diagnostics.persist.DataPersistence-service-name 的形式發布。這項資訊必須導向任何會使用為該服務定義的標記的元件。

該服務的 FIDL 通訊協定位於 //src/diagnostics/persistence/fidl/persist.fidl。函式呼叫如下:

protocol DataPersistence {
    Persist(string:MAX_NAME_SIZE tag) -> (PersistResult result);
};

預期結果為 PersistResult::QUEUED

使用已發布的資料

下次啟動時,系統會在延遲一段時間 (目前為 120 秒) 後,將儲存的資料發布至 Inspect。

如果選取器為 INSPECT:core/test_component:root/path:number,服務為 my-service,標記為 my-tag,資料就會在 core/diagnostics-persistence:root/persist/my-service/my-tag/core\test_component/root/path:number 下方。