@lark-apaas/observable-web 1.0.1-alpha.5 → 1.0.1-alpha.7

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 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,8 +36,11 @@ 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;
package/dist/index.js CHANGED
@@ -794,7 +794,7 @@ var trace = TraceAPI.getInstance();
794
794
 
795
795
  // package.json
796
796
  var package_default = {
797
- version: "1.0.1-alpha.4"};
797
+ version: "1.0.1-alpha.7"};
798
798
 
799
799
  // src/const.ts
800
800
  var defaultResourceAttr = {
@@ -973,8 +973,8 @@ var CustomWebMetricExporter = class {
973
973
  transformNumberDataPoints(dataPoints) {
974
974
  return dataPoints.map((dp) => ({
975
975
  attributes: __spreadValues(__spreadValues({}, convertAttributesToString(dp.attributes)), getDefaultAttr()),
976
- startTimeUnixNano: hrTimeToNanosNumber(dp.startTime),
977
- timeUnixNano: hrTimeToNanosNumber(dp.endTime),
976
+ startTimeUnixNano: hrTimeToNanosNumber(WebObservableSdk.adjustHrTime(dp.startTime)),
977
+ timeUnixNano: hrTimeToNanosNumber(WebObservableSdk.adjustHrTime(dp.endTime)),
978
978
  // JS 中所有数字都是双精度浮点数,默认映射到 asDouble
979
979
  // 如果需要 asInt,需要自行判断 Number.isInteger(dp.value)
980
980
  asDouble: dp.value
@@ -1113,8 +1113,8 @@ var CustomWebLogExporter = class {
1113
1113
  logRecords: logs.map((log) => {
1114
1114
  var _a, _b, _c;
1115
1115
  return {
1116
- timeUnixNano: hrTimeToNanosNumber(log.hrTime),
1117
- observedTimeUnixNano: hrTimeToNanosNumber(log.hrTimeObserved),
1116
+ timeUnixNano: hrTimeToNanosNumber(WebObservableSdk.adjustHrTime(log.hrTime)),
1117
+ observedTimeUnixNano: hrTimeToNanosNumber(WebObservableSdk.adjustHrTime(log.hrTimeObserved)),
1118
1118
  severityNumber: log.severityNumber,
1119
1119
  severityText: log.severityText,
1120
1120
  body: log.body,
@@ -1200,8 +1200,8 @@ var CustomWebTraceExporter = class {
1200
1200
  parentSpanID: (_a = span.parentSpanContext) == null ? void 0 : _a.spanId,
1201
1201
  name: span.name,
1202
1202
  kind: span.kind,
1203
- startTimeUnixNano: hrTimeToNanosNumber(span.startTime),
1204
- endTimeUnixNano: hrTimeToNanosNumber(span.endTime),
1203
+ startTimeUnixNano: hrTimeToNanosNumber(WebObservableSdk.adjustHrTime(span.startTime)),
1204
+ endTimeUnixNano: hrTimeToNanosNumber(WebObservableSdk.adjustHrTime(span.endTime)),
1205
1205
  attributes: __spreadValues(__spreadValues({}, convertAttributesToString(span.attributes)), getDefaultAttr()),
1206
1206
  status: {
1207
1207
  code: span.status.code,
@@ -1212,7 +1212,7 @@ var CustomWebTraceExporter = class {
1212
1212
  events: span.events.map((event) => {
1213
1213
  var _a2;
1214
1214
  return {
1215
- timeUnixNano: hrTimeToNanosNumber(event.time),
1215
+ timeUnixNano: hrTimeToNanosNumber(WebObservableSdk.adjustHrTime(event.time)),
1216
1216
  name: event.name,
1217
1217
  attributes: convertAttributesToString((_a2 = event.attributes) != null ? _a2 : {}),
1218
1218
  droppedAttributesCount: event.droppedAttributesCount
@@ -1291,6 +1291,7 @@ var _WebObservableSdk = class _WebObservableSdk {
1291
1291
  start(config) {
1292
1292
  if (this.isStarted || config.env === "preview" /* Dev */) return;
1293
1293
  this.config = config;
1294
+ this.initTimeOffset();
1294
1295
  try {
1295
1296
  this.resource = resources.detectResources({
1296
1297
  detectors: [new CustomWebDetector()]
@@ -1314,6 +1315,13 @@ var _WebObservableSdk = class _WebObservableSdk {
1314
1315
  url: this.config.collectorUrl.log,
1315
1316
  headers: ((_b = this.config) == null ? void 0 : _b.headers) || {}
1316
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
+ };
1317
1325
  this.loggerProvider = new sdkLogs.LoggerProvider({
1318
1326
  resource: this.resource,
1319
1327
  processors: [
@@ -1333,6 +1341,17 @@ var _WebObservableSdk = class _WebObservableSdk {
1333
1341
  url: (_b = this.config) == null ? void 0 : _b.collectorUrl.metric,
1334
1342
  headers: ((_c = this.config) == null ? void 0 : _c.headers) || {}
1335
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
+ };
1336
1355
  this.meterProvider = new sdkMetrics.MeterProvider({
1337
1356
  resource: this.resource,
1338
1357
  readers: [
@@ -1354,6 +1373,14 @@ var _WebObservableSdk = class _WebObservableSdk {
1354
1373
  url: (_b = this.config) == null ? void 0 : _b.collectorUrl.trace,
1355
1374
  headers: ((_c = this.config) == null ? void 0 : _c.headers) || {}
1356
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
+ };
1357
1384
  this.tracerProvider = new sdkTraceWeb.WebTracerProvider({
1358
1385
  resource: this.resource,
1359
1386
  spanProcessors: [
@@ -1373,6 +1400,43 @@ var _WebObservableSdk = class _WebObservableSdk {
1373
1400
  const pvTracker = new PvInstrumentation(meter);
1374
1401
  pvTracker.enable();
1375
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 serverTimeRes = yield response.json();
1429
+ const serverTimeNs = BigInt(serverTimeRes.data.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
+ }
1376
1440
  flushData() {
1377
1441
  try {
1378
1442
  const promises = [];
@@ -1417,6 +1481,10 @@ var _WebObservableSdk = class _WebObservableSdk {
1417
1481
  this.flushData();
1418
1482
  });
1419
1483
  }
1484
+ static getCalibratedDate() {
1485
+ const offsetInMs = _WebObservableSdk.timeOffset / 1e6;
1486
+ return new Date(Date.now() + offsetInMs);
1487
+ }
1420
1488
  // --- 公开 API: 日志(Log) ---
1421
1489
  log(level, message, attributes = {}, span) {
1422
1490
  try {
@@ -1425,7 +1493,7 @@ var _WebObservableSdk = class _WebObservableSdk {
1425
1493
  severityText: level,
1426
1494
  body: message,
1427
1495
  attributes,
1428
- timestamp: /* @__PURE__ */ new Date(),
1496
+ timestamp: _WebObservableSdk.getCalibratedDate(),
1429
1497
  context: ctx
1430
1498
  });
1431
1499
  } catch (error) {
@@ -1479,6 +1547,7 @@ var _WebObservableSdk = class _WebObservableSdk {
1479
1547
  }
1480
1548
  };
1481
1549
  _WebObservableSdk.EmptySpan = trace.wrapSpanContext(INVALID_SPAN_CONTEXT);
1550
+ _WebObservableSdk.timeOffset = 0;
1482
1551
  var WebObservableSdk = _WebObservableSdk;
1483
1552
  var observable = WebObservableSdk.instance;
1484
1553
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lark-apaas/observable-web",
3
- "version": "1.0.1-alpha.5",
3
+ "version": "1.0.1-alpha.7",
4
4
  "description": "Observable SDK For Web",
5
5
  "main": "./dist/index.js",
6
6
  "files": [