opentelemetry_gcloud_trace/
lib.rs1#![allow(unused_parens, clippy::new_without_default, clippy::needless_update)]
54
55pub mod errors;
56pub type TraceExportResult<E> = Result<E, crate::errors::GcloudTraceError>;
57
58mod google_trace_exporter_client;
59mod span_exporter;
60
61use crate::errors::GcloudTraceError;
62use opentelemetry::trace::TracerProvider;
63use opentelemetry::InstrumentationScope;
64use opentelemetry_sdk::error::OTelSdkError;
65use opentelemetry_sdk::trace::span_processor_with_async_runtime::BatchSpanProcessor;
66use opentelemetry_sdk::trace::{SdkTracerProvider, TracerProviderBuilder};
67use opentelemetry_sdk::{runtime, Resource};
68use rsb_derive::*;
69pub use span_exporter::GcpCloudTraceExporter;
70
71pub type SdkTracer = opentelemetry_sdk::trace::Tracer;
72
73#[derive(Debug, Builder)]
74pub struct GcpCloudTraceExporterBuilder {
75 pub google_project_id: String,
76 pub resource: Option<Resource>,
77}
78
79impl GcpCloudTraceExporterBuilder {
80 pub async fn for_default_project_id() -> TraceExportResult<Self> {
81 let detected_project_id = gcloud_sdk::GoogleEnvironment::detect_google_project_id().await.ok_or_else(||
82 crate::errors::GcloudTraceError::SystemError(
83 crate::errors::GcloudTraceSystemError::new(
84 "No Google Project ID detected. Please specify it explicitly using env variable: PROJECT_ID or define it as default project for your service accounts".to_string()
85 )
86 )
87 )?;
88 Ok(Self::new(detected_project_id))
89 }
90
91 pub async fn create_provider(&self) -> Result<SdkTracerProvider, GcloudTraceError> {
92 self.create_provider_from_builder(SdkTracerProvider::builder())
93 .await
94 }
95
96 pub async fn create_provider_from_builder(
97 &self,
98 builder: TracerProviderBuilder,
99 ) -> Result<SdkTracerProvider, GcloudTraceError> {
100 let exporter = GcpCloudTraceExporter::new(
101 &self.google_project_id,
102 self.resource
103 .clone()
104 .unwrap_or_else(|| Resource::builder_empty().build()),
105 )
106 .await?;
107
108 let tracer_provider = builder
109 .with_span_processor(BatchSpanProcessor::builder(exporter, runtime::Tokio).build())
110 .build();
111
112 Ok(tracer_provider)
113 }
114
115 pub async fn install(
116 self,
117 provider: &SdkTracerProvider,
118 ) -> Result<opentelemetry_sdk::trace::Tracer, OTelSdkError> {
119 let scope = InstrumentationScope::builder("opentelemetry-gcloud")
120 .with_version(env!("CARGO_PKG_VERSION"))
121 .with_schema_url("https://opentelemetry.io/schemas/1.23.0")
122 .build();
123
124 let tracer = provider.tracer_with_scope(scope);
125 Ok(tracer)
126 }
127}