vmm/vmm_config/
metrics.rs

1// Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2// SPDX-License-Identifier: Apache-2.0
3
4//! Auxiliary module for configuring the metrics system.
5use std::path::PathBuf;
6
7use serde::{Deserialize, Serialize};
8
9use crate::logger::{FcLineWriter, METRICS};
10use crate::utils::open_file_write_nonblock;
11
12/// Strongly typed structure used to describe the metrics system.
13#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
14pub struct MetricsConfig {
15    /// Named pipe or file used as output for metrics.
16    pub metrics_path: PathBuf,
17}
18
19/// Errors associated with actions on the `MetricsConfig`.
20#[derive(Debug, thiserror::Error, displaydoc::Display)]
21pub enum MetricsConfigError {
22    /// Cannot initialize the metrics system due to bad user input: {0}
23    InitializationFailure(String),
24}
25
26/// Configures the metrics as described in `metrics_cfg`.
27pub fn init_metrics(metrics_cfg: MetricsConfig) -> Result<(), MetricsConfigError> {
28    let writer = FcLineWriter::new(
29        open_file_write_nonblock(&metrics_cfg.metrics_path)
30            .map_err(|err| MetricsConfigError::InitializationFailure(err.to_string()))?,
31    );
32    METRICS
33        .init(writer)
34        .map_err(|err| MetricsConfigError::InitializationFailure(err.to_string()))
35}
36
37#[cfg(test)]
38mod tests {
39    use vmm_sys_util::tempfile::TempFile;
40
41    use super::*;
42
43    #[test]
44    fn test_init_metrics() {
45        // Initializing metrics with valid pipe is ok.
46        let metrics_file = TempFile::new().unwrap();
47        let desc = MetricsConfig {
48            metrics_path: metrics_file.as_path().to_path_buf(),
49        };
50
51        init_metrics(desc.clone()).unwrap();
52        init_metrics(desc).unwrap_err();
53    }
54}