@opentelemetry/resources
Version:
OpenTelemetry SDK resources
125 lines • 4.86 kB
JavaScript
"use strict";
/*!
* Copyright 2020, OpenTelemetry Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
Object.defineProperty(exports, "__esModule", { value: true });
const Resource_1 = require("../../../Resource");
/**
* EnvDetector can be used to detect the presence of and create a Resource
* from the OTEL_RESOURCE_LABELS environment variable.
*/
class EnvDetector {
constructor() {
// Type, label keys, and label values should not exceed 256 characters.
this._MAX_LENGTH = 255;
// OTEL_RESOURCE_LABELS is a comma-separated list of labels.
this._COMMA_SEPARATOR = ',';
// OTEL_RESOURCE_LABELS contains key value pair separated by '='.
this._LABEL_KEY_VALUE_SPLITTER = '=';
this._ERROR_MESSAGE_INVALID_CHARS = 'should be a ASCII string with a length greater than 0 and not exceed ' +
this._MAX_LENGTH +
' characters.';
this._ERROR_MESSAGE_INVALID_VALUE = 'should be a ASCII string with a length not exceed ' +
this._MAX_LENGTH +
' characters.';
}
/**
* Returns a {@link Resource} populated with labels from the
* OTEL_RESOURCE_LABELS environment variable. Note this is an async function
* to conform to the Detector interface.
*/
async detect() {
try {
const labelString = process.env.OTEL_RESOURCE_LABELS;
if (!labelString)
return Resource_1.Resource.empty();
const labels = this._parseResourceLabels(process.env.OTEL_RESOURCE_LABELS);
return new Resource_1.Resource(labels);
}
catch (_a) {
return Resource_1.Resource.empty();
}
}
/**
* Creates a label map from the OTEL_RESOURCE_LABELS environment variable.
*
* OTEL_RESOURCE_LABELS: A comma-separated list of labels describing the
* source in more detail, e.g. “key1=val1,key2=val2”. Domain names and paths
* are accepted as label keys. Values may be quoted or unquoted in general. If
* a value contains whitespaces, =, or " characters, it must always be quoted.
*
* @param rawEnvLabels The resource labels as a comma-seperated list
* of key/value pairs.
* @returns The sanitized resource labels.
*/
_parseResourceLabels(rawEnvLabels) {
if (!rawEnvLabels)
return {};
const labels = {};
const rawLabels = rawEnvLabels.split(this._COMMA_SEPARATOR, -1);
for (const rawLabel of rawLabels) {
const keyValuePair = rawLabel.split(this._LABEL_KEY_VALUE_SPLITTER, -1);
if (keyValuePair.length !== 2) {
continue;
}
let [key, value] = keyValuePair;
// Leading and trailing whitespaces are trimmed.
key = key.trim();
value = value
.trim()
.split('^"|"$')
.join('');
if (!this._isValidAndNotEmpty(key)) {
throw new Error(`Label key ${this._ERROR_MESSAGE_INVALID_CHARS}`);
}
if (!this._isValid(value)) {
throw new Error(`Label value ${this._ERROR_MESSAGE_INVALID_VALUE}`);
}
labels[key] = value;
}
return labels;
}
/**
* Determines whether the given String is a valid printable ASCII string with
* a length not exceed _MAX_LENGTH characters.
*
* @param str The String to be validated.
* @returns Whether the String is valid.
*/
_isValid(name) {
return name.length <= this._MAX_LENGTH && this._isPrintableString(name);
}
_isPrintableString(str) {
for (let i = 0; i < str.length; i++) {
const ch = str.charAt(i);
if (ch <= ' ' || ch >= '~') {
return false;
}
}
return true;
}
/**
* Determines whether the given String is a valid printable ASCII string with
* a length greater than 0 and not exceed _MAX_LENGTH characters.
*
* @param str The String to be validated.
* @returns Whether the String is valid and not empty.
*/
_isValidAndNotEmpty(str) {
return str.length > 0 && this._isValid(str);
}
}
exports.envDetector = new EnvDetector();
//# sourceMappingURL=EnvDetector.js.map