-
Notifications
You must be signed in to change notification settings - Fork 936
feat(opentelemetry-configuration): parse logger provider from config file #5995
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
5df60a4
2381346
b2bfada
8f60964
6933b03
9dec6ab
01497ab
aaaed79
2d0369c
bb00dc8
0ce3289
860aae1
2e06c42
4f18dd4
da7762d
2cd03d7
6265f0f
8e0420d
f26c8d0
7d09a23
d5546b7
dd229ae
30fffce
79d6a61
60fafee
2ec2b47
1061b07
6c7f7a9
2b48da4
f40c414
b324fd4
2b8a2d2
e1913b4
eff2f69
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -17,8 +17,6 @@ | |
import { diagLogLevelFromString, getStringFromEnv } from '@opentelemetry/core'; | ||
import { | ||
AttributeLimits, | ||
ConfigAttributes, | ||
LoggerProvider, | ||
MeterProvider, | ||
Propagator, | ||
ConfigurationModel, | ||
|
@@ -41,6 +39,8 @@ import { | |
SpanProcessor, | ||
TracerProvider, | ||
} from './models/tracerProviderModel'; | ||
import { LoggerProvider } from './models/loggerProviderModel'; | ||
import { AttributeNameValue } from './models/resourceModel'; | ||
|
||
export class FileConfigProvider implements ConfigProvider { | ||
private _config: ConfigurationModel; | ||
|
@@ -98,14 +98,14 @@ function parseConfigFile(config: ConfigurationModel) { | |
config.resource = {}; | ||
} | ||
const attrList = getStringFromConfigFile( | ||
parsedContent['resource']?.['attributes_list'] | ||
parsedContent['resource']['attributes_list'] | ||
); | ||
if (attrList) { | ||
config.resource.attributes_list = attrList; | ||
} | ||
|
||
const schemaUrl = getStringFromConfigFile( | ||
parsedContent['resource']?.['schema_url'] | ||
parsedContent['resource']['schema_url'] | ||
); | ||
if (schemaUrl) { | ||
config.resource.schema_url = schemaUrl; | ||
|
@@ -127,7 +127,7 @@ function parseConfigFile(config: ConfigurationModel) { | |
|
||
function setResourceAttributes( | ||
config: ConfigurationModel, | ||
attributes: ConfigAttributes[] | ||
attributes: AttributeNameValue[] | ||
) { | ||
if (attributes) { | ||
if (config.resource == null) { | ||
|
@@ -254,7 +254,16 @@ function getConfigHeaders( | |
return null; | ||
} | ||
|
||
function parseConfigExporter(exporter: SpanExporter): SpanExporter { | ||
enum ProviderType { | ||
TRACER = 0, | ||
METER = 1, | ||
LOGGER = 2, | ||
} | ||
|
||
function parseConfigExporter( | ||
exporter: SpanExporter, | ||
providerType: ProviderType | ||
): SpanExporter { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Since we are now using this for multiple signals, do we need to return different exporters for each signal (e.g. LogExporter vs SpanExporter)? |
||
const exporterType = Object.keys(exporter)[0]; | ||
let parsedExporter: SpanExporter = {}; | ||
let e; | ||
|
@@ -265,15 +274,24 @@ function parseConfigExporter(exporter: SpanExporter): SpanExporter { | |
let headers; | ||
let headersList; | ||
let insecure; | ||
let endpoint; | ||
|
||
switch (providerType) { | ||
case ProviderType.TRACER: | ||
endpoint = 'http://localhost:4318/v1/traces'; | ||
break; | ||
case ProviderType.LOGGER: | ||
endpoint = 'http://localhost:4318/v1/logs'; | ||
break; | ||
} | ||
|
||
switch (exporterType) { | ||
case 'otlp_http': | ||
e = exporter['otlp_http']; | ||
if (e) { | ||
parsedExporter = { | ||
otlp_http: { | ||
endpoint: | ||
getStringFromConfigFile(e['endpoint']) ?? | ||
'http://localhost:4318/v1/traces', | ||
endpoint: getStringFromConfigFile(e['endpoint']) ?? endpoint, | ||
timeout: getNumberFromConfigFile(e['timeout']) ?? 10000, | ||
encoding: | ||
getStringFromConfigFile(e['encoding']) === 'json' | ||
|
@@ -460,7 +478,10 @@ function setTracerProvider( | |
if (processorType === 'batch') { | ||
const element = tracerProvider['processors'][i]['batch']; | ||
if (element) { | ||
const parsedExporter = parseConfigExporter(element['exporter']); | ||
const parsedExporter = parseConfigExporter( | ||
element['exporter'], | ||
ProviderType.TRACER | ||
); | ||
const batchConfig: SpanProcessor = { | ||
batch: { | ||
schedule_delay: | ||
|
@@ -481,7 +502,10 @@ function setTracerProvider( | |
} else if (processorType === 'simple') { | ||
const element = tracerProvider['processors'][i]['simple']; | ||
if (element) { | ||
const parsedExporter = parseConfigExporter(element['exporter']); | ||
const parsedExporter = parseConfigExporter( | ||
element['exporter'], | ||
ProviderType.TRACER | ||
); | ||
const simpleConfig: SpanProcessor = { | ||
simple: { | ||
exporter: parsedExporter, | ||
|
@@ -524,8 +548,9 @@ function setLoggerProvider( | |
): void { | ||
if (loggerProvider) { | ||
if (config.logger_provider == null) { | ||
config.logger_provider = {}; | ||
config.logger_provider = { processors: [] }; | ||
} | ||
// Limits | ||
if (loggerProvider['limits']) { | ||
const attributeValueLengthLimit = getNumberFromConfigFile( | ||
loggerProvider['limits']['attribute_value_length_limit'] | ||
|
@@ -537,17 +562,124 @@ function setLoggerProvider( | |
if (config.logger_provider.limits == null) { | ||
config.logger_provider.limits = { attribute_count_limit: 128 }; | ||
} | ||
|
||
if (attributeValueLengthLimit) { | ||
config.logger_provider.limits.attribute_value_length_limit = | ||
attributeValueLengthLimit; | ||
} | ||
|
||
if (attributeCountLimit) { | ||
config.logger_provider.limits.attribute_count_limit = | ||
attributeCountLimit; | ||
} | ||
} | ||
} | ||
|
||
// Processors | ||
if (loggerProvider['processors']) { | ||
if (loggerProvider['processors'].length > 0) { | ||
if (config.logger_provider == null) { | ||
config.logger_provider = { processors: [] }; | ||
} | ||
config.logger_provider.processors = []; | ||
for (let i = 0; i < loggerProvider['processors'].length; i++) { | ||
const processorType = Object.keys(loggerProvider['processors'][i])[0]; | ||
if (processorType === 'batch') { | ||
const element = loggerProvider['processors'][i]['batch']; | ||
if (element) { | ||
const parsedExporter = parseConfigExporter( | ||
element['exporter'], | ||
ProviderType.LOGGER | ||
); | ||
const batchConfig: SpanProcessor = { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should this be a log processor? |
||
batch: { | ||
schedule_delay: | ||
getNumberFromConfigFile(element['schedule_delay']) ?? 1000, | ||
export_timeout: | ||
getNumberFromConfigFile(element['export_timeout']) ?? 30000, | ||
max_queue_size: | ||
getNumberFromConfigFile(element['max_queue_size']) ?? 2048, | ||
max_export_batch_size: | ||
getNumberFromConfigFile(element['max_export_batch_size']) ?? | ||
512, | ||
exporter: parsedExporter, | ||
}, | ||
}; | ||
|
||
config.logger_provider.processors.push(batchConfig); | ||
} | ||
} else if (processorType === 'simple') { | ||
const element = loggerProvider['processors'][i]['simple']; | ||
if (element) { | ||
const parsedExporter = parseConfigExporter( | ||
element['exporter'], | ||
ProviderType.LOGGER | ||
); | ||
const simpleConfig: SpanProcessor = { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should this be a log processor? |
||
simple: { | ||
exporter: parsedExporter, | ||
}, | ||
}; | ||
|
||
config.logger_provider.processors.push(simpleConfig); | ||
} | ||
} | ||
} | ||
} | ||
} | ||
|
||
// logger_configurator/development | ||
if (loggerProvider['logger_configurator/development']) { | ||
const defaultConfigDisabled = getBooleanFromConfigFile( | ||
loggerProvider['logger_configurator/development']['default_config']?.[ | ||
'disabled' | ||
] | ||
); | ||
if (defaultConfigDisabled || defaultConfigDisabled === false) { | ||
if (config.logger_provider == null) { | ||
config.logger_provider = { processors: [] }; | ||
} | ||
config.logger_provider['logger_configurator/development'] = { | ||
default_config: { | ||
disabled: defaultConfigDisabled, | ||
}, | ||
}; | ||
} | ||
|
||
if ( | ||
loggerProvider['logger_configurator/development'].loggers && | ||
loggerProvider['logger_configurator/development'].loggers.length > 0 | ||
) { | ||
const loggers = []; | ||
for ( | ||
let i = 0; | ||
i < loggerProvider['logger_configurator/development'].loggers.length; | ||
i++ | ||
Comment on lines
+651
to
+655
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. nit... could we replace with something like const container = loggerProvider['logger_configurator/development'];
for (const logger of container.loggers) {
...
} |
||
) { | ||
const logger = | ||
loggerProvider['logger_configurator/development'].loggers[i]; | ||
let disabled = false; | ||
if (logger['config']) { | ||
disabled = | ||
getBooleanFromConfigFile(logger['config']['disabled']) ?? false; | ||
} | ||
const name = getStringFromConfigFile(logger['name']); | ||
if (name) { | ||
loggers.push({ | ||
name: name, | ||
config: { | ||
disabled: disabled, | ||
}, | ||
}); | ||
} | ||
} | ||
if (config.logger_provider == null) { | ||
config.logger_provider = { processors: [] }; | ||
} | ||
if (config.logger_provider['logger_configurator/development'] == null) { | ||
config.logger_provider['logger_configurator/development'] = {}; | ||
} | ||
config.logger_provider['logger_configurator/development'].loggers = | ||
loggers; | ||
} | ||
} | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reviewing utils, I think
resource
could still be undefined here right? Is there a reason to drop the optional chaining?