1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#![doc = include_str!("../README.md")]
pub mod chunk;
pub mod event;
pub mod iter;
pub mod label_set;
pub mod procession;
pub mod recorder;
#[cfg(test)]
mod tests {
use metrics::{Key, Label};
use crate::{
chunk::Chunk,
event::{Entry, Event, Op},
label_set::LabelSet,
procession::Procession,
};
#[test]
fn ser_de() {
let labels = LabelSet(
[
(
Key::from_parts("label1", vec![Label::new("key", "value")]),
1,
),
(
Key::from_parts(
"label2",
vec![Label::new("key", "value"), Label::new("other", "value")],
),
2,
),
(Key::from_parts("label3", vec![]), 3),
]
.into_iter()
.collect(),
);
let streams = Procession {
labels,
chunks: vec![
Chunk {
reference_time: time::OffsetDateTime::new_utc(
time::Date::from_calendar_date(2025, time::Month::January, 1).unwrap(),
time::Time::from_hms(0, 0, 0).unwrap(),
),
events: vec![
Event {
entry: Entry::Counter {
value: 1,
op: Op::Add,
},
ms: 0,
label: 1,
},
Event {
entry: Entry::Gauge {
value: 1.0,
op: Op::Set,
},
ms: 1,
label: 2,
},
Event {
entry: Entry::Histogram { value: 1.0 },
ms: 2,
label: 3,
},
],
},
Chunk {
reference_time: time::OffsetDateTime::new_utc(
time::Date::from_calendar_date(2025, time::Month::January, 1).unwrap(),
time::Time::from_hms(1, 0, 0).unwrap(),
),
events: vec![
Event {
entry: Entry::Counter {
value: 1,
op: Op::Set,
},
ms: 0,
label: 1,
},
Event {
entry: Entry::Gauge {
value: 1.0,
op: Op::Add,
},
ms: 1,
label: 2,
},
Event {
entry: Entry::Histogram { value: 1.0 },
ms: 2,
label: 3,
},
],
},
],
};
let json = serde_json::to_string_pretty(&streams).unwrap();
let back = serde_json::from_str(&json).unwrap();
assert_eq!(streams, back);
}
}