scouter_tracing/exporter/
mod.rs1pub 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#[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 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}