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
JavaScript
;
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