#![allow(unused_parens, clippy::new_without_default, clippy::needless_update)]
pub mod errors;
pub type TraceExportResult<E> = Result<E, crate::errors::GcloudTraceError>;
mod google_trace_exporter_client;
mod span_exporter;
use crate::errors::GcloudTraceError;
use opentelemetry::trace::TracerProvider;
use opentelemetry::InstrumentationScope;
use opentelemetry_sdk::error::OTelSdkError;
use opentelemetry_sdk::trace::span_processor_with_async_runtime::BatchSpanProcessor;
use opentelemetry_sdk::trace::{SdkTracerProvider, TracerProviderBuilder};
use opentelemetry_sdk::{runtime, Resource};
use rsb_derive::*;
pub use span_exporter::GcpCloudTraceExporter;
pub type SdkTracer = opentelemetry_sdk::trace::Tracer;
#[derive(Debug, Builder)]
pub struct GcpCloudTraceExporterBuilder {
pub google_project_id: String,
pub resource: Option<Resource>,
}
impl GcpCloudTraceExporterBuilder {
pub async fn for_default_project_id() -> TraceExportResult<Self> {
let detected_project_id = gcloud_sdk::GoogleEnvironment::detect_google_project_id().await.ok_or_else(||
crate::errors::GcloudTraceError::SystemError(
crate::errors::GcloudTraceSystemError::new(
"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()
)
)
)?;
Ok(Self::new(detected_project_id))
}
pub async fn create_provider(&self) -> Result<SdkTracerProvider, GcloudTraceError> {
self.create_provider_from_builder(SdkTracerProvider::builder())
.await
}
pub async fn create_provider_from_builder(
&self,
builder: TracerProviderBuilder,
) -> Result<SdkTracerProvider, GcloudTraceError> {
let exporter = GcpCloudTraceExporter::new(
&self.google_project_id,
self.resource
.clone()
.unwrap_or_else(|| Resource::builder_empty().build()),
)
.await?;
let tracer_provider = builder
.with_span_processor(BatchSpanProcessor::builder(exporter, runtime::Tokio).build())
.build();
Ok(tracer_provider)
}
pub async fn install(
self,
provider: &SdkTracerProvider,
) -> Result<opentelemetry_sdk::trace::Tracer, OTelSdkError> {
let scope = InstrumentationScope::builder("opentelemetry-gcloud")
.with_version(env!("CARGO_PKG_VERSION"))
.with_schema_url("https://opentelemetry.io/schemas/1.23.0")
.build();
let tracer = provider.tracer_with_scope(scope);
Ok(tracer)
}
}