tracing_honeycomb/
honeycomb.rs1use chrono::{DateTime, Utc};
2
3use crate::reporter::Reporter;
4use crate::visitor::{event_to_values, span_to_values, HoneycombVisitor};
5use std::collections::HashMap;
6use tracing_distributed::{Event, Span, Telemetry};
7
8use crate::{SpanId, TraceId};
9
10#[derive(Debug)]
12pub struct HoneycombTelemetry<R> {
13 reporter: R,
14 sample_rate: Option<u32>,
15}
16
17impl<R: Reporter> HoneycombTelemetry<R> {
18 pub(crate) fn new(reporter: R, sample_rate: Option<u32>) -> Self {
19 HoneycombTelemetry {
20 reporter,
21 sample_rate,
22 }
23 }
24
25 #[inline]
26 fn report_data(&self, data: HashMap<String, libhoney::Value>, timestamp: DateTime<Utc>) {
27 self.reporter.report_data(data, timestamp);
28 }
29
30 fn should_report(&self, trace_id: &TraceId) -> bool {
31 if let Some(sample_rate) = self.sample_rate {
32 crate::deterministic_sampler::sample(sample_rate, trace_id)
33 } else {
34 true
35 }
36 }
37}
38
39impl<R: Reporter> Telemetry for HoneycombTelemetry<R> {
40 type Visitor = HoneycombVisitor;
41 type TraceId = TraceId;
42 type SpanId = SpanId;
43
44 fn mk_visitor(&self) -> Self::Visitor {
45 Default::default()
46 }
47
48 fn report_span(&self, span: Span<Self::Visitor, Self::SpanId, Self::TraceId>) {
49 if self.should_report(&span.trace_id) {
50 let (data, timestamp) = span_to_values(span);
51 self.report_data(data, timestamp);
52 }
53 }
54
55 fn report_event(&self, event: Event<Self::Visitor, Self::SpanId, Self::TraceId>) {
56 if self.should_report(&event.trace_id) {
57 let (data, timestamp) = event_to_values(event);
58 self.report_data(data, timestamp);
59 }
60 }
61}