UNPKG

@opentelemetry/resources

Version:
125 lines 4.86 kB
"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