aboutsummaryrefslogtreecommitdiff
path: root/crates/tor-config-shared/src/opentelemetry.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/tor-config-shared/src/opentelemetry.rs')
-rw-r--r--crates/tor-config-shared/src/opentelemetry.rs95
1 files changed, 95 insertions, 0 deletions
diff --git a/crates/tor-config-shared/src/opentelemetry.rs b/crates/tor-config-shared/src/opentelemetry.rs
new file mode 100644
index 000000000..c3b2a9992
--- /dev/null
+++ b/crates/tor-config-shared/src/opentelemetry.rs
@@ -0,0 +1,95 @@
+//! Configuration for OpenTelemetry exporter
+
+use amplify::Getters;
+use derive_deftly::Deftly;
+use serde::{Deserialize, Serialize};
+use std::time::Duration;
+use tor_config::derive::prelude::*;
+use tor_config_path::CfgPath;
+
+/// Configuration for exporting spans with OpenTelemetry.
+#[derive(Debug, Clone, Deftly, Eq, PartialEq, Serialize, Deserialize, Getters)]
+#[derive_deftly(TorConfig)]
+pub struct OpentelemetryConfig {
+ /// Write spans to a file in OTLP JSON format.
+ #[deftly(tor_config(default))]
+ file: Option<OpentelemetryFileExporterConfig>,
+ /// Export spans via HTTP.
+ #[deftly(tor_config(default))]
+ http: Option<OpentelemetryHttpExporterConfig>,
+}
+
+/// Configuration for the OpenTelemetry HTTP exporter.
+#[derive(Debug, Clone, Deftly, Eq, PartialEq, Serialize, Deserialize, Getters)]
+#[derive_deftly(TorConfig)]
+#[deftly(tor_config(no_default_trait))]
+pub struct OpentelemetryHttpExporterConfig {
+ /// HTTP(S) endpoint to send spans to.
+ ///
+ /// For Jaeger, this should be something like: `http://localhost:4318/v1/traces`
+ #[deftly(tor_config(no_default))]
+ endpoint: String,
+ /// Configuration for how to batch exports.
+ #[deftly(tor_config(sub_builder))]
+ batch: OpentelemetryBatchConfig,
+ // TODO: A different approach to this may be better, as getting the default in this way
+ // prevents the use of environment variables to override this, and also is inconsistent with
+ // other aspects of configuration.
+ /// Timeout for sending data.
+ #[deftly(tor_config(default = "opentelemetry_otlp::OTEL_EXPORTER_OTLP_TIMEOUT_DEFAULT"))]
+ timeout: Duration,
+ // TODO: Once opentelemetry-otlp supports more than one protocol over HTTP, add a config option
+ // to choose protocol here.
+}
+
+/// Configuration for the OpenTelemetry File exporter.
+#[derive(Debug, Clone, Deftly, Eq, PartialEq, Serialize, Deserialize, Getters)]
+#[derive_deftly(TorConfig)]
+#[deftly(tor_config(no_default_trait))]
+pub struct OpentelemetryFileExporterConfig {
+ /// The path to write the JSON file to.
+ #[deftly(tor_config(no_default))]
+ path: CfgPath,
+ /// Configuration for how to batch writes.
+ #[deftly(tor_config(sub_builder))]
+ batch: OpentelemetryBatchConfig,
+}
+
+/// Configuration for the Opentelemetry batch exporting.
+///
+/// This is a copy of [`opentelemetry_sdk::trace::BatchConfig`].
+#[derive(Debug, Clone, Deftly, Eq, PartialEq, Serialize, Deserialize, Getters)]
+#[derive_deftly(TorConfig)]
+pub struct OpentelemetryBatchConfig {
+ /// Maximum queue size. See [`opentelemetry_sdk::trace::BatchConfig::max_queue_size`].
+ #[deftly(tor_config(default))]
+ max_queue_size: Option<usize>,
+ /// Maximum export batch size. See [`opentelemetry_sdk::trace::BatchConfig::max_export_batch_size`].
+ #[deftly(tor_config(default))]
+ max_export_batch_size: Option<usize>,
+ /// Scheduled delay. See [`opentelemetry_sdk::trace::BatchConfig::scheduled_delay`].
+ #[deftly(tor_config(default = "Duration::from_secs(5)"))]
+ scheduled_delay: Duration,
+}
+
+impl From<OpentelemetryBatchConfig> for opentelemetry_sdk::trace::BatchConfig {
+ fn from(config: OpentelemetryBatchConfig) -> opentelemetry_sdk::trace::BatchConfig {
+ let batch_config = opentelemetry_sdk::trace::BatchConfigBuilder::default();
+
+ let batch_config = if let Some(max_queue_size) = config.max_queue_size {
+ batch_config.with_max_queue_size(max_queue_size)
+ } else {
+ batch_config
+ };
+
+ let batch_config = if let Some(max_export_batch_size) = config.max_export_batch_size {
+ batch_config.with_max_export_batch_size(max_export_batch_size)
+ } else {
+ batch_config
+ };
+
+ let batch_config = batch_config.with_scheduled_delay(config.scheduled_delay);
+
+ batch_config.build()
+ }
+}