| // Copyright 2020 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. |
| |
| use crate::diagnostics::types::SnapshotInspectArgs; |
| use anyhow::Error; |
| use diagnostics_reader::{ArchiveReader, DataType}; |
| use fidl_fuchsia_diagnostics::ArchiveAccessorMarker; |
| use fuchsia_component::client; |
| use serde_json::Value; |
| |
| // Give components 5 minutes to respond with their Inspect data in case the system is under heavy |
| // load. This can happen especially when running unoptimized on emulators. |
| const BATCH_RETRIEVAL_TIMEOUT_SECONDS: i64 = 300; |
| |
| /// Facade providing access to diagnostics interface. |
| #[derive(Debug)] |
| pub struct DiagnosticsFacade {} |
| |
| impl DiagnosticsFacade { |
| pub fn new() -> DiagnosticsFacade { |
| DiagnosticsFacade {} |
| } |
| |
| pub async fn snapshot_inspect(&self, args: SnapshotInspectArgs) -> Result<Value, Error> { |
| let service_path = format!("/svc/{}", args.service_name); |
| let proxy = |
| client::connect_to_service_at_path::<ArchiveAccessorMarker>(&service_path).unwrap(); |
| ArchiveReader::new() |
| .retry_if_empty(false) |
| .with_archive(proxy) |
| .add_selectors(args.selectors.into_iter()) |
| .with_batch_retrieval_timeout_seconds(BATCH_RETRIEVAL_TIMEOUT_SECONDS) |
| .snapshot_raw(DataType::Inspect) |
| .await |
| } |
| } |