@instana/aws-fargate
Version:
Instana tracing and monitoring for Node.js based AWS Fargate tasks
81 lines (66 loc) • 2.31 kB
JavaScript
/*
* (c) Copyright IBM Corp. 2021
* (c) Copyright Instana Inc. and contributors 2020
*/
;
const { backendConnector } = require('@instana/serverless');
const processorRegistry = require('./processorRegistry');
let transmissionDelay;
let transmissionTimeoutHandle;
let isActive = false;
/**
* @param {import('@instana/core/src/config').InstanaConfig} config
*/
exports.init = function init(config, metadataUri, onReady) {
transmissionDelay = config.metrics.transmissionDelay;
processorRegistry.init(config, metadataUri, onReady);
};
exports.activate = function activate() {
isActive = true;
processorRegistry.activate();
sendMetrics();
};
exports.deactivate = function deactivate() {
isActive = false;
processorRegistry.deactivate();
clearTimeout(transmissionTimeoutHandle);
};
function sendMetrics() {
if (!isActive) {
return;
}
const payload = { plugins: [] };
const uncompressedPerProcessor = {};
processorRegistry.forEachProcessor(processor => {
if (processor.isReady()) {
const uncompressedData = processor.getUncompressedData(true);
uncompressedPerProcessor[processor.getId()] = uncompressedData;
if (uncompressedData) {
const compressedData = processor.compress(uncompressedData);
payload.plugins.push(processor.wrapAsPayload(compressedData));
}
}
});
if (payload.plugins.length === 0) {
// nothing to report, simply schedule next transmission
clearTimeout(transmissionTimeoutHandle);
transmissionTimeoutHandle = setTimeout(sendMetrics, transmissionDelay);
transmissionTimeoutHandle.unref();
return;
}
// TODO Maybe fargate should send _BUNDLES_?
backendConnector.sendMetrics(payload, onMetricsHaveBeenSent.bind(null, uncompressedPerProcessor));
}
function onMetricsHaveBeenSent(transmittedPayloadPerProcessor, error) {
// schedule next transmission, no matter if success or error
// TODO A decent backoff pattern might be nice.
clearTimeout(transmissionTimeoutHandle);
transmissionTimeoutHandle = setTimeout(sendMetrics, transmissionDelay);
transmissionTimeoutHandle.unref();
if (error) {
return;
}
processorRegistry.forEachProcessor(processor => {
processor.setLastTransmittedPayload(transmittedPayloadPerProcessor[processor.getId()]);
});
}