// Licensed under the Apache-2.0 license
// SPDX-License-Identifier: Apache-2.0

//! Telemetry, monitoring, and logging service for OpenPRoT
//!
//! This crate provides telemetry collection and monitoring capabilities.

#![no_std]
