Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions experimental/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ For notes on migrating to 2.x / 0.200.x see [the upgrade guide](doc/upgrade-to-2
* feat(opentelemetry-configuration): Parse of Configuration File [#5875](https://github.com/open-telemetry/opentelemetry-js/pull/5875) @maryliag
* feat(opentelemetry-configuration): parse of array objects on configuration file [#5947](https://github.com/open-telemetry/opentelemetry-js/pull/5947) @maryliag
* feat(opentelemetry-configuration): parse of environment variables on configuration file [#5947](https://github.com/open-telemetry/opentelemetry-js/pull/5947) @maryliag
* feat(opentelemetry-configuration): parse more parameters from config file [#5955](https://github.com/open-telemetry/opentelemetry-js/pull/5955) @maryliag

### :bug: Bug Fixes

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,13 +96,13 @@ function setAttributeLimits(config: ConfigurationModel): void {
}

function setPropagators(config: ConfigurationModel): void {
const propagators = getStringListFromEnv('OTEL_PROPAGATORS');
if (propagators) {
config.propagator = {
composite: propagators,
composite_list:
getStringFromEnv('OTEL_PROPAGATORS') || 'tracecontext,baggage',
};
const composite = getStringListFromEnv('OTEL_PROPAGATORS');
if (composite) {
config.propagator.composite = composite;
}
const compositeList = getStringFromEnv('OTEL_PROPAGATORS');
if (compositeList) {
config.propagator.composite_list = compositeList;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,11 @@

import { diagLogLevelFromString, getStringFromEnv } from '@opentelemetry/core';
import {
AttributeLimits,
ConfigAttributes,
ConfigLoggerProvider,
ConfigMeterProvider,
ConfigTracerProvider,
ConfigurationModel,
initializeDefaultConfiguration,
} from './configModel';
Expand All @@ -26,10 +30,12 @@ import * as yaml from 'yaml';
import {
getBooleanFromConfigFile,
getBooleanListFromConfigFile,
getListFromObjectsFromConfigFile,
getNumberFromConfigFile,
getNumberListFromConfigFile,
getStringFromConfigFile,
getStringListFromConfigFile,
isPropagator,
} from './utils';

export class FileConfigProvider implements ConfigProvider {
Expand Down Expand Up @@ -98,6 +104,11 @@ function parseConfigFile(config: ConfigurationModel) {
}

setResourceAttributes(config, parsedContent['resource']?.['attributes']);
setAttributeLimits(config, parsedContent['attribute_limits']);
setPropagator(config, parsedContent['propagator']);
setTracerProvider(config, parsedContent['tracer_provider']);
setMeterProvider(config, parsedContent['meter_provider']);
setLoggerProvider(config, parsedContent['logger_provider']);
} else {
throw new Error(
`Unsupported File Format: ${parsedContent['file_format']}. It must be one of the following: ${supportedFileVersions}`
Expand Down Expand Up @@ -145,3 +156,152 @@ function setResourceAttributes(
}
}
}

function setAttributeLimits(
config: ConfigurationModel,
attrLimits: AttributeLimits
) {
if (attrLimits) {
const lengthLimit = getNumberFromConfigFile(
attrLimits['attribute_value_length_limit']
);
if (lengthLimit) {
config.attribute_limits.attribute_value_length_limit = lengthLimit;
}
const countLimit = getNumberFromConfigFile(
attrLimits['attribute_count_limit']
);
if (countLimit) {
config.attribute_limits.attribute_count_limit = countLimit;
}
}
}

function setPropagator(config: ConfigurationModel, propagator: unknown): void {
if (propagator && isPropagator(propagator)) {
let composite = getListFromObjectsFromConfigFile(
propagator['composite'] as unknown as object[]
);
const compositeList = getStringListFromConfigFile(
propagator['composite_list']
);
if (composite === undefined) {
composite = [];
}
if (compositeList) {
for (let i = 0; i < compositeList.length; i++) {
if (!composite.includes(compositeList[i])) {
composite.push(compositeList[i]);
}
}
}

if (composite.length > 0) {
config.propagator.composite = composite;
}
const compositeListString = getStringFromConfigFile(
propagator['composite_list']
);
if (compositeListString) {
config.propagator.composite_list = compositeListString;
}
}
}

function setTracerProvider(
config: ConfigurationModel,
tracerProvider: ConfigTracerProvider
): void {
if (tracerProvider) {
// Limits
if (tracerProvider['limits']) {
const attributeValueLengthLimit = getNumberFromConfigFile(
tracerProvider['limits']['attribute_value_length_limit']
);

if (attributeValueLengthLimit) {
config.tracer_provider.limits.attribute_value_length_limit =
attributeValueLengthLimit;
}

const attributeCountLimit = getNumberFromConfigFile(
tracerProvider['limits']['attribute_count_limit']
);
if (attributeCountLimit) {
config.tracer_provider.limits.attribute_count_limit =
attributeCountLimit;
}

const eventCountLimit = getNumberFromConfigFile(
tracerProvider['limits']['event_count_limit']
);
if (eventCountLimit) {
config.tracer_provider.limits.event_count_limit = eventCountLimit;
}

const linkCountLimit = getNumberFromConfigFile(
tracerProvider['limits']['link_count_limit']
);
if (linkCountLimit) {
config.tracer_provider.limits.link_count_limit = linkCountLimit;
}

const eventAttributeCountLimit = getNumberFromConfigFile(
tracerProvider['limits']['event_attribute_count_limit']
);
if (eventAttributeCountLimit) {
config.tracer_provider.limits.event_attribute_count_limit =
eventAttributeCountLimit;
}

const linkAttributeCountLimit = getNumberFromConfigFile(
tracerProvider['limits']['link_attribute_count_limit']
);
if (linkAttributeCountLimit) {
config.tracer_provider.limits.link_attribute_count_limit =
linkAttributeCountLimit;
}
}
}
}

function setMeterProvider(
config: ConfigurationModel,
meterProvider: ConfigMeterProvider
): void {
if (meterProvider) {
const exemplarFilter = getStringFromConfigFile(
meterProvider['exemplar_filter']
);
if (
exemplarFilter &&
(exemplarFilter === 'trace_based' ||
exemplarFilter === 'always_on' ||
exemplarFilter === 'always_off')
) {
config.meter_provider.exemplar_filter = exemplarFilter;
}
}
}

function setLoggerProvider(
config: ConfigurationModel,
loggerProvider: ConfigLoggerProvider
): void {
if (loggerProvider) {
const attributeValueLengthLimit = getNumberFromConfigFile(
loggerProvider['limits']['attribute_value_length_limit']
);
if (attributeValueLengthLimit) {
config.logger_provider.limits.attribute_value_length_limit =
attributeValueLengthLimit;
}

const attributeCountLimit = getNumberFromConfigFile(
loggerProvider['limits']['attribute_count_limit']
);
if (attributeCountLimit) {
config.logger_provider.limits.attribute_count_limit = attributeCountLimit;
}
}
}
59 changes: 58 additions & 1 deletion experimental/packages/opentelemetry-configuration/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import { diag } from '@opentelemetry/api';
import { getStringFromEnv } from '@opentelemetry/core';
import { inspect } from 'util';
import { ConfigPropagator } from './configModel';

/**
* Retrieves a boolean value from a configuration file parameter.
Expand Down Expand Up @@ -156,12 +157,39 @@ export function getStringListFromConfigFile(
.filter(s => s !== '');
}

/**
* Retrieves a list of strings from a configuration file parameter
* that is a list of objects.
* e.g. Parsing the value of `composite` such as
* composite:
* - tracecontext:
* - baggage:
* - b3:
* returns ['tracecontext', 'baggage', 'b3']
* @param value - The value from the config file.
* @returns {string[] | undefined} - The list of strings or `undefined`.
*/
export function getListFromObjectsFromConfigFile(
value: object[] | undefined
): string[] | undefined {
if (value) {
const list: string[] = [];
for (let i = 0; i < value.length; i++) {
list.push(...Object.keys(value[i]));
}
if (list.length > 0) {
return list;
}
}
return undefined;
}

export function envVariableSubstitution(value: unknown): string | undefined {
if (value == null) {
return undefined;
}

const matches = String(value).match(/\$\{[a-zA-Z0-9_:.-]*\}/g);
const matches = String(value).match(/\$\{[a-zA-Z0-9,=_:.-]*\}/g);
if (matches) {
let stringValue = String(value);
for (const match of matches) {
Expand All @@ -174,3 +202,32 @@ export function envVariableSubstitution(value: unknown): string | undefined {
}
return String(value);
}

export function isPropagator(
propagator: unknown
): propagator is Partial<ConfigPropagator> {
if (propagator == null) {
return false;
}
if (typeof propagator === 'object') {
if ('composite' in propagator) {
if (Array.isArray(propagator.composite)) {
for (let i = 0; i < propagator.composite.length; i++) {
const element = propagator.composite[i];
if (typeof element !== 'object') {
Comment thread
pichlermarc marked this conversation as resolved.
Outdated
return false;
}
}
} else {
return false;
}
}
if ('composite_list' in propagator) {
if (typeof propagator.composite_list !== 'string') {
return false;
}
}
return true;
}
return false;
}
Original file line number Diff line number Diff line change
Expand Up @@ -164,10 +164,19 @@ const configFromFile: Configuration = {
},
attribute_limits: {
attribute_count_limit: 128,
attribute_value_length_limit: 4096,
},
propagator: {
composite: ['tracecontext', 'baggage'],
composite_list: 'tracecontext,baggage',
composite: [
'tracecontext',
'baggage',
'b3',
'b3multi',
'jaeger',
'ottrace',
'xray',
],
composite_list: 'tracecontext,baggage,b3,b3multi,jaeger,ottrace,xray',
},
tracer_provider: {
processors: [
Expand All @@ -188,6 +197,7 @@ const configFromFile: Configuration = {
],
limits: {
attribute_count_limit: 128,
attribute_value_length_limit: 4096,
event_count_limit: 128,
link_count_limit: 128,
event_attribute_count_limit: 128,
Expand Down Expand Up @@ -241,6 +251,7 @@ const configFromFile: Configuration = {
],
limits: {
attribute_count_limit: 128,
attribute_value_length_limit: 4096,
},
},
};
Expand Down Expand Up @@ -844,7 +855,7 @@ describe('ConfigProvider', function () {
'metric-temporality';
process.env.OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION =
'metric-hist-agg';
process.env.OTEL_METRICS_EXEMPLAR_FILTER = 'metric-exemplar-filter';
process.env.OTEL_METRICS_EXEMPLAR_FILTER = 'always_off';
process.env.OTEL_BLRP_SCHEDULE_DELAY = '23';
process.env.OTEL_BLRP_EXPORT_TIMEOUT = '24';
process.env.OTEL_BLRP_MAX_QUEUE_SIZE = '25';
Expand All @@ -861,7 +872,7 @@ describe('ConfigProvider', function () {
process.env.OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT = '29';
const configProvider = createConfigProvider();
const expectedConfig: Configuration = {
...defaultConfig,
...defaultConfigFromFileWithEnvVariables,
resource: {
attributes_list: 'attributes',
attributes: [
Expand All @@ -872,6 +883,36 @@ describe('ConfigProvider', function () {
},
],
},
attribute_limits: {
attribute_count_limit: 7,
attribute_value_length_limit: 23,
},
propagator: {
composite: ['prop'],
composite_list: 'prop',
},
tracer_provider: {
...defaultConfigFromFileWithEnvVariables.tracer_provider,
limits: {
attribute_value_length_limit: 14,
attribute_count_limit: 15,
event_count_limit: 16,
link_count_limit: 17,
event_attribute_count_limit: 18,
link_attribute_count_limit: 19,
},
},
meter_provider: {
...defaultConfigFromFileWithEnvVariables.meter_provider,
exemplar_filter: 'always_off',
},
logger_provider: {
...defaultConfigFromFileWithEnvVariables.logger_provider,
limits: {
attribute_value_length_limit: 28,
attribute_count_limit: 29,
},
},
};

assert.deepStrictEqual(
Expand Down
Loading