blob: 917c857fff92234fed01d19686f712596dcb84e6 [file] [log] [blame]
// Copyright 2021 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.
//! # fuchsia-inspect
//!
//! Components in Fuchsia may expose structured information about themselves conforming to the
//! [Inspect API][inspect]. This crate is the core library for writing inspect data in Rust
//! components.
//!
//! For a comprehensive guide on how to start using inspect, please refer to the
//! [codelab].
//!
//! ## Library concepts
//!
//! There's two types of inspect values: nodes and properties. These have the following
//! characteristics:
//!
//! - A Node may have any number of key/value pairs called Properties.
//! - A Node may have any number of children, which are also Nodes.
//! - Properties and nodes are created under a parent node. Inspect is already initialized with a
//! root node.
//! - The key for a value in a Node is always a UTF-8 string, the value may be one of the
//! supported types (a node or a property of any type).
//! - Nodes and properties have strict ownership semantics. Whenever a node or property is
//! created, it is written to the backing [VMO][inspect-vmo] and whenever it is dropped it is
//! removed from the VMO.
//! - Inspection is best effort, if an error occurs, no panic will happen and nodes and properties
//! might become No-Ops. For example, when the VMO becomes full, any further creation of a
//! property or a node will result in no changes in the VMO and a silent failure. However,
//! mutation of existing properties in the VMO will continue to work.
//! - All nodes and properties are thread safe.
//!
//! ### Creating vs Recording
//!
//! There are two functions each for initializing nodes and properties:
//!
//! - `create_*`: returns the created node/property and it's up to the caller to handle its
//! lifetime.
//! - `record_*`: creates the node/property but doesn't return it and ties its lifetime to
//! the node where the function was called.
//!
//! ### Lazy value support
//!
//! Lazy (or dynamic) values are values that are created on demand, this is, whenever they are read.
//! Unlike regular nodes, they don't take any space on the VMO until a reader comes and requests
//! its data.
//!
//! There's two ways of creating lazy values:
//!
//! - **Lazy node**: creates a child node of root with the given name. The callback returns a
//! future for an [`Inspector`][inspector] whose root node is spliced into the parent node when
//! read.
//! - **Lazy values**: works like the previous one, except that all properties and nodes under the
//! future root node node are added directly as children of the parent node.
//!
//! ## Quickstart
//!
//! Add the following to your component main:
//!
//! ```rust
//! use fuchsia_inspect::component;
//! use inspect_runtime;
//!
//! let _inspect_server_task = inspect_runtime::publish(
//! component::inspector(),
//! inspect_runtime::PublishOptions::default(),
//! );
//!
//! // Now you can create nodes and properties anywhere!
//! let child = component::inspector().root().create_child("foo");
//! child.record_uint("bar", 42);
//! ```
//!
//! [inspect]: https://fuchsia.dev/fuchsia-src/development/diagnostics/inspect
//! [codelab]: https://fuchsia.dev/fuchsia-src/development/diagnostics/inspect/codelab
//! [inspect-vmo]: https://fuchsia.dev/fuchsia-src/reference/diagnostics/inspect/vmo-format
//! [inspector]: Inspector
#[cfg(target_os = "fuchsia")]
pub mod component;
pub mod health;
pub mod reader;
pub mod stats;
mod writer;
pub mod hierarchy {
pub use diagnostics_hierarchy::*;
}
pub use crate::state::Stats;
pub use crate::writer::*;
pub use diagnostics_hierarchy::{
DiagnosticsHierarchyGetter, ExponentialHistogramParams, LinearHistogramParams,
};
/// Directiory within the outgoing directory of a component where the diagnostics service should be
/// added.
pub const DIAGNOSTICS_DIR: &str = "diagnostics";