Skip to main content

micromegas_tracing/
process_info.rs

1//! Process metadata
2use std::collections::HashMap;
3
4use serde::{Deserialize, Serialize};
5
6mod uuid_serde {
7    use serde::{self, Deserialize, Deserializer, Serializer};
8
9    pub fn uuid_to_string<S>(id: &uuid::Uuid, serializer: S) -> Result<S::Ok, S::Error>
10    where
11        S: Serializer,
12    {
13        serializer.serialize_str(&id.to_string())
14    }
15
16    pub fn uuid_from_string<'de, D>(deserializer: D) -> Result<uuid::Uuid, D::Error>
17    where
18        D: Deserializer<'de>,
19    {
20        let s = String::deserialize(deserializer)?;
21        uuid::Uuid::try_parse(&s).map_err(serde::de::Error::custom)
22    }
23
24    pub fn opt_uuid_to_string<S>(id: &Option<uuid::Uuid>, serializer: S) -> Result<S::Ok, S::Error>
25    where
26        S: Serializer,
27    {
28        match id {
29            Some(id) => serializer.serialize_some(&id.to_string()),
30            None => serializer.serialize_none(),
31        }
32    }
33
34    pub fn opt_uuid_from_string<'de, D>(deserializer: D) -> Result<Option<uuid::Uuid>, D::Error>
35    where
36        D: Deserializer<'de>,
37    {
38        let s: Option<String> = Option::deserialize(deserializer)?;
39        match s {
40            Some(s) if s.is_empty() => Ok(None),
41            Some(s) => uuid::Uuid::try_parse(&s)
42                .map(Some)
43                .map_err(serde::de::Error::custom),
44            None => Ok(None),
45        }
46    }
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize)]
50pub struct ProcessInfo {
51    #[serde(
52        deserialize_with = "uuid_serde::uuid_from_string",
53        serialize_with = "uuid_serde::uuid_to_string"
54    )]
55    pub process_id: uuid::Uuid,
56    pub exe: String,
57    pub username: String,
58    pub realname: String,
59    pub computer: String,
60    pub distro: String,
61    pub cpu_brand: String,
62    pub tsc_frequency: i64,
63    /// RFC 3339
64    pub start_time: chrono::DateTime<chrono::Utc>,
65    pub start_ticks: i64,
66    #[serde(
67        deserialize_with = "uuid_serde::opt_uuid_from_string",
68        serialize_with = "uuid_serde::opt_uuid_to_string"
69    )]
70    pub parent_process_id: Option<uuid::Uuid>,
71    pub properties: HashMap<String, String>,
72}