This repository has been archived by the owner on Jan 11, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathsignalfx-async-wrapper.js
113 lines (98 loc) · 2.84 KB
/
signalfx-async-wrapper.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
"use strict";
var tracing = require("./tracing");
const sfxHelper = require("./signalfx-helper");
const noopMetricSender = require("./noop-metric-helpers");
let coldStart = true;
class SignalFxWrapper {
constructor(
originalObj,
originalFn,
originalEvent,
originalContext,
originalCallback,
dimensions,
disableTracing,
disableMetrics
) {
this.originalObj = originalObj;
this.originalFn = originalFn;
this.originalEvent = originalEvent;
this.originalContext = originalContext;
this.originalCallback = originalCallback;
this.disableMetrics = sfxHelper.isMetricsDisabled(disableMetrics);
this.disableTracing = sfxHelper.isTracingDisabled(disableTracing);
tracing.init(this.disableTracing);
this.metricSender = sfxHelper;
if (this.disableMetrics) {
this.metricSender = noopMetricSender;
}
this.execMeta = sfxHelper.getExecutionMetadata(this.originalContext);
sfxHelper.setDefaultDimensions(dimensions, this.execMeta);
this.metricSender.sendCounter("function.invocations", 1);
if (coldStart) {
this.metricSender.sendCounter("function.cold_starts", 1);
coldStart = false;
}
return this;
}
async invoke() {
const tracer = tracing.tracer(this.disableTracing);
const span = tracing.startSpan(tracer, this.originalEvent, this.execMeta);
const startTime = new Date().getTime();
let sent;
const flush = async () => {
if (sent) {
return;
}
this.metricSender.sendGauge(
"function.duration",
new Date().getTime() - startTime
);
sent = true;
await Promise.all([tracing.flush(), sfxHelper.waitForAllSends()]);
};
const callbackWrapper = (err, result) => {
flush().then(() => {
this.originalCallback(err, result);
});
};
return tracer.scope().activate(span, async () => {
try {
return await this.originalFn.call(
this.originalObj,
this.originalEvent,
this.originalContext,
callbackWrapper
);
} catch (err) {
this.metricSender.sendCounter("function.errors", 1);
span.addTags({
"sfx.error.kind": err.name,
"sfx.error.message": err.message,
"sfx.error.stack": err.stack,
});
throw err;
} finally {
span.finish();
await flush();
}
});
}
}
module.exports = (originalFn, dimensions, disableTracing, disableMetrics) => {
return async function (originalEvent, originalContext, originalCallback) {
const self = this;
const signalFxWrapper = new SignalFxWrapper(
self,
originalFn,
originalEvent,
originalContext,
originalCallback,
dimensions,
disableTracing,
disableMetrics
);
const result = await signalFxWrapper.invoke();
return result;
};
};