UNPKG

enhanced-adot-node-autoinstrumentation

Version:

This package provides Amazon Web Services distribution of the OpenTelemetry Node Instrumentation, which allows for auto-instrumentation of NodeJS applications.

79 lines 3.11 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AwsAuthenticator = void 0; // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 const api_1 = require("@opentelemetry/api"); const utils_1 = require("../../../../utils"); let SignatureV4; let HttpRequest; let defaultProvider; let Sha256; let dependenciesLoaded = false; if ((0, utils_1.getNodeVersion)() >= 16) { try { defaultProvider = require('@aws-sdk/credential-provider-node').defaultProvider; Sha256 = require('@aws-crypto/sha256-js').Sha256; SignatureV4 = require('@smithy/signature-v4').SignatureV4; HttpRequest = require('@smithy/protocol-http').HttpRequest; dependenciesLoaded = true; } catch (error) { api_1.diag.error(`Failed to load required AWS dependency for SigV4 Signing: ${error}`); } } else { api_1.diag.error('SigV4 signing requires at least Node major version 16'); } class AwsAuthenticator { constructor(region, service) { this.region = region; this.service = service; } async authenticate(endpoint, headers, serializedData) { // Only do SigV4 Signing if the required dependencies are installed. if (dependenciesLoaded) { const url = new URL(endpoint); if (serializedData === undefined) { api_1.diag.error('Given serialized data is undefined. Not authenticating.'); return headers; } const cleanedHeaders = this.removeSigV4Headers(headers); const request = new HttpRequest({ method: 'POST', protocol: 'https', hostname: url.hostname, path: url.pathname, body: serializedData, headers: Object.assign(Object.assign({}, cleanedHeaders), { host: url.hostname }), }); try { const signer = new SignatureV4({ credentials: defaultProvider(), region: this.region, service: this.service, sha256: Sha256, }); const signedRequest = await signer.sign(request); return signedRequest.headers; } catch (exception) { api_1.diag.debug(`Failed to sign/authenticate the given exported Span request to OTLP XRay endpoint with error: ${exception}`); } } return headers; } // Cleans up Sigv4 from headers to avoid accidentally copying them to the new headers removeSigV4Headers(headers) { const newHeaders = {}; const sigV4Headers = ['x-amz-date', 'authorization', 'x-amz-content-sha256', 'x-amz-security-token']; for (const key in headers) { if (!sigV4Headers.includes(key.toLowerCase())) { newHeaders[key] = headers[key]; } } return newHeaders; } } exports.AwsAuthenticator = AwsAuthenticator; //# sourceMappingURL=aws-authenticator.js.map