micromegas_tracing/metrics/
block.rs1use super::{TaggedFloatMetricEvent, TaggedIntegerMetricEvent};
2use crate::{
3 event::{EventBlock, EventStream, ExtractDeps},
4 metrics::{
5 FloatMetricEvent, IntegerMetricEvent, MetricMetadataDependency, StaticMetricMetadata,
6 },
7 property_set::{PropertySet, PropertySetDependency},
8};
9use micromegas_transit::{StaticStringDependency, Utf8StaticStringDependency, prelude::*};
10use std::collections::HashSet;
11
12declare_queue_struct!(
13 struct MetricsMsgQueue<
14 IntegerMetricEvent,
15 FloatMetricEvent,
16 TaggedFloatMetricEvent,
17 TaggedIntegerMetricEvent,
18 > {}
19);
20
21declare_queue_struct!(
22 struct MetricsDepsQueue<
23 Utf8StaticStringDependency,
24 StaticStringDependency,
25 MetricMetadataDependency,
26 PropertySetDependency,
27 > {}
28);
29
30fn record_metric_event_dependencies(
31 metric_desc: &StaticMetricMetadata,
32 recorded_deps: &mut HashSet<u64>,
33 deps: &mut MetricsDepsQueue,
34) {
35 let metric_ptr = metric_desc as *const _ as u64;
36 if recorded_deps.insert(metric_ptr) {
37 let name = Utf8StaticStringDependency::from(metric_desc.name);
38 if recorded_deps.insert(name.ptr as u64) {
39 deps.push(name);
40 }
41 let unit = Utf8StaticStringDependency::from(metric_desc.unit);
42 if recorded_deps.insert(unit.ptr as u64) {
43 deps.push(unit);
44 }
45 let target = Utf8StaticStringDependency::from(metric_desc.target);
46 if recorded_deps.insert(target.ptr as u64) {
47 deps.push(target);
48 }
49 let file = Utf8StaticStringDependency::from(metric_desc.file);
50 if recorded_deps.insert(file.ptr as u64) {
51 deps.push(file);
52 }
53 deps.push(MetricMetadataDependency {
54 id: metric_ptr,
55 name: metric_desc.name.as_ptr(),
56 unit: metric_desc.unit.as_ptr(),
57 target: metric_desc.target.as_ptr(),
58 file: metric_desc.file.as_ptr(),
59 line: metric_desc.line,
60 lod: metric_desc.lod as u32,
61 });
62 }
63}
64
65fn record_properties(
66 set: &'static PropertySet,
67 recorded_deps: &mut HashSet<u64>,
68 deps: &mut MetricsDepsQueue,
69) {
70 let id = set as *const _ as u64;
71 if recorded_deps.insert(id) {
72 for prop in set.get_properties() {
73 if recorded_deps.insert(prop.name.id()) {
74 deps.push(prop.name.into_dependency());
75 }
76 if recorded_deps.insert(prop.value.id()) {
77 deps.push(prop.value.into_dependency());
78 }
79 }
80 deps.push(PropertySetDependency::new(set));
81 }
82}
83
84impl ExtractDeps for MetricsMsgQueue {
85 type DepsQueue = MetricsDepsQueue;
86
87 fn extract(&self) -> Self::DepsQueue {
88 let mut deps = MetricsDepsQueue::new(1024 * 1024);
89 let mut recorded_deps = HashSet::new();
90 for x in self.iter() {
91 match x {
92 MetricsMsgQueueAny::IntegerMetricEvent(evt) => {
93 record_metric_event_dependencies(evt.desc, &mut recorded_deps, &mut deps);
94 }
95 MetricsMsgQueueAny::FloatMetricEvent(evt) => {
96 record_metric_event_dependencies(evt.desc, &mut recorded_deps, &mut deps);
97 }
98 MetricsMsgQueueAny::TaggedFloatMetricEvent(evt) => {
99 record_metric_event_dependencies(evt.desc, &mut recorded_deps, &mut deps);
100 record_properties(evt.properties, &mut recorded_deps, &mut deps);
101 }
102 MetricsMsgQueueAny::TaggedIntegerMetricEvent(evt) => {
103 record_metric_event_dependencies(evt.desc, &mut recorded_deps, &mut deps);
104 record_properties(evt.properties, &mut recorded_deps, &mut deps);
105 }
106 }
107 }
108 deps
109 }
110}
111
112pub type MetricsBlock = EventBlock<MetricsMsgQueue>;
113pub type MetricsStream = EventStream<MetricsBlock>;