use std::str::FromStr;
use std::sync::Arc;
use std::time::Duration;
use opentelemetry::KeyValue;
use opentelemetry_appender_log::OpenTelemetryLogBridge;
use opentelemetry_otlp::HttpExporterBuilder;
use opentelemetry_otlp::Protocol;
use opentelemetry_otlp::WithExportConfig;
use opentelemetry_sdk::logs::BatchConfigBuilder;
use opentelemetry_sdk::Resource;
use crate::Opentelemetry;
pub fn init(
manager: &mut Opentelemetry,
tag: String,
level: &str,
exporter_endpoint: &str,
) -> anyhow::Result<()> {
let batch_config = BatchConfigBuilder::default()
.with_max_export_timeout(Duration::from_secs(20))
.with_max_queue_size(10_000)
.with_max_export_batch_size(100_000);
let batch_config = batch_config.build();
let logger_provider = opentelemetry_otlp::new_pipeline()
.logging()
.with_resource(Resource::new(vec![KeyValue::new(
opentelemetry_semantic_conventions::resource::SERVICE_NAME,
tag,
)]))
.with_batch_config(batch_config)
.with_exporter(
http_exporter()
.with_protocol(Protocol::HttpBinary) .with_endpoint(format!("{exporter_endpoint}/v1/logs")),
)
.install_batch(opentelemetry_sdk::runtime::Tokio)?;
manager.logger = Some(Arc::new(logger_provider.clone()));
let otel_log_appender = OpenTelemetryLogBridge::new(&logger_provider);
log::set_boxed_logger(Box::new(otel_log_appender)).map_err(|err| anyhow::anyhow!("{err}"))?;
let level = log::Level::from_str(level)?;
log::set_max_level(level.to_level_filter());
Ok(())
}
fn http_exporter() -> HttpExporterBuilder {
opentelemetry_otlp::new_exporter().http()
}