diff --git a/packages/hub/src/sessionflusher.ts b/packages/hub/src/sessionflusher.ts index bb898030efb4..82aa0af8c4c2 100644 --- a/packages/hub/src/sessionflusher.ts +++ b/packages/hub/src/sessionflusher.ts @@ -113,13 +113,13 @@ export class SessionFlusher implements SessionFlusherLike { } switch (status) { - case RequestSessionStatus.Errored: + case 'errored': aggregationCounts.errored = (aggregationCounts.errored || 0) + 1; return aggregationCounts.errored; - case RequestSessionStatus.Ok: + case 'ok': aggregationCounts.exited = (aggregationCounts.exited || 0) + 1; return aggregationCounts.exited; - case RequestSessionStatus.Crashed: + default: aggregationCounts.crashed = (aggregationCounts.crashed || 0) + 1; return aggregationCounts.crashed; } diff --git a/packages/hub/test/scope.test.ts b/packages/hub/test/scope.test.ts index 12dc965d2c03..9b1760dcd11c 100644 --- a/packages/hub/test/scope.test.ts +++ b/packages/hub/test/scope.test.ts @@ -1,4 +1,4 @@ -import { Event, EventHint, RequestSessionStatus } from '@sentry/types'; +import { Event, EventHint } from '@sentry/types'; import { getGlobalObject } from '@sentry/utils'; import { addGlobalEventProcessor, Scope } from '../src'; @@ -147,7 +147,7 @@ describe('Scope', () => { test('_requestSession clone', () => { const parentScope = new Scope(); - parentScope.setRequestSession({ status: RequestSessionStatus.Errored }); + parentScope.setRequestSession({ status: 'errored' }); const scope = Scope.clone(parentScope); expect(parentScope.getRequestSession()).toEqual(scope.getRequestSession()); }); @@ -174,16 +174,16 @@ describe('Scope', () => { // Test that ensures if the status value of `status` of `_requestSession` is changed in a child scope // that it should also change in parent scope because we are copying the reference to the object const parentScope = new Scope(); - parentScope.setRequestSession({ status: RequestSessionStatus.Errored }); + parentScope.setRequestSession({ status: 'errored' }); const scope = Scope.clone(parentScope); const requestSession = scope.getRequestSession(); if (requestSession) { - requestSession.status = RequestSessionStatus.Ok; + requestSession.status = 'ok'; } - expect(parentScope.getRequestSession()).toEqual({ status: RequestSessionStatus.Ok }); - expect(scope.getRequestSession()).toEqual({ status: RequestSessionStatus.Ok }); + expect(parentScope.getRequestSession()).toEqual({ status: 'ok' }); + expect(scope.getRequestSession()).toEqual({ status: 'ok' }); }); }); @@ -375,7 +375,7 @@ describe('Scope', () => { scope.setUser({ id: '1' }); scope.setFingerprint(['abcd']); scope.addBreadcrumb({ message: 'test' }); - scope.setRequestSession({ status: RequestSessionStatus.Ok }); + scope.setRequestSession({ status: 'ok' }); expect((scope as any)._extra).toEqual({ a: 2 }); scope.clear(); expect((scope as any)._extra).toEqual({}); @@ -402,7 +402,7 @@ describe('Scope', () => { scope.setUser({ id: '1337' }); scope.setLevel('info'); scope.setFingerprint(['foo']); - scope.setRequestSession({ status: RequestSessionStatus.Ok }); + scope.setRequestSession({ status: 'ok' }); }); test('given no data, returns the original scope', () => { @@ -450,7 +450,7 @@ describe('Scope', () => { localScope.setUser({ id: '42' }); localScope.setLevel('warning'); localScope.setFingerprint(['bar']); - (localScope as any)._requestSession = { status: RequestSessionStatus.Ok }; + (localScope as any)._requestSession = { status: 'ok' }; const updatedScope = scope.update(localScope) as any; @@ -472,7 +472,7 @@ describe('Scope', () => { expect(updatedScope._user).toEqual({ id: '42' }); expect(updatedScope._level).toEqual('warning'); expect(updatedScope._fingerprint).toEqual(['bar']); - expect(updatedScope._requestSession.status).toEqual(RequestSessionStatus.Ok); + expect(updatedScope._requestSession.status).toEqual('ok'); }); test('given an empty instance of Scope, it should preserve all the original scope data', () => { @@ -493,7 +493,7 @@ describe('Scope', () => { expect(updatedScope._user).toEqual({ id: '1337' }); expect(updatedScope._level).toEqual('info'); expect(updatedScope._fingerprint).toEqual(['foo']); - expect(updatedScope._requestSession.status).toEqual(RequestSessionStatus.Ok); + expect(updatedScope._requestSession.status).toEqual('ok'); }); test('given a plain object, it should merge two together, with the passed object having priority', () => { @@ -504,7 +504,7 @@ describe('Scope', () => { level: 'warning', tags: { bar: '3', baz: '4' }, user: { id: '42' }, - requestSession: { status: RequestSessionStatus.Errored }, + requestSession: { status: 'errored' }, }; const updatedScope = scope.update(localAttributes) as any; @@ -526,7 +526,7 @@ describe('Scope', () => { expect(updatedScope._user).toEqual({ id: '42' }); expect(updatedScope._level).toEqual('warning'); expect(updatedScope._fingerprint).toEqual(['bar']); - expect(updatedScope._requestSession).toEqual({ status: RequestSessionStatus.Errored }); + expect(updatedScope._requestSession).toEqual({ status: 'errored' }); }); }); diff --git a/packages/hub/test/sessionflusher.test.ts b/packages/hub/test/sessionflusher.test.ts index e126a374a415..3c7dc9782615 100644 --- a/packages/hub/test/sessionflusher.test.ts +++ b/packages/hub/test/sessionflusher.test.ts @@ -1,5 +1,3 @@ -import { RequestSessionStatus } from '@sentry/types'; - import { SessionFlusher } from '../src/sessionflusher'; describe('Session Flusher', () => { @@ -28,16 +26,16 @@ describe('Session Flusher', () => { const flusher = new SessionFlusher(transport, { release: '1.0.0', environment: 'dev' }); const date = new Date('2021-04-08T12:18:23.043Z'); - let count = (flusher as any)._incrementSessionStatusCount(RequestSessionStatus.Ok, date); + let count = (flusher as any)._incrementSessionStatusCount('ok', date); expect(count).toEqual(1); - count = (flusher as any)._incrementSessionStatusCount(RequestSessionStatus.Ok, date); + count = (flusher as any)._incrementSessionStatusCount('ok', date); expect(count).toEqual(2); - count = (flusher as any)._incrementSessionStatusCount(RequestSessionStatus.Errored, date); + count = (flusher as any)._incrementSessionStatusCount('errored', date); expect(count).toEqual(1); date.setMinutes(date.getMinutes() + 1); - count = (flusher as any)._incrementSessionStatusCount(RequestSessionStatus.Ok, date); + count = (flusher as any)._incrementSessionStatusCount('ok', date); expect(count).toEqual(1); - count = (flusher as any)._incrementSessionStatusCount(RequestSessionStatus.Errored, date); + count = (flusher as any)._incrementSessionStatusCount('errored', date); expect(count).toEqual(1); expect(flusher.getSessionAggregates().aggregates).toEqual([ @@ -51,8 +49,8 @@ describe('Session Flusher', () => { const flusher = new SessionFlusher(transport, { release: '1.0.0' }); const date = new Date('2021-04-08T12:18:23.043Z'); - (flusher as any)._incrementSessionStatusCount(RequestSessionStatus.Ok, date); - (flusher as any)._incrementSessionStatusCount(RequestSessionStatus.Errored, date); + (flusher as any)._incrementSessionStatusCount('ok', date); + (flusher as any)._incrementSessionStatusCount('errored', date); expect(flusher.getSessionAggregates()).toEqual({ aggregates: [{ errored: 1, exited: 1, started: '2021-04-08T12:18:00.000Z' }], @@ -77,8 +75,8 @@ describe('Session Flusher', () => { const flusher = new SessionFlusher(transport, { release: '1.0.0', environment: 'dev' }); const flusherFlushFunc = jest.spyOn(flusher, 'flush'); const date = new Date('2021-04-08T12:18:23.043Z'); - (flusher as any)._incrementSessionStatusCount(RequestSessionStatus.Ok, date); - (flusher as any)._incrementSessionStatusCount(RequestSessionStatus.Ok, date); + (flusher as any)._incrementSessionStatusCount('ok', date); + (flusher as any)._incrementSessionStatusCount('ok', date); expect(sendSession).toHaveBeenCalledTimes(0); @@ -113,8 +111,8 @@ describe('Session Flusher', () => { const flusher = new SessionFlusher(transport, { release: '1.0.x' }); const flusherFlushFunc = jest.spyOn(flusher, 'flush'); const date = new Date('2021-04-08T12:18:23.043Z'); - (flusher as any)._incrementSessionStatusCount(RequestSessionStatus.Ok, date); - (flusher as any)._incrementSessionStatusCount(RequestSessionStatus.Ok, date); + (flusher as any)._incrementSessionStatusCount('ok', date); + (flusher as any)._incrementSessionStatusCount('ok', date); flusher.close(); expect(flusherFlushFunc).toHaveBeenCalledTimes(1); diff --git a/packages/node/src/client.ts b/packages/node/src/client.ts index 7f4842b48ad4..c5f19ed611d0 100644 --- a/packages/node/src/client.ts +++ b/packages/node/src/client.ts @@ -1,6 +1,6 @@ import { BaseClient, Scope, SDK_VERSION } from '@sentry/core'; import { SessionFlusher } from '@sentry/hub'; -import { Event, EventHint, RequestSessionStatus } from '@sentry/types'; +import { Event, EventHint } from '@sentry/types'; import { logger } from '@sentry/utils'; import { NodeBackend } from './backend'; @@ -48,8 +48,8 @@ export class NodeClient extends BaseClient { // Necessary checks to ensure this is code block is executed only within a request // Should override the status only if `requestSession.status` is `Ok`, which is its initial stage - if (requestSession && requestSession.status === RequestSessionStatus.Ok) { - requestSession.status = RequestSessionStatus.Errored; + if (requestSession && requestSession.status === 'ok') { + requestSession.status = 'errored'; } } @@ -74,8 +74,8 @@ export class NodeClient extends BaseClient { // Ensure that this is happening within the bounds of a request, and make sure not to override // Session Status if Errored / Crashed - if (requestSession && requestSession.status === RequestSessionStatus.Ok) { - requestSession.status = RequestSessionStatus.Errored; + if (requestSession && requestSession.status === 'ok') { + requestSession.status = 'errored'; } } } diff --git a/packages/node/src/handlers.ts b/packages/node/src/handlers.ts index c8156896acc8..332d8593010a 100644 --- a/packages/node/src/handlers.ts +++ b/packages/node/src/handlers.ts @@ -2,7 +2,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { captureException, getCurrentHub, startTransaction, withScope } from '@sentry/core'; import { extractTraceparentData, Span } from '@sentry/tracing'; -import { Event, ExtractedNodeRequestData, RequestSessionStatus, Transaction } from '@sentry/types'; +import { Event, ExtractedNodeRequestData, Transaction } from '@sentry/types'; import { isPlainObject, isString, logger, normalize, stripUrlQueryAndFragment } from '@sentry/utils'; import * as cookie from 'cookie'; import * as domain from 'domain'; @@ -424,7 +424,7 @@ export function requestHandler( const scope = currentHub.getScope(); if (scope) { // Set `status` of `RequestSession` to Ok, at the beginning of the request - scope.setRequestSession({ status: RequestSessionStatus.Ok }); + scope.setRequestSession({ status: 'ok' }); } } }); @@ -517,8 +517,9 @@ export function errorHandler(options?: { // If an error bubbles to the `errorHandler`, then this is an unhandled error, and should be reported as a // Crashed session. The `_requestSession.status` is checked to ensure that this error is happening within // the bounds of a request, and if so the status is updated - if (requestSession && requestSession.status !== undefined) - requestSession.status = RequestSessionStatus.Crashed; + if (requestSession && requestSession.status !== undefined) { + requestSession.status = 'crashed'; + } } } diff --git a/packages/node/test/client.test.ts b/packages/node/test/client.test.ts index 1ff6dc73d03e..f18f66c716af 100644 --- a/packages/node/test/client.test.ts +++ b/packages/node/test/client.test.ts @@ -1,5 +1,4 @@ import { Scope, SessionFlusher } from '@sentry/hub'; -import { RequestSessionStatus } from '@sentry/types'; import { NodeClient } from '../src'; @@ -17,12 +16,12 @@ describe('NodeClient', () => { test('when autoSessionTracking is enabled, and requestHandler is not used -> requestStatus should not be set', () => { client = new NodeClient({ dsn: PUBLIC_DSN, autoSessionTracking: true, release: '1.4' }); const scope = new Scope(); - scope.setRequestSession({ status: RequestSessionStatus.Ok }); + scope.setRequestSession({ status: 'ok' }); client.captureException(new Error('test exception'), undefined, scope); const requestSession = scope.getRequestSession(); - expect(requestSession!.status).toEqual(RequestSessionStatus.Ok); + expect(requestSession!.status).toEqual('ok'); }); test('when autoSessionTracking is disabled -> requestStatus should not be set', () => { client = new NodeClient({ dsn: PUBLIC_DSN, autoSessionTracking: false, release: '1.4' }); @@ -31,12 +30,12 @@ describe('NodeClient', () => { client.initSessionFlusher(); const scope = new Scope(); - scope.setRequestSession({ status: RequestSessionStatus.Ok }); + scope.setRequestSession({ status: 'ok' }); client.captureException(new Error('test exception'), undefined, scope); const requestSession = scope.getRequestSession(); - expect(requestSession!.status).toEqual(RequestSessionStatus.Ok); + expect(requestSession!.status).toEqual('ok'); }); test('when autoSessionTracking is enabled + requestSession status is Crashed -> requestStatus should not be overridden', () => { client = new NodeClient({ dsn: PUBLIC_DSN, autoSessionTracking: true, release: '1.4' }); @@ -45,12 +44,12 @@ describe('NodeClient', () => { client.initSessionFlusher(); const scope = new Scope(); - scope.setRequestSession({ status: RequestSessionStatus.Crashed }); + scope.setRequestSession({ status: 'crashed' }); client.captureException(new Error('test exception'), undefined, scope); const requestSession = scope.getRequestSession(); - expect(requestSession!.status).toEqual(RequestSessionStatus.Crashed); + expect(requestSession!.status).toEqual('crashed'); }); test('when autoSessionTracking is enabled + error occurs within request bounds -> requestStatus should be set to Errored', () => { client = new NodeClient({ dsn: PUBLIC_DSN, autoSessionTracking: true, release: '1.4' }); @@ -59,12 +58,12 @@ describe('NodeClient', () => { client.initSessionFlusher(); const scope = new Scope(); - scope.setRequestSession({ status: RequestSessionStatus.Ok }); + scope.setRequestSession({ status: 'ok' }); client.captureException(new Error('test exception'), undefined, scope); const requestSession = scope.getRequestSession(); - expect(requestSession!.status).toEqual(RequestSessionStatus.Errored); + expect(requestSession!.status).toEqual('errored'); }); test('when autoSessionTracking is enabled + error occurs outside of request bounds -> requestStatus should not be set to Errored', () => { client = new NodeClient({ dsn: PUBLIC_DSN, autoSessionTracking: true, release: '1.4' }); @@ -89,7 +88,7 @@ describe('NodeClient', () => { client.initSessionFlusher(); const scope = new Scope(); - scope.setRequestSession({ status: RequestSessionStatus.Ok }); + scope.setRequestSession({ status: 'ok' }); client.captureEvent( { message: 'message', exception: { values: [{ type: 'exception type 1' }] } }, undefined, @@ -97,7 +96,7 @@ describe('NodeClient', () => { ); const requestSession = scope.getRequestSession(); - expect(requestSession!.status).toEqual(RequestSessionStatus.Ok); + expect(requestSession!.status).toEqual('ok'); }); test('When captureEvent is called with an exception, requestSession status should be set to Errored', () => { @@ -107,12 +106,12 @@ describe('NodeClient', () => { client.initSessionFlusher(); const scope = new Scope(); - scope.setRequestSession({ status: RequestSessionStatus.Ok }); + scope.setRequestSession({ status: 'ok' }); client.captureEvent({ message: 'message', exception: { values: [{ type: 'exception type 1' }] } }, {}, scope); const requestSession = scope.getRequestSession(); - expect(requestSession!.status).toEqual(RequestSessionStatus.Errored); + expect(requestSession!.status).toEqual('errored'); }); test('When captureEvent is called without an exception, requestSession status should not be set to Errored', () => { @@ -122,12 +121,12 @@ describe('NodeClient', () => { client.initSessionFlusher(); const scope = new Scope(); - scope.setRequestSession({ status: RequestSessionStatus.Ok }); + scope.setRequestSession({ status: 'ok' }); client.captureEvent({ message: 'message' }, {}, scope); const requestSession = scope.getRequestSession(); - expect(requestSession!.status).toEqual(RequestSessionStatus.Ok); + expect(requestSession!.status).toEqual('ok'); }); test('When captureEvent is called with an exception but outside of a request, then requestStatus should not be set', () => { @@ -154,18 +153,18 @@ describe('NodeClient', () => { client.initSessionFlusher(); const scope = new Scope(); - scope.setRequestSession({ status: RequestSessionStatus.Ok }); + scope.setRequestSession({ status: 'ok' }); client.captureEvent({ message: 'message', type: 'transaction' }, undefined, scope); const requestSession = scope.getRequestSession(); - expect(requestSession!.status).toEqual(RequestSessionStatus.Ok); + expect(requestSession!.status).toEqual('ok'); }); test('When captureEvent is called with an exception but requestHandler is not used, then requestSession status should not be set', () => { client = new NodeClient({ dsn: PUBLIC_DSN, autoSessionTracking: true, release: '1.3' }); const scope = new Scope(); - scope.setRequestSession({ status: RequestSessionStatus.Ok }); + scope.setRequestSession({ status: 'ok' }); client.captureEvent( { message: 'message', exception: { values: [{ type: 'exception type 1' }] } }, undefined, @@ -173,7 +172,7 @@ describe('NodeClient', () => { ); const requestSession = scope.getRequestSession(); - expect(requestSession!.status).toEqual(RequestSessionStatus.Ok); + expect(requestSession!.status).toEqual('ok'); }); }); }); diff --git a/packages/node/test/handlers.test.ts b/packages/node/test/handlers.test.ts index 9033ffc2ba81..daef81e4d44c 100644 --- a/packages/node/test/handlers.test.ts +++ b/packages/node/test/handlers.test.ts @@ -2,7 +2,7 @@ import * as sentryCore from '@sentry/core'; import { Hub } from '@sentry/hub'; import * as sentryHub from '@sentry/hub'; import { Transaction } from '@sentry/tracing'; -import { RequestSessionStatus, Runtime } from '@sentry/types'; +import { Runtime } from '@sentry/types'; import * as http from 'http'; import * as net from 'net'; @@ -229,7 +229,7 @@ describe('requestHandler', () => { sentryRequestMiddleware(req, res, next); const scope = sentryCore.getCurrentHub().getScope(); - expect(scope?.getRequestSession()).toEqual({ status: RequestSessionStatus.Ok }); + expect(scope?.getRequestSession()).toEqual({ status: 'ok' }); }); it('autoSessionTracking is disabled, does not set requestSession, when handling a request', () => { @@ -258,7 +258,7 @@ describe('requestHandler', () => { res.emit('finish'); setImmediate(() => { - expect(scope?.getRequestSession()).toEqual({ status: RequestSessionStatus.Ok }); + expect(scope?.getRequestSession()).toEqual({ status: 'ok' }); expect(captureRequestSession).toHaveBeenCalled(); done(); }); @@ -708,10 +708,10 @@ describe('errorHandler()', () => { jest.spyOn(sentryCore, 'getCurrentHub').mockReturnValue(hub); jest.spyOn(sentryHub, 'getCurrentHub').mockReturnValue(hub); - scope?.setRequestSession({ status: RequestSessionStatus.Ok }); + scope?.setRequestSession({ status: 'ok' }); sentryErrorMiddleware({ name: 'error', message: 'this is an error' }, req, res, next); const requestSession = scope?.getRequestSession(); - expect(requestSession).toEqual({ status: RequestSessionStatus.Ok }); + expect(requestSession).toEqual({ status: 'ok' }); }); it('autoSessionTracking is enabled + requestHandler is not used -> does not set requestSession status on Crash', () => { @@ -724,10 +724,10 @@ describe('errorHandler()', () => { jest.spyOn(sentryCore, 'getCurrentHub').mockReturnValue(hub); jest.spyOn(sentryHub, 'getCurrentHub').mockReturnValue(hub); - scope?.setRequestSession({ status: RequestSessionStatus.Ok }); + scope?.setRequestSession({ status: 'ok' }); sentryErrorMiddleware({ name: 'error', message: 'this is an error' }, req, res, next); const requestSession = scope?.getRequestSession(); - expect(requestSession).toEqual({ status: RequestSessionStatus.Ok }); + expect(requestSession).toEqual({ status: 'ok' }); }); it('when autoSessionTracking is enabled, should set requestSession status to Crashed when an unhandled error occurs within the bounds of a request', () => { @@ -742,10 +742,10 @@ describe('errorHandler()', () => { jest.spyOn(sentryCore, 'getCurrentHub').mockReturnValue(hub); jest.spyOn(sentryHub, 'getCurrentHub').mockReturnValue(hub); - scope?.setRequestSession({ status: RequestSessionStatus.Ok }); + scope?.setRequestSession({ status: 'ok' }); sentryErrorMiddleware({ name: 'error', message: 'this is an error' }, req, res, next); const requestSession = scope?.getRequestSession(); - expect(requestSession).toEqual({ status: RequestSessionStatus.Crashed }); + expect(requestSession).toEqual({ status: 'crashed' }); }); it('when autoSessionTracking is enabled, should not set requestSession status on Crash when it occurs outside the bounds of a request', () => { diff --git a/packages/types/src/requestsessionstatus.ts b/packages/types/src/requestsessionstatus.ts new file mode 100644 index 000000000000..b6b7ab9ee659 --- /dev/null +++ b/packages/types/src/requestsessionstatus.ts @@ -0,0 +1,11 @@ +/** JSDoc + * @deprecated Use string literals - if you require type casting, cast to RequestSessionStatus type + */ +export enum RequestSessionStatus { + /** JSDoc */ + Ok = 'ok', + /** JSDoc */ + Errored = 'errored', + /** JSDoc */ + Crashed = 'crashed', +} diff --git a/packages/types/src/session.ts b/packages/types/src/session.ts index 9b53772b4918..39ce0a5c49cf 100644 --- a/packages/types/src/session.ts +++ b/packages/types/src/session.ts @@ -69,14 +69,7 @@ export enum SessionStatus { Abnormal = 'abnormal', } -export enum RequestSessionStatus { - /** JSDoc */ - Ok = 'ok', - /** JSDoc */ - Errored = 'errored', - /** JSDoc */ - Crashed = 'crashed', -} +export type RequestSessionStatus = 'ok' | 'errored' | 'crashed'; /** JSDoc */ export interface SessionAggregates {