diff --git a/packages/browser/src/integrations/breadcrumbs.ts b/packages/browser/src/integrations/breadcrumbs.ts index cfcb255f5999..9c6b4cfb9764 100644 --- a/packages/browser/src/integrations/breadcrumbs.ts +++ b/packages/browser/src/integrations/breadcrumbs.ts @@ -1,5 +1,5 @@ /* eslint-disable max-lines */ -import { getClient, getCurrentHub } from '@sentry/core'; +import { addBreadcrumb, getClient } from '@sentry/core'; import type { Event as SentryEvent, HandlerDataConsole, @@ -123,7 +123,7 @@ export class Breadcrumbs implements Integration { * Adds a breadcrumb for Sentry events or transactions if this option is enabled. */ function addSentryBreadcrumb(event: SentryEvent): void { - getCurrentHub().addBreadcrumb( + addBreadcrumb( { category: `sentry.${event.type === 'transaction' ? 'transaction' : 'event'}`, event_id: event.event_id, @@ -173,7 +173,7 @@ function _domBreadcrumb(dom: BreadcrumbsOptions['dom']): (handlerData: HandlerDa return; } - getCurrentHub().addBreadcrumb( + addBreadcrumb( { category: `ui.${handlerData.name}`, message: target, @@ -213,7 +213,7 @@ function _consoleBreadcrumb(handlerData: HandlerDataConsole): void { } } - getCurrentHub().addBreadcrumb(breadcrumb, { + addBreadcrumb(breadcrumb, { input: handlerData.args, level: handlerData.level, }); @@ -247,7 +247,7 @@ function _xhrBreadcrumb(handlerData: HandlerDataXhr): void { endTimestamp, }; - getCurrentHub().addBreadcrumb( + addBreadcrumb( { category: 'xhr', data, @@ -282,7 +282,7 @@ function _fetchBreadcrumb(handlerData: HandlerDataFetch): void { endTimestamp, }; - getCurrentHub().addBreadcrumb( + addBreadcrumb( { category: 'fetch', data, @@ -303,7 +303,7 @@ function _fetchBreadcrumb(handlerData: HandlerDataFetch): void { startTimestamp, endTimestamp, }; - getCurrentHub().addBreadcrumb( + addBreadcrumb( { category: 'fetch', data, @@ -338,7 +338,7 @@ function _historyBreadcrumb(handlerData: HandlerDataHistory): void { from = parsedFrom.relative; } - getCurrentHub().addBreadcrumb({ + addBreadcrumb({ category: 'navigation', data: { from, diff --git a/packages/browser/test/unit/integrations/breadcrumbs.test.ts b/packages/browser/test/unit/integrations/breadcrumbs.test.ts index d81107a69c38..e87454737482 100644 --- a/packages/browser/test/unit/integrations/breadcrumbs.test.ts +++ b/packages/browser/test/unit/integrations/breadcrumbs.test.ts @@ -1,4 +1,4 @@ -import { getCurrentHub } from '@sentry/core'; +import * as SentryCore from '@sentry/core'; import type { Client } from '@sentry/types'; import { Breadcrumbs, BrowserClient, Hub, flush } from '../../../src'; @@ -18,21 +18,20 @@ jest.mock('@sentry/core', () => { describe('Breadcrumbs', () => { it('Should add sentry breadcrumb', async () => { - const addBreadcrumb = jest.fn(); - hub.addBreadcrumb = addBreadcrumb; - client = new BrowserClient({ ...getDefaultBrowserClientOptions(), dsn: 'https://username@domain/123', integrations: [new Breadcrumbs()], }); - getCurrentHub().bindClient(client); + SentryCore.getCurrentHub().bindClient(client); + + const addBreadcrumbSpy = jest.spyOn(SentryCore, 'addBreadcrumb').mockImplementation(() => {}); client.captureMessage('test'); await flush(2000); - expect(addBreadcrumb.mock.calls[0][0].category).toEqual('sentry.event'); - expect(addBreadcrumb.mock.calls[0][0].message).toEqual('test'); + expect(addBreadcrumbSpy.mock.calls[0][0].category).toEqual('sentry.event'); + expect(addBreadcrumbSpy.mock.calls[0][0].message).toEqual('test'); }); }); diff --git a/packages/core/src/exports.ts b/packages/core/src/exports.ts index 0e574c4853cc..211740131cbf 100644 --- a/packages/core/src/exports.ts +++ b/packages/core/src/exports.ts @@ -1,5 +1,6 @@ import type { Breadcrumb, + BreadcrumbHint, CaptureContext, CheckIn, Client, @@ -90,8 +91,8 @@ export function configureScope(callback: (scope: Scope) => void): ReturnType { - getCurrentHub().addBreadcrumb(breadcrumb); +export function addBreadcrumb(breadcrumb: Breadcrumb, hint?: BreadcrumbHint): ReturnType { + getCurrentHub().addBreadcrumb(breadcrumb, hint); } /** diff --git a/packages/node-experimental/src/integrations/http.ts b/packages/node-experimental/src/integrations/http.ts index 6fe99e90101c..860169c6a43e 100644 --- a/packages/node-experimental/src/integrations/http.ts +++ b/packages/node-experimental/src/integrations/http.ts @@ -3,7 +3,7 @@ import type { Span } from '@opentelemetry/api'; import { SpanKind } from '@opentelemetry/api'; import { registerInstrumentations } from '@opentelemetry/instrumentation'; import { HttpInstrumentation } from '@opentelemetry/instrumentation-http'; -import { hasTracingEnabled, isSentryRequestUrl } from '@sentry/core'; +import { addBreadcrumb, hasTracingEnabled, isSentryRequestUrl } from '@sentry/core'; import { _INTERNAL, getClient, getCurrentHub, getSpanKind, setSpanMetadata } from '@sentry/opentelemetry'; import type { EventProcessor, Hub, Integration } from '@sentry/types'; import { stringMatchesSomePattern } from '@sentry/utils'; @@ -159,7 +159,7 @@ export class Http implements Integration { } const data = _INTERNAL.getRequestSpanData(span); - getCurrentHub().addBreadcrumb( + addBreadcrumb( { category: 'http', data: { diff --git a/packages/node-experimental/src/integrations/node-fetch.ts b/packages/node-experimental/src/integrations/node-fetch.ts index 54d67f33f4c2..2f9db367d511 100644 --- a/packages/node-experimental/src/integrations/node-fetch.ts +++ b/packages/node-experimental/src/integrations/node-fetch.ts @@ -1,8 +1,8 @@ import type { Span } from '@opentelemetry/api'; import { SpanKind } from '@opentelemetry/api'; import type { Instrumentation } from '@opentelemetry/instrumentation'; -import { hasTracingEnabled } from '@sentry/core'; -import { _INTERNAL, getClient, getCurrentHub, getSpanKind } from '@sentry/opentelemetry'; +import { addBreadcrumb, hasTracingEnabled } from '@sentry/core'; +import { _INTERNAL, getClient, getSpanKind } from '@sentry/opentelemetry'; import type { Integration } from '@sentry/types'; import type { NodeExperimentalClient } from '../types'; @@ -114,7 +114,7 @@ export class NodeFetch extends NodePerformanceIntegration impl } const data = _INTERNAL.getRequestSpanData(span); - getCurrentHub().addBreadcrumb({ + addBreadcrumb({ category: 'http', data: { ...data, diff --git a/packages/node/src/integrations/console.ts b/packages/node/src/integrations/console.ts index f99ab88b43b5..6c5142ae2a40 100644 --- a/packages/node/src/integrations/console.ts +++ b/packages/node/src/integrations/console.ts @@ -1,5 +1,5 @@ import * as util from 'util'; -import { getCurrentHub } from '@sentry/core'; +import { addBreadcrumb, getCurrentHub } from '@sentry/core'; import type { Integration } from '@sentry/types'; import { addConsoleInstrumentationHandler, severityLevelFromString } from '@sentry/utils'; @@ -26,7 +26,7 @@ export class Console implements Integration { return; } - hub.addBreadcrumb( + addBreadcrumb( { category: 'console', level: severityLevelFromString(level), diff --git a/packages/node/src/integrations/http.ts b/packages/node/src/integrations/http.ts index 94aa36b80901..02e79d06b942 100644 --- a/packages/node/src/integrations/http.ts +++ b/packages/node/src/integrations/http.ts @@ -1,7 +1,7 @@ import type * as http from 'http'; import type * as https from 'https'; import type { Hub } from '@sentry/core'; -import { getClient, getCurrentScope } from '@sentry/core'; +import { addBreadcrumb, getClient, getCurrentScope } from '@sentry/core'; import { getCurrentHub, getDynamicSamplingContextFromClient, isSentryRequestUrl } from '@sentry/core'; import type { DynamicSamplingContext, @@ -214,7 +214,7 @@ function _createWrappedRequestMethodFactory( return; } - getCurrentHub().addBreadcrumb( + addBreadcrumb( { category: 'http', data: { diff --git a/packages/node/src/integrations/undici/index.ts b/packages/node/src/integrations/undici/index.ts index b260f26e192d..b67562843d84 100644 --- a/packages/node/src/integrations/undici/index.ts +++ b/packages/node/src/integrations/undici/index.ts @@ -1,4 +1,5 @@ import { + addBreadcrumb, getClient, getCurrentHub, getCurrentScope, @@ -214,7 +215,7 @@ export class Undici implements Integration { } if (this._options.breadcrumbs) { - hub.addBreadcrumb( + addBreadcrumb( { category: 'http', data: { @@ -254,7 +255,7 @@ export class Undici implements Integration { } if (this._options.breadcrumbs) { - hub.addBreadcrumb( + addBreadcrumb( { category: 'http', data: { diff --git a/packages/node/test/integrations/http.test.ts b/packages/node/test/integrations/http.test.ts index 1bfafd5c256d..2055aefeca39 100644 --- a/packages/node/test/integrations/http.test.ts +++ b/packages/node/test/integrations/http.test.ts @@ -592,6 +592,7 @@ describe('default protocols', () => { function captureBreadcrumb(key: string): Promise { const hub = new Hub(); jest.spyOn(sentryCore, 'getCurrentHub').mockReturnValue(hub); + jest.spyOn(sentryCore, 'addBreadcrumb').mockImplementation((...rest) => hub.addBreadcrumb(...rest)); let resolve: (value: Breadcrumb | PromiseLike) => void; const p = new Promise(r => { diff --git a/packages/replay/src/util/log.ts b/packages/replay/src/util/log.ts index 96b6e76dc498..3d16137bbbc0 100644 --- a/packages/replay/src/util/log.ts +++ b/packages/replay/src/util/log.ts @@ -1,4 +1,4 @@ -import { getCurrentHub } from '@sentry/core'; +import { addBreadcrumb } from '@sentry/core'; import { logger } from '@sentry/utils'; import { DEBUG_BUILD } from '../debug-build'; @@ -14,7 +14,7 @@ export function logInfo(message: string, shouldAddBreadcrumb?: boolean): void { logger.info(message); if (shouldAddBreadcrumb) { - addBreadcrumb(message); + addLogBreadcrumb(message); } } @@ -33,14 +33,13 @@ export function logInfoNextTick(message: string, shouldAddBreadcrumb?: boolean): // Wait a tick here to avoid race conditions for some initial logs // which may be added before replay is initialized setTimeout(() => { - addBreadcrumb(message); + addLogBreadcrumb(message); }, 0); } } -function addBreadcrumb(message: string): void { - const hub = getCurrentHub(); - hub.addBreadcrumb( +function addLogBreadcrumb(message: string): void { + addBreadcrumb( { category: 'console', data: { diff --git a/packages/vercel-edge/src/integrations/wintercg-fetch.ts b/packages/vercel-edge/src/integrations/wintercg-fetch.ts index b03cae819073..18c4cb25df56 100644 --- a/packages/vercel-edge/src/integrations/wintercg-fetch.ts +++ b/packages/vercel-edge/src/integrations/wintercg-fetch.ts @@ -1,5 +1,5 @@ import { instrumentFetchRequest } from '@sentry-internal/tracing'; -import { getClient, getCurrentHub, isSentryRequestUrl } from '@sentry/core'; +import { addBreadcrumb, getClient, getCurrentHub, isSentryRequestUrl } from '@sentry/core'; import type { FetchBreadcrumbData, FetchBreadcrumbHint, HandlerDataFetch, Integration, Span } from '@sentry/types'; import { LRUMap, addFetchInstrumentationHandler, stringMatchesSomePattern } from '@sentry/utils'; @@ -130,7 +130,7 @@ function createBreadcrumb(handlerData: HandlerDataFetch): void { endTimestamp, }; - getCurrentHub().addBreadcrumb( + addBreadcrumb( { category: 'fetch', data, @@ -150,7 +150,7 @@ function createBreadcrumb(handlerData: HandlerDataFetch): void { startTimestamp, endTimestamp, }; - getCurrentHub().addBreadcrumb( + addBreadcrumb( { category: 'fetch', data, diff --git a/packages/vercel-edge/test/wintercg-fetch.test.ts b/packages/vercel-edge/test/wintercg-fetch.test.ts index d35aaa64f35c..3e6ac09330e0 100644 --- a/packages/vercel-edge/test/wintercg-fetch.test.ts +++ b/packages/vercel-edge/test/wintercg-fetch.test.ts @@ -34,7 +34,7 @@ jest.spyOn(sentryCore, 'getClient').mockImplementation(() => fakeHubInstance.get const addFetchInstrumentationHandlerSpy = jest.spyOn(sentryUtils, 'addFetchInstrumentationHandler'); const instrumentFetchRequestSpy = jest.spyOn(internalTracing, 'instrumentFetchRequest'); -const addBreadcrumbSpy = jest.spyOn(fakeHubInstance, 'addBreadcrumb'); +const addBreadcrumbSpy = jest.spyOn(sentryCore, 'addBreadcrumb'); beforeEach(() => { jest.clearAllMocks();