tracing_honeycomb/
honeycomb.rs

1use 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/// Telemetry capability that publishes Honeycomb events and spans to some backend
11#[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}