@@ -23,11 +23,19 @@ export interface OTLPExporterEndpoint {
2323
2424// TODO: when we have more, include a key that defines this exporter type
2525export interface OTLPExporter extends OTLPExporterEndpoint {
26- traces ?: OTLPExporterEndpoint ;
26+ _type ?: string
27+ traces ?: OTLPExporterEndpoint | DatadogExporter ;
2728 metrics ?: OTLPExporterEndpoint ;
2829 logs ?: OTLPExporterEndpoint ;
2930}
3031
32+ export interface DatadogExporter {
33+ _type ?: string
34+ region ?: string
35+ custom_endpoint ?: string
36+ api_key ?: string
37+ }
38+
3139export interface Options {
3240 enabled ?: boolean ;
3341 pid_file ?: string ;
@@ -39,7 +47,11 @@ export interface Options {
3947 otlp_receiver_traces_disabled ?: boolean ;
4048 otlp_receiver_metrics_disabled ?: boolean ;
4149 otlp_receiver_logs_disabled ?: boolean ;
42- exporter ?: OTLPExporter ;
50+ exporter ?: OTLPExporter | DatadogExporter ;
51+ exporters ?: Record < string , OTLPExporter | DatadogExporter | undefined >
52+ exporters_metrics ?: string [ ] | undefined
53+ exporters_traces ?: string [ ] | undefined
54+ exporters_logs ?: string [ ] | undefined
4355}
4456
4557export class Config {
@@ -84,26 +96,74 @@ export class Config {
8496 otlp_receiver_logs_disabled : as_bool ( rotel_env ( "OTLP_RECEIVER_LOGS_DISABLED" ) ) ,
8597 } ;
8698
87- const exporter_type = as_lower ( rotel_env ( "EXPORTER" ) ) ;
88- if ( exporter_type === null || exporter_type === "otlp" ) {
89- let exporter : OTLPExporter = Config . _load_otlp_exporter_options_from_env ( null ) as OTLPExporter ;
90- if ( exporter === null ) {
91- // make sure we always construct the top-level exporter config
92- exporter = { } ;
93- }
94- env . exporter = exporter ;
99+ const exporters = as_lower ( rotel_env ( "EXPORTERS" ) ) ;
100+ if ( exporters !== null && exporters !== undefined ) {
101+ env [ "exporters" ] = { } ;
102+ for ( const exporterStr of exporters . split ( "," ) ) {
103+ let name = exporterStr ;
104+ let value = exporterStr ;
105+ if ( exporterStr . includes ( ":" ) ) {
106+ [ name , value ] = exporterStr . split ( ":" , 2 ) ;
107+ }
95108
96- const traces_endpoint = Config . _load_otlp_exporter_options_from_env ( "TRACES" ) ;
97- if ( traces_endpoint !== null ) {
98- exporter . traces = traces_endpoint ;
99- }
100- const metrics_endpoint = Config . _load_otlp_exporter_options_from_env ( "METRICS" ) ;
101- if ( metrics_endpoint !== null ) {
102- exporter . metrics = metrics_endpoint ;
109+ let exporter : OTLPExporter | DatadogExporter | undefined = undefined ;
110+ let pfx = "EXPORTER_" + name . toUpperCase + "_"
111+ switch ( value ) {
112+ case "otlp" :
113+ exporter = Config . _load_otlp_exporter_options_from_env ( pfx , "OTLPExporter" ) as OTLPExporter ;
114+ exporter . _type = "otlp"
115+ if ( exporter === null || exporter === undefined ) {
116+ exporter = { } ;
117+ exporter . _type = "otlp" ;
118+ }
119+ case "datadog" :
120+ const datadogExporter : DatadogExporter = {
121+ _type : "datadog" ,
122+ region : rotel_env ( pfx + "REGION" ) ,
123+ custom_endpoint : rotel_env ( pfx + "CUSTOM_ENDPOINT" ) ,
124+ api_key : rotel_env ( pfx + "API_KEY" ) ,
125+ } ;
126+ exporter = datadogExporter ;
127+ }
128+ if ( exporter !== undefined ) {
129+ env . exporters [ name ] = exporter ;
130+ }
103131 }
104- const logs_endpoint = Config . _load_otlp_exporter_options_from_env ( "LOGS" ) ;
105- if ( logs_endpoint != null ) {
106- exporter . logs = logs_endpoint ;
132+ env . exporters_traces = as_list ( rotel_env ( "EXPORTERS_TRACES" ) )
133+ env . exporters_metrics = as_list ( rotel_env ( "EXPORTERS_METRICS" ) )
134+ env . exporters_logs = as_list ( rotel_env ( "EXPORTERS_LOGS" ) )
135+ } else {
136+ const exporter_type = as_lower ( rotel_env ( "EXPORTER" ) ) ;
137+ if ( exporter_type === null || exporter_type === "otlp" ) {
138+ let exporter : OTLPExporter = Config . _load_otlp_exporter_options_from_env ( "OTLP_EXPORTER_" , null ) as OTLPExporter ;
139+ if ( exporter === null ) {
140+ // make sure we always construct the top-level exporter config
141+ exporter = { } ;
142+ }
143+ exporter . _type = "otlp" ;
144+ env . exporter = exporter ;
145+
146+ const traces_endpoint = Config . _load_otlp_exporter_options_from_env ( "OTLP_EXPORTER_TRACES_" , "TRACES" ) ;
147+ if ( traces_endpoint !== null ) {
148+ exporter . traces = traces_endpoint ;
149+ }
150+ const metrics_endpoint = Config . _load_otlp_exporter_options_from_env ( "OTLP_EXPORTER_METRICS_" , "METRICS" ) ;
151+ if ( metrics_endpoint !== null ) {
152+ exporter . metrics = metrics_endpoint ;
153+ }
154+ const logs_endpoint = Config . _load_otlp_exporter_options_from_env ( "OTLP_EXPORTER_LOGS_" , "LOGS" ) ;
155+ if ( logs_endpoint != null ) {
156+ exporter . logs = logs_endpoint ;
157+ }
158+ } else if ( exporter_type === "datadog" ) {
159+ const pfx = "DATADOG_EXPORTER_"
160+ var c : DatadogExporter = {
161+ _type : "datadog" ,
162+ region : rotel_env ( pfx + "REGION" ) ,
163+ custom_endpoint : rotel_env ( pfx + "CUSTOM_ENDPOINT" ) ,
164+ api_key : rotel_env ( pfx + "API_KEY" ) ,
165+ }
166+ env . exporter = c ;
107167 }
108168 }
109169
@@ -117,11 +177,20 @@ export class Config {
117177 return final_env ;
118178 }
119179
120- static _load_otlp_exporter_options_from_env ( endpoint_type : string | null ) : OTLPExporter | OTLPExporterEndpoint | undefined {
121- let pfx = "OTLP_EXPORTER_" ;
122- if ( endpoint_type !== null ) {
123- pfx += `${ endpoint_type } _` ;
124- }
180+ static _load_datadog_exporter_options_from_env ( pfx : string ) : DatadogExporter {
181+ const datadogExporter : DatadogExporter = {
182+ region : rotel_env ( pfx + "REGION" ) ,
183+ custom_endpoint : rotel_env ( pfx + "CUSTOM_ENDPOINT" ) ,
184+ api_key : rotel_env ( pfx + "API_KEY" ) ,
185+ } ;
186+ return datadogExporter ;
187+ }
188+
189+ static _load_otlp_exporter_options_from_env ( pfx : string , endpoint_type : string | null ) : OTLPExporter | OTLPExporterEndpoint | undefined {
190+ // let pfx = "OTLP_EXPORTER_";
191+ // if (endpoint_type !== null) {
192+ // pfx += `${endpoint_type}_`;
193+ // }
125194 const endpoint : OTLPExporterEndpoint = {
126195 endpoint : rotel_env ( pfx + "ENDPOINT" ) ,
127196 protocol : as_lower ( rotel_env ( pfx + "PROTOCOL" ) ) ,
@@ -170,20 +239,30 @@ export class Config {
170239
171240 const exporter = opts . exporter ;
172241 if ( exporter !== undefined ) {
173- _set_otlp_exporter_agent_env ( updates , null , exporter ) ;
174-
175- const traces = exporter . traces ;
176- if ( traces !== undefined ) {
177- _set_otlp_exporter_agent_env ( updates , "TRACES" , traces ) ;
178- }
242+ console . log ( "exporter._type in build_agent_environment is " + exporter . _type ) ;
243+ switch ( exporter . _type ) {
244+ case "otlp" || undefined :
245+ const otlpExporter : OTLPExporter = < OTLPExporter > exporter ;
246+ _set_otlp_exporter_agent_env ( updates , null , exporter ) ;
247+
248+ const traces = otlpExporter . traces ;
249+ if ( traces !== undefined ) {
250+ _set_otlp_exporter_agent_env ( updates , "TRACES" , traces ) ;
251+ }
179252
180- const metrics = exporter . metrics ;
181- if ( metrics !== undefined ) {
182- _set_otlp_exporter_agent_env ( updates , "METRICS" , metrics ) ;
183- }
184- const logs = exporter . logs ;
185- if ( logs !== undefined ) {
186- _set_otlp_exporter_agent_env ( updates , "LOGS" , logs ) ;
253+ const metrics = otlpExporter . metrics ;
254+ if ( metrics !== undefined ) {
255+ _set_otlp_exporter_agent_env ( updates , "METRICS" , metrics ) ;
256+ }
257+ const logs = otlpExporter . logs ;
258+ if ( logs !== undefined ) {
259+ _set_otlp_exporter_agent_env ( updates , "LOGS" , logs ) ;
260+ }
261+ break ;
262+ case "datadog" :
263+ const datadogExporter : DatadogExporter = < DatadogExporter > exporter ;
264+ _set_datadog_exporter_agent_env ( updates , "DATADOG_EXPORTER_" , exporter ) ;
265+ break ;
187266 }
188267 }
189268
@@ -217,10 +296,19 @@ export class Config {
217296
218297 const exporter = this . options . exporter ;
219298 if ( exporter !== undefined ) {
220- const protocol = exporter . protocol ;
221- if ( protocol !== undefined && protocol !== 'grpc' && protocol !== 'http' ) {
222- console . error ( "exporter protocol must be 'grpc' or 'http'" ) ;
223- return false ;
299+ if ( exporter . _type === undefined ) {
300+ exporter . _type = "otlp"
301+ }
302+ switch ( exporter . _type ) {
303+ case "otlp" :
304+ const otlpExporter : OTLPExporter = < OTLPExporter > exporter ;
305+ const protocol = otlpExporter . protocol ;
306+ console . log ( "protocol is " + protocol ) ;
307+ if ( protocol !== undefined && protocol !== 'grpc' && protocol !== 'http' ) {
308+ console . error ( "exporter protocol must be 'grpc' or 'http'" ) ;
309+ return false ;
310+ }
311+
224312 }
225313 }
226314
@@ -234,6 +322,15 @@ export class Config {
234322 }
235323}
236324
325+ function _set_datadog_exporter_agent_env ( updates : Record < string , any > , pfx : string , exporter : DatadogExporter ) {
326+ Object . assign ( updates , {
327+ [ pfx + "EXPORTER" ] : "datadog" ,
328+ [ pfx + "REGION" ] : exporter . region ,
329+ [ pfx + "CUSTOM_ENDPOINT" ] : exporter . custom_endpoint ,
330+ [ pfx + "API_KEY" ] : exporter . api_key ,
331+ } )
332+ }
333+
237334function _set_otlp_exporter_agent_env ( updates : Record < string , any > , endpoint_type : string | null , exporter : OTLPExporter | OTLPExporterEndpoint | null ) : void {
238335 let pfx = "OTLP_EXPORTER_" ;
239336 if ( endpoint_type !== null ) {
@@ -317,6 +414,8 @@ function as_bool(value: string | null | undefined): boolean | undefined {
317414}
318415
319416function rotel_env ( base_key : string ) : string | undefined {
417+ // let key = rotel_expand_env_key(base_key);
418+ // console.log("key is " + key);
320419 const envVar = process . env [ rotel_expand_env_key ( base_key ) ] ;
321420 return envVar !== undefined ? envVar : undefined ;
322421}
0 commit comments