1use std::{collections::HashMap, time::SystemTime};
2
3use super::v7::{DebugMeta, TraceId};
4use crate::utils::ts_rfc3339;
5
6use serde::{Deserialize, Serialize, Serializer};
7use uuid::Uuid;
8
9fn serialize_id<S: Serializer>(uuid: &Uuid, serializer: S) -> Result<S::Ok, S::Error> {
10 serializer.serialize_some(&uuid.as_simple())
11}
12#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)]
13pub struct TransactionMetadata {
15 #[serde(serialize_with = "serialize_id")]
16 pub id: Uuid,
18 pub name: String,
20 pub trace_id: TraceId,
22 pub relative_start_ns: u64,
24 pub relative_end_ns: u64,
26 #[serde(default)]
28 pub active_thread_id: u64,
29}
30
31#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq, Hash)]
32pub struct RustFrame {
34 pub instruction_addr: String,
36}
37
38#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)]
39pub struct Sample {
41 pub stack_id: u32,
43 pub thread_id: u64,
45 pub elapsed_since_start_ns: u64,
47}
48
49#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)]
50pub struct ThreadMetadata {
52 #[serde(default, skip_serializing_if = "Option::is_none")]
53 pub name: Option<String>,
55}
56
57#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)]
58pub struct Profile {
60 pub samples: Vec<Sample>,
62 pub stacks: Vec<Vec<u32>>,
64 pub frames: Vec<RustFrame>,
66 pub thread_metadata: HashMap<String, ThreadMetadata>,
68}
69
70#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)]
71pub struct OSMetadata {
73 pub name: String,
75 pub version: String,
77
78 #[serde(default, skip_serializing_if = "Option::is_none")]
79 pub build_number: Option<String>,
81}
82
83#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)]
84pub struct RuntimeMetadata {
86 pub name: String,
88 pub version: String,
90}
91
92#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)]
93pub struct DeviceMetadata {
95 pub architecture: Option<String>,
97}
98
99#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)]
100pub enum Version {
102 #[serde(rename = "1")]
103 V1,
105}
106
107#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
108pub struct SampleProfile {
110 pub version: Version,
112
113 #[serde(skip_serializing_if = "Option::is_none")]
114 pub debug_meta: Option<DebugMeta>,
116
117 pub device: DeviceMetadata,
119 pub os: OSMetadata,
121 #[serde(skip_serializing_if = "Option::is_none")]
122 pub runtime: Option<RuntimeMetadata>,
124
125 #[serde(default, skip_serializing_if = "String::is_empty")]
126 pub environment: String,
128 #[serde(serialize_with = "serialize_id")]
129 pub event_id: Uuid,
131 pub platform: String,
133 pub profile: Profile,
135 pub release: String,
137 #[serde(with = "ts_rfc3339")]
138 pub timestamp: SystemTime,
140
141 #[serde(default, skip_serializing_if = "Vec::is_empty")]
142 pub transactions: Vec<TransactionMetadata>,
144}