Repository navigation
Expand file tree
/
Copy pathbrowser.js
More file actions
87 lines (82 loc) · 2.28 KB
/
Copy pathbrowser.js
File metadata and controls
87 lines (82 loc) · 2.28 KB
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
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
"use strict";
const {
OTLPTraceExporter,
} = require("@opentelemetry/exporter-trace-otlp-proto");
const { registerInstrumentations } = require("@opentelemetry/instrumentation");
const {
FetchInstrumentation,
} = require("@opentelemetry/instrumentation-fetch");
const {
SimpleSpanProcessor,
WebTracerProvider,
} = require("@opentelemetry/sdk-trace-web");
const { drive } = require("@otel-conformance/fetch-scenarios");
/** Resolves once exactly `expected` Fetch spans have reached the exporter. */
function trackingExporter(exporter, expected) {
let exported = 0;
let resolve;
let reject;
const complete = new Promise((onResolve, onReject) => {
resolve = onResolve;
reject = onReject;
});
return {
export(spans, callback) {
exporter.export(spans, (result) => {
callback(result);
if (result.code !== 0) {
reject(result.error || new Error("OTLP export failed"));
return;
}
exported += spans.length;
if (exported === expected) {
resolve();
} else if (exported > expected) {
reject(new Error(`exported ${exported} spans, expected ${expected}`));
}
});
},
forceFlush() {
return exporter.forceFlush();
},
shutdown() {
return exporter.shutdown();
},
waitForExpectedSpans() {
return complete;
},
};
}
async function run() {
const { baseUrl, exchanges, traceExporterUrl } = window.__otelConformance;
const exporter = trackingExporter(
new OTLPTraceExporter({ url: traceExporterUrl }),
exchanges.filter((exchange) => !exchange.readiness).length,
);
const provider = new WebTracerProvider({
spanProcessors: [new SimpleSpanProcessor(exporter)],
});
provider.register();
registerInstrumentations({
tracerProvider: provider,
instrumentations: [
new FetchInstrumentation({ ignoreUrls: [traceExporterUrl] }),
],
});
await drive(baseUrl, exchanges);
await exporter.waitForExpectedSpans();
await provider.forceFlush();
}
run().then(
() => {
window.__otelConformanceResult = { ok: true };
},
(error) => {
window.__otelConformanceResult = {
ok: false,
error: String(error.stack || error),
};
},
);