micromegas_tracing/metrics/
block.rs

1use 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>;