Skip to content

Commit 10ad545

Browse files
maryliagdavid-lunapichlermarccjihrigtimfish
authored
feat(opentelemetry-configuration): parse logger provider from config file (#5995)
Co-authored-by: David Luna <[email protected]> Co-authored-by: Marc Pichler <[email protected]> Co-authored-by: Colin Ihrig <[email protected]> Co-authored-by: Tim Fish <[email protected]>
1 parent 8fa5242 commit 10ad545

File tree

9 files changed

+684
-119
lines changed

9 files changed

+684
-119
lines changed

experimental/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2
5959
* feat(opentelemetry-configuration): parse more parameters from config file [#5955](https://github.com/open-telemetry/opentelemetry-js/pull/5955) @maryliag
6060
* feat(exporter-prometheus): support withoutTargetInfo option [#5962](https://github.com/open-telemetry/opentelemetry-js/pull/5962) @cjihrig
6161
* feat(opentelemetry-configuration): parse trace provider from config file [#5992](https://github.com/open-telemetry/opentelemetry-js/pull/5992) @maryliag
62+
* feat(opentelemetry-configuration): parse logger provider from config file [#5995](https://github.com/open-telemetry/opentelemetry-js/pull/5995) @maryliag
6263
* feat(opentelemetry-configuration): parse config file with format 1.0-rc.2 [#6029](https://github.com/open-telemetry/opentelemetry-js/pull/6029) @maryliag
6364

6465
### :bug: Bug Fixes

experimental/packages/opentelemetry-configuration/src/EnvironmentConfigProvider.ts

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ export class EnvironmentConfigProvider implements ConfigProvider {
6262
}
6363
}
6464

65-
function setResources(config: ConfigurationModel): void {
65+
export function setResources(config: ConfigurationModel): void {
6666
if (config.resource == null) {
6767
config.resource = {};
6868
}
@@ -84,7 +84,7 @@ function setResources(config: ConfigurationModel): void {
8484
}
8585
}
8686

87-
function setAttributeLimits(config: ConfigurationModel): void {
87+
export function setAttributeLimits(config: ConfigurationModel): void {
8888
const attributeValueLengthLimit = getNumberFromEnv(
8989
'OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT'
9090
);
@@ -106,7 +106,7 @@ function setAttributeLimits(config: ConfigurationModel): void {
106106
}
107107
}
108108

109-
function setPropagators(config: ConfigurationModel): void {
109+
export function setPropagators(config: ConfigurationModel): void {
110110
if (config.propagator == null) {
111111
config.propagator = {};
112112
}
@@ -123,7 +123,7 @@ function setPropagators(config: ConfigurationModel): void {
123123
}
124124
}
125125

126-
function setTracerProvider(config: ConfigurationModel): void {
126+
export function setTracerProvider(config: ConfigurationModel): void {
127127
if (config.tracer_provider == null) {
128128
config.tracer_provider = { processors: [] };
129129
}
@@ -349,17 +349,17 @@ function setMeterProvider(config: ConfigurationModel): void {
349349
}
350350
}
351351

352-
function setLoggerProvider(config: ConfigurationModel): void {
352+
export function setLoggerProvider(config: ConfigurationModel): void {
353+
if (config.logger_provider == null) {
354+
config.logger_provider = { processors: [] };
355+
}
353356
const attributeValueLengthLimit = getNumberFromEnv(
354357
'OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT'
355358
);
356359
const attributeCountLimit = getNumberFromEnv(
357360
'OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT'
358361
);
359362
if (attributeValueLengthLimit || attributeCountLimit) {
360-
if (config.logger_provider == null) {
361-
config.logger_provider = {};
362-
}
363363
if (config.logger_provider.limits == null) {
364364
config.logger_provider.limits = { attribute_count_limit: 128 };
365365
}
@@ -442,12 +442,6 @@ function setLoggerProvider(config: ConfigurationModel): void {
442442
batch.exporter.otlp_http.headers_list = headersList;
443443
}
444444

445-
if (config.logger_provider == null) {
446-
config.logger_provider = { processors: [{}] };
447-
}
448-
if (config.logger_provider?.processors == null) {
449-
config.logger_provider.processors = [{}];
450-
}
451445
config.logger_provider.processors[0].batch = batch;
452446
}
453447
}

experimental/packages/opentelemetry-configuration/src/FileConfigProvider.ts

Lines changed: 161 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@
1717
import { diagLogLevelFromString, getStringFromEnv } from '@opentelemetry/core';
1818
import {
1919
AttributeLimits,
20-
ConfigAttributes,
21-
LoggerProvider,
2220
MeterProvider,
2321
Propagator,
2422
ConfigurationModel,
@@ -41,6 +39,12 @@ import {
4139
SpanProcessor,
4240
TracerProvider,
4341
} from './models/tracerProviderModel';
42+
import {
43+
LoggerProvider,
44+
LogRecordExporter,
45+
LogRecordProcessor,
46+
} from './models/loggerProviderModel';
47+
import { AttributeNameValue } from './models/resourceModel';
4448

4549
export class FileConfigProvider implements ConfigProvider {
4650
private _config: ConfigurationModel;
@@ -71,7 +75,7 @@ export function hasValidConfigFile(): boolean {
7175
return false;
7276
}
7377

74-
function parseConfigFile(config: ConfigurationModel) {
78+
export function parseConfigFile(config: ConfigurationModel) {
7579
const supportedFileVersions = ['1.0-rc.1', '1.0-rc.2'];
7680
const configFile = getStringFromEnv('OTEL_EXPERIMENTAL_CONFIG_FILE') || '';
7781
const file = fs.readFileSync(configFile, 'utf8');
@@ -125,9 +129,9 @@ function parseConfigFile(config: ConfigurationModel) {
125129
}
126130
}
127131

128-
function setResourceAttributes(
132+
export function setResourceAttributes(
129133
config: ConfigurationModel,
130-
attributes: ConfigAttributes[]
134+
attributes: AttributeNameValue[]
131135
) {
132136
if (attributes) {
133137
if (config.resource == null) {
@@ -169,7 +173,7 @@ function setResourceAttributes(
169173
}
170174
}
171175

172-
function setAttributeLimits(
176+
export function setAttributeLimits(
173177
config: ConfigurationModel,
174178
attrLimits: AttributeLimits
175179
) {
@@ -194,7 +198,7 @@ function setAttributeLimits(
194198
}
195199
}
196200

197-
function setPropagator(
201+
export function setPropagator(
198202
config: ConfigurationModel,
199203
propagator: Propagator
200204
): void {
@@ -254,9 +258,18 @@ function getConfigHeaders(
254258
return null;
255259
}
256260

257-
function parseConfigExporter(exporter: SpanExporter): SpanExporter {
261+
enum ProviderType {
262+
TRACER = 0,
263+
METER = 1,
264+
LOGGER = 2,
265+
}
266+
267+
function parseConfigExporter(
268+
exporter: SpanExporter | LogRecordExporter,
269+
providerType: ProviderType
270+
): SpanExporter | LogRecordExporter {
258271
const exporterType = Object.keys(exporter)[0];
259-
let parsedExporter: SpanExporter = {};
272+
let parsedExporter: SpanExporter | LogRecordExporter = {};
260273
let e;
261274
let certFile;
262275
let clientCertFile;
@@ -265,15 +278,26 @@ function parseConfigExporter(exporter: SpanExporter): SpanExporter {
265278
let headers;
266279
let headersList;
267280
let insecure;
281+
let endpoint;
282+
283+
switch (providerType) {
284+
case ProviderType.TRACER:
285+
endpoint = 'http://localhost:4318/v1/traces';
286+
parsedExporter = parsedExporter as SpanExporter;
287+
break;
288+
case ProviderType.LOGGER:
289+
endpoint = 'http://localhost:4318/v1/logs';
290+
parsedExporter = parsedExporter as LogRecordExporter;
291+
break;
292+
}
293+
268294
switch (exporterType) {
269295
case 'otlp_http':
270296
e = exporter['otlp_http'];
271297
if (e) {
272298
parsedExporter = {
273299
otlp_http: {
274-
endpoint:
275-
getStringFromConfigFile(e['endpoint']) ??
276-
'http://localhost:4318/v1/traces',
300+
endpoint: getStringFromConfigFile(e['endpoint']) ?? endpoint,
277301
timeout: getNumberFromConfigFile(e['timeout']) ?? 10000,
278302
encoding:
279303
getStringFromConfigFile(e['encoding']) === 'json'
@@ -370,7 +394,7 @@ function parseConfigExporter(exporter: SpanExporter): SpanExporter {
370394
break;
371395

372396
case 'zipkin':
373-
e = exporter['zipkin'];
397+
e = (exporter as SpanExporter)['zipkin'];
374398
if (e) {
375399
parsedExporter = {
376400
zipkin: {
@@ -387,7 +411,7 @@ function parseConfigExporter(exporter: SpanExporter): SpanExporter {
387411
return parsedExporter;
388412
}
389413

390-
function setTracerProvider(
414+
export function setTracerProvider(
391415
config: ConfigurationModel,
392416
tracerProvider: TracerProvider
393417
): void {
@@ -460,7 +484,10 @@ function setTracerProvider(
460484
if (processorType === 'batch') {
461485
const element = tracerProvider['processors'][i]['batch'];
462486
if (element) {
463-
const parsedExporter = parseConfigExporter(element['exporter']);
487+
const parsedExporter = parseConfigExporter(
488+
element['exporter'],
489+
ProviderType.TRACER
490+
);
464491
const batchConfig: SpanProcessor = {
465492
batch: {
466493
schedule_delay:
@@ -472,7 +499,7 @@ function setTracerProvider(
472499
max_export_batch_size:
473500
getNumberFromConfigFile(element['max_export_batch_size']) ??
474501
512,
475-
exporter: parsedExporter,
502+
exporter: parsedExporter as SpanExporter,
476503
},
477504
};
478505

@@ -481,10 +508,13 @@ function setTracerProvider(
481508
} else if (processorType === 'simple') {
482509
const element = tracerProvider['processors'][i]['simple'];
483510
if (element) {
484-
const parsedExporter = parseConfigExporter(element['exporter']);
511+
const parsedExporter = parseConfigExporter(
512+
element['exporter'],
513+
ProviderType.TRACER
514+
);
485515
const simpleConfig: SpanProcessor = {
486516
simple: {
487-
exporter: parsedExporter,
517+
exporter: parsedExporter as SpanExporter,
488518
},
489519
};
490520

@@ -496,7 +526,7 @@ function setTracerProvider(
496526
}
497527
}
498528

499-
function setMeterProvider(
529+
export function setMeterProvider(
500530
config: ConfigurationModel,
501531
meterProvider: MeterProvider
502532
): void {
@@ -518,14 +548,15 @@ function setMeterProvider(
518548
}
519549
}
520550

521-
function setLoggerProvider(
551+
export function setLoggerProvider(
522552
config: ConfigurationModel,
523553
loggerProvider: LoggerProvider
524554
): void {
525555
if (loggerProvider) {
526556
if (config.logger_provider == null) {
527-
config.logger_provider = {};
557+
config.logger_provider = { processors: [] };
528558
}
559+
// Limits
529560
if (loggerProvider['limits']) {
530561
const attributeValueLengthLimit = getNumberFromConfigFile(
531562
loggerProvider['limits']['attribute_value_length_limit']
@@ -537,17 +568,124 @@ function setLoggerProvider(
537568
if (config.logger_provider.limits == null) {
538569
config.logger_provider.limits = { attribute_count_limit: 128 };
539570
}
540-
541571
if (attributeValueLengthLimit) {
542572
config.logger_provider.limits.attribute_value_length_limit =
543573
attributeValueLengthLimit;
544574
}
545-
546575
if (attributeCountLimit) {
547576
config.logger_provider.limits.attribute_count_limit =
548577
attributeCountLimit;
549578
}
550579
}
551580
}
581+
582+
// Processors
583+
if (loggerProvider['processors']) {
584+
if (loggerProvider['processors'].length > 0) {
585+
if (config.logger_provider == null) {
586+
config.logger_provider = { processors: [] };
587+
}
588+
config.logger_provider.processors = [];
589+
for (let i = 0; i < loggerProvider['processors'].length; i++) {
590+
const processorType = Object.keys(loggerProvider['processors'][i])[0];
591+
if (processorType === 'batch') {
592+
const element = loggerProvider['processors'][i]['batch'];
593+
if (element) {
594+
const parsedExporter = parseConfigExporter(
595+
element['exporter'],
596+
ProviderType.LOGGER
597+
);
598+
const batchConfig: LogRecordProcessor = {
599+
batch: {
600+
schedule_delay:
601+
getNumberFromConfigFile(element['schedule_delay']) ?? 1000,
602+
export_timeout:
603+
getNumberFromConfigFile(element['export_timeout']) ?? 30000,
604+
max_queue_size:
605+
getNumberFromConfigFile(element['max_queue_size']) ?? 2048,
606+
max_export_batch_size:
607+
getNumberFromConfigFile(element['max_export_batch_size']) ??
608+
512,
609+
exporter: parsedExporter as LogRecordExporter,
610+
},
611+
};
612+
613+
config.logger_provider.processors.push(batchConfig);
614+
}
615+
} else if (processorType === 'simple') {
616+
const element = loggerProvider['processors'][i]['simple'];
617+
if (element) {
618+
const parsedExporter = parseConfigExporter(
619+
element['exporter'],
620+
ProviderType.LOGGER
621+
);
622+
const simpleConfig: LogRecordProcessor = {
623+
simple: {
624+
exporter: parsedExporter,
625+
},
626+
};
627+
628+
config.logger_provider.processors.push(simpleConfig);
629+
}
630+
}
631+
}
632+
}
633+
}
634+
635+
// logger_configurator/development
636+
if (loggerProvider['logger_configurator/development']) {
637+
const defaultConfigDisabled = getBooleanFromConfigFile(
638+
loggerProvider['logger_configurator/development']['default_config']?.[
639+
'disabled'
640+
]
641+
);
642+
if (defaultConfigDisabled || defaultConfigDisabled === false) {
643+
if (config.logger_provider == null) {
644+
config.logger_provider = { processors: [] };
645+
}
646+
config.logger_provider['logger_configurator/development'] = {
647+
default_config: {
648+
disabled: defaultConfigDisabled,
649+
},
650+
};
651+
}
652+
653+
if (
654+
loggerProvider['logger_configurator/development'].loggers &&
655+
loggerProvider['logger_configurator/development'].loggers.length > 0
656+
) {
657+
const loggers = [];
658+
for (
659+
let i = 0;
660+
i < loggerProvider['logger_configurator/development'].loggers.length;
661+
i++
662+
) {
663+
const logger =
664+
loggerProvider['logger_configurator/development'].loggers[i];
665+
let disabled = false;
666+
if (logger['config']) {
667+
disabled =
668+
getBooleanFromConfigFile(logger['config']['disabled']) ?? false;
669+
}
670+
const name = getStringFromConfigFile(logger['name']);
671+
if (name) {
672+
loggers.push({
673+
name: name,
674+
config: {
675+
disabled: disabled,
676+
},
677+
});
678+
}
679+
}
680+
if (config.logger_provider == null) {
681+
config.logger_provider = { processors: [] };
682+
}
683+
if (config.logger_provider['logger_configurator/development'] == null) {
684+
config.logger_provider['logger_configurator/development'] = {};
685+
}
686+
config.logger_provider['logger_configurator/development'].loggers =
687+
loggers;
688+
}
689+
}
552690
}
553691
}

0 commit comments

Comments
 (0)