// Copyright 2024 - Nym Technologies SA // SPDX-License-Identifier: GPL-3.0-only use nym_bin_common::logging::{default_tracing_env_filter, default_tracing_fmt_layer}; use tracing_subscriber::filter::Directive; use tracing_subscriber::layer::SubscriberExt; use tracing_subscriber::util::SubscriberInitExt; // Signoz use opentelemetry::trace::TracerProvider; use opentelemetry::{global, KeyValue}; use opentelemetry_otlp::tonic_types::metadata::MetadataMap; use opentelemetry_otlp::tonic_types::transport::ClientTlsConfig; use opentelemetry_otlp::{WithExportConfig, WithTonicConfig}; use opentelemetry_sdk::metrics::{MeterProviderBuilder, PeriodicReader, SdkMeterProvider}; use opentelemetry_sdk::trace::{RandomIdGenerator, SdkTracerProvider}; use opentelemetry_sdk::{trace::Sampler, Resource}; use opentelemetry_semantic_conventions::resource::{DEPLOYMENT_ENVIRONMENT_NAME, SERVICE_VERSION}; use opentelemetry_semantic_conventions::SCHEMA_URL; use tracing_core::Level; use tracing_opentelemetry::{MetricsLayer, OpenTelemetryLayer}; pub(crate) fn granual_filtered_env() -> anyhow::Result { fn directive_checked(directive: impl Into) -> anyhow::Result { directive.into().parse().map_err(From::from) } let mut filter = default_tracing_env_filter(); let filter_crates = ["defguard_wireguard_rs"]; for crate_name in filter_crates { filter = filter.add_directive(directive_checked(format!("{crate_name}=warn"))?); } Ok(filter) } pub(crate) fn build_tracing_logger() -> anyhow::Result { let key = std::env::var("SIGNOZ_INGESTION_KEY").expect("SIGNOZ_INGESTION_KEY not set"); println!("SIGNOZ_INGESTION_KEY = {}", key); let mut metadata = MetadataMap::new(); metadata.insert( "signoz-ingestion-key", key.parse().expect("Could not parse key"), ); let tracer_provider = init_tracer_provider(metadata)?; let meter_provider = init_meter_provider()?; let tracer = tracer_provider.tracer("tracing-otel-subscriber"); let registry = tracing_subscriber::registry() .with(default_tracing_fmt_layer(std::io::stderr)) .with(granual_filtered_env()?) .with(tracing_subscriber::filter::LevelFilter::from_level( Level::DEBUG, )) .with(MetricsLayer::new(meter_provider)) .with(OpenTelemetryLayer::new(tracer)); Ok(registry) } pub(crate) fn setup_tracing_logger() -> anyhow::Result<()> { build_tracing_logger()?.init(); Ok(()) } // Signoz fn resource() -> Resource { Resource::builder() .with_service_name("nym-node") .with_schema_url( [ KeyValue::new(SERVICE_VERSION, env!("CARGO_PKG_VERSION")), KeyValue::new(DEPLOYMENT_ENVIRONMENT_NAME, "develop"), ], SCHEMA_URL, ) .build() } fn init_tracer_provider(metadata: MetadataMap) -> anyhow::Result { let endpoint = std::env::var("SIGNOZ_ENDPOINT").expect("SIGNOZ_ENDPOINT not set"); println!("SIGNOZ_ENDPOINT = {}", endpoint); let mut exporter_builder = opentelemetry_otlp::SpanExporter::builder() .with_tonic() .with_metadata(metadata) .with_endpoint(&endpoint); if endpoint.starts_with("https://") { exporter_builder = exporter_builder.with_tls_config(ClientTlsConfig::new().with_enabled_roots()); } let exporter = exporter_builder.build()?; let tracer = SdkTracerProvider::builder() .with_sampler(Sampler::ParentBased(Box::new(Sampler::TraceIdRatioBased( 1.0, )))) .with_id_generator(RandomIdGenerator::default()) .with_resource(resource()) .with_batch_exporter(exporter) .build(); Ok(tracer) } fn init_meter_provider() -> anyhow::Result { let exporter = opentelemetry_otlp::MetricExporter::builder() .with_tonic() .with_temporality(opentelemetry_sdk::metrics::Temporality::default()) .build()?; let reader = PeriodicReader::builder(exporter) .with_interval(std::time::Duration::from_secs(30)) .build(); let stdout_reader = PeriodicReader::builder(opentelemetry_stdout::MetricExporter::default()).build(); let meter_provider = MeterProviderBuilder::default() .with_resource(resource()) .with_reader(reader) .with_reader(stdout_reader) .build(); global::set_meter_provider(meter_provider.clone()); Ok(meter_provider) }