scouter_tracing/exporter/
mod.rs

1pub mod grpc;
2pub mod http;
3pub mod noop;
4pub mod processor;
5pub mod scouter;
6pub mod stdout;
7pub mod testing;
8pub mod traits;
9
10use crate::error::TraceError;
11use crate::exporter::noop::NoopSpanExporter;
12use crate::exporter::processor::BatchConfig;
13use crate::exporter::scouter::ScouterSpanExporter;
14use crate::exporter::traits::SpanExporterBuilder;
15use opentelemetry_sdk::Resource;
16use pyo3::prelude::*;
17use scouter_state::app_state;
18use tracing::debug;
19
20pub use grpc::GrpcSpanExporter;
21pub use http::HttpSpanExporter;
22pub use stdout::StdoutSpanExporter;
23pub use testing::TestSpanExporter;
24
25#[derive(PartialEq)]
26pub enum ExporterType {
27    Http,
28    Stdout,
29    Testing,
30    Noop,
31    Grpc,
32}
33
34// Enum for handling different span exporter types
35#[derive(Debug)]
36pub enum SpanExporterNum {
37    Http(HttpSpanExporter),
38    Stdout(StdoutSpanExporter),
39    Testing(TestSpanExporter),
40    Noop(NoopSpanExporter),
41    Grpc(GrpcSpanExporter),
42}
43
44impl SpanExporterNum {
45    pub fn from_pyobject(obj: &Bound<'_, PyAny>) -> Result<Self, TraceError> {
46        if obj.is_instance_of::<HttpSpanExporter>() {
47            let exporter = obj.extract::<HttpSpanExporter>()?;
48            Ok(SpanExporterNum::Http(exporter))
49        } else if obj.is_instance_of::<GrpcSpanExporter>() {
50            let exporter = obj.extract::<GrpcSpanExporter>()?;
51            Ok(SpanExporterNum::Grpc(exporter))
52        } else if obj.is_instance_of::<StdoutSpanExporter>() {
53            let exporter = obj.extract::<StdoutSpanExporter>()?;
54            Ok(SpanExporterNum::Stdout(exporter))
55        } else if obj.is_instance_of::<TestSpanExporter>() {
56            let exporter = obj.extract::<TestSpanExporter>()?;
57            Ok(SpanExporterNum::Testing(exporter))
58        } else {
59            debug!("Using NoopSpanExporter as default");
60            Ok(SpanExporterNum::Noop(NoopSpanExporter::new()))
61        }
62    }
63
64    pub fn build_provider(
65        &self,
66        resource: Resource,
67        scouter_exporter: ScouterSpanExporter,
68        batch_config: Option<BatchConfig>,
69    ) -> Result<opentelemetry_sdk::trace::SdkTracerProvider, TraceError> {
70        match self {
71            SpanExporterNum::Http(builder) => {
72                builder.build_provider(resource, scouter_exporter, batch_config)
73            }
74            SpanExporterNum::Stdout(builder) => {
75                builder.build_provider(resource, scouter_exporter, batch_config)
76            }
77            SpanExporterNum::Testing(builder) => {
78                builder.build_provider(resource, scouter_exporter, batch_config)
79            }
80            SpanExporterNum::Noop(builder) => {
81                builder.build_provider(resource, scouter_exporter, batch_config)
82            }
83            // tonic requires a tokio runtime to start the background channel
84            SpanExporterNum::Grpc(builder) => app_state().block_on(async {
85                builder.build_provider(resource, scouter_exporter, batch_config)
86            }),
87        }
88    }
89}
90
91impl Default for SpanExporterNum {
92    fn default() -> Self {
93        SpanExporterNum::Stdout(StdoutSpanExporter::default())
94    }
95}