diff --git a/CHANGELOG.md b/CHANGELOG.md index d2805f3340d4..c8b579c25cc5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,13 +4,6 @@ - "You miss 100 percent of the chances you don't take. — Wayne Gretzky" — Michael Scott -## 6.18.1-beta.0 - -This patch builds on top of the https://github.com/getsentry/sentry-javascript/releases/tag/6.17.8-beta.0 beta. -It adds an additional finish reason that covers the case where a transaction was getting externally finished. - -- feat(tracing): Reset IdleTimeout based on activities count ([#4531](https://github.com/getsentry/sentry-javascript/pull/4531)) - ## 6.18.1 - fix(ember): use _backburner if it exists ([#4603](https://github.com/getsentry/sentry-javascript/pull/4603)) diff --git a/lerna.json b/lerna.json index f059849b4090..6184484fb485 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { "lerna": "3.4.0", - "version": "6.18.1-beta.0", + "version": "6.18.1", "packages": "packages/*", "npmClient": "yarn", "useWorkspaces": true diff --git a/packages/angular/package.json b/packages/angular/package.json index 96f53a52d704..1ad920e54522 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -1,6 +1,6 @@ { "name": "@sentry/angular", - "version": "6.18.1-beta.0", + "version": "6.18.1", "description": "Official Sentry SDK for Angular", "repository": "git://github.com/getsentry/sentry-javascript.git", "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/angular", @@ -21,9 +21,9 @@ "@angular/router": "10.x || 11.x || 12.x || 13.x" }, "dependencies": { - "@sentry/browser": "6.18.1-beta.0", - "@sentry/types": "6.18.1-beta.0", - "@sentry/utils": "6.18.1-beta.0", + "@sentry/browser": "6.18.1", + "@sentry/types": "6.18.1", + "@sentry/utils": "6.18.1", "rxjs": "^6.6.0", "tslib": "^1.9.3" }, diff --git a/packages/browser/package.json b/packages/browser/package.json index aa40f1f840ee..cdf1fad6e295 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -1,6 +1,6 @@ { "name": "@sentry/browser", - "version": "6.18.1-beta.0", + "version": "6.18.1", "description": "Official Sentry SDK for browsers", "repository": "git://github.com/getsentry/sentry-javascript.git", "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/browser", @@ -16,9 +16,9 @@ "access": "public" }, "dependencies": { - "@sentry/core": "6.18.1-beta.0", - "@sentry/types": "6.18.1-beta.0", - "@sentry/utils": "6.18.1-beta.0", + "@sentry/core": "6.18.1", + "@sentry/types": "6.18.1", + "@sentry/utils": "6.18.1", "tslib": "^1.9.3" }, "devDependencies": { diff --git a/packages/core/package.json b/packages/core/package.json index 78e92409bff7..9c923afac1d2 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@sentry/core", - "version": "6.18.1-beta.0", + "version": "6.18.1", "description": "Base implementation for all Sentry JavaScript SDKs", "repository": "git://github.com/getsentry/sentry-javascript.git", "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/core", @@ -16,10 +16,10 @@ "access": "public" }, "dependencies": { - "@sentry/hub": "6.18.1-beta.0", - "@sentry/minimal": "6.18.1-beta.0", - "@sentry/types": "6.18.1-beta.0", - "@sentry/utils": "6.18.1-beta.0", + "@sentry/hub": "6.18.1", + "@sentry/minimal": "6.18.1", + "@sentry/types": "6.18.1", + "@sentry/utils": "6.18.1", "tslib": "^1.9.3" }, "scripts": { diff --git a/packages/core/src/version.ts b/packages/core/src/version.ts index a42272d66d86..58f439858f65 100644 --- a/packages/core/src/version.ts +++ b/packages/core/src/version.ts @@ -1 +1 @@ -export const SDK_VERSION = '6.18.1-beta.0'; +export const SDK_VERSION = '6.18.1'; diff --git a/packages/ember/package.json b/packages/ember/package.json index 0f359586a770..6047a6d79b9f 100644 --- a/packages/ember/package.json +++ b/packages/ember/package.json @@ -1,6 +1,6 @@ { "name": "@sentry/ember", - "version": "6.18.1-beta.0", + "version": "6.18.1", "description": "Official Sentry SDK for Ember.js", "repository": "git://github.com/getsentry/sentry-javascript.git", "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/ember", @@ -31,10 +31,10 @@ }, "dependencies": { "@embroider/macros": "~0.47.2", - "@sentry/browser": "6.18.1-beta.0", - "@sentry/tracing": "6.18.1-beta.0", - "@sentry/types": "6.18.1-beta.0", - "@sentry/utils": "6.18.1-beta.0", + "@sentry/browser": "6.18.1", + "@sentry/tracing": "6.18.1", + "@sentry/types": "6.18.1", + "@sentry/utils": "6.18.1", "ember-auto-import": "^1.12.0 || ^2.2.0", "ember-cli-babel": "~7.26.6", "ember-cli-htmlbars": "^6.0.1", diff --git a/packages/eslint-config-sdk/package.json b/packages/eslint-config-sdk/package.json index d3ec094695f0..f3b17830c57e 100644 --- a/packages/eslint-config-sdk/package.json +++ b/packages/eslint-config-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@sentry-internal/eslint-config-sdk", - "version": "6.18.1-beta.0", + "version": "6.18.1", "description": "Official Sentry SDK eslint config", "repository": "git://github.com/getsentry/sentry-javascript.git", "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/eslint-config-sdk", @@ -19,8 +19,8 @@ "access": "public" }, "dependencies": { - "@sentry-internal/eslint-plugin-sdk": "6.18.1-beta.0", - "@sentry-internal/typescript": "6.18.1-beta.0", + "@sentry-internal/eslint-plugin-sdk": "6.18.1", + "@sentry-internal/typescript": "6.18.1", "@typescript-eslint/eslint-plugin": "^3.9.0", "@typescript-eslint/parser": "^3.9.0", "eslint-config-prettier": "^6.11.0", diff --git a/packages/eslint-plugin-sdk/package.json b/packages/eslint-plugin-sdk/package.json index 66545b0e934c..d794c09e8f3f 100644 --- a/packages/eslint-plugin-sdk/package.json +++ b/packages/eslint-plugin-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@sentry-internal/eslint-plugin-sdk", - "version": "6.18.1-beta.0", + "version": "6.18.1", "description": "Official Sentry SDK eslint plugin", "repository": "git://github.com/getsentry/sentry-javascript.git", "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/eslint-plugin-sdk", diff --git a/packages/gatsby/package.json b/packages/gatsby/package.json index e4a7095814d8..ffb03b4bcbd9 100644 --- a/packages/gatsby/package.json +++ b/packages/gatsby/package.json @@ -1,6 +1,6 @@ { "name": "@sentry/gatsby", - "version": "6.18.1-beta.0", + "version": "6.18.1", "description": "Official Sentry SDK for Gatsby.js", "repository": "git://github.com/getsentry/sentry-javascript.git", "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/gatsby", @@ -26,8 +26,8 @@ "access": "public" }, "dependencies": { - "@sentry/react": "6.18.1-beta.0", - "@sentry/tracing": "6.18.1-beta.0", + "@sentry/react": "6.18.1", + "@sentry/tracing": "6.18.1", "@sentry/webpack-plugin": "1.18.8" }, "peerDependencies": { @@ -35,7 +35,7 @@ "react": "15.x || 16.x || 17.x" }, "devDependencies": { - "@sentry/types": "6.18.1-beta.0", + "@sentry/types": "6.18.1", "@testing-library/react": "^10.4.9", "react": "^17.0.0" }, diff --git a/packages/hub/package.json b/packages/hub/package.json index 3a140f29e1f3..dc8773b5bbde 100644 --- a/packages/hub/package.json +++ b/packages/hub/package.json @@ -1,6 +1,6 @@ { "name": "@sentry/hub", - "version": "6.18.1-beta.0", + "version": "6.18.1", "description": "Sentry hub which handles global state managment.", "repository": "git://github.com/getsentry/sentry-javascript.git", "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/hub", @@ -16,8 +16,8 @@ "access": "public" }, "dependencies": { - "@sentry/types": "6.18.1-beta.0", - "@sentry/utils": "6.18.1-beta.0", + "@sentry/types": "6.18.1", + "@sentry/utils": "6.18.1", "tslib": "^1.9.3" }, "scripts": { diff --git a/packages/integration-tests/package.json b/packages/integration-tests/package.json index c626593c799a..7c6e8a6b18ed 100644 --- a/packages/integration-tests/package.json +++ b/packages/integration-tests/package.json @@ -1,6 +1,6 @@ { "name": "@sentry-internal/browser-integration-tests", - "version": "6.18.1-beta.0", + "version": "6.18.1", "main": "index.js", "license": "MIT", "engines": { diff --git a/packages/integration-tests/suites/tracing/browsertracing/backgroundtab-custom/test.ts b/packages/integration-tests/suites/tracing/browsertracing/backgroundtab-custom/test.ts index 8a50d643e0c9..a21cff2f1831 100644 --- a/packages/integration-tests/suites/tracing/browsertracing/backgroundtab-custom/test.ts +++ b/packages/integration-tests/suites/tracing/browsertracing/backgroundtab-custom/test.ts @@ -36,5 +36,5 @@ sentryTest('should finish a custom transaction when the page goes background', a expect(id_before).toBe(id_after); expect(name_after).toBe(name_before); expect(status_after).toBe('cancelled'); - expect(tags_after).toStrictEqual({ visibilitychange: 'document.hidden' }); + expect(tags_after).toStrictEqual({ finishReason: 'documentHidden', visibilitychange: 'document.hidden' }); }); diff --git a/packages/integrations/package.json b/packages/integrations/package.json index 079229186438..dbc42b8d938a 100644 --- a/packages/integrations/package.json +++ b/packages/integrations/package.json @@ -1,6 +1,6 @@ { "name": "@sentry/integrations", - "version": "6.18.1-beta.0", + "version": "6.18.1", "description": "Pluggable integrations that can be used to enhance JS SDKs", "repository": "git://github.com/getsentry/sentry-javascript.git", "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/integrations", @@ -16,8 +16,8 @@ "module": "esm/index.js", "types": "dist/index.d.ts", "dependencies": { - "@sentry/types": "6.18.1-beta.0", - "@sentry/utils": "6.18.1-beta.0", + "@sentry/types": "6.18.1", + "@sentry/utils": "6.18.1", "localforage": "^1.8.1", "tslib": "^1.9.3" }, diff --git a/packages/minimal/package.json b/packages/minimal/package.json index 46edc0c87a94..a36e0f07c18a 100644 --- a/packages/minimal/package.json +++ b/packages/minimal/package.json @@ -1,6 +1,6 @@ { "name": "@sentry/minimal", - "version": "6.18.1-beta.0", + "version": "6.18.1", "description": "Sentry minimal library that can be used in other packages", "repository": "git://github.com/getsentry/sentry-javascript.git", "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/minimal", @@ -16,8 +16,8 @@ "access": "public" }, "dependencies": { - "@sentry/hub": "6.18.1-beta.0", - "@sentry/types": "6.18.1-beta.0", + "@sentry/hub": "6.18.1", + "@sentry/types": "6.18.1", "tslib": "^1.9.3" }, "scripts": { diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 13d7564f3bb1..ed1dd6d5050b 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@sentry/nextjs", - "version": "6.18.1-beta.0", + "version": "6.18.1", "description": "Official Sentry SDK for Next.js", "repository": "git://github.com/getsentry/sentry-javascript.git", "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/nextjs", @@ -17,18 +17,18 @@ "access": "public" }, "dependencies": { - "@sentry/core": "6.18.1-beta.0", - "@sentry/hub": "6.18.1-beta.0", - "@sentry/integrations": "6.18.1-beta.0", - "@sentry/node": "6.18.1-beta.0", - "@sentry/react": "6.18.1-beta.0", - "@sentry/tracing": "6.18.1-beta.0", - "@sentry/utils": "6.18.1-beta.0", + "@sentry/core": "6.18.1", + "@sentry/hub": "6.18.1", + "@sentry/integrations": "6.18.1", + "@sentry/node": "6.18.1", + "@sentry/react": "6.18.1", + "@sentry/tracing": "6.18.1", + "@sentry/utils": "6.18.1", "@sentry/webpack-plugin": "1.18.8", "tslib": "^1.9.3" }, "devDependencies": { - "@sentry/types": "6.18.1-beta.0", + "@sentry/types": "6.18.1", "@types/webpack": "^4.41.31", "next": "10.1.3" }, diff --git a/packages/node/package.json b/packages/node/package.json index 5459946be053..2b1ec548e8d7 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -1,6 +1,6 @@ { "name": "@sentry/node", - "version": "6.18.1-beta.0", + "version": "6.18.1", "description": "Official Sentry SDK for Node.js", "repository": "git://github.com/getsentry/sentry-javascript.git", "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/node", @@ -16,10 +16,10 @@ "access": "public" }, "dependencies": { - "@sentry/core": "6.18.1-beta.0", - "@sentry/hub": "6.18.1-beta.0", - "@sentry/types": "6.18.1-beta.0", - "@sentry/utils": "6.18.1-beta.0", + "@sentry/core": "6.18.1", + "@sentry/hub": "6.18.1", + "@sentry/types": "6.18.1", + "@sentry/utils": "6.18.1", "cookie": "^0.4.1", "https-proxy-agent": "^5.0.0", "lru_map": "^0.3.3", diff --git a/packages/react/package.json b/packages/react/package.json index badd051b507f..ec1388b5c017 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@sentry/react", - "version": "6.18.1-beta.0", + "version": "6.18.1", "description": "Official Sentry SDK for React.js", "repository": "git://github.com/getsentry/sentry-javascript.git", "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/react", @@ -16,10 +16,10 @@ "access": "public" }, "dependencies": { - "@sentry/browser": "6.18.1-beta.0", - "@sentry/minimal": "6.18.1-beta.0", - "@sentry/types": "6.18.1-beta.0", - "@sentry/utils": "6.18.1-beta.0", + "@sentry/browser": "6.18.1", + "@sentry/minimal": "6.18.1", + "@sentry/types": "6.18.1", + "@sentry/utils": "6.18.1", "hoist-non-react-statics": "^3.3.2", "tslib": "^1.9.3" }, diff --git a/packages/serverless/package.json b/packages/serverless/package.json index 6c0fb3f65122..2c075325c152 100644 --- a/packages/serverless/package.json +++ b/packages/serverless/package.json @@ -1,6 +1,6 @@ { "name": "@sentry/serverless", - "version": "6.18.1-beta.0", + "version": "6.18.1", "description": "Official Sentry SDK for various serverless solutions", "repository": "git://github.com/getsentry/sentry-javascript.git", "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/serverless", @@ -16,11 +16,11 @@ "access": "public" }, "dependencies": { - "@sentry/minimal": "6.18.1-beta.0", - "@sentry/node": "6.18.1-beta.0", - "@sentry/tracing": "6.18.1-beta.0", - "@sentry/types": "6.18.1-beta.0", - "@sentry/utils": "6.18.1-beta.0", + "@sentry/minimal": "6.18.1", + "@sentry/node": "6.18.1", + "@sentry/tracing": "6.18.1", + "@sentry/types": "6.18.1", + "@sentry/utils": "6.18.1", "@types/aws-lambda": "^8.10.62", "@types/express": "^4.17.2", "tslib": "^1.9.3" diff --git a/packages/tracing/package.json b/packages/tracing/package.json index 23cfb1e57a12..a0b939f20196 100644 --- a/packages/tracing/package.json +++ b/packages/tracing/package.json @@ -1,6 +1,6 @@ { "name": "@sentry/tracing", - "version": "6.18.1-beta.0", + "version": "6.18.1", "description": "Extensions for Sentry AM", "repository": "git://github.com/getsentry/sentry-javascript.git", "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/tracing", @@ -16,14 +16,14 @@ "access": "public" }, "dependencies": { - "@sentry/hub": "6.18.1-beta.0", - "@sentry/minimal": "6.18.1-beta.0", - "@sentry/types": "6.18.1-beta.0", - "@sentry/utils": "6.18.1-beta.0", + "@sentry/hub": "6.18.1", + "@sentry/minimal": "6.18.1", + "@sentry/types": "6.18.1", + "@sentry/utils": "6.18.1", "tslib": "^1.9.3" }, "devDependencies": { - "@sentry/browser": "6.18.1-beta.0", + "@sentry/browser": "6.18.1", "@types/express": "^4.17.1", "@types/jsdom": "^16.2.3", "jsdom": "^16.2.2" diff --git a/packages/tracing/src/browser/backgroundtab.ts b/packages/tracing/src/browser/backgroundtab.ts index 2d9a147e8bfa..3701404b5d26 100644 --- a/packages/tracing/src/browser/backgroundtab.ts +++ b/packages/tracing/src/browser/backgroundtab.ts @@ -1,6 +1,6 @@ import { getGlobalObject, logger } from '@sentry/utils'; -import { IDLE_TRANSACTION_FINISH_REASONS } from '../constants'; +import { FINISH_REASON_TAG, IDLE_TRANSACTION_FINISH_REASONS } from '../constants'; import { IdleTransaction } from '../idletransaction'; import { SpanStatusType } from '../span'; import { getActiveTransaction } from '../utils'; @@ -27,7 +27,7 @@ export function registerBackgroundTabDetection(): void { activeTransaction.setStatus(statusType); } activeTransaction.setTag('visibilitychange', 'document.hidden'); - activeTransaction.finishReason = IDLE_TRANSACTION_FINISH_REASONS[2]; /* 'documentHidden' */ + activeTransaction.setTag(FINISH_REASON_TAG, IDLE_TRANSACTION_FINISH_REASONS[2]); activeTransaction.finish(); } }); diff --git a/packages/tracing/src/browser/browsertracing.ts b/packages/tracing/src/browser/browsertracing.ts index d5f23f9395c0..4218f8e84fd7 100644 --- a/packages/tracing/src/browser/browsertracing.ts +++ b/packages/tracing/src/browser/browsertracing.ts @@ -3,7 +3,7 @@ import { EventProcessor, Integration, Transaction, TransactionContext } from '@s import { getGlobalObject, logger } from '@sentry/utils'; import { startIdleTransaction } from '../hubextensions'; -import { DEFAULT_FINAL_TIMEOUT, DEFAULT_IDLE_TIMEOUT, IdleTransaction } from '../idletransaction'; +import { DEFAULT_IDLE_TIMEOUT, IdleTransaction } from '../idletransaction'; import { extractTraceparentData, secToMs } from '../utils'; import { registerBackgroundTabDetection } from './backgroundtab'; import { MetricsInstrumentation } from './metrics'; @@ -21,23 +21,12 @@ export interface BrowserTracingOptions extends RequestInstrumentationOptions { /** * The time to wait in ms until the transaction will be finished. The transaction will use the end timestamp of * the last finished span as the endtime for the transaction. - * * Time is in ms. * * Default: 1000 */ idleTimeout: number; - /** - * The max duration for a transaction. If a transaction duration hits the `finalTimeout` value, it - * will be finished. - * - * Time is in ms. - * - * Default: 30000 - */ - finalTimeout: number; - /** * Flag to enable/disable creation of `navigation` transaction on history changes. * @@ -104,7 +93,6 @@ export interface BrowserTracingOptions extends RequestInstrumentationOptions { const DEFAULT_BROWSER_TRACING_OPTIONS = { idleTimeout: DEFAULT_IDLE_TIMEOUT, - finalTimeout: DEFAULT_FINAL_TIMEOUT, markBackgroundTransactions: true, maxTransactionDuration: DEFAULT_MAX_TRANSACTION_DURATION_SECONDS, routingInstrumentation: instrumentRoutingWithDefaults, diff --git a/packages/tracing/src/constants.ts b/packages/tracing/src/constants.ts index 801e1d315e3a..3f01982c3614 100644 --- a/packages/tracing/src/constants.ts +++ b/packages/tracing/src/constants.ts @@ -1,11 +1,5 @@ // Store finish reasons in tuple to save on bundle size // Readonly type should enforce that this is not mutated. -export const FINISH_REASON_TAG = 'finishReason' as const; +export const FINISH_REASON_TAG = 'finishReason'; -export const IDLE_TRANSACTION_FINISH_REASONS = [ - 'heartbeatFailed', - 'idleTimeout', - 'documentHidden', - 'finalTimeout', - 'externalFinish', -] as const; +export const IDLE_TRANSACTION_FINISH_REASONS = ['heartbeatFailed', 'idleTimeout', 'documentHidden'] as const; diff --git a/packages/tracing/src/idletransaction.ts b/packages/tracing/src/idletransaction.ts index d60b7af70c6f..7e876bb18660 100644 --- a/packages/tracing/src/idletransaction.ts +++ b/packages/tracing/src/idletransaction.ts @@ -1,18 +1,14 @@ -/* eslint-disable max-lines */ import { Hub } from '@sentry/hub'; import { TransactionContext } from '@sentry/types'; -import { getGlobalObject, logger, timestampWithMs } from '@sentry/utils'; +import { logger, timestampWithMs } from '@sentry/utils'; import { FINISH_REASON_TAG, IDLE_TRANSACTION_FINISH_REASONS } from './constants'; import { Span, SpanRecorder } from './span'; import { Transaction } from './transaction'; export const DEFAULT_IDLE_TIMEOUT = 1000; -export const DEFAULT_FINAL_TIMEOUT = 30000; export const HEARTBEAT_INTERVAL = 5000; -const global = getGlobalObject(); - /** * @inheritDoc */ @@ -60,14 +56,6 @@ export class IdleTransaction extends Transaction { // Activities store a list of active spans public activities: Record = {}; - /** - * - * Defaults to `externalFinish`, which means transaction.finish() was called outside of the idle transaction (for example, - * by a navigation transaction ending the previous pageload/navigation in some routing instrumentation). - * @default 'externalFinish' - */ - public finishReason: typeof IDLE_TRANSACTION_FINISH_REASONS[number] = IDLE_TRANSACTION_FINISH_REASONS[4]; - // Track state of activities in previous heartbeat private _prevHeartbeatString: string | undefined; @@ -83,7 +71,7 @@ export class IdleTransaction extends Transaction { * If a transaction is created and no activities are added, we want to make sure that * it times out properly. This is cleared and not used when activities are added. */ - private _idleTimeoutID: ReturnType | undefined; + private _initTimeout: ReturnType | undefined; public constructor( transactionContext: TransactionContext, @@ -91,21 +79,10 @@ export class IdleTransaction extends Transaction { /** * The time to wait in ms until the idle transaction will be finished. * @default 1000 - * - * TODO: Make _idleTimeout and _finalTimeout required to reduce duplication when setting the options - * in `BrowserTracing`. This is considered a breaking change to the IdleTransaction API, - * so we need to make sure we communicate it with react native. */ private readonly _idleTimeout: number = DEFAULT_IDLE_TIMEOUT, // Whether or not the transaction should put itself on the scope when it starts and pop itself off when it ends private readonly _onScope: boolean = false, - /** - * The final value that a transaction cannot exceed - * @default 30000 - * @experimental - * @internal - */ - private readonly _finalTimeout: number = DEFAULT_FINAL_TIMEOUT, ) { super(transactionContext, _idleHub); @@ -119,13 +96,11 @@ export class IdleTransaction extends Transaction { _idleHub.configureScope(scope => scope.setSpan(this)); } - this._startIdleTimeout(); - global.setTimeout(() => { + this._initTimeout = setTimeout(() => { if (!this._finished) { - this.finishReason = IDLE_TRANSACTION_FINISH_REASONS[3]; /* 'finalTimeout' */ this.finish(); } - }, this._finalTimeout); + }, this._idleTimeout); } /** {@inheritDoc} */ @@ -133,8 +108,6 @@ export class IdleTransaction extends Transaction { this._finished = true; this.activities = {}; - this.setTag(FINISH_REASON_TAG, this.finishReason); - if (this.spanRecorder) { logger.log('[Tracing] finishing IdleTransaction', new Date(endTimestamp * 1000).toISOString(), this.op); @@ -216,35 +189,15 @@ export class IdleTransaction extends Transaction { this.spanRecorder.add(this); } - /** - * Cancels the existing idletimeout, if there is one - */ - private _cancelIdleTimeout(): void { - if (this._idleTimeoutID) { - global.clearTimeout(this._idleTimeoutID); - this._idleTimeoutID = undefined; - } - } - - /** - * Creates an idletimeout - */ - private _startIdleTimeout(endTimestamp?: Parameters[0]): void { - this._cancelIdleTimeout(); - this._idleTimeoutID = global.setTimeout(() => { - if (!this._finished && Object.keys(this.activities).length === 0) { - this.finishReason = IDLE_TRANSACTION_FINISH_REASONS[1]; /* 'idleTimeout' */ - this.finish(endTimestamp); - } - }, this._idleTimeout); - } - /** * Start tracking a specific activity. * @param spanId The span id that represents the activity */ private _pushActivity(spanId: string): void { - this._cancelIdleTimeout(); + if (this._initTimeout) { + clearTimeout(this._initTimeout); + this._initTimeout = undefined; + } logger.log(`[Tracing] pushActivity: ${spanId}`); this.activities[spanId] = true; logger.log('[Tracing] new activities count', Object.keys(this.activities).length); @@ -266,8 +219,14 @@ export class IdleTransaction extends Transaction { const timeout = this._idleTimeout; // We need to add the timeout here to have the real endtimestamp of the transaction // Remember timestampWithMs is in seconds, timeout is in ms - const endTimestamp = timestampWithMs() + timeout / 1000; - this._startIdleTimeout(endTimestamp); + const end = timestampWithMs() + timeout / 1000; + + setTimeout(() => { + if (!this._finished) { + this.setTag(FINISH_REASON_TAG, IDLE_TRANSACTION_FINISH_REASONS[1]); + this.finish(end); + } + }, timeout); } } @@ -294,7 +253,7 @@ export class IdleTransaction extends Transaction { if (this._heartbeatCounter >= 3) { logger.log(`[Tracing] Transaction finished because of no change for 3 heart beats`); this.setStatus('deadline_exceeded'); - this.finishReason = IDLE_TRANSACTION_FINISH_REASONS[0]; /* 'heartbeatFailed' */ + this.setTag(FINISH_REASON_TAG, IDLE_TRANSACTION_FINISH_REASONS[0]); this.finish(); } else { this._pingHeartbeat(); @@ -306,7 +265,7 @@ export class IdleTransaction extends Transaction { */ private _pingHeartbeat(): void { logger.log(`pinging Heartbeat -> current counter: ${this._heartbeatCounter}`); - global.setTimeout(() => { + setTimeout(() => { this._beat(); }, HEARTBEAT_INTERVAL); } diff --git a/packages/tracing/test/browser/browsertracing.test.ts b/packages/tracing/test/browser/browsertracing.test.ts index 18d32dd285af..5658dd34858c 100644 --- a/packages/tracing/test/browser/browsertracing.test.ts +++ b/packages/tracing/test/browser/browsertracing.test.ts @@ -14,7 +14,7 @@ import { MetricsInstrumentation } from '../../src/browser/metrics'; import { defaultRequestInstrumentationOptions } from '../../src/browser/request'; import { instrumentRoutingWithDefaults } from '../../src/browser/router'; import * as hubExtensions from '../../src/hubextensions'; -import { DEFAULT_FINAL_TIMEOUT, DEFAULT_IDLE_TIMEOUT, IdleTransaction } from '../../src/idletransaction'; +import { DEFAULT_IDLE_TIMEOUT, IdleTransaction } from '../../src/idletransaction'; import { getActiveTransaction, secToMs } from '../../src/utils'; let mockChangeHistory: ({ to, from }: { to: string; from?: string }) => void = () => undefined; @@ -83,7 +83,6 @@ describe('BrowserTracing', () => { expect(browserTracing.options).toEqual({ idleTimeout: DEFAULT_IDLE_TIMEOUT, - finalTimeout: DEFAULT_FINAL_TIMEOUT, markBackgroundTransactions: true, maxTransactionDuration: DEFAULT_MAX_TRANSACTION_DURATION_SECONDS, routingInstrumentation: instrumentRoutingWithDefaults, @@ -236,8 +235,9 @@ describe('BrowserTracing', () => { describe('idleTimeout', () => { it('is created by default', () => { createBrowserTracing(true, { routingInstrumentation: customInstrumentRouting }); + const mockFinish = jest.fn(); const transaction = getActiveTransaction(hub) as IdleTransaction; - const mockFinish = jest.spyOn(transaction, 'finish'); + transaction.finish = mockFinish; const span = transaction.startChild(); // activities = 1 span.finish(); // activities = 0 @@ -251,8 +251,9 @@ describe('BrowserTracing', () => { it('can be a custom value', () => { createBrowserTracing(true, { idleTimeout: 2000, routingInstrumentation: customInstrumentRouting }); + const mockFinish = jest.fn(); const transaction = getActiveTransaction(hub) as IdleTransaction; - const mockFinish = jest.spyOn(transaction, 'finish'); + transaction.finish = mockFinish; const span = transaction.startChild(); // activities = 1 span.finish(); // activities = 0 diff --git a/packages/tracing/test/idletransaction.test.ts b/packages/tracing/test/idletransaction.test.ts index b229ae349902..b60fec726c54 100644 --- a/packages/tracing/test/idletransaction.test.ts +++ b/packages/tracing/test/idletransaction.test.ts @@ -9,16 +9,7 @@ import { } from '../src/idletransaction'; import { Span } from '../src/span'; -type TransportSendRequest = Transports.BaseTransport['_sendRequest']; - -export class SimpleTransport extends Transports.BaseTransport { - protected _sendRequest( - _req: Parameters[0], - _payload: Parameters[1], - ): ReturnType { - throw new Error('Method not implemented.'); - } -} +export class SimpleTransport extends Transports.BaseTransport {} const dsn = 'https://123@sentry.io/42'; let hub: Hub; @@ -112,7 +103,7 @@ describe('IdleTransaction', () => { expect(transaction.activities).toMatchObject({ [span.spanId]: true, [childSpan.spanId]: true }); span.finish(); - jest.advanceTimersByTime(DEFAULT_IDLE_TIMEOUT + 1); + jest.runOnlyPendingTimers(); expect(mockFinish).toHaveBeenCalledTimes(0); expect(transaction.activities).toMatchObject({ [childSpan.spanId]: true }); @@ -238,20 +229,20 @@ describe('IdleTransaction', () => { transaction.startChild({}); // Beat 1 - jest.advanceTimersByTime(HEARTBEAT_INTERVAL); + jest.runOnlyPendingTimers(); expect(mockFinish).toHaveBeenCalledTimes(0); // Beat 2 - jest.advanceTimersByTime(HEARTBEAT_INTERVAL); + jest.runOnlyPendingTimers(); expect(mockFinish).toHaveBeenCalledTimes(0); // Beat 3 - jest.advanceTimersByTime(HEARTBEAT_INTERVAL); + jest.runOnlyPendingTimers(); expect(mockFinish).toHaveBeenCalledTimes(1); }); it('resets after new activities are added', () => { - const transaction = new IdleTransaction({ name: 'foo' }, hub, DEFAULT_IDLE_TIMEOUT, false, 50000); + const transaction = new IdleTransaction({ name: 'foo' }, hub, DEFAULT_IDLE_TIMEOUT); const mockFinish = jest.spyOn(transaction, 'finish'); transaction.initSpanRecorder(10); @@ -259,42 +250,42 @@ describe('IdleTransaction', () => { transaction.startChild({}); // Beat 1 - jest.advanceTimersByTime(HEARTBEAT_INTERVAL); + jest.runOnlyPendingTimers(); expect(mockFinish).toHaveBeenCalledTimes(0); const span = transaction.startChild(); // push activity // Beat 1 - jest.advanceTimersByTime(HEARTBEAT_INTERVAL); + jest.runOnlyPendingTimers(); expect(mockFinish).toHaveBeenCalledTimes(0); // Beat 2 - jest.advanceTimersByTime(HEARTBEAT_INTERVAL); + jest.runOnlyPendingTimers(); expect(mockFinish).toHaveBeenCalledTimes(0); transaction.startChild(); // push activity transaction.startChild(); // push activity // Beat 1 - jest.advanceTimersByTime(HEARTBEAT_INTERVAL); + jest.runOnlyPendingTimers(); expect(mockFinish).toHaveBeenCalledTimes(0); // Beat 2 - jest.advanceTimersByTime(HEARTBEAT_INTERVAL); + jest.runOnlyPendingTimers(); expect(mockFinish).toHaveBeenCalledTimes(0); span.finish(); // pop activity // Beat 1 - jest.advanceTimersByTime(HEARTBEAT_INTERVAL); + jest.runOnlyPendingTimers(); expect(mockFinish).toHaveBeenCalledTimes(0); // Beat 2 - jest.advanceTimersByTime(HEARTBEAT_INTERVAL); + jest.runOnlyPendingTimers(); expect(mockFinish).toHaveBeenCalledTimes(0); // Beat 3 - jest.advanceTimersByTime(HEARTBEAT_INTERVAL); + jest.runOnlyPendingTimers(); expect(mockFinish).toHaveBeenCalledTimes(1); // Heartbeat does not keep going after finish has been called diff --git a/packages/types/package.json b/packages/types/package.json index 4743ba0b1ab4..cc448df8058d 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@sentry/types", - "version": "6.18.1-beta.0", + "version": "6.18.1", "description": "Types for all Sentry JavaScript SDKs", "repository": "git://github.com/getsentry/sentry-javascript.git", "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/types", diff --git a/packages/typescript/package.json b/packages/typescript/package.json index ebbdc5564356..422d19cb2932 100644 --- a/packages/typescript/package.json +++ b/packages/typescript/package.json @@ -1,6 +1,6 @@ { "name": "@sentry-internal/typescript", - "version": "6.18.1-beta.0", + "version": "6.18.1", "description": "Typescript configuration used at Sentry", "repository": "git://github.com/getsentry/sentry-javascript.git", "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/typescript", diff --git a/packages/utils/package.json b/packages/utils/package.json index 58a76a5228f1..5291d8f6eb2e 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@sentry/utils", - "version": "6.18.1-beta.0", + "version": "6.18.1", "description": "Utilities for all Sentry JavaScript SDKs", "repository": "git://github.com/getsentry/sentry-javascript.git", "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/utils", @@ -16,7 +16,7 @@ "access": "public" }, "dependencies": { - "@sentry/types": "6.18.1-beta.0", + "@sentry/types": "6.18.1", "tslib": "^1.9.3" }, "devDependencies": { diff --git a/packages/vue/package.json b/packages/vue/package.json index 63f2e911a766..42e2754b9bfb 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@sentry/vue", - "version": "6.18.1-beta.0", + "version": "6.18.1", "description": "Official Sentry SDK for Vue.js", "repository": "git://github.com/getsentry/sentry-javascript.git", "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/vue", @@ -16,11 +16,11 @@ "access": "public" }, "dependencies": { - "@sentry/browser": "6.18.1-beta.0", - "@sentry/core": "6.18.1-beta.0", - "@sentry/minimal": "6.18.1-beta.0", - "@sentry/types": "6.18.1-beta.0", - "@sentry/utils": "6.18.1-beta.0", + "@sentry/browser": "6.18.1", + "@sentry/core": "6.18.1", + "@sentry/minimal": "6.18.1", + "@sentry/types": "6.18.1", + "@sentry/utils": "6.18.1", "tslib": "^1.9.3" }, "peerDependencies": { diff --git a/packages/wasm/package.json b/packages/wasm/package.json index 02ba77f8f381..b15fd1ff6adf 100644 --- a/packages/wasm/package.json +++ b/packages/wasm/package.json @@ -1,6 +1,6 @@ { "name": "@sentry/wasm", - "version": "6.18.1-beta.0", + "version": "6.18.1", "description": "Support for WASM.", "repository": "git://github.com/getsentry/sentry-javascript.git", "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/wasm", @@ -16,8 +16,8 @@ "access": "public" }, "dependencies": { - "@sentry/browser": "6.18.1-beta.0", - "@sentry/types": "6.18.1-beta.0", + "@sentry/browser": "6.18.1", + "@sentry/types": "6.18.1", "tslib": "^1.9.3" }, "devDependencies": {