@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 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, spanContext?: Context): Promise<T>;
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(provider) {
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(provider);
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.3"};
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: /* @__PURE__ */ new Date(),
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, spanContext) {
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 = spanContext || context.active();
1453
- return this.tracer.startActiveSpan(name, options || {}, ctx, (span) => __async(this, null, function* () {
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(span);
1529
+ return yield fn(span2);
1456
1530
  } finally {
1457
- span.end();
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.4",
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",