@@ -6,17 +6,46 @@ use std::{
66} ;
77
88use anyhow:: { Context , Error } ;
9+ use serde:: Deserialize ;
10+
11+ #[ derive( Deserialize , Default ) ]
12+ pub struct Env {
13+ otel_service_name : Option < String > ,
14+ aws_lambda_function_name : Option < String > ,
15+
16+ aws_lambda_initialization_type : Option < String > ,
17+ aws_lambda_runtime_api : Option < String > ,
18+ sw_exporter_compression : Option < String > ,
19+
20+ sw_apm_api_token : Option < String > ,
21+ sw_apm_service_key : Option < String > ,
22+
23+ sw_apm_data_center : Option < String > ,
24+ sw_apm_collector : Option < String > ,
25+ sw_exporter_otlp_endpoint : Option < String > ,
26+ sw_exporter_otlp_traces_endpoint : Option < String > ,
27+ sw_exporter_otlp_metrics_endpoint : Option < String > ,
28+ sw_exporter_otlp_logs_endpoint : Option < String > ,
29+ sw_exporter_otlp_profiles_endpoint : Option < String > ,
30+ }
931
1032pub struct Config {
1133 pub _service : String ,
1234 pub token : String ,
1335
1436 pub executable : String ,
1537 pub managed : bool ,
38+ pub compression : Compression ,
1639
1740 pub urls : UrlsConfig ,
1841}
1942
43+ #[ derive( Clone , Copy ) ]
44+ pub enum Compression {
45+ Gzip ,
46+ Zstd ,
47+ }
48+
2049pub struct UrlsConfig {
2150 pub settings : String ,
2251 pub exporters : ExportersUrlsConfig ,
@@ -65,28 +94,55 @@ impl Config {
6594 const LOCAL_HOST : & str = "sandbox.localdomain" ;
6695
6796 pub fn parse ( ) -> Result < Arc < Self > , Error > {
68- let service_key = env:: var ( "SW_APM_SERVICE_KEY" ) . ok ( ) ;
69- let service_key = service_key. as_ref ( ) . and_then ( |s| s. split_once ( ':' ) ) ;
97+ let Env {
98+ otel_service_name,
99+ aws_lambda_function_name,
70100
71- let service_name = env:: var ( "OTEL_SERVICE_NAME" )
72- . ok ( )
101+ aws_lambda_initialization_type,
102+ aws_lambda_runtime_api,
103+ sw_exporter_compression,
104+
105+ sw_apm_api_token,
106+ sw_apm_service_key,
107+
108+ sw_apm_data_center,
109+ sw_apm_collector,
110+ sw_exporter_otlp_endpoint,
111+ sw_exporter_otlp_traces_endpoint,
112+ sw_exporter_otlp_metrics_endpoint,
113+ sw_exporter_otlp_logs_endpoint,
114+ sw_exporter_otlp_profiles_endpoint,
115+ } = envy:: from_env ( ) . unwrap_or_default ( ) ;
116+
117+ let service_key = sw_apm_service_key. as_ref ( ) . and_then ( |s| s. split_once ( ':' ) ) ;
118+
119+ let service_name = otel_service_name
73120 . or_else ( || service_key. map ( |( name, _) | name. to_string ( ) ) )
74- . or_else ( || env :: var ( "AWS_LAMBDA_FUNCTION_NAME" ) . ok ( ) )
121+ . or ( aws_lambda_function_name )
75122 . context ( "missing service name" ) ?;
76123
77- let api_token = env:: var ( "SW_APM_API_TOKEN" )
78- . ok ( )
79- . or_else ( || service_key. map ( |( _, token) | token. to_string ( ) ) ) . unwrap_or_else ( || {
124+ let managed =
125+ aws_lambda_initialization_type. is_some_and ( |v| v == "lambda-managed-instances" ) ;
126+ let api_host = aws_lambda_runtime_api. unwrap_or_else ( || Self :: API_HOST . to_string ( ) ) ;
127+
128+ let api_token = sw_apm_api_token
129+ . or_else ( || service_key. map ( |( _, token) | token. to_string ( ) ) )
130+ . unwrap_or_else ( || {
80131 eprintln ! ( "Missing SolarWinds APM API token. Please set the `SW_APM_API_TOKEN` environment variable to enable sampling." ) ;
81132 "missing" . to_string ( )
82133 } ) ;
83134
84- let data_center = env:: var ( "SW_APM_DATA_CENTER" )
85- . ok ( )
86- . unwrap_or_else ( || "na-01" . to_string ( ) ) ;
135+ let data_center = sw_apm_data_center. unwrap_or_else ( || "na-01" . to_string ( ) ) ;
136+ let mut collector = sw_apm_collector
137+ . unwrap_or_else ( || format ! ( "https://apm.collector.{data_center}.cloud.solarwinds.com" ) ) ;
138+ let mut exporter = sw_exporter_otlp_endpoint
139+ . unwrap_or_else ( || collector. replace ( "apm.collector" , "otel.collector" ) ) ;
87140
88- let api_host =
89- env:: var ( "AWS_LAMBDA_RUNTIME_API" ) . unwrap_or_else ( |_| Self :: API_HOST . to_string ( ) ) ;
141+ for url in [ & mut collector, & mut exporter] {
142+ if !url. starts_with ( "https://" ) && !url. starts_with ( "http://" ) {
143+ * url = format ! ( "https://{url}" ) ;
144+ }
145+ }
90146
91147 let executable = env:: current_exe ( )
92148 . ok ( )
@@ -96,31 +152,26 @@ impl Config {
96152 } )
97153 . unwrap_or_else ( || env ! ( "CARGO_PKG_NAME" ) . to_string ( ) ) ;
98154
99- let managed = env:: var ( "AWS_LAMBDA_INITIALIZATION_TYPE" )
100- . is_ok_and ( |v| v == "lambda-managed-instances" ) ;
155+ let compression = sw_exporter_compression
156+ . and_then ( |c| match c. to_lowercase ( ) . trim ( ) {
157+ "gzip" | "gz" => Some ( Compression :: Gzip ) ,
158+ "zstd" => Some ( Compression :: Zstd ) ,
159+ _ => None ,
160+ } )
161+ . unwrap_or ( Compression :: Gzip ) ;
101162
102163 Ok ( Arc :: new ( Self {
103164 urls : UrlsConfig {
104- settings : format ! (
105- "https://apm.collector.{data_center}.cloud.solarwinds.com/v1/settings/{service_name}/{service_name}" ,
106- ) ,
165+ settings : format ! ( "{collector}/v1/settings/{service_name}/{service_name}" , ) ,
107166 exporters : ExportersUrlsConfig {
108- traces : format ! (
109- "https://otel.collector.{data_center}.cloud.solarwinds.com{}" ,
110- Self :: TRACES_ROUTE
111- ) ,
112- metrics : format ! (
113- "https://otel.collector.{data_center}.cloud.solarwinds.com{}" ,
114- Self :: METRICS_ROUTE
115- ) ,
116- logs : format ! (
117- "https://otel.collector.{data_center}.cloud.solarwinds.com{}" ,
118- Self :: LOGS_ROUTE
119- ) ,
120- profiles : format ! (
121- "https://otel.collector.{data_center}.cloud.solarwinds.com{}" ,
122- Self :: PROFILES_ROUTE
123- ) ,
167+ traces : sw_exporter_otlp_traces_endpoint
168+ . unwrap_or_else ( || format ! ( "{exporter}{}" , Self :: TRACES_ROUTE ) ) ,
169+ metrics : sw_exporter_otlp_metrics_endpoint
170+ . unwrap_or_else ( || format ! ( "{exporter}{}" , Self :: METRICS_ROUTE ) ) ,
171+ logs : sw_exporter_otlp_logs_endpoint
172+ . unwrap_or_else ( || format ! ( "{exporter}{}" , Self :: LOGS_ROUTE ) ) ,
173+ profiles : sw_exporter_otlp_profiles_endpoint
174+ . unwrap_or_else ( || format ! ( "{exporter}{}" , Self :: PROFILES_ROUTE ) ) ,
124175 } ,
125176 extension : ExtensionUrlsConfig {
126177 register : format ! (
@@ -151,6 +202,7 @@ impl Config {
151202
152203 executable,
153204 managed,
205+ compression,
154206 } ) )
155207 }
156208}
0 commit comments