diff --git a/package.json b/package.json index 70c13d77c60..da8280cf20f 100644 --- a/package.json +++ b/package.json @@ -257,9 +257,9 @@ "@react-stately/menu": "3.2.3", "@react-stately/tree": "3.2.0", "@reduxjs/toolkit": "1.7.1", - "@sentry/browser": "6.16.1", - "@sentry/types": "6.16.1", - "@sentry/utils": "6.16.1", + "@sentry/browser": "6.17.2", + "@sentry/types": "6.17.2", + "@sentry/utils": "6.17.2", "@visx/event": "2.6.0", "@visx/gradient": "2.1.0", "@visx/group": "2.1.0", diff --git a/packages/grafana-runtime/package.json b/packages/grafana-runtime/package.json index 2dd66e28f9d..8de4dbe08e2 100644 --- a/packages/grafana-runtime/package.json +++ b/packages/grafana-runtime/package.json @@ -25,7 +25,7 @@ "@grafana/data": "8.4.0-pre", "@grafana/e2e-selectors": "8.4.0-pre", "@grafana/ui": "8.4.0-pre", - "@sentry/browser": "6.16.1", + "@sentry/browser": "6.17.2", "history": "4.10.1", "lodash": "4.17.21", "react": "17.0.2", diff --git a/packages/grafana-ui/package.json b/packages/grafana-ui/package.json index df9e20e9b54..bac88122d1b 100644 --- a/packages/grafana-ui/package.json +++ b/packages/grafana-ui/package.json @@ -44,7 +44,7 @@ "@react-aria/menu": "3.3.0", "@react-aria/overlays": "3.7.3", "@react-stately/menu": "3.2.3", - "@sentry/browser": "6.16.1", + "@sentry/browser": "6.17.2", "ansicolor": "1.1.95", "calculate-size": "1.1.1", "classnames": "2.3.1", diff --git a/public/app/core/services/echo/backends/sentry/transports/CustomEndpointTransport.test.ts b/public/app/core/services/echo/backends/sentry/transports/CustomEndpointTransport.test.ts index a1ae6f328c2..def5dd6dce6 100644 --- a/public/app/core/services/echo/backends/sentry/transports/CustomEndpointTransport.test.ts +++ b/public/app/core/services/echo/backends/sentry/transports/CustomEndpointTransport.test.ts @@ -1,5 +1,4 @@ import { Event, Severity } from '@sentry/browser'; -import { Status } from '@sentry/types'; import { CustomEndpointTransport } from './CustomEndpointTransport'; describe('CustomEndpointTransport', () => { @@ -54,7 +53,7 @@ describe('CustomEndpointTransport', () => { expect(fetchSpy).toHaveBeenCalledTimes(1); // second immediate call - shot circuited because retry-after time has not expired, backend not called - await expect(transport.sendEvent(event)).resolves.toHaveProperty('status', Status.Skipped); + await expect(transport.sendEvent(event)).resolves.toHaveProperty('status', 'skipped'); expect(fetchSpy).toHaveBeenCalledTimes(1); // wait out the retry-after and call again - great success @@ -79,7 +78,7 @@ describe('CustomEndpointTransport', () => { expect(fetchSpy).toHaveBeenCalledTimes(1); // second immediate call - shot circuited because retry-after time has not expired, backend not called - await expect(transport.sendEvent(event)).resolves.toHaveProperty('status', Status.Skipped); + await expect(transport.sendEvent(event)).resolves.toHaveProperty('status', 'skipped'); expect(fetchSpy).toHaveBeenCalledTimes(1); // wait out the retry-after and call again - great success diff --git a/public/app/core/services/echo/backends/sentry/transports/CustomEndpointTransport.ts b/public/app/core/services/echo/backends/sentry/transports/CustomEndpointTransport.ts index b591f7b6823..53d00d6296b 100644 --- a/public/app/core/services/echo/backends/sentry/transports/CustomEndpointTransport.ts +++ b/public/app/core/services/echo/backends/sentry/transports/CustomEndpointTransport.ts @@ -1,6 +1,13 @@ import { Event, Severity } from '@sentry/browser'; -import { logger, parseRetryAfterHeader, PromiseBuffer, supportsReferrerPolicy, SyncPromise } from '@sentry/utils'; -import { Response, Status } from '@sentry/types'; +import { + logger, + makePromiseBuffer, + parseRetryAfterHeader, + PromiseBuffer, + supportsReferrerPolicy, + SyncPromise, +} from '@sentry/utils'; +import { Response } from '@sentry/types'; import { BaseTransport } from '../types'; export interface CustomEndpointTransportOptions { @@ -25,7 +32,7 @@ export class CustomEndpointTransport implements BaseTransport { private readonly _buffer: PromiseBuffer; constructor(public options: CustomEndpointTransportOptions) { - this._buffer = new PromiseBuffer(options.maxConcurrentRequests ?? DEFAULT_MAX_CONCURRENT_REQUESTS); + this._buffer = makePromiseBuffer(options.maxConcurrentRequests ?? DEFAULT_MAX_CONCURRENT_REQUESTS); } sendEvent(event: Event): PromiseLike { @@ -35,7 +42,7 @@ export class CustomEndpointTransport implements BaseTransport { return Promise.resolve({ event, reason, - status: Status.Skipped, + status: 'skipped', }); } @@ -81,41 +88,42 @@ export class CustomEndpointTransport implements BaseTransport { Object.assign(options, this.options.fetchParameters); } - if (!this._buffer.isReady()) { - const reason = `Dropping frontend log event due to too many requests in flight.`; - console.warn(reason); - return Promise.resolve({ - event, - reason, - status: Status.Skipped, + return this._buffer + .add( + () => + new SyncPromise((resolve, reject) => { + window + .fetch(sentryReq.url, options) + .then((response) => { + if (response.status === 200) { + resolve({ status: 'success' }); + return; + } + + if (response.status === 429) { + const now = Date.now(); + const retryAfterHeader = response.headers.get('Retry-After'); + this._disabledUntil = new Date(now + parseRetryAfterHeader(now, retryAfterHeader)); + logger.warn(`Too many requests, backing off till: ${this._disabledUntil}`); + } + + reject(response); + }) + .catch(reject); + }) + ) + .then(undefined, (reason) => { + if (reason.message === 'Not adding Promise due to buffer limit reached.') { + const msg = `Dropping frontend log event due to too many requests in flight.`; + console.warn(msg); + return { + event, + reason: msg, + status: 'skipped', + }; + } + throw reason; }); - } - - return this._buffer.add( - () => - new SyncPromise((resolve, reject) => { - window - .fetch(sentryReq.url, options) - .then((response) => { - const status = Status.fromHttpCode(response.status); - - if (status === Status.Success) { - resolve({ status }); - return; - } - - if (status === Status.RateLimit) { - const now = Date.now(); - const retryAfterHeader = response.headers.get('Retry-After'); - this._disabledUntil = new Date(now + parseRetryAfterHeader(now, retryAfterHeader)); - logger.warn(`Too many requests, backing off till: ${this._disabledUntil}`); - } - - reject(response); - }) - .catch(reject); - }) - ); } } diff --git a/public/app/core/services/echo/backends/sentry/transports/EchoSrvTransport.ts b/public/app/core/services/echo/backends/sentry/transports/EchoSrvTransport.ts index 0e1759ed877..b3555b17568 100644 --- a/public/app/core/services/echo/backends/sentry/transports/EchoSrvTransport.ts +++ b/public/app/core/services/echo/backends/sentry/transports/EchoSrvTransport.ts @@ -1,7 +1,7 @@ import { getEchoSrv, EchoEventType } from '@grafana/runtime'; import { BaseTransport } from '@sentry/browser/dist/transports'; import { Event } from '@sentry/browser'; -import { Status } from '@sentry/types'; +import { EventStatus, Request, Session, Response } from '@sentry/types'; export class EchoSrvTransport extends BaseTransport { sendEvent(event: Event) { @@ -9,6 +9,14 @@ export class EchoSrvTransport extends BaseTransport { type: EchoEventType.Sentry, payload: event, }); - return Promise.resolve({ status: Status.Success, event }); + return Promise.resolve({ status: 'success' as EventStatus, event }); + } + // not recording sessions for now + sendSession(session: Session): PromiseLike { + return Promise.resolve({ status: 'skipped' }); + } + // required by BaseTransport definition but not used by this implementation + _sendRequest(sentryRequest: Request, originalPayload: Event | Session): PromiseLike { + throw new Error('should not happen'); } } diff --git a/yarn.lock b/yarn.lock index 9b7583da88d..f6a342c9b52 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3863,7 +3863,7 @@ __metadata: "@grafana/ui": 8.4.0-pre "@rollup/plugin-commonjs": 21.0.1 "@rollup/plugin-node-resolve": 13.1.3 - "@sentry/browser": 6.16.1 + "@sentry/browser": 6.17.2 "@testing-library/dom": ^8.11.1 "@testing-library/react": ^12.1.2 "@testing-library/user-event": ^13.5.0 @@ -4060,7 +4060,7 @@ __metadata: "@rollup/plugin-commonjs": 21.0.1 "@rollup/plugin-image": 2.1.1 "@rollup/plugin-node-resolve": 13.1.3 - "@sentry/browser": 6.16.1 + "@sentry/browser": 6.17.2 "@storybook/addon-a11y": 6.4.13 "@storybook/addon-actions": 6.4.13 "@storybook/addon-docs": 6.4.13 @@ -7075,67 +7075,67 @@ __metadata: languageName: node linkType: hard -"@sentry/browser@npm:6.16.1": - version: 6.16.1 - resolution: "@sentry/browser@npm:6.16.1" +"@sentry/browser@npm:6.17.2": + version: 6.17.2 + resolution: "@sentry/browser@npm:6.17.2" dependencies: - "@sentry/core": 6.16.1 - "@sentry/types": 6.16.1 - "@sentry/utils": 6.16.1 + "@sentry/core": 6.17.2 + "@sentry/types": 6.17.2 + "@sentry/utils": 6.17.2 tslib: ^1.9.3 - checksum: baae33f5cb008a617b50c4b719e62c64db0ac107741938061902817310c72dc1e83bda560296954510a9dbb933425316d5a56911e455104307aa8e057c7722c2 + checksum: 81235d9648a8486ba76fbc2c069f4d25889b936c45367b8c3ddf36e4a4a609ac8d65d65219afd1dc1d16177fa2167ed625d88bdeb0276f8230128d195ce4bfbd languageName: node linkType: hard -"@sentry/core@npm:6.16.1": - version: 6.16.1 - resolution: "@sentry/core@npm:6.16.1" +"@sentry/core@npm:6.17.2": + version: 6.17.2 + resolution: "@sentry/core@npm:6.17.2" dependencies: - "@sentry/hub": 6.16.1 - "@sentry/minimal": 6.16.1 - "@sentry/types": 6.16.1 - "@sentry/utils": 6.16.1 + "@sentry/hub": 6.17.2 + "@sentry/minimal": 6.17.2 + "@sentry/types": 6.17.2 + "@sentry/utils": 6.17.2 tslib: ^1.9.3 - checksum: 76f49b270d6acf1b9473822035d7a9a5c191f2df472c5768e01329afbb3f420634792f2a2826cd295982710d39b7c3d53e0c462e1d652451c0ba783c150420d8 + checksum: 3d0265bacf95df766db90ce582758130cf802ea4a9cc86872519aec8e240a37d69aa0f0e72be3526a6b8d4c59bd6eb0c23518d07e4b7b3477014526e45c5e29a languageName: node linkType: hard -"@sentry/hub@npm:6.16.1": - version: 6.16.1 - resolution: "@sentry/hub@npm:6.16.1" +"@sentry/hub@npm:6.17.2": + version: 6.17.2 + resolution: "@sentry/hub@npm:6.17.2" dependencies: - "@sentry/types": 6.16.1 - "@sentry/utils": 6.16.1 + "@sentry/types": 6.17.2 + "@sentry/utils": 6.17.2 tslib: ^1.9.3 - checksum: 032cd76e9de169ba3ee9683ab4c7603d7e5784fc9d5dc4173d7fedcecc3f9dd07c8ee1b95d250befff5943d1bdb2e9ee4d38c9976b723db959b33c10a1b2aead + checksum: 1f8e029f6e32fd3b6779103cf425bd813a1caeec91fc27f3a3675ea253a16e50a95d719fce9511d061682c81108a969f25e39eb6d59f469f4d4fd89a57d72eea languageName: node linkType: hard -"@sentry/minimal@npm:6.16.1": - version: 6.16.1 - resolution: "@sentry/minimal@npm:6.16.1" +"@sentry/minimal@npm:6.17.2": + version: 6.17.2 + resolution: "@sentry/minimal@npm:6.17.2" dependencies: - "@sentry/hub": 6.16.1 - "@sentry/types": 6.16.1 + "@sentry/hub": 6.17.2 + "@sentry/types": 6.17.2 tslib: ^1.9.3 - checksum: c928c94ce76538b8ad81d6e724f4c149b046087a48de60e43933520f6a51ce13abbcbc94f91575aa215e662901c65204344d9185f8afc6d5b449b3bedf85db54 + checksum: 4c1d63deee6387c25b3f6fd8d377777f6010f4725230566b24ef103a26daa07a359604e5d1418e8e7f47f31680506a128dab803ecec2eab3e263fad99902e92e languageName: node linkType: hard -"@sentry/types@npm:6.16.1": - version: 6.16.1 - resolution: "@sentry/types@npm:6.16.1" - checksum: 994791c471a83b3e9a3c7052b6b2fef3ab404834eaabb61f3dd15b79782ca9cf6774cfb760040bbc06812a8420e8d40681d81a7d4b51ce7ed578d72d97c9a0b8 +"@sentry/types@npm:6.17.2": + version: 6.17.2 + resolution: "@sentry/types@npm:6.17.2" + checksum: 0872f84ef93547a15a9c6567a1e7ce4f79ab4649829879637aba476437c4bb025bd4b0107799620818f8c2188521d3af221b3b35663ce968e5a44dc3a3a18ccb languageName: node linkType: hard -"@sentry/utils@npm:6.16.1": - version: 6.16.1 - resolution: "@sentry/utils@npm:6.16.1" +"@sentry/utils@npm:6.17.2": + version: 6.17.2 + resolution: "@sentry/utils@npm:6.17.2" dependencies: - "@sentry/types": 6.16.1 + "@sentry/types": 6.17.2 tslib: ^1.9.3 - checksum: 6a94b7a4706a28a6f0ccd4b4f9553217d17883974e3edf019f301110957ba592f0c33e653e3f0c79db735631ca87f1c03de8a60a69fd086c3a7cc1f88b7d2be2 + checksum: 15d2885a7da1bb30b78b2de54a031130aab59cb511ad5766d80daffeb2a08c5769b015e2a2687d4435b27e4474f79cc9fd19c1ad6bc0aabb572bea2a388ae0fb languageName: node linkType: hard @@ -19816,9 +19816,9 @@ __metadata: "@react-types/shared": 3.10.1 "@reduxjs/toolkit": 1.7.1 "@rtsao/plugin-proposal-class-properties": 7.0.1-patch.1 - "@sentry/browser": 6.16.1 - "@sentry/types": 6.16.1 - "@sentry/utils": 6.16.1 + "@sentry/browser": 6.17.2 + "@sentry/types": 6.17.2 + "@sentry/utils": 6.17.2 "@swc/core": 1.2.127 "@swc/helpers": 0.3.2 "@testing-library/dom": 8.11.1