Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions MIGRATION.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,11 @@ npx @sentry/migr8@latest

This will let you select which updates to run, and automatically update your code. Make sure to still review all code changes!

## Deprecate `scope.getSpan()` and `scope.setSpan()`

Instead, you can get the currently active span via `Sentry.getActiveSpan()`.
Setting a span on the scope happens automatically when you use the new performance APIs `startSpan()` and `startSpanManual()`.

## Deprecate `scope.setTransactionName()`

Instead, either set this as attributes or tags, or use an event processor to set `event.transaction`.
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,7 @@ import type { NextApiRequest, NextApiResponse } from 'next';
export default function handler(req: NextApiRequest, res: NextApiResponse) {
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test-transaction', op: 'e2e-test' });
// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentHub().getScope().setSpan(transaction);

// eslint-disable-next-line deprecation/deprecation
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,6 +30,7 @@ const server = new ApolloServer({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction', op: 'transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

// eslint-disable-next-line @typescript-eslint/no-floating-promises
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,6 +22,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const query = connection.query('SELECT 1 + 1 AS solution');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,6 +14,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const client = new pg.Client();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,6 +13,7 @@ Sentry.init({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

http.get('http://match-this-url.com/api/v0');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,6 +32,7 @@ const server = new ApolloServer({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction', op: 'transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

// eslint-disable-next-line @typescript-eslint/no-floating-promises
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,6 +23,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,6 +26,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const client = new pg.Client();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,6 +21,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ Sentry.init({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

http.get('http://match-this-url.com/api/v0');
Expand Down
3 changes: 2 additions & 1 deletion packages/astro/src/server/middleware.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,6 +2,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';
import {
captureException,
continueTrace,
getActiveSpan,
getClient,
getCurrentScope,
runWithAsyncContext,
Expand DownExpand Up@@ -70,7 +71,7 @@ export const handleRequest: (options?: MiddlewareOptions) => MiddlewareResponseH
// if there is an active span, we know that this handle call is nested and hence
// we don't create a new domain for it. If we created one, nested server calls would
// create new transactions instead of adding a child span to the currently active span.
if (getCurrentScope().getSpan()) {
if (getActiveSpan()) {
return instrumentRequest(ctx, next, handlerOptions);
}
return runWithAsyncContext(() => {
Expand Down
7 changes: 5 additions & 2 deletions packages/astro/test/server/middleware.test.ts
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';
import * as SentryNode from '@sentry/node';
import type { Client } from '@sentry/types';
import type { Client, Span } from '@sentry/types';
import { vi } from 'vitest';

import { handleRequest, interpolateRouteFromUrlAndParams } from '../../src/server/middleware';
Expand All@@ -15,7 +15,9 @@ vi.mock('../../src/server/meta', () => ({
describe('sentryMiddleware', () => {
const startSpanSpy = vi.spyOn(SentryNode, 'startSpan');

const getSpanMock = vi.fn(() => {});
const getSpanMock = vi.fn(() => {
return {} as Span | undefined;
});
const setUserMock = vi.fn();

beforeEach(() => {
Expand All@@ -26,6 +28,7 @@ describe('sentryMiddleware', () => {
getSpan: getSpanMock,
} as any;
});
vi.spyOn(SentryNode, 'getActiveSpan').mockImplementation(getSpanMock);
vi.spyOn(SentryNode, 'getClient').mockImplementation(() => ({}) as Client);
});

Expand Down
9 changes: 6 additions & 3 deletions packages/core/src/scope.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -308,7 +308,9 @@ export class Scope implements ScopeInterface {
}

/**
* @inheritDoc
* Sets the Span on the scope.
* @param span Span
* @deprecated Instead of setting a span on a scope, use `startSpan()`/`startSpanManual()` instead.
*/
public setSpan(span?: Span): this {
this._span = span;
Expand All@@ -317,7 +319,8 @@ export class Scope implements ScopeInterface {
}

/**
* @inheritDoc
* Returns the `Span` if there is one.
* @deprecated Use `getActiveSpan()` instead.
*/
public getSpan(): Span | undefined {
return this._span;
Expand All@@ -330,7 +333,7 @@ export class Scope implements ScopeInterface {
public getTransaction(): Transaction | undefined {
// Often, this span (if it exists at all) will be a transaction, but it's not guaranteed to be. Regardless, it will
// have a pointer to the currently-active transaction.
const span = this.getSpan();
const span = this._span;
return span && span.transaction;
}

Expand Down
1 change: 1 addition & 0 deletions packages/core/src/server-runtime-client.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -255,6 +255,7 @@ export class ServerRuntimeClient<
return [undefined, undefined];
}

// eslint-disable-next-line deprecation/deprecation
const span = scope.getSpan();
if (span) {
const samplingContext = span.transaction ? span.transaction.getDynamicSamplingContext() : undefined;
Expand Down
1 change: 1 addition & 0 deletions packages/core/src/tracing/hubextensions.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,6 +13,7 @@ import { Transaction } from './transaction';
/** Returns all trace headers that are currently on the top scope. */
function traceHeaders(this: Hub): { [key: string]: string } {
const scope = this.getScope();
// eslint-disable-next-line deprecation/deprecation
const span = scope.getSpan();

return span
Expand Down
2 changes: 2 additions & 0 deletions packages/core/src/tracing/idletransaction.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -124,6 +124,7 @@ export class IdleTransaction extends Transaction {
// We set the transaction here on the scope so error events pick up the trace
// context and attach it to the error.
DEBUG_BUILD && logger.log(`Setting idle transaction on scope. Span ID: ${this.spanContext().spanId}`);
// eslint-disable-next-line deprecation/deprecation
_idleHub.getScope().setSpan(this);
}

Expand DownExpand Up@@ -198,6 +199,7 @@ export class IdleTransaction extends Transaction {
const scope = this._idleHub.getScope();
// eslint-disable-next-line deprecation/deprecation
if (scope.getTransaction() === this) {
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(undefined);
}
}
Expand Down
16 changes: 13 additions & 3 deletions packages/core/src/tracing/trace.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -143,11 +143,13 @@ export function trace<T>(
): T {
const hub = getCurrentHub();
const scope = getCurrentScope();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const ctx = normalizeContext(context);
const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);

// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

return handleCallbackErrors(
Expand All@@ -158,6 +160,7 @@ export function trace<T>(
},
() => {
activeSpan && activeSpan.end();
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(parentSpan);
afterFinish();
},
Expand All@@ -180,10 +183,11 @@ export function startSpan<T>(context: StartSpanOptions, callback: (span: Span |

return withScope(context.scope, scope => {
const hub = getCurrentHub();
const scopeForSpan = context.scope || scope;
const parentSpan = scopeForSpan.getSpan();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

return handleCallbackErrors(
Expand DownExpand Up@@ -223,9 +227,11 @@ export function startSpanManual<T>(

return withScope(context.scope, scope => {
const hub = getCurrentHub();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

function finishAndSetSpan(): void {
Expand DownExpand Up@@ -261,7 +267,10 @@ export function startInactiveSpan(context: StartSpanOptions): Span | undefined {

const ctx = normalizeContext(context);
const hub = getCurrentHub();
const parentSpan = context.scope ? context.scope.getSpan() : getActiveSpan();
const parentSpan = context.scope
? // eslint-disable-next-line deprecation/deprecation
context.scope.getSpan()
: getActiveSpan();
return parentSpan
? // eslint-disable-next-line deprecation/deprecation
parentSpan.startChild(ctx)
Expand All@@ -273,6 +282,7 @@ export function startInactiveSpan(context: StartSpanOptions): Span | undefined {
* Returns the currently active span.
*/
export function getActiveSpan(): Span | undefined {
// eslint-disable-next-line deprecation/deprecation
return getCurrentScope().getSpan();
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions MIGRATION.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,11 @@ npx @sentry/migr8@latest

This will let you select which updates to run, and automatically update your code. Make sure to still review all code changes!

## Deprecate `scope.getSpan()` and `scope.setSpan()`

Instead, you can get the currently active span via `Sentry.getActiveSpan()`.
Setting a span on the scope happens automatically when you use the new performance APIs `startSpan()` and `startSpanManual()`.

## Deprecate `scope.setTransactionName()`

Instead, either set this as attributes or tags, or use an event processor to set `event.transaction`.
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,7 @@ import type { NextApiRequest, NextApiResponse } from 'next';
export default function handler(req: NextApiRequest, res: NextApiResponse) {
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test-transaction', op: 'e2e-test' });
// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentHub().getScope().setSpan(transaction);

// eslint-disable-next-line deprecation/deprecation
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,6 +30,7 @@ const server = new ApolloServer({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction', op: 'transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

// eslint-disable-next-line @typescript-eslint/no-floating-promises
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,6 +22,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const query = connection.query('SELECT 1 + 1 AS solution');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,6 +14,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const client = new pg.Client();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,6 +13,7 @@ Sentry.init({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

http.get('http://match-this-url.com/api/v0');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,6 +32,7 @@ const server = new ApolloServer({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction', op: 'transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

// eslint-disable-next-line @typescript-eslint/no-floating-promises
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,6 +23,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,6 +26,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const client = new pg.Client();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,6 +21,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ Sentry.init({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

http.get('http://match-this-url.com/api/v0');
Expand Down
3 changes: 2 additions & 1 deletion packages/astro/src/server/middleware.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,6 +2,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';
import {
captureException,
continueTrace,
getActiveSpan,
getClient,
getCurrentScope,
runWithAsyncContext,
Expand DownExpand Up@@ -70,7 +71,7 @@ export const handleRequest: (options?: MiddlewareOptions) => MiddlewareResponseH
// if there is an active span, we know that this handle call is nested and hence
// we don't create a new domain for it. If we created one, nested server calls would
// create new transactions instead of adding a child span to the currently active span.
if (getCurrentScope().getSpan()) {
if (getActiveSpan()) {
return instrumentRequest(ctx, next, handlerOptions);
}
return runWithAsyncContext(() => {
Expand Down
7 changes: 5 additions & 2 deletions packages/astro/test/server/middleware.test.ts
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';
import * as SentryNode from '@sentry/node';
import type { Client } from '@sentry/types';
import type { Client, Span } from '@sentry/types';
import { vi } from 'vitest';

import { handleRequest, interpolateRouteFromUrlAndParams } from '../../src/server/middleware';
Expand All@@ -15,7 +15,9 @@ vi.mock('../../src/server/meta', () => ({
describe('sentryMiddleware', () => {
const startSpanSpy = vi.spyOn(SentryNode, 'startSpan');

const getSpanMock = vi.fn(() => {});
const getSpanMock = vi.fn(() => {
return {} as Span | undefined;
});
const setUserMock = vi.fn();

beforeEach(() => {
Expand All@@ -26,6 +28,7 @@ describe('sentryMiddleware', () => {
getSpan: getSpanMock,
} as any;
});
vi.spyOn(SentryNode, 'getActiveSpan').mockImplementation(getSpanMock);
vi.spyOn(SentryNode, 'getClient').mockImplementation(() => ({}) as Client);
});

Expand Down
9 changes: 6 additions & 3 deletions packages/core/src/scope.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -308,7 +308,9 @@ export class Scope implements ScopeInterface {
}

/**
* @inheritDoc
* Sets the Span on the scope.
* @param span Span
* @deprecated Instead of setting a span on a scope, use `startSpan()`/`startSpanManual()` instead.
*/
public setSpan(span?: Span): this {
this._span = span;
Expand All@@ -317,7 +319,8 @@ export class Scope implements ScopeInterface {
}

/**
* @inheritDoc
* Returns the `Span` if there is one.
* @deprecated Use `getActiveSpan()` instead.
*/
public getSpan(): Span | undefined {
return this._span;
Expand All@@ -330,7 +333,7 @@ export class Scope implements ScopeInterface {
public getTransaction(): Transaction | undefined {
// Often, this span (if it exists at all) will be a transaction, but it's not guaranteed to be. Regardless, it will
// have a pointer to the currently-active transaction.
const span = this.getSpan();
const span = this._span;
return span && span.transaction;
}

Expand Down
1 change: 1 addition & 0 deletions packages/core/src/server-runtime-client.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -255,6 +255,7 @@ export class ServerRuntimeClient<
return [undefined, undefined];
}

// eslint-disable-next-line deprecation/deprecation
const span = scope.getSpan();
if (span) {
const samplingContext = span.transaction ? span.transaction.getDynamicSamplingContext() : undefined;
Expand Down
1 change: 1 addition & 0 deletions packages/core/src/tracing/hubextensions.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,6 +13,7 @@ import { Transaction } from './transaction';
/** Returns all trace headers that are currently on the top scope. */
function traceHeaders(this: Hub): { [key: string]: string } {
const scope = this.getScope();
// eslint-disable-next-line deprecation/deprecation
const span = scope.getSpan();

return span
Expand Down
2 changes: 2 additions & 0 deletions packages/core/src/tracing/idletransaction.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -124,6 +124,7 @@ export class IdleTransaction extends Transaction {
// We set the transaction here on the scope so error events pick up the trace
// context and attach it to the error.
DEBUG_BUILD && logger.log(`Setting idle transaction on scope. Span ID: ${this.spanContext().spanId}`);
// eslint-disable-next-line deprecation/deprecation
_idleHub.getScope().setSpan(this);
}

Expand DownExpand Up@@ -198,6 +199,7 @@ export class IdleTransaction extends Transaction {
const scope = this._idleHub.getScope();
// eslint-disable-next-line deprecation/deprecation
if (scope.getTransaction() === this) {
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(undefined);
}
}
Expand Down
16 changes: 13 additions & 3 deletions packages/core/src/tracing/trace.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -143,11 +143,13 @@ export function trace<T>(
): T {
const hub = getCurrentHub();
const scope = getCurrentScope();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const ctx = normalizeContext(context);
const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);

// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

return handleCallbackErrors(
Expand All@@ -158,6 +160,7 @@ export function trace<T>(
},
() => {
activeSpan && activeSpan.end();
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(parentSpan);
afterFinish();
},
Expand All@@ -180,10 +183,11 @@ export function startSpan<T>(context: StartSpanOptions, callback: (span: Span |

return withScope(context.scope, scope => {
const hub = getCurrentHub();
const scopeForSpan = context.scope || scope;
const parentSpan = scopeForSpan.getSpan();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

return handleCallbackErrors(
Expand DownExpand Up@@ -223,9 +227,11 @@ export function startSpanManual<T>(

return withScope(context.scope, scope => {
const hub = getCurrentHub();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

function finishAndSetSpan(): void {
Expand DownExpand Up@@ -261,7 +267,10 @@ export function startInactiveSpan(context: StartSpanOptions): Span | undefined {

const ctx = normalizeContext(context);
const hub = getCurrentHub();
const parentSpan = context.scope ? context.scope.getSpan() : getActiveSpan();
const parentSpan = context.scope
? // eslint-disable-next-line deprecation/deprecation
context.scope.getSpan()
: getActiveSpan();
return parentSpan
? // eslint-disable-next-line deprecation/deprecation
parentSpan.startChild(ctx)
Expand All@@ -273,6 +282,7 @@ export function startInactiveSpan(context: StartSpanOptions): Span | undefined {
* Returns the currently active span.
*/
export function getActiveSpan(): Span | undefined {
// eslint-disable-next-line deprecation/deprecation
return getCurrentScope().getSpan();
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions MIGRATION.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,11 @@ npx @sentry/migr8@latest

This will let you select which updates to run, and automatically update your code. Make sure to still review all code changes!

## Deprecate `scope.getSpan()` and `scope.setSpan()`

Instead, you can get the currently active span via `Sentry.getActiveSpan()`.
Setting a span on the scope happens automatically when you use the new performance APIs `startSpan()` and `startSpanManual()`.

## Deprecate `scope.setTransactionName()`

Instead, either set this as attributes or tags, or use an event processor to set `event.transaction`.
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,7 @@ import type { NextApiRequest, NextApiResponse } from 'next';
export default function handler(req: NextApiRequest, res: NextApiResponse) {
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test-transaction', op: 'e2e-test' });
// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentHub().getScope().setSpan(transaction);

// eslint-disable-next-line deprecation/deprecation
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,6 +30,7 @@ const server = new ApolloServer({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction', op: 'transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

// eslint-disable-next-line @typescript-eslint/no-floating-promises
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,6 +22,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const query = connection.query('SELECT 1 + 1 AS solution');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,6 +14,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const client = new pg.Client();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,6 +13,7 @@ Sentry.init({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

http.get('http://match-this-url.com/api/v0');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,6 +32,7 @@ const server = new ApolloServer({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction', op: 'transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

// eslint-disable-next-line @typescript-eslint/no-floating-promises
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,6 +23,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,6 +26,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const client = new pg.Client();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,6 +21,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ Sentry.init({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

http.get('http://match-this-url.com/api/v0');
Expand Down
3 changes: 2 additions & 1 deletion packages/astro/src/server/middleware.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,6 +2,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';
import {
captureException,
continueTrace,
getActiveSpan,
getClient,
getCurrentScope,
runWithAsyncContext,
Expand DownExpand Up@@ -70,7 +71,7 @@ export const handleRequest: (options?: MiddlewareOptions) => MiddlewareResponseH
// if there is an active span, we know that this handle call is nested and hence
// we don't create a new domain for it. If we created one, nested server calls would
// create new transactions instead of adding a child span to the currently active span.
if (getCurrentScope().getSpan()) {
if (getActiveSpan()) {
return instrumentRequest(ctx, next, handlerOptions);
}
return runWithAsyncContext(() => {
Expand Down
7 changes: 5 additions & 2 deletions packages/astro/test/server/middleware.test.ts
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';
import * as SentryNode from '@sentry/node';
import type { Client } from '@sentry/types';
import type { Client, Span } from '@sentry/types';
import { vi } from 'vitest';

import { handleRequest, interpolateRouteFromUrlAndParams } from '../../src/server/middleware';
Expand All@@ -15,7 +15,9 @@ vi.mock('../../src/server/meta', () => ({
describe('sentryMiddleware', () => {
const startSpanSpy = vi.spyOn(SentryNode, 'startSpan');

const getSpanMock = vi.fn(() => {});
const getSpanMock = vi.fn(() => {
return {} as Span | undefined;
});
const setUserMock = vi.fn();

beforeEach(() => {
Expand All@@ -26,6 +28,7 @@ describe('sentryMiddleware', () => {
getSpan: getSpanMock,
} as any;
});
vi.spyOn(SentryNode, 'getActiveSpan').mockImplementation(getSpanMock);
vi.spyOn(SentryNode, 'getClient').mockImplementation(() => ({}) as Client);
});

Expand Down
9 changes: 6 additions & 3 deletions packages/core/src/scope.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -308,7 +308,9 @@ export class Scope implements ScopeInterface {
}

/**
* @inheritDoc
* Sets the Span on the scope.
* @param span Span
* @deprecated Instead of setting a span on a scope, use `startSpan()`/`startSpanManual()` instead.
*/
public setSpan(span?: Span): this {
this._span = span;
Expand All@@ -317,7 +319,8 @@ export class Scope implements ScopeInterface {
}

/**
* @inheritDoc
* Returns the `Span` if there is one.
* @deprecated Use `getActiveSpan()` instead.
*/
public getSpan(): Span | undefined {
return this._span;
Expand All@@ -330,7 +333,7 @@ export class Scope implements ScopeInterface {
public getTransaction(): Transaction | undefined {
// Often, this span (if it exists at all) will be a transaction, but it's not guaranteed to be. Regardless, it will
// have a pointer to the currently-active transaction.
const span = this.getSpan();
const span = this._span;
return span && span.transaction;
}

Expand Down
1 change: 1 addition & 0 deletions packages/core/src/server-runtime-client.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -255,6 +255,7 @@ export class ServerRuntimeClient<
return [undefined, undefined];
}

// eslint-disable-next-line deprecation/deprecation
const span = scope.getSpan();
if (span) {
const samplingContext = span.transaction ? span.transaction.getDynamicSamplingContext() : undefined;
Expand Down
1 change: 1 addition & 0 deletions packages/core/src/tracing/hubextensions.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,6 +13,7 @@ import { Transaction } from './transaction';
/** Returns all trace headers that are currently on the top scope. */
function traceHeaders(this: Hub): { [key: string]: string } {
const scope = this.getScope();
// eslint-disable-next-line deprecation/deprecation
const span = scope.getSpan();

return span
Expand Down
2 changes: 2 additions & 0 deletions packages/core/src/tracing/idletransaction.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -124,6 +124,7 @@ export class IdleTransaction extends Transaction {
// We set the transaction here on the scope so error events pick up the trace
// context and attach it to the error.
DEBUG_BUILD && logger.log(`Setting idle transaction on scope. Span ID: ${this.spanContext().spanId}`);
// eslint-disable-next-line deprecation/deprecation
_idleHub.getScope().setSpan(this);
}

Expand DownExpand Up@@ -198,6 +199,7 @@ export class IdleTransaction extends Transaction {
const scope = this._idleHub.getScope();
// eslint-disable-next-line deprecation/deprecation
if (scope.getTransaction() === this) {
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(undefined);
}
}
Expand Down
16 changes: 13 additions & 3 deletions packages/core/src/tracing/trace.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -143,11 +143,13 @@ export function trace<T>(
): T {
const hub = getCurrentHub();
const scope = getCurrentScope();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const ctx = normalizeContext(context);
const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);

// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

return handleCallbackErrors(
Expand All@@ -158,6 +160,7 @@ export function trace<T>(
},
() => {
activeSpan && activeSpan.end();
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(parentSpan);
afterFinish();
},
Expand All@@ -180,10 +183,11 @@ export function startSpan<T>(context: StartSpanOptions, callback: (span: Span |

return withScope(context.scope, scope => {
const hub = getCurrentHub();
const scopeForSpan = context.scope || scope;
const parentSpan = scopeForSpan.getSpan();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

return handleCallbackErrors(
Expand DownExpand Up@@ -223,9 +227,11 @@ export function startSpanManual<T>(

return withScope(context.scope, scope => {
const hub = getCurrentHub();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

function finishAndSetSpan(): void {
Expand DownExpand Up@@ -261,7 +267,10 @@ export function startInactiveSpan(context: StartSpanOptions): Span | undefined {

const ctx = normalizeContext(context);
const hub = getCurrentHub();
const parentSpan = context.scope ? context.scope.getSpan() : getActiveSpan();
const parentSpan = context.scope
? // eslint-disable-next-line deprecation/deprecation
context.scope.getSpan()
: getActiveSpan();
return parentSpan
? // eslint-disable-next-line deprecation/deprecation
parentSpan.startChild(ctx)
Expand All@@ -273,6 +282,7 @@ export function startInactiveSpan(context: StartSpanOptions): Span | undefined {
* Returns the currently active span.
*/
export function getActiveSpan(): Span | undefined {
// eslint-disable-next-line deprecation/deprecation
return getCurrentScope().getSpan();
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions MIGRATION.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,11 @@ npx @sentry/migr8@latest

This will let you select which updates to run, and automatically update your code. Make sure to still review all code changes!

## Deprecate `scope.getSpan()` and `scope.setSpan()`

Instead, you can get the currently active span via `Sentry.getActiveSpan()`.
Setting a span on the scope happens automatically when you use the new performance APIs `startSpan()` and `startSpanManual()`.

## Deprecate `scope.setTransactionName()`

Instead, either set this as attributes or tags, or use an event processor to set `event.transaction`.
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,7 @@ import type { NextApiRequest, NextApiResponse } from 'next';
export default function handler(req: NextApiRequest, res: NextApiResponse) {
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test-transaction', op: 'e2e-test' });
// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentHub().getScope().setSpan(transaction);

// eslint-disable-next-line deprecation/deprecation
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,6 +30,7 @@ const server = new ApolloServer({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction', op: 'transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

// eslint-disable-next-line @typescript-eslint/no-floating-promises
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,6 +22,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const query = connection.query('SELECT 1 + 1 AS solution');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,6 +14,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const client = new pg.Client();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,6 +13,7 @@ Sentry.init({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

http.get('http://match-this-url.com/api/v0');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,6 +32,7 @@ const server = new ApolloServer({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction', op: 'transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

// eslint-disable-next-line @typescript-eslint/no-floating-promises
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,6 +23,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,6 +26,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const client = new pg.Client();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,6 +21,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ Sentry.init({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

http.get('http://match-this-url.com/api/v0');
Expand Down
3 changes: 2 additions & 1 deletion packages/astro/src/server/middleware.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,6 +2,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';
import {
captureException,
continueTrace,
getActiveSpan,
getClient,
getCurrentScope,
runWithAsyncContext,
Expand DownExpand Up@@ -70,7 +71,7 @@ export const handleRequest: (options?: MiddlewareOptions) => MiddlewareResponseH
// if there is an active span, we know that this handle call is nested and hence
// we don't create a new domain for it. If we created one, nested server calls would
// create new transactions instead of adding a child span to the currently active span.
if (getCurrentScope().getSpan()) {
if (getActiveSpan()) {
return instrumentRequest(ctx, next, handlerOptions);
}
return runWithAsyncContext(() => {
Expand Down
7 changes: 5 additions & 2 deletions packages/astro/test/server/middleware.test.ts
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';
import * as SentryNode from '@sentry/node';
import type { Client } from '@sentry/types';
import type { Client, Span } from '@sentry/types';
import { vi } from 'vitest';

import { handleRequest, interpolateRouteFromUrlAndParams } from '../../src/server/middleware';
Expand All@@ -15,7 +15,9 @@ vi.mock('../../src/server/meta', () => ({
describe('sentryMiddleware', () => {
const startSpanSpy = vi.spyOn(SentryNode, 'startSpan');

const getSpanMock = vi.fn(() => {});
const getSpanMock = vi.fn(() => {
return {} as Span | undefined;
});
const setUserMock = vi.fn();

beforeEach(() => {
Expand All@@ -26,6 +28,7 @@ describe('sentryMiddleware', () => {
getSpan: getSpanMock,
} as any;
});
vi.spyOn(SentryNode, 'getActiveSpan').mockImplementation(getSpanMock);
vi.spyOn(SentryNode, 'getClient').mockImplementation(() => ({}) as Client);
});

Expand Down
9 changes: 6 additions & 3 deletions packages/core/src/scope.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -308,7 +308,9 @@ export class Scope implements ScopeInterface {
}

/**
* @inheritDoc
* Sets the Span on the scope.
* @param span Span
* @deprecated Instead of setting a span on a scope, use `startSpan()`/`startSpanManual()` instead.
*/
public setSpan(span?: Span): this {
this._span = span;
Expand All@@ -317,7 +319,8 @@ export class Scope implements ScopeInterface {
}

/**
* @inheritDoc
* Returns the `Span` if there is one.
* @deprecated Use `getActiveSpan()` instead.
*/
public getSpan(): Span | undefined {
return this._span;
Expand All@@ -330,7 +333,7 @@ export class Scope implements ScopeInterface {
public getTransaction(): Transaction | undefined {
// Often, this span (if it exists at all) will be a transaction, but it's not guaranteed to be. Regardless, it will
// have a pointer to the currently-active transaction.
const span = this.getSpan();
const span = this._span;
return span && span.transaction;
}

Expand Down
1 change: 1 addition & 0 deletions packages/core/src/server-runtime-client.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -255,6 +255,7 @@ export class ServerRuntimeClient<
return [undefined, undefined];
}

// eslint-disable-next-line deprecation/deprecation
const span = scope.getSpan();
if (span) {
const samplingContext = span.transaction ? span.transaction.getDynamicSamplingContext() : undefined;
Expand Down
1 change: 1 addition & 0 deletions packages/core/src/tracing/hubextensions.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,6 +13,7 @@ import { Transaction } from './transaction';
/** Returns all trace headers that are currently on the top scope. */
function traceHeaders(this: Hub): { [key: string]: string } {
const scope = this.getScope();
// eslint-disable-next-line deprecation/deprecation
const span = scope.getSpan();

return span
Expand Down
2 changes: 2 additions & 0 deletions packages/core/src/tracing/idletransaction.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -124,6 +124,7 @@ export class IdleTransaction extends Transaction {
// We set the transaction here on the scope so error events pick up the trace
// context and attach it to the error.
DEBUG_BUILD && logger.log(`Setting idle transaction on scope. Span ID: ${this.spanContext().spanId}`);
// eslint-disable-next-line deprecation/deprecation
_idleHub.getScope().setSpan(this);
}

Expand DownExpand Up@@ -198,6 +199,7 @@ export class IdleTransaction extends Transaction {
const scope = this._idleHub.getScope();
// eslint-disable-next-line deprecation/deprecation
if (scope.getTransaction() === this) {
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(undefined);
}
}
Expand Down
16 changes: 13 additions & 3 deletions packages/core/src/tracing/trace.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -143,11 +143,13 @@ export function trace<T>(
): T {
const hub = getCurrentHub();
const scope = getCurrentScope();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const ctx = normalizeContext(context);
const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);

// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

return handleCallbackErrors(
Expand All@@ -158,6 +160,7 @@ export function trace<T>(
},
() => {
activeSpan && activeSpan.end();
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(parentSpan);
afterFinish();
},
Expand All@@ -180,10 +183,11 @@ export function startSpan<T>(context: StartSpanOptions, callback: (span: Span |

return withScope(context.scope, scope => {
const hub = getCurrentHub();
const scopeForSpan = context.scope || scope;
const parentSpan = scopeForSpan.getSpan();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

return handleCallbackErrors(
Expand DownExpand Up@@ -223,9 +227,11 @@ export function startSpanManual<T>(

return withScope(context.scope, scope => {
const hub = getCurrentHub();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

function finishAndSetSpan(): void {
Expand DownExpand Up@@ -261,7 +267,10 @@ export function startInactiveSpan(context: StartSpanOptions): Span | undefined {

const ctx = normalizeContext(context);
const hub = getCurrentHub();
const parentSpan = context.scope ? context.scope.getSpan() : getActiveSpan();
const parentSpan = context.scope
? // eslint-disable-next-line deprecation/deprecation
context.scope.getSpan()
: getActiveSpan();
return parentSpan
? // eslint-disable-next-line deprecation/deprecation
parentSpan.startChild(ctx)
Expand All@@ -273,6 +282,7 @@ export function startInactiveSpan(context: StartSpanOptions): Span | undefined {
* Returns the currently active span.
*/
export function getActiveSpan(): Span | undefined {
// eslint-disable-next-line deprecation/deprecation
return getCurrentScope().getSpan();
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions MIGRATION.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,11 @@ npx @sentry/migr8@latest

This will let you select which updates to run, and automatically update your code. Make sure to still review all code changes!

## Deprecate `scope.getSpan()` and `scope.setSpan()`

Instead, you can get the currently active span via `Sentry.getActiveSpan()`.
Setting a span on the scope happens automatically when you use the new performance APIs `startSpan()` and `startSpanManual()`.

## Deprecate `scope.setTransactionName()`

Instead, either set this as attributes or tags, or use an event processor to set `event.transaction`.
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,7 @@ import type { NextApiRequest, NextApiResponse } from 'next';
export default function handler(req: NextApiRequest, res: NextApiResponse) {
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test-transaction', op: 'e2e-test' });
// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentHub().getScope().setSpan(transaction);

// eslint-disable-next-line deprecation/deprecation
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,6 +30,7 @@ const server = new ApolloServer({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction', op: 'transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

// eslint-disable-next-line @typescript-eslint/no-floating-promises
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,6 +22,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const query = connection.query('SELECT 1 + 1 AS solution');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,6 +14,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const client = new pg.Client();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,6 +13,7 @@ Sentry.init({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

http.get('http://match-this-url.com/api/v0');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,6 +32,7 @@ const server = new ApolloServer({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction', op: 'transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

// eslint-disable-next-line @typescript-eslint/no-floating-promises
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,6 +23,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,6 +26,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const client = new pg.Client();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,6 +21,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ Sentry.init({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

http.get('http://match-this-url.com/api/v0');
Expand Down
3 changes: 2 additions & 1 deletion packages/astro/src/server/middleware.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,6 +2,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';
import {
captureException,
continueTrace,
getActiveSpan,
getClient,
getCurrentScope,
runWithAsyncContext,
Expand DownExpand Up@@ -70,7 +71,7 @@ export const handleRequest: (options?: MiddlewareOptions) => MiddlewareResponseH
// if there is an active span, we know that this handle call is nested and hence
// we don't create a new domain for it. If we created one, nested server calls would
// create new transactions instead of adding a child span to the currently active span.
if (getCurrentScope().getSpan()) {
if (getActiveSpan()) {
return instrumentRequest(ctx, next, handlerOptions);
}
return runWithAsyncContext(() => {
Expand Down
7 changes: 5 additions & 2 deletions packages/astro/test/server/middleware.test.ts
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';
import * as SentryNode from '@sentry/node';
import type { Client } from '@sentry/types';
import type { Client, Span } from '@sentry/types';
import { vi } from 'vitest';

import { handleRequest, interpolateRouteFromUrlAndParams } from '../../src/server/middleware';
Expand All@@ -15,7 +15,9 @@ vi.mock('../../src/server/meta', () => ({
describe('sentryMiddleware', () => {
const startSpanSpy = vi.spyOn(SentryNode, 'startSpan');

const getSpanMock = vi.fn(() => {});
const getSpanMock = vi.fn(() => {
return {} as Span | undefined;
});
const setUserMock = vi.fn();

beforeEach(() => {
Expand All@@ -26,6 +28,7 @@ describe('sentryMiddleware', () => {
getSpan: getSpanMock,
} as any;
});
vi.spyOn(SentryNode, 'getActiveSpan').mockImplementation(getSpanMock);
vi.spyOn(SentryNode, 'getClient').mockImplementation(() => ({}) as Client);
});

Expand Down
9 changes: 6 additions & 3 deletions packages/core/src/scope.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -308,7 +308,9 @@ export class Scope implements ScopeInterface {
}

/**
* @inheritDoc
* Sets the Span on the scope.
* @param span Span
* @deprecated Instead of setting a span on a scope, use `startSpan()`/`startSpanManual()` instead.
*/
public setSpan(span?: Span): this {
this._span = span;
Expand All@@ -317,7 +319,8 @@ export class Scope implements ScopeInterface {
}

/**
* @inheritDoc
* Returns the `Span` if there is one.
* @deprecated Use `getActiveSpan()` instead.
*/
public getSpan(): Span | undefined {
return this._span;
Expand All@@ -330,7 +333,7 @@ export class Scope implements ScopeInterface {
public getTransaction(): Transaction | undefined {
// Often, this span (if it exists at all) will be a transaction, but it's not guaranteed to be. Regardless, it will
// have a pointer to the currently-active transaction.
const span = this.getSpan();
const span = this._span;
return span && span.transaction;
}

Expand Down
1 change: 1 addition & 0 deletions packages/core/src/server-runtime-client.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -255,6 +255,7 @@ export class ServerRuntimeClient<
return [undefined, undefined];
}

// eslint-disable-next-line deprecation/deprecation
const span = scope.getSpan();
if (span) {
const samplingContext = span.transaction ? span.transaction.getDynamicSamplingContext() : undefined;
Expand Down
1 change: 1 addition & 0 deletions packages/core/src/tracing/hubextensions.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,6 +13,7 @@ import { Transaction } from './transaction';
/** Returns all trace headers that are currently on the top scope. */
function traceHeaders(this: Hub): { [key: string]: string } {
const scope = this.getScope();
// eslint-disable-next-line deprecation/deprecation
const span = scope.getSpan();

return span
Expand Down
2 changes: 2 additions & 0 deletions packages/core/src/tracing/idletransaction.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -124,6 +124,7 @@ export class IdleTransaction extends Transaction {
// We set the transaction here on the scope so error events pick up the trace
// context and attach it to the error.
DEBUG_BUILD && logger.log(`Setting idle transaction on scope. Span ID: ${this.spanContext().spanId}`);
// eslint-disable-next-line deprecation/deprecation
_idleHub.getScope().setSpan(this);
}

Expand DownExpand Up@@ -198,6 +199,7 @@ export class IdleTransaction extends Transaction {
const scope = this._idleHub.getScope();
// eslint-disable-next-line deprecation/deprecation
if (scope.getTransaction() === this) {
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(undefined);
}
}
Expand Down
16 changes: 13 additions & 3 deletions packages/core/src/tracing/trace.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -143,11 +143,13 @@ export function trace<T>(
): T {
const hub = getCurrentHub();
const scope = getCurrentScope();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const ctx = normalizeContext(context);
const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);

// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

return handleCallbackErrors(
Expand All@@ -158,6 +160,7 @@ export function trace<T>(
},
() => {
activeSpan && activeSpan.end();
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(parentSpan);
afterFinish();
},
Expand All@@ -180,10 +183,11 @@ export function startSpan<T>(context: StartSpanOptions, callback: (span: Span |

return withScope(context.scope, scope => {
const hub = getCurrentHub();
const scopeForSpan = context.scope || scope;
const parentSpan = scopeForSpan.getSpan();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

return handleCallbackErrors(
Expand DownExpand Up@@ -223,9 +227,11 @@ export function startSpanManual<T>(

return withScope(context.scope, scope => {
const hub = getCurrentHub();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

function finishAndSetSpan(): void {
Expand DownExpand Up@@ -261,7 +267,10 @@ export function startInactiveSpan(context: StartSpanOptions): Span | undefined {

const ctx = normalizeContext(context);
const hub = getCurrentHub();
const parentSpan = context.scope ? context.scope.getSpan() : getActiveSpan();
const parentSpan = context.scope
? // eslint-disable-next-line deprecation/deprecation
context.scope.getSpan()
: getActiveSpan();
return parentSpan
? // eslint-disable-next-line deprecation/deprecation
parentSpan.startChild(ctx)
Expand All@@ -273,6 +282,7 @@ export function startInactiveSpan(context: StartSpanOptions): Span | undefined {
* Returns the currently active span.
*/
export function getActiveSpan(): Span | undefined {
// eslint-disable-next-line deprecation/deprecation
return getCurrentScope().getSpan();
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions MIGRATION.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,11 @@ npx @sentry/migr8@latest

This will let you select which updates to run, and automatically update your code. Make sure to still review all code changes!

## Deprecate `scope.getSpan()` and `scope.setSpan()`

Instead, you can get the currently active span via `Sentry.getActiveSpan()`.
Setting a span on the scope happens automatically when you use the new performance APIs `startSpan()` and `startSpanManual()`.

## Deprecate `scope.setTransactionName()`

Instead, either set this as attributes or tags, or use an event processor to set `event.transaction`.
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,7 @@ import type { NextApiRequest, NextApiResponse } from 'next';
export default function handler(req: NextApiRequest, res: NextApiResponse) {
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test-transaction', op: 'e2e-test' });
// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentHub().getScope().setSpan(transaction);

// eslint-disable-next-line deprecation/deprecation
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,6 +30,7 @@ const server = new ApolloServer({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction', op: 'transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

// eslint-disable-next-line @typescript-eslint/no-floating-promises
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,6 +22,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const query = connection.query('SELECT 1 + 1 AS solution');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,6 +14,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const client = new pg.Client();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,6 +13,7 @@ Sentry.init({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

http.get('http://match-this-url.com/api/v0');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,6 +32,7 @@ const server = new ApolloServer({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction', op: 'transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

// eslint-disable-next-line @typescript-eslint/no-floating-promises
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,6 +23,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,6 +26,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const client = new pg.Client();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,6 +21,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ Sentry.init({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

http.get('http://match-this-url.com/api/v0');
Expand Down
3 changes: 2 additions & 1 deletion packages/astro/src/server/middleware.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,6 +2,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';
import {
captureException,
continueTrace,
getActiveSpan,
getClient,
getCurrentScope,
runWithAsyncContext,
Expand DownExpand Up@@ -70,7 +71,7 @@ export const handleRequest: (options?: MiddlewareOptions) => MiddlewareResponseH
// if there is an active span, we know that this handle call is nested and hence
// we don't create a new domain for it. If we created one, nested server calls would
// create new transactions instead of adding a child span to the currently active span.
if (getCurrentScope().getSpan()) {
if (getActiveSpan()) {
return instrumentRequest(ctx, next, handlerOptions);
}
return runWithAsyncContext(() => {
Expand Down
7 changes: 5 additions & 2 deletions packages/astro/test/server/middleware.test.ts
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';
import * as SentryNode from '@sentry/node';
import type { Client } from '@sentry/types';
import type { Client, Span } from '@sentry/types';
import { vi } from 'vitest';

import { handleRequest, interpolateRouteFromUrlAndParams } from '../../src/server/middleware';
Expand All@@ -15,7 +15,9 @@ vi.mock('../../src/server/meta', () => ({
describe('sentryMiddleware', () => {
const startSpanSpy = vi.spyOn(SentryNode, 'startSpan');

const getSpanMock = vi.fn(() => {});
const getSpanMock = vi.fn(() => {
return {} as Span | undefined;
});
const setUserMock = vi.fn();

beforeEach(() => {
Expand All@@ -26,6 +28,7 @@ describe('sentryMiddleware', () => {
getSpan: getSpanMock,
} as any;
});
vi.spyOn(SentryNode, 'getActiveSpan').mockImplementation(getSpanMock);
vi.spyOn(SentryNode, 'getClient').mockImplementation(() => ({}) as Client);
});

Expand Down
9 changes: 6 additions & 3 deletions packages/core/src/scope.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -308,7 +308,9 @@ export class Scope implements ScopeInterface {
}

/**
* @inheritDoc
* Sets the Span on the scope.
* @param span Span
* @deprecated Instead of setting a span on a scope, use `startSpan()`/`startSpanManual()` instead.
*/
public setSpan(span?: Span): this {
this._span = span;
Expand All@@ -317,7 +319,8 @@ export class Scope implements ScopeInterface {
}

/**
* @inheritDoc
* Returns the `Span` if there is one.
* @deprecated Use `getActiveSpan()` instead.
*/
public getSpan(): Span | undefined {
return this._span;
Expand All@@ -330,7 +333,7 @@ export class Scope implements ScopeInterface {
public getTransaction(): Transaction | undefined {
// Often, this span (if it exists at all) will be a transaction, but it's not guaranteed to be. Regardless, it will
// have a pointer to the currently-active transaction.
const span = this.getSpan();
const span = this._span;
return span && span.transaction;
}

Expand Down
1 change: 1 addition & 0 deletions packages/core/src/server-runtime-client.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -255,6 +255,7 @@ export class ServerRuntimeClient<
return [undefined, undefined];
}

// eslint-disable-next-line deprecation/deprecation
const span = scope.getSpan();
if (span) {
const samplingContext = span.transaction ? span.transaction.getDynamicSamplingContext() : undefined;
Expand Down
1 change: 1 addition & 0 deletions packages/core/src/tracing/hubextensions.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,6 +13,7 @@ import { Transaction } from './transaction';
/** Returns all trace headers that are currently on the top scope. */
function traceHeaders(this: Hub): { [key: string]: string } {
const scope = this.getScope();
// eslint-disable-next-line deprecation/deprecation
const span = scope.getSpan();

return span
Expand Down
2 changes: 2 additions & 0 deletions packages/core/src/tracing/idletransaction.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -124,6 +124,7 @@ export class IdleTransaction extends Transaction {
// We set the transaction here on the scope so error events pick up the trace
// context and attach it to the error.
DEBUG_BUILD && logger.log(`Setting idle transaction on scope. Span ID: ${this.spanContext().spanId}`);
// eslint-disable-next-line deprecation/deprecation
_idleHub.getScope().setSpan(this);
}

Expand DownExpand Up@@ -198,6 +199,7 @@ export class IdleTransaction extends Transaction {
const scope = this._idleHub.getScope();
// eslint-disable-next-line deprecation/deprecation
if (scope.getTransaction() === this) {
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(undefined);
}
}
Expand Down
16 changes: 13 additions & 3 deletions packages/core/src/tracing/trace.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -143,11 +143,13 @@ export function trace<T>(
): T {
const hub = getCurrentHub();
const scope = getCurrentScope();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const ctx = normalizeContext(context);
const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);

// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

return handleCallbackErrors(
Expand All@@ -158,6 +160,7 @@ export function trace<T>(
},
() => {
activeSpan && activeSpan.end();
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(parentSpan);
afterFinish();
},
Expand All@@ -180,10 +183,11 @@ export function startSpan<T>(context: StartSpanOptions, callback: (span: Span |

return withScope(context.scope, scope => {
const hub = getCurrentHub();
const scopeForSpan = context.scope || scope;
const parentSpan = scopeForSpan.getSpan();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

return handleCallbackErrors(
Expand DownExpand Up@@ -223,9 +227,11 @@ export function startSpanManual<T>(

return withScope(context.scope, scope => {
const hub = getCurrentHub();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

function finishAndSetSpan(): void {
Expand DownExpand Up@@ -261,7 +267,10 @@ export function startInactiveSpan(context: StartSpanOptions): Span | undefined {

const ctx = normalizeContext(context);
const hub = getCurrentHub();
const parentSpan = context.scope ? context.scope.getSpan() : getActiveSpan();
const parentSpan = context.scope
? // eslint-disable-next-line deprecation/deprecation
context.scope.getSpan()
: getActiveSpan();
return parentSpan
? // eslint-disable-next-line deprecation/deprecation
parentSpan.startChild(ctx)
Expand All@@ -273,6 +282,7 @@ export function startInactiveSpan(context: StartSpanOptions): Span | undefined {
* Returns the currently active span.
*/
export function getActiveSpan(): Span | undefined {
// eslint-disable-next-line deprecation/deprecation
return getCurrentScope().getSpan();
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions MIGRATION.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,11 @@ npx @sentry/migr8@latest

This will let you select which updates to run, and automatically update your code. Make sure to still review all code changes!

## Deprecate `scope.getSpan()` and `scope.setSpan()`

Instead, you can get the currently active span via `Sentry.getActiveSpan()`.
Setting a span on the scope happens automatically when you use the new performance APIs `startSpan()` and `startSpanManual()`.

## Deprecate `scope.setTransactionName()`

Instead, either set this as attributes or tags, or use an event processor to set `event.transaction`.
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,7 @@ import type { NextApiRequest, NextApiResponse } from 'next';
export default function handler(req: NextApiRequest, res: NextApiResponse) {
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test-transaction', op: 'e2e-test' });
// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentHub().getScope().setSpan(transaction);

// eslint-disable-next-line deprecation/deprecation
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,6 +30,7 @@ const server = new ApolloServer({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction', op: 'transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

// eslint-disable-next-line @typescript-eslint/no-floating-promises
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,6 +22,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const query = connection.query('SELECT 1 + 1 AS solution');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,6 +14,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const client = new pg.Client();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,6 +13,7 @@ Sentry.init({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

http.get('http://match-this-url.com/api/v0');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,6 +32,7 @@ const server = new ApolloServer({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction', op: 'transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

// eslint-disable-next-line @typescript-eslint/no-floating-promises
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,6 +23,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,6 +26,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const client = new pg.Client();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,6 +21,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ Sentry.init({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

http.get('http://match-this-url.com/api/v0');
Expand Down
3 changes: 2 additions & 1 deletion packages/astro/src/server/middleware.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,6 +2,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';
import {
captureException,
continueTrace,
getActiveSpan,
getClient,
getCurrentScope,
runWithAsyncContext,
Expand DownExpand Up@@ -70,7 +71,7 @@ export const handleRequest: (options?: MiddlewareOptions) => MiddlewareResponseH
// if there is an active span, we know that this handle call is nested and hence
// we don't create a new domain for it. If we created one, nested server calls would
// create new transactions instead of adding a child span to the currently active span.
if (getCurrentScope().getSpan()) {
if (getActiveSpan()) {
return instrumentRequest(ctx, next, handlerOptions);
}
return runWithAsyncContext(() => {
Expand Down
7 changes: 5 additions & 2 deletions packages/astro/test/server/middleware.test.ts
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';
import * as SentryNode from '@sentry/node';
import type { Client } from '@sentry/types';
import type { Client, Span } from '@sentry/types';
import { vi } from 'vitest';

import { handleRequest, interpolateRouteFromUrlAndParams } from '../../src/server/middleware';
Expand All@@ -15,7 +15,9 @@ vi.mock('../../src/server/meta', () => ({
describe('sentryMiddleware', () => {
const startSpanSpy = vi.spyOn(SentryNode, 'startSpan');

const getSpanMock = vi.fn(() => {});
const getSpanMock = vi.fn(() => {
return {} as Span | undefined;
});
const setUserMock = vi.fn();

beforeEach(() => {
Expand All@@ -26,6 +28,7 @@ describe('sentryMiddleware', () => {
getSpan: getSpanMock,
} as any;
});
vi.spyOn(SentryNode, 'getActiveSpan').mockImplementation(getSpanMock);
vi.spyOn(SentryNode, 'getClient').mockImplementation(() => ({}) as Client);
});

Expand Down
9 changes: 6 additions & 3 deletions packages/core/src/scope.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -308,7 +308,9 @@ export class Scope implements ScopeInterface {
}

/**
* @inheritDoc
* Sets the Span on the scope.
* @param span Span
* @deprecated Instead of setting a span on a scope, use `startSpan()`/`startSpanManual()` instead.
*/
public setSpan(span?: Span): this {
this._span = span;
Expand All@@ -317,7 +319,8 @@ export class Scope implements ScopeInterface {
}

/**
* @inheritDoc
* Returns the `Span` if there is one.
* @deprecated Use `getActiveSpan()` instead.
*/
public getSpan(): Span | undefined {
return this._span;
Expand All@@ -330,7 +333,7 @@ export class Scope implements ScopeInterface {
public getTransaction(): Transaction | undefined {
// Often, this span (if it exists at all) will be a transaction, but it's not guaranteed to be. Regardless, it will
// have a pointer to the currently-active transaction.
const span = this.getSpan();
const span = this._span;
return span && span.transaction;
}

Expand Down
1 change: 1 addition & 0 deletions packages/core/src/server-runtime-client.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -255,6 +255,7 @@ export class ServerRuntimeClient<
return [undefined, undefined];
}

// eslint-disable-next-line deprecation/deprecation
const span = scope.getSpan();
if (span) {
const samplingContext = span.transaction ? span.transaction.getDynamicSamplingContext() : undefined;
Expand Down
1 change: 1 addition & 0 deletions packages/core/src/tracing/hubextensions.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,6 +13,7 @@ import { Transaction } from './transaction';
/** Returns all trace headers that are currently on the top scope. */
function traceHeaders(this: Hub): { [key: string]: string } {
const scope = this.getScope();
// eslint-disable-next-line deprecation/deprecation
const span = scope.getSpan();

return span
Expand Down
2 changes: 2 additions & 0 deletions packages/core/src/tracing/idletransaction.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -124,6 +124,7 @@ export class IdleTransaction extends Transaction {
// We set the transaction here on the scope so error events pick up the trace
// context and attach it to the error.
DEBUG_BUILD && logger.log(`Setting idle transaction on scope. Span ID: ${this.spanContext().spanId}`);
// eslint-disable-next-line deprecation/deprecation
_idleHub.getScope().setSpan(this);
}

Expand DownExpand Up@@ -198,6 +199,7 @@ export class IdleTransaction extends Transaction {
const scope = this._idleHub.getScope();
// eslint-disable-next-line deprecation/deprecation
if (scope.getTransaction() === this) {
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(undefined);
}
}
Expand Down
16 changes: 13 additions & 3 deletions packages/core/src/tracing/trace.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -143,11 +143,13 @@ export function trace<T>(
): T {
const hub = getCurrentHub();
const scope = getCurrentScope();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const ctx = normalizeContext(context);
const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);

// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

return handleCallbackErrors(
Expand All@@ -158,6 +160,7 @@ export function trace<T>(
},
() => {
activeSpan && activeSpan.end();
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(parentSpan);
afterFinish();
},
Expand All@@ -180,10 +183,11 @@ export function startSpan<T>(context: StartSpanOptions, callback: (span: Span |

return withScope(context.scope, scope => {
const hub = getCurrentHub();
const scopeForSpan = context.scope || scope;
const parentSpan = scopeForSpan.getSpan();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

return handleCallbackErrors(
Expand DownExpand Up@@ -223,9 +227,11 @@ export function startSpanManual<T>(

return withScope(context.scope, scope => {
const hub = getCurrentHub();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

function finishAndSetSpan(): void {
Expand DownExpand Up@@ -261,7 +267,10 @@ export function startInactiveSpan(context: StartSpanOptions): Span | undefined {

const ctx = normalizeContext(context);
const hub = getCurrentHub();
const parentSpan = context.scope ? context.scope.getSpan() : getActiveSpan();
const parentSpan = context.scope
? // eslint-disable-next-line deprecation/deprecation
context.scope.getSpan()
: getActiveSpan();
return parentSpan
? // eslint-disable-next-line deprecation/deprecation
parentSpan.startChild(ctx)
Expand All@@ -273,6 +282,7 @@ export function startInactiveSpan(context: StartSpanOptions): Span | undefined {
* Returns the currently active span.
*/
export function getActiveSpan(): Span | undefined {
// eslint-disable-next-line deprecation/deprecation
return getCurrentScope().getSpan();
}

Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions MIGRATION.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -8,6 +8,11 @@ npx @sentry/migr8@latest

This will let you select which updates to run, and automatically update your code. Make sure to still review all code changes!

## Deprecate `scope.getSpan()` and `scope.setSpan()`

Instead, you can get the currently active span via `Sentry.getActiveSpan()`.
Setting a span on the scope happens automatically when you use the new performance APIs `startSpan()` and `startSpanManual()`.

## Deprecate `scope.setTransactionName()`

Instead, either set this as attributes or tags, or use an event processor to set `event.transaction`.
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,6 +5,7 @@ import type { NextApiRequest, NextApiResponse } from 'next';
export default function handler(req: NextApiRequest, res: NextApiResponse) {
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test-transaction', op: 'e2e-test' });
// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentHub().getScope().setSpan(transaction);

// eslint-disable-next-line deprecation/deprecation
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,6 +30,7 @@ const server = new ApolloServer({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction', op: 'transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

// eslint-disable-next-line @typescript-eslint/no-floating-promises
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,6 +22,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -25,6 +25,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const query = connection.query('SELECT 1 + 1 AS solution');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,6 +14,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const client = new pg.Client();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -19,6 +19,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,6 +13,7 @@ Sentry.init({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

http.get('http://match-this-url.com/api/v0');
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -32,6 +32,7 @@ const server = new ApolloServer({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction', op: 'transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

// eslint-disable-next-line @typescript-eslint/no-floating-promises
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -23,6 +23,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -26,6 +26,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

connection.query('SELECT 1 + 1 AS solution', function () {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ const transaction = Sentry.startTransaction({
name: 'Test Transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

const client = new pg.Client();
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -21,6 +21,7 @@ async function run(): Promise<void> {
op: 'transaction',
});

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

try {
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,7 @@ Sentry.init({
// eslint-disable-next-line deprecation/deprecation
const transaction = Sentry.startTransaction({ name: 'test_transaction' });

// eslint-disable-next-line deprecation/deprecation
Sentry.getCurrentScope().setSpan(transaction);

http.get('http://match-this-url.com/api/v0');
Expand Down
3 changes: 2 additions & 1 deletion packages/astro/src/server/middleware.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -2,6 +2,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';
import {
captureException,
continueTrace,
getActiveSpan,
getClient,
getCurrentScope,
runWithAsyncContext,
Expand DownExpand Up@@ -70,7 +71,7 @@ export const handleRequest: (options?: MiddlewareOptions) => MiddlewareResponseH
// if there is an active span, we know that this handle call is nested and hence
// we don't create a new domain for it. If we created one, nested server calls would
// create new transactions instead of adding a child span to the currently active span.
if (getCurrentScope().getSpan()) {
if (getActiveSpan()) {
return instrumentRequest(ctx, next, handlerOptions);
}
return runWithAsyncContext(() => {
Expand Down
7 changes: 5 additions & 2 deletions packages/astro/test/server/middleware.test.ts
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '@sentry/core';
import * as SentryNode from '@sentry/node';
import type { Client } from '@sentry/types';
import type { Client, Span } from '@sentry/types';
import { vi } from 'vitest';

import { handleRequest, interpolateRouteFromUrlAndParams } from '../../src/server/middleware';
Expand All@@ -15,7 +15,9 @@ vi.mock('../../src/server/meta', () => ({
describe('sentryMiddleware', () => {
const startSpanSpy = vi.spyOn(SentryNode, 'startSpan');

const getSpanMock = vi.fn(() => {});
const getSpanMock = vi.fn(() => {
return {} as Span | undefined;
});
const setUserMock = vi.fn();

beforeEach(() => {
Expand All@@ -26,6 +28,7 @@ describe('sentryMiddleware', () => {
getSpan: getSpanMock,
} as any;
});
vi.spyOn(SentryNode, 'getActiveSpan').mockImplementation(getSpanMock);
vi.spyOn(SentryNode, 'getClient').mockImplementation(() => ({}) as Client);
});

Expand Down
9 changes: 6 additions & 3 deletions packages/core/src/scope.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -308,7 +308,9 @@ export class Scope implements ScopeInterface {
}

/**
* @inheritDoc
* Sets the Span on the scope.
* @param span Span
* @deprecated Instead of setting a span on a scope, use `startSpan()`/`startSpanManual()` instead.
*/
public setSpan(span?: Span): this {
this._span = span;
Expand All@@ -317,7 +319,8 @@ export class Scope implements ScopeInterface {
}

/**
* @inheritDoc
* Returns the `Span` if there is one.
* @deprecated Use `getActiveSpan()` instead.
*/
public getSpan(): Span | undefined {
return this._span;
Expand All@@ -330,7 +333,7 @@ export class Scope implements ScopeInterface {
public getTransaction(): Transaction | undefined {
// Often, this span (if it exists at all) will be a transaction, but it's not guaranteed to be. Regardless, it will
// have a pointer to the currently-active transaction.
const span = this.getSpan();
const span = this._span;
return span && span.transaction;
}

Expand Down
1 change: 1 addition & 0 deletions packages/core/src/server-runtime-client.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -255,6 +255,7 @@ export class ServerRuntimeClient<
return [undefined, undefined];
}

// eslint-disable-next-line deprecation/deprecation
const span = scope.getSpan();
if (span) {
const samplingContext = span.transaction ? span.transaction.getDynamicSamplingContext() : undefined;
Expand Down
1 change: 1 addition & 0 deletions packages/core/src/tracing/hubextensions.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,6 +13,7 @@ import { Transaction } from './transaction';
/** Returns all trace headers that are currently on the top scope. */
function traceHeaders(this: Hub): { [key: string]: string } {
const scope = this.getScope();
// eslint-disable-next-line deprecation/deprecation
const span = scope.getSpan();

return span
Expand Down
2 changes: 2 additions & 0 deletions packages/core/src/tracing/idletransaction.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -124,6 +124,7 @@ export class IdleTransaction extends Transaction {
// We set the transaction here on the scope so error events pick up the trace
// context and attach it to the error.
DEBUG_BUILD && logger.log(`Setting idle transaction on scope. Span ID: ${this.spanContext().spanId}`);
// eslint-disable-next-line deprecation/deprecation
_idleHub.getScope().setSpan(this);
}

Expand DownExpand Up@@ -198,6 +199,7 @@ export class IdleTransaction extends Transaction {
const scope = this._idleHub.getScope();
// eslint-disable-next-line deprecation/deprecation
if (scope.getTransaction() === this) {
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(undefined);
}
}
Expand Down
16 changes: 13 additions & 3 deletions packages/core/src/tracing/trace.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -143,11 +143,13 @@ export function trace<T>(
): T {
const hub = getCurrentHub();
const scope = getCurrentScope();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const ctx = normalizeContext(context);
const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);

// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

return handleCallbackErrors(
Expand All@@ -158,6 +160,7 @@ export function trace<T>(
},
() => {
activeSpan && activeSpan.end();
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(parentSpan);
afterFinish();
},
Expand All@@ -180,10 +183,11 @@ export function startSpan<T>(context: StartSpanOptions, callback: (span: Span |

return withScope(context.scope, scope => {
const hub = getCurrentHub();
const scopeForSpan = context.scope || scope;
const parentSpan = scopeForSpan.getSpan();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

return handleCallbackErrors(
Expand DownExpand Up@@ -223,9 +227,11 @@ export function startSpanManual<T>(

return withScope(context.scope, scope => {
const hub = getCurrentHub();
// eslint-disable-next-line deprecation/deprecation
const parentSpan = scope.getSpan();

const activeSpan = createChildSpanOrTransaction(hub, parentSpan, ctx);
// eslint-disable-next-line deprecation/deprecation
scope.setSpan(activeSpan);

function finishAndSetSpan(): void {
Expand DownExpand Up@@ -261,7 +267,10 @@ export function startInactiveSpan(context: StartSpanOptions): Span | undefined {

const ctx = normalizeContext(context);
const hub = getCurrentHub();
const parentSpan = context.scope ? context.scope.getSpan() : getActiveSpan();
const parentSpan = context.scope
? // eslint-disable-next-line deprecation/deprecation
context.scope.getSpan()
: getActiveSpan();
return parentSpan
? // eslint-disable-next-line deprecation/deprecation
parentSpan.startChild(ctx)
Expand All@@ -273,6 +282,7 @@ export function startInactiveSpan(context: StartSpanOptions): Span | undefined {
* Returns the currently active span.
*/
export function getActiveSpan(): Span | undefined {
// eslint-disable-next-line deprecation/deprecation
return getCurrentScope().getSpan();
}

Expand Down
Loading