1 | "use strict";
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 | Object.defineProperty(exports, "__esModule", { value: true });
|
18 | exports.TraceIdRatioBasedSampler = void 0;
|
19 | const api_1 = require("@opentelemetry/api");
|
20 |
|
21 |
|
22 |
|
23 |
|
24 | class TraceIdRatioBasedSampler {
|
25 | constructor(_ratio = 0) {
|
26 | this._ratio = _ratio;
|
27 | this._ratio = this._normalize(_ratio);
|
28 | this._upperBound = Math.floor(this._ratio * 0xffffffff);
|
29 | }
|
30 | shouldSample(context, traceId) {
|
31 | return {
|
32 | decision: (0, api_1.isValidTraceId)(traceId) && this._accumulate(traceId) < this._upperBound
|
33 | ? api_1.SamplingDecision.RECORD_AND_SAMPLED
|
34 | : api_1.SamplingDecision.NOT_RECORD,
|
35 | };
|
36 | }
|
37 | toString() {
|
38 | return `TraceIdRatioBased{${this._ratio}}`;
|
39 | }
|
40 | _normalize(ratio) {
|
41 | if (typeof ratio !== 'number' || isNaN(ratio))
|
42 | return 0;
|
43 | return ratio >= 1 ? 1 : ratio <= 0 ? 0 : ratio;
|
44 | }
|
45 | _accumulate(traceId) {
|
46 | let accumulation = 0;
|
47 | for (let i = 0; i < traceId.length / 8; i++) {
|
48 | const pos = i * 8;
|
49 | const part = parseInt(traceId.slice(pos, pos + 8), 16);
|
50 | accumulation = (accumulation ^ part) >>> 0;
|
51 | }
|
52 | return accumulation;
|
53 | }
|
54 | }
|
55 | exports.TraceIdRatioBasedSampler = TraceIdRatioBasedSampler;
|
56 |
|
\ | No newline at end of file |