Skip to content

Commit 6fce76d

Browse files
committed
Add telemetry settings to config
Instead of relying on obfuscated default env variables, make telemetry configurable via config.toml or `PJ_` env variables.
1 parent 134cc3f commit 6fce76d

3 files changed

Lines changed: 34 additions & 19 deletions

File tree

payjoin-service/Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ clap = { version = "4.5", features = ["derive", "env"] }
3434
config = "0.15"
3535
ohttp-relay = { path = "../ohttp-relay", features = ["bootstrap"] }
3636
opentelemetry = "0.31"
37-
opentelemetry-otlp = { version = "0.31", optional = true }
37+
opentelemetry-otlp = { version = "0.31", optional = true, features = [
38+
"reqwest-rustls",
39+
] }
3840
opentelemetry_sdk = "0.31"
3941
payjoin-directory = { path = "../payjoin-directory" }
4042
rand = "0.8"

payjoin-service/src/config.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,20 @@ pub struct Config {
1212
pub storage_dir: PathBuf,
1313
#[serde(deserialize_with = "deserialize_duration_secs")]
1414
pub timeout: Duration,
15+
#[cfg(feature = "telemetry")]
16+
pub telemetry: Option<TelemetryConfig>,
1517
#[cfg(feature = "acme")]
1618
pub acme: Option<AcmeConfig>,
1719
}
1820

21+
#[cfg(feature = "telemetry")]
22+
#[derive(Debug, Clone, Deserialize)]
23+
pub struct TelemetryConfig {
24+
pub endpoint: String,
25+
pub auth_token: String,
26+
pub operator_domain: String,
27+
}
28+
1929
#[cfg(feature = "acme")]
2030
#[derive(Debug, Clone, Deserialize)]
2131
pub struct AcmeConfig {
@@ -48,6 +58,8 @@ impl Default for Config {
4858
listener: "[::]:8080".parse().expect("valid default listener address"),
4959
storage_dir: PathBuf::from("./data"),
5060
timeout: Duration::from_secs(30),
61+
#[cfg(feature = "telemetry")]
62+
telemetry: None,
5163
#[cfg(feature = "acme")]
5264
acme: None,
5365
}
@@ -68,6 +80,8 @@ impl Config {
6880
listener,
6981
storage_dir,
7082
timeout,
83+
#[cfg(feature = "telemetry")]
84+
telemetry: None,
7185
#[cfg(feature = "acme")]
7286
acme: None,
7387
}

payjoin-service/src/main.rs

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,18 @@ use tracing_subscriber::EnvFilter;
66

77
#[tokio::main]
88
async fn main() -> anyhow::Result<()> {
9-
let meter_provider = init_tracing();
10-
119
let args = cli::Args::parse();
1210
let config_path = args.config.unwrap_or_else(|| "config.toml".into());
1311
let config = config::Config::from_file(&config_path)?;
1412

13+
#[cfg(feature = "telemetry")]
14+
let meter_provider = match &config.telemetry {
15+
Some(telemetry) => Some(init_tracing_with_telemetry(telemetry)),
16+
None => init_tracing(),
17+
};
18+
#[cfg(not(feature = "telemetry"))]
19+
let meter_provider = init_tracing();
20+
1521
#[cfg(feature = "acme")]
1622
if config.acme.is_some() {
1723
return payjoin_service::serve_acme(config, meter_provider).await;
@@ -20,7 +26,6 @@ async fn main() -> anyhow::Result<()> {
2026
payjoin_service::serve(config, meter_provider).await
2127
}
2228

23-
#[cfg(not(feature = "telemetry"))]
2429
fn init_tracing() -> Option<SdkMeterProvider> {
2530
let env_filter =
2631
EnvFilter::builder().with_default_directive(LevelFilter::INFO.into()).from_env_lossy();
@@ -30,29 +35,23 @@ fn init_tracing() -> Option<SdkMeterProvider> {
3035
}
3136

3237
#[cfg(feature = "telemetry")]
33-
fn init_tracing() -> Option<SdkMeterProvider> {
34-
use opentelemetry::trace::TracerProvider;
38+
fn init_tracing_with_telemetry(telemetry: &config::TelemetryConfig) -> SdkMeterProvider {
3539
use opentelemetry::KeyValue;
36-
use opentelemetry_appender_tracing::layer::OpenTelemetryTracingBridge;
37-
use opentelemetry_otlp::WithHttpConfig;
40+
use opentelemetry_otlp::{WithExportConfig, WithHttpConfig};
3841
use opentelemetry_sdk::Resource;
3942

40-
let mut resource_builder = Resource::builder().with_service_name("payjoin-service");
41-
if let Ok(domain) = std::env::var("OPERATOR_DOMAIN") {
42-
resource_builder =
43-
resource_builder.with_attribute(KeyValue::new("operator.domain", domain));
44-
}
45-
let resource = resource_builder.build();
43+
let resource = Resource::builder()
44+
.with_service_name("payjoin-service")
45+
.with_attribute(KeyValue::new("operator.domain", telemetry.operator_domain.clone()))
46+
.build();
4647

4748
let headers: std::collections::HashMap<String, String> =
48-
std::env::var("OTEL_EXPORTER_OTLP_TOKEN")
49-
.ok()
50-
.map(|token| [("Authorization".to_string(), format!("Basic {}", token))].into())
51-
.unwrap_or_default();
49+
[("Authorization".to_string(), format!("Basic {}", telemetry.auth_token))].into();
5250

5351
// Initialize metric exporter and provider
5452
let metric_exporter = opentelemetry_otlp::MetricExporter::builder()
5553
.with_http()
54+
.with_endpoint(format!("{}/v1/metrics", &telemetry.endpoint))
5655
.with_headers(headers)
5756
.build()
5857
.expect("Failed to build OTLP metric exporter");
@@ -68,5 +67,5 @@ fn init_tracing() -> Option<SdkMeterProvider> {
6867

6968
opentelemetry::global::set_meter_provider(meter_provider.clone());
7069

71-
Some(meter_provider)
70+
meter_provider
7271
}

0 commit comments

Comments
 (0)