@lark-apaas/observable-web 1.0.1-alpha.4 → 1.0.1-alpha.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +6 -1
- package/dist/index.js +91 -16
- package/package.json +4 -2
package/dist/index.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ interface WebSdkConfig {
|
|
|
12
12
|
log: string;
|
|
13
13
|
metric: string;
|
|
14
14
|
trace: string;
|
|
15
|
+
time?: string;
|
|
15
16
|
};
|
|
16
17
|
headers?: Record<string, string>;
|
|
17
18
|
}
|
|
@@ -27,6 +28,7 @@ declare class WebObservableSdk {
|
|
|
27
28
|
private config;
|
|
28
29
|
private isStarted;
|
|
29
30
|
static EmptySpan: Span;
|
|
31
|
+
static timeOffset: number;
|
|
30
32
|
constructor();
|
|
31
33
|
static get instance(): WebObservableSdk;
|
|
32
34
|
start(config: WebSdkConfig): void;
|
|
@@ -34,12 +36,15 @@ declare class WebObservableSdk {
|
|
|
34
36
|
private initMetrics;
|
|
35
37
|
private initTraces;
|
|
36
38
|
private initAutoPv;
|
|
39
|
+
static adjustHrTime(hrTime: [number, number]): [number, number];
|
|
40
|
+
private initTimeOffset;
|
|
37
41
|
private flushData;
|
|
38
42
|
private registerLifecycleListeners;
|
|
43
|
+
static getCalibratedDate(): Date;
|
|
39
44
|
log(level: 'INFO' | 'ERROR' | 'WARN', message: string, attributes?: Record<string, any>, span?: Span): void;
|
|
40
45
|
addCount(name: string, value?: number, attributes?: Record<string, any>): void;
|
|
41
46
|
startSpan(name: string, options?: SpanOptions, spanContext?: Context): Span | undefined;
|
|
42
|
-
trace<T>(name: string, fn: (span: Span) => Promise<T>, options?: SpanOptions,
|
|
47
|
+
trace<T>(name: string, fn: (span: Span) => Promise<T>, options?: SpanOptions, span?: Span): Promise<T>;
|
|
43
48
|
shutdown(): Promise<void>;
|
|
44
49
|
}
|
|
45
50
|
declare const observable: WebObservableSdk;
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
require('zone.js');
|
|
4
|
+
var contextZone = require('@opentelemetry/context-zone');
|
|
3
5
|
var resources = require('@opentelemetry/resources');
|
|
4
6
|
var sdkLogs = require('@opentelemetry/sdk-logs');
|
|
5
7
|
var sdkMetrics = require('@opentelemetry/sdk-metrics');
|
|
@@ -766,10 +768,10 @@ var TraceAPI = (
|
|
|
766
768
|
}
|
|
767
769
|
return this._instance;
|
|
768
770
|
};
|
|
769
|
-
TraceAPI2.prototype.setGlobalTracerProvider = function(
|
|
771
|
+
TraceAPI2.prototype.setGlobalTracerProvider = function(provider2) {
|
|
770
772
|
var success = registerGlobal(API_NAME3, this._proxyTracerProvider, DiagAPI.instance());
|
|
771
773
|
if (success) {
|
|
772
|
-
this._proxyTracerProvider.setDelegate(
|
|
774
|
+
this._proxyTracerProvider.setDelegate(provider2);
|
|
773
775
|
}
|
|
774
776
|
return success;
|
|
775
777
|
};
|
|
@@ -792,7 +794,7 @@ var trace = TraceAPI.getInstance();
|
|
|
792
794
|
|
|
793
795
|
// package.json
|
|
794
796
|
var package_default = {
|
|
795
|
-
version: "1.0.1-alpha.
|
|
797
|
+
version: "1.0.1-alpha.6"};
|
|
796
798
|
|
|
797
799
|
// src/const.ts
|
|
798
800
|
var defaultResourceAttr = {
|
|
@@ -971,8 +973,8 @@ var CustomWebMetricExporter = class {
|
|
|
971
973
|
transformNumberDataPoints(dataPoints) {
|
|
972
974
|
return dataPoints.map((dp) => ({
|
|
973
975
|
attributes: __spreadValues(__spreadValues({}, convertAttributesToString(dp.attributes)), getDefaultAttr()),
|
|
974
|
-
startTimeUnixNano: hrTimeToNanosNumber(dp.startTime),
|
|
975
|
-
timeUnixNano: hrTimeToNanosNumber(dp.endTime),
|
|
976
|
+
startTimeUnixNano: hrTimeToNanosNumber(WebObservableSdk.adjustHrTime(dp.startTime)),
|
|
977
|
+
timeUnixNano: hrTimeToNanosNumber(WebObservableSdk.adjustHrTime(dp.endTime)),
|
|
976
978
|
// JS 中所有数字都是双精度浮点数,默认映射到 asDouble
|
|
977
979
|
// 如果需要 asInt,需要自行判断 Number.isInteger(dp.value)
|
|
978
980
|
asDouble: dp.value
|
|
@@ -1111,8 +1113,8 @@ var CustomWebLogExporter = class {
|
|
|
1111
1113
|
logRecords: logs.map((log) => {
|
|
1112
1114
|
var _a, _b, _c;
|
|
1113
1115
|
return {
|
|
1114
|
-
timeUnixNano: hrTimeToNanosNumber(log.hrTime),
|
|
1115
|
-
observedTimeUnixNano: hrTimeToNanosNumber(log.hrTimeObserved),
|
|
1116
|
+
timeUnixNano: hrTimeToNanosNumber(WebObservableSdk.adjustHrTime(log.hrTime)),
|
|
1117
|
+
observedTimeUnixNano: hrTimeToNanosNumber(WebObservableSdk.adjustHrTime(log.hrTimeObserved)),
|
|
1116
1118
|
severityNumber: log.severityNumber,
|
|
1117
1119
|
severityText: log.severityText,
|
|
1118
1120
|
body: log.body,
|
|
@@ -1198,8 +1200,8 @@ var CustomWebTraceExporter = class {
|
|
|
1198
1200
|
parentSpanID: (_a = span.parentSpanContext) == null ? void 0 : _a.spanId,
|
|
1199
1201
|
name: span.name,
|
|
1200
1202
|
kind: span.kind,
|
|
1201
|
-
startTimeUnixNano: hrTimeToNanosNumber(span.startTime),
|
|
1202
|
-
endTimeUnixNano: hrTimeToNanosNumber(span.endTime),
|
|
1203
|
+
startTimeUnixNano: hrTimeToNanosNumber(WebObservableSdk.adjustHrTime(span.startTime)),
|
|
1204
|
+
endTimeUnixNano: hrTimeToNanosNumber(WebObservableSdk.adjustHrTime(span.endTime)),
|
|
1203
1205
|
attributes: __spreadValues(__spreadValues({}, convertAttributesToString(span.attributes)), getDefaultAttr()),
|
|
1204
1206
|
status: {
|
|
1205
1207
|
code: span.status.code,
|
|
@@ -1210,7 +1212,7 @@ var CustomWebTraceExporter = class {
|
|
|
1210
1212
|
events: span.events.map((event) => {
|
|
1211
1213
|
var _a2;
|
|
1212
1214
|
return {
|
|
1213
|
-
timeUnixNano: hrTimeToNanosNumber(event.time),
|
|
1215
|
+
timeUnixNano: hrTimeToNanosNumber(WebObservableSdk.adjustHrTime(event.time)),
|
|
1214
1216
|
name: event.name,
|
|
1215
1217
|
attributes: convertAttributesToString((_a2 = event.attributes) != null ? _a2 : {}),
|
|
1216
1218
|
droppedAttributesCount: event.droppedAttributesCount
|
|
@@ -1272,6 +1274,10 @@ var CustomWebTraceExporter = class {
|
|
|
1272
1274
|
};
|
|
1273
1275
|
|
|
1274
1276
|
// src/core/sdk.ts
|
|
1277
|
+
var provider = new sdkTraceWeb.WebTracerProvider();
|
|
1278
|
+
provider.register({
|
|
1279
|
+
contextManager: new contextZone.ZoneContextManager()
|
|
1280
|
+
});
|
|
1275
1281
|
var _WebObservableSdk = class _WebObservableSdk {
|
|
1276
1282
|
constructor() {
|
|
1277
1283
|
this.isStarted = false;
|
|
@@ -1285,6 +1291,7 @@ var _WebObservableSdk = class _WebObservableSdk {
|
|
|
1285
1291
|
start(config) {
|
|
1286
1292
|
if (this.isStarted || config.env === "preview" /* Dev */) return;
|
|
1287
1293
|
this.config = config;
|
|
1294
|
+
this.initTimeOffset();
|
|
1288
1295
|
try {
|
|
1289
1296
|
this.resource = resources.detectResources({
|
|
1290
1297
|
detectors: [new CustomWebDetector()]
|
|
@@ -1308,6 +1315,13 @@ var _WebObservableSdk = class _WebObservableSdk {
|
|
|
1308
1315
|
url: this.config.collectorUrl.log,
|
|
1309
1316
|
headers: ((_b = this.config) == null ? void 0 : _b.headers) || {}
|
|
1310
1317
|
});
|
|
1318
|
+
const originalExport = exporter.export.bind(exporter);
|
|
1319
|
+
exporter.export = (logs, resultCallback) => {
|
|
1320
|
+
for (const log of logs) {
|
|
1321
|
+
log.hrTime = _WebObservableSdk._adjustHrTime(log.hrTime);
|
|
1322
|
+
}
|
|
1323
|
+
return originalExport(logs, resultCallback);
|
|
1324
|
+
};
|
|
1311
1325
|
this.loggerProvider = new sdkLogs.LoggerProvider({
|
|
1312
1326
|
resource: this.resource,
|
|
1313
1327
|
processors: [
|
|
@@ -1327,6 +1341,17 @@ var _WebObservableSdk = class _WebObservableSdk {
|
|
|
1327
1341
|
url: (_b = this.config) == null ? void 0 : _b.collectorUrl.metric,
|
|
1328
1342
|
headers: ((_c = this.config) == null ? void 0 : _c.headers) || {}
|
|
1329
1343
|
});
|
|
1344
|
+
const originalExport = exporter.export.bind(exporter);
|
|
1345
|
+
exporter.export = (metrics, resultCallback) => {
|
|
1346
|
+
for (const record of metrics.scopeMetrics) {
|
|
1347
|
+
for (const metric of record.metrics) {
|
|
1348
|
+
for (const dataPoint of metric.dataPoints) {
|
|
1349
|
+
dataPoint.hrTime = _WebObservableSdk._adjustHrTime(dataPoint.hrTime);
|
|
1350
|
+
}
|
|
1351
|
+
}
|
|
1352
|
+
}
|
|
1353
|
+
return originalExport(metrics, resultCallback);
|
|
1354
|
+
};
|
|
1330
1355
|
this.meterProvider = new sdkMetrics.MeterProvider({
|
|
1331
1356
|
resource: this.resource,
|
|
1332
1357
|
readers: [
|
|
@@ -1348,6 +1373,14 @@ var _WebObservableSdk = class _WebObservableSdk {
|
|
|
1348
1373
|
url: (_b = this.config) == null ? void 0 : _b.collectorUrl.trace,
|
|
1349
1374
|
headers: ((_c = this.config) == null ? void 0 : _c.headers) || {}
|
|
1350
1375
|
});
|
|
1376
|
+
const originalExport = exporter.export.bind(exporter);
|
|
1377
|
+
exporter.export = (spans, resultCallback) => {
|
|
1378
|
+
for (const span of spans) {
|
|
1379
|
+
span.startTime = _WebObservableSdk._adjustHrTime(span.startTime);
|
|
1380
|
+
span.endTime = _WebObservableSdk._adjustHrTime(span.endTime);
|
|
1381
|
+
}
|
|
1382
|
+
return originalExport(spans, resultCallback);
|
|
1383
|
+
};
|
|
1351
1384
|
this.tracerProvider = new sdkTraceWeb.WebTracerProvider({
|
|
1352
1385
|
resource: this.resource,
|
|
1353
1386
|
spanProcessors: [
|
|
@@ -1367,6 +1400,43 @@ var _WebObservableSdk = class _WebObservableSdk {
|
|
|
1367
1400
|
const pvTracker = new PvInstrumentation(meter);
|
|
1368
1401
|
pvTracker.enable();
|
|
1369
1402
|
}
|
|
1403
|
+
static adjustHrTime(hrTime) {
|
|
1404
|
+
if (_WebObservableSdk.timeOffset === 0) {
|
|
1405
|
+
return hrTime;
|
|
1406
|
+
}
|
|
1407
|
+
try {
|
|
1408
|
+
const offsetNs = BigInt(_WebObservableSdk.timeOffset);
|
|
1409
|
+
const originalTimeNs = BigInt(hrTime[0]) * BigInt(1e9) + BigInt(hrTime[1]);
|
|
1410
|
+
const calibratedTimeNs = originalTimeNs + offsetNs;
|
|
1411
|
+
const calibratedSec = calibratedTimeNs / BigInt(1e9);
|
|
1412
|
+
const calibratedNs = calibratedTimeNs % BigInt(1e9);
|
|
1413
|
+
return [Number(calibratedSec), Number(calibratedNs)];
|
|
1414
|
+
} catch (e) {
|
|
1415
|
+
console.error("Failed to adjust HrTime", e);
|
|
1416
|
+
return hrTime;
|
|
1417
|
+
}
|
|
1418
|
+
}
|
|
1419
|
+
initTimeOffset() {
|
|
1420
|
+
return __async(this, null, function* () {
|
|
1421
|
+
var _a;
|
|
1422
|
+
try {
|
|
1423
|
+
if (!((_a = this.config) == null ? void 0 : _a.collectorUrl.time)) return;
|
|
1424
|
+
const start = Date.now();
|
|
1425
|
+
const response = yield fetch(this.config.collectorUrl.time);
|
|
1426
|
+
const end = Date.now();
|
|
1427
|
+
const rtt = end - start;
|
|
1428
|
+
const serverTimeStr = yield response.json();
|
|
1429
|
+
const serverTimeNs = BigInt(serverTimeStr.timestampNsStr);
|
|
1430
|
+
if (serverTimeNs) {
|
|
1431
|
+
const clientTimeMs = start + rtt / 2;
|
|
1432
|
+
const clientTimeNs = BigInt(Math.round(clientTimeMs)) * BigInt(1e6);
|
|
1433
|
+
_WebObservableSdk.timeOffset = Number(serverTimeNs - clientTimeNs);
|
|
1434
|
+
}
|
|
1435
|
+
} catch (error) {
|
|
1436
|
+
console.error("Failed to init time offset:", error);
|
|
1437
|
+
}
|
|
1438
|
+
});
|
|
1439
|
+
}
|
|
1370
1440
|
flushData() {
|
|
1371
1441
|
try {
|
|
1372
1442
|
const promises = [];
|
|
@@ -1411,6 +1481,10 @@ var _WebObservableSdk = class _WebObservableSdk {
|
|
|
1411
1481
|
this.flushData();
|
|
1412
1482
|
});
|
|
1413
1483
|
}
|
|
1484
|
+
static getCalibratedDate() {
|
|
1485
|
+
const offsetInMs = _WebObservableSdk.timeOffset / 1e6;
|
|
1486
|
+
return new Date(Date.now() + offsetInMs);
|
|
1487
|
+
}
|
|
1414
1488
|
// --- 公开 API: 日志(Log) ---
|
|
1415
1489
|
log(level, message, attributes = {}, span) {
|
|
1416
1490
|
try {
|
|
@@ -1419,7 +1493,7 @@ var _WebObservableSdk = class _WebObservableSdk {
|
|
|
1419
1493
|
severityText: level,
|
|
1420
1494
|
body: message,
|
|
1421
1495
|
attributes,
|
|
1422
|
-
timestamp:
|
|
1496
|
+
timestamp: _WebObservableSdk.getCalibratedDate(),
|
|
1423
1497
|
context: ctx
|
|
1424
1498
|
});
|
|
1425
1499
|
} catch (error) {
|
|
@@ -1444,17 +1518,17 @@ var _WebObservableSdk = class _WebObservableSdk {
|
|
|
1444
1518
|
}
|
|
1445
1519
|
}
|
|
1446
1520
|
// --- 公开 API: 链路追踪 (Trace) ---
|
|
1447
|
-
trace(name, fn, options,
|
|
1521
|
+
trace(name, fn, options, span) {
|
|
1448
1522
|
return __async(this, null, function* () {
|
|
1449
1523
|
if (!this.tracer) {
|
|
1450
1524
|
return fn(_WebObservableSdk.EmptySpan);
|
|
1451
1525
|
}
|
|
1452
|
-
const ctx =
|
|
1453
|
-
return this.tracer.startActiveSpan(name, options || {}, ctx, (
|
|
1526
|
+
const ctx = span ? trace.setSpan(context.active(), span) : context.active();
|
|
1527
|
+
return this.tracer.startActiveSpan(name, options || {}, ctx, (span2) => __async(this, null, function* () {
|
|
1454
1528
|
try {
|
|
1455
|
-
return yield fn(
|
|
1529
|
+
return yield fn(span2);
|
|
1456
1530
|
} finally {
|
|
1457
|
-
|
|
1531
|
+
span2.end();
|
|
1458
1532
|
}
|
|
1459
1533
|
}));
|
|
1460
1534
|
});
|
|
@@ -1473,6 +1547,7 @@ var _WebObservableSdk = class _WebObservableSdk {
|
|
|
1473
1547
|
}
|
|
1474
1548
|
};
|
|
1475
1549
|
_WebObservableSdk.EmptySpan = trace.wrapSpanContext(INVALID_SPAN_CONTEXT);
|
|
1550
|
+
_WebObservableSdk.timeOffset = 0;
|
|
1476
1551
|
var WebObservableSdk = _WebObservableSdk;
|
|
1477
1552
|
var observable = WebObservableSdk.instance;
|
|
1478
1553
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lark-apaas/observable-web",
|
|
3
|
-
"version": "1.0.1-alpha.
|
|
3
|
+
"version": "1.0.1-alpha.6",
|
|
4
4
|
"description": "Observable SDK For Web",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"files": [
|
|
@@ -18,12 +18,14 @@
|
|
|
18
18
|
"prepublishOnly": "npm run build"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
+
"@opentelemetry/context-zone": "^2.4.0",
|
|
21
22
|
"@opentelemetry/core": "^2.2.0",
|
|
22
23
|
"@opentelemetry/resources": "^2.2.0",
|
|
23
24
|
"@opentelemetry/sdk-logs": "^0.208.0",
|
|
24
25
|
"@opentelemetry/sdk-metrics": "^2.2.0",
|
|
25
26
|
"@opentelemetry/sdk-trace-base": "^2.2.0",
|
|
26
|
-
"@opentelemetry/sdk-trace-web": "^2.2.0"
|
|
27
|
+
"@opentelemetry/sdk-trace-web": "^2.2.0",
|
|
28
|
+
"zone.js": "^0.16.0"
|
|
27
29
|
},
|
|
28
30
|
"devDependencies": {
|
|
29
31
|
"@opentelemetry/api": "^1.9.0",
|