@obtrace/browser 2.2.0 → 2.4.0

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.
@@ -4,6 +4,8 @@ import { BatchSpanProcessor, TraceIdRatioBasedSampler, ParentBasedSampler } from
4
4
  import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
5
5
  import { MeterProvider, PeriodicExportingMetricReader } from "@opentelemetry/sdk-metrics";
6
6
  import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http";
7
+ import { LoggerProvider, BatchLogRecordProcessor } from "@opentelemetry/sdk-logs";
8
+ import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http";
7
9
  import { Resource } from "@opentelemetry/resources";
8
10
  import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from "@opentelemetry/semantic-conventions";
9
11
  import { FetchInstrumentation } from "@opentelemetry/instrumentation-fetch";
@@ -12,6 +14,7 @@ import { DocumentLoadInstrumentation } from "@opentelemetry/instrumentation-docu
12
14
  import { UserInteractionInstrumentation } from "@opentelemetry/instrumentation-user-interaction";
13
15
  import { ZoneContextManager } from "@opentelemetry/context-zone";
14
16
  import { registerInstrumentations } from "@opentelemetry/instrumentation";
17
+ import { enrichSupabaseSpan, isSupabaseURL } from "../browser/supabase";
15
18
  export function setupOtelWeb(config) {
16
19
  const baseUrl = (config.ingestBaseUrl || "https://ingest.obtrace.ai").replace(/\/$/, "");
17
20
  const authHeaders = {
@@ -62,13 +65,32 @@ export function setupOtelWeb(config) {
62
65
  ],
63
66
  });
64
67
  metrics.setGlobalMeterProvider(meterProvider);
68
+ const logExporter = new OTLPLogExporter({
69
+ url: `${baseUrl}/otlp/v1/logs`,
70
+ headers: authHeaders,
71
+ });
72
+ const loggerProvider = new LoggerProvider({
73
+ resource: resource,
74
+ processors: [new BatchLogRecordProcessor(logExporter)],
75
+ });
65
76
  const ingestPattern = new RegExp(`^${baseUrl.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}`);
66
77
  const instrumentations = [];
78
+ const applySupabaseAttrs = (span, req, _result) => {
79
+ try {
80
+ const url = typeof req === "string" ? req : req instanceof URL ? req.href : req?.url || "";
81
+ const method = req?.method || "GET";
82
+ if (url && isSupabaseURL(url)) {
83
+ enrichSupabaseSpan(span, url, method);
84
+ }
85
+ }
86
+ catch { }
87
+ };
67
88
  if (config.instrumentGlobalFetch !== false) {
68
89
  instrumentations.push(new FetchInstrumentation({
69
90
  propagateTraceHeaderCorsUrls: /.*/,
70
91
  ignoreUrls: [ingestPattern],
71
92
  clearTimingResources: true,
93
+ applyCustomAttributesOnSpan: applySupabaseAttrs,
72
94
  }));
73
95
  }
74
96
  if (config.instrumentXHR !== false) {
@@ -84,8 +106,8 @@ export function setupOtelWeb(config) {
84
106
  tracerProvider,
85
107
  instrumentations,
86
108
  });
87
- const tracer = trace.getTracer("@obtrace/sdk-browser", "2.1.0");
88
- const meter = metrics.getMeter("@obtrace/sdk-browser", "2.1.0");
109
+ const tracer = trace.getTracer("@obtrace/sdk-browser", "2.4.0");
110
+ const meter = metrics.getMeter("@obtrace/sdk-browser", "2.4.0");
89
111
  const forceFlush = async () => {
90
112
  try {
91
113
  await tracerProvider.forceFlush();
@@ -95,11 +117,16 @@ export function setupOtelWeb(config) {
95
117
  await meterProvider.forceFlush();
96
118
  }
97
119
  catch { }
120
+ try {
121
+ await loggerProvider.forceFlush();
122
+ }
123
+ catch { }
98
124
  };
99
125
  const shutdown = async () => {
100
126
  await forceFlush();
101
127
  await tracerProvider.shutdown();
102
128
  await meterProvider.shutdown();
129
+ await loggerProvider.shutdown();
103
130
  };
104
- return { tracer, meter, shutdown, forceFlush };
131
+ return { tracer, meter, loggerProvider, shutdown, forceFlush };
105
132
  }
@@ -1,2 +1,3 @@
1
1
  import { type Tracer } from "@opentelemetry/api";
2
- export declare function installConsoleCapture(tracer: Tracer, sessionId: string): () => void;
2
+ import type { Logger } from "@opentelemetry/api-logs";
3
+ export declare function installConsoleCapture(tracer: Tracer, logger: Logger, sessionId: string): () => void;
@@ -1,2 +1,3 @@
1
1
  import { type Tracer } from "@opentelemetry/api";
2
- export declare function installBrowserErrorHooks(tracer: Tracer, sessionId?: string): () => void;
2
+ import type { Logger } from "@opentelemetry/api-logs";
3
+ export declare function installBrowserErrorHooks(tracer: Tracer, logger: Logger, sessionId?: string): () => void;
@@ -0,0 +1,2 @@
1
+ import { type Tracer } from "@opentelemetry/api";
2
+ export declare function installSupabaseFetchInterceptor(tracer: Tracer, sessionId: string): () => void;
@@ -0,0 +1,12 @@
1
+ import { type Span } from "@opentelemetry/api";
2
+ interface SupabaseParsed {
3
+ ref: string;
4
+ service: string;
5
+ operation: string;
6
+ table: string;
7
+ detail: string;
8
+ }
9
+ export declare function isSupabaseURL(url: string): boolean;
10
+ export declare function parseSupabaseURL(url: string, method: string): SupabaseParsed | null;
11
+ export declare function enrichSupabaseSpan(span: Span, url: string, method: string): void;
12
+ export {};
@@ -1,8 +1,10 @@
1
1
  import { type Tracer, type Meter } from "@opentelemetry/api";
2
+ import { LoggerProvider } from "@opentelemetry/sdk-logs";
2
3
  import type { ObtraceSDKConfig } from "../shared/types";
3
4
  export interface OtelHandles {
4
5
  tracer: Tracer;
5
6
  meter: Meter;
7
+ loggerProvider: LoggerProvider;
6
8
  shutdown: () => Promise<void>;
7
9
  forceFlush: () => Promise<void>;
8
10
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@obtrace/browser",
3
- "version": "2.2.0",
3
+ "version": "2.4.0",
4
4
  "description": "Obtrace Browser SDK with frontend wrappers",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -66,6 +66,7 @@
66
66
  "dependencies": {
67
67
  "@opentelemetry/api": "^1.9.0",
68
68
  "@opentelemetry/context-zone": "^1.30.0",
69
+ "@opentelemetry/exporter-logs-otlp-http": "^0.214.0",
69
70
  "@opentelemetry/exporter-metrics-otlp-http": "^0.57.0",
70
71
  "@opentelemetry/exporter-trace-otlp-http": "^0.57.0",
71
72
  "@opentelemetry/instrumentation-document-load": "^0.43.0",
@@ -73,6 +74,7 @@
73
74
  "@opentelemetry/instrumentation-user-interaction": "^0.43.0",
74
75
  "@opentelemetry/instrumentation-xml-http-request": "^0.57.0",
75
76
  "@opentelemetry/resources": "^1.30.0",
77
+ "@opentelemetry/sdk-logs": "^0.214.0",
76
78
  "@opentelemetry/sdk-metrics": "^1.30.0",
77
79
  "@opentelemetry/sdk-trace-web": "^1.30.0",
78
80
  "@opentelemetry/semantic-conventions": "^1.30.0",