diff --git a/package.json b/package.json index c258b484838..10cafee0435 100644 --- a/package.json +++ b/package.json @@ -246,12 +246,12 @@ "@daybrush/utils": "1.10.0", "@emotion/css": "11.10.5", "@emotion/react": "11.10.5", - "@grafana/agent-core": "0.4.0", - "@grafana/agent-web": "0.4.0", "@grafana/aws-sdk": "0.0.37", "@grafana/data": "workspace:*", "@grafana/e2e-selectors": "workspace:*", "@grafana/experimental": "1.0.1", + "@grafana/faro-core": "1.0.0-beta2", + "@grafana/faro-web-sdk": "1.0.0-beta2", "@grafana/google-sdk": "0.0.4", "@grafana/lezer-logql": "0.1.1", "@grafana/monaco-logql": "^0.0.6", diff --git a/packages/grafana-runtime/package.json b/packages/grafana-runtime/package.json index 02c7a0d9e33..37bae34afee 100644 --- a/packages/grafana-runtime/package.json +++ b/packages/grafana-runtime/package.json @@ -35,9 +35,9 @@ "typecheck": "tsc --emitDeclarationOnly false --noEmit" }, "dependencies": { - "@grafana/agent-web": "^0.4.0", "@grafana/data": "9.3.0-pre", "@grafana/e2e-selectors": "9.3.0-pre", + "@grafana/faro-web-sdk": "1.0.0-beta2", "@grafana/ui": "9.3.0-pre", "@sentry/browser": "6.19.7", "history": "4.10.1", diff --git a/packages/grafana-runtime/src/utils/logging.ts b/packages/grafana-runtime/src/utils/logging.ts index 6ad4670ef7b..b4369298ce7 100644 --- a/packages/grafana-runtime/src/utils/logging.ts +++ b/packages/grafana-runtime/src/utils/logging.ts @@ -1,6 +1,6 @@ import { captureMessage, captureException, Severity as LogLevel } from '@sentry/browser'; -import { agent, LogLevel as GrafanaLogLevel } from '@grafana/agent-web'; +import { faro, LogLevel as GrafanaLogLevel } from '@grafana/faro-web-sdk'; import { config } from '../config'; @@ -16,7 +16,7 @@ type Contexts = Record { - const originalModule = jest.requireActual('@grafana/agent-web'); +jest.mock('@grafana/faro-web-sdk', () => { + const originalModule = jest.requireActual('@grafana/faro-web-sdk'); return { __esModule: true, ...originalModule, - initializeAgent: jest.fn(), + initializeFaro: jest.fn(), }; }); @@ -52,8 +52,8 @@ describe('GrafanaJavascriptAgentEchoBackend', () => { it('will set up FetchTransport if customEndpoint is provided', async () => { // arrange - const originalModule = jest.requireActual('@grafana/agent-web'); - jest.mocked(initializeAgent).mockImplementation(originalModule.initializeAgent); + const originalModule = jest.requireActual('@grafana/faro-web-sdk'); + jest.mocked(initializeFaro).mockImplementation(originalModule.initializeFaro); //act const backend = new GrafanaJavascriptAgentBackend(options); @@ -66,6 +66,19 @@ describe('GrafanaJavascriptAgentEchoBackend', () => { it('will initialize GrafanaJavascriptAgent and set user', async () => { // arrange const mockedSetUser = jest.fn(); + const mockedInstrumentationsForConfig: Instrumentation[] = []; + const mockedInstrumentations = { + add: jest.fn(), + instrumentations: mockedInstrumentationsForConfig, + remove: jest.fn(), + }; + const mockedInternalLogger = { + prefix: 'Faro', + debug: jest.fn(), + info: jest.fn(), + warn: jest.fn(), + error: jest.fn(), + }; const mockedAgent = () => { return { api: { @@ -75,24 +88,38 @@ describe('GrafanaJavascriptAgentEchoBackend', () => { pushError: jest.fn(), pushMeasurement: jest.fn(), pushTraces: jest.fn(), + pushEvent: jest.fn(), initOTEL: jest.fn(), getOTEL: jest.fn(), getTraceContext: jest.fn(), + changeStacktraceParser: jest.fn(), + getStacktraceParser: jest.fn(), + isOTELInitialized: jest.fn(), + setSession: jest.fn(), + getSession: jest.fn(), + resetUser: jest.fn(), + resetSession: jest.fn(), }, config: { globalObjectKey: '', - instrumentations: [], preventGlobalExposure: false, transports: [], + instrumentations: mockedInstrumentationsForConfig, metas: [], parseStacktrace: jest.fn(), app: jest.fn(), paused: false, + dedupe: true, + isolate: false, + internalLoggerLevel: InternalLoggerLevel.ERROR, + unpatchedConsole: { ...console }, }, metas: { add: jest.fn(), remove: jest.fn(), value: {}, + addListener: jest.fn(), + removeListener: jest.fn(), }, transports: { add: jest.fn(), @@ -100,18 +127,27 @@ describe('GrafanaJavascriptAgentEchoBackend', () => { transports: [], pause: jest.fn(), unpause: jest.fn(), + addBeforeSendHooks: jest.fn(), + addIgnoreErrorsPatterns: jest.fn(), + getBeforeSendHooks: jest.fn(), + isPaused: jest.fn(), + remove: jest.fn(), + removeBeforeSendHooks: jest.fn(), }, pause: jest.fn(), unpause: jest.fn(), + instrumentations: mockedInstrumentations, + internalLogger: mockedInternalLogger, + unpatchedConsole: { ...console }, }; }; - jest.mocked(initializeAgent).mockImplementation(mockedAgent); + jest.mocked(initializeFaro).mockImplementation(mockedAgent); //act new GrafanaJavascriptAgentBackend(options); //assert - expect(initializeAgent).toHaveBeenCalledTimes(1); + expect(initializeFaro).toHaveBeenCalledTimes(1); expect(mockedSetUser).toHaveBeenCalledTimes(1); expect(mockedSetUser).toHaveBeenCalledWith({ id: '504', @@ -124,6 +160,19 @@ describe('GrafanaJavascriptAgentEchoBackend', () => { it('will forward events to transports', async () => { //arrange const mockedSetUser = jest.fn(); + const mockedInstrumentationsForConfig: Instrumentation[] = []; + const mockedInstrumentations = { + add: jest.fn(), + instrumentations: mockedInstrumentationsForConfig, + remove: jest.fn(), + }; + const mockedInternalLogger = { + prefix: 'Faro', + debug: jest.fn(), + info: jest.fn(), + warn: jest.fn(), + error: jest.fn(), + }; const mockedAgent = () => { return { api: { @@ -133,24 +182,38 @@ describe('GrafanaJavascriptAgentEchoBackend', () => { pushError: jest.fn(), pushMeasurement: jest.fn(), pushTraces: jest.fn(), + pushEvent: jest.fn(), initOTEL: jest.fn(), getOTEL: jest.fn(), getTraceContext: jest.fn(), + changeStacktraceParser: jest.fn(), + getStacktraceParser: jest.fn(), + isOTELInitialized: jest.fn(), + setSession: jest.fn(), + getSession: jest.fn(), + resetUser: jest.fn(), + resetSession: jest.fn(), }, config: { globalObjectKey: '', - instrumentations: [], preventGlobalExposure: false, transports: [], + instrumentations: mockedInstrumentationsForConfig, metas: [], parseStacktrace: jest.fn(), app: jest.fn(), paused: false, + dedupe: true, + isolate: false, + internalLoggerLevel: InternalLoggerLevel.ERROR, + unpatchedConsole: { ...console }, }, metas: { add: jest.fn(), remove: jest.fn(), value: {}, + addListener: jest.fn(), + removeListener: jest.fn(), }, transports: { add: jest.fn(), @@ -158,13 +221,22 @@ describe('GrafanaJavascriptAgentEchoBackend', () => { transports: [], pause: jest.fn(), unpause: jest.fn(), + addBeforeSendHooks: jest.fn(), + addIgnoreErrorsPatterns: jest.fn(), + getBeforeSendHooks: jest.fn(), + isPaused: jest.fn(), + remove: jest.fn(), + removeBeforeSendHooks: jest.fn(), }, pause: jest.fn(), unpause: jest.fn(), + instrumentations: mockedInstrumentations, + internalLogger: mockedInternalLogger, + unpatchedConsole: { ...console }, }; }; - jest.mocked(initializeAgent).mockImplementation(mockedAgent); + jest.mocked(initializeFaro).mockImplementation(mockedAgent); const backend = new GrafanaJavascriptAgentBackend({ ...options, preventGlobalExposure: true, @@ -195,8 +267,8 @@ describe('GrafanaJavascriptAgentEchoBackend', () => { // // use actual GrafanaJavascriptAgent & mock window.fetch // // arrange - // const originalModule = jest.requireActual('@grafana/agent-web'); - // jest.mocked(initializeAgent).mockImplementation(originalModule.initializeAgent); + // const originalModule = jest.requireActual('@grafana/faro-web-sdk'); + // jest.mocked(initializeFaro).mockImplementation(originalModule.initializeFaro); // const fetchSpy = (window.fetch = jest.fn()); // fetchSpy.mockResolvedValue({ status: 200 } as Response); // const echo = new Echo({ debug: true }); diff --git a/public/app/core/services/echo/backends/grafana-javascript-agent/GrafanaJavascriptAgentBackend.ts b/public/app/core/services/echo/backends/grafana-javascript-agent/GrafanaJavascriptAgentBackend.ts index 616dcf5d2e9..ddb78077f4e 100644 --- a/public/app/core/services/echo/backends/grafana-javascript-agent/GrafanaJavascriptAgentBackend.ts +++ b/public/app/core/services/echo/backends/grafana-javascript-agent/GrafanaJavascriptAgentBackend.ts @@ -1,14 +1,14 @@ -import { BaseTransport } from '@grafana/agent-core'; +import { BuildInfo } from '@grafana/data'; +import { BaseTransport } from '@grafana/faro-core'; import { - initializeAgent, + initializeFaro, defaultMetas, BrowserConfig, ErrorsInstrumentation, ConsoleInstrumentation, WebVitalsInstrumentation, FetchTransport, -} from '@grafana/agent-web'; -import { BuildInfo } from '@grafana/data'; +} from '@grafana/faro-web-sdk'; import { EchoBackend, EchoEvent, EchoEventType } from '@grafana/runtime'; import { EchoSrvTransport } from './EchoSrvTransport'; @@ -27,7 +27,7 @@ export class GrafanaJavascriptAgentBackend implements EchoBackend { supportedEvents = [EchoEventType.GrafanaJavascriptAgent]; - private agentInstance; + private faroInstance; transports: BaseTransport[]; constructor(public options: GrafanaJavascriptAgentBackendOptions) { @@ -51,7 +51,7 @@ export class GrafanaJavascriptAgentBackend // initialize GrafanaJavascriptAgent so it can set up its hooks and start collecting errors const grafanaJavaScriptAgentOptions: BrowserConfig = { - globalObjectKey: options.globalObjectKey || 'grafanaAgent', + globalObjectKey: options.globalObjectKey || 'faro', preventGlobalExposure: options.preventGlobalExposure || false, app: { version: options.buildInfo.version, @@ -74,10 +74,10 @@ export class GrafanaJavascriptAgentBackend }, ], }; - this.agentInstance = initializeAgent(grafanaJavaScriptAgentOptions); + this.faroInstance = initializeFaro(grafanaJavaScriptAgentOptions); if (options.user) { - this.agentInstance.api.setUser({ + this.faroInstance.api.setUser({ id: options.user.id, attributes: { orgId: String(options.user.orgId) || '', diff --git a/public/app/features/alerting/unified/Analytics.ts b/public/app/features/alerting/unified/Analytics.ts index dee5f9b0dd9..62eb16a5628 100644 --- a/public/app/features/alerting/unified/Analytics.ts +++ b/public/app/features/alerting/unified/Analytics.ts @@ -1,4 +1,4 @@ -import { agent, LogLevel as GrafanaLogLevel } from '@grafana/agent-web'; +import { faro, LogLevel as GrafanaLogLevel } from '@grafana/faro-web-sdk'; import { config } from '@grafana/runtime/src'; export const LogMessages = { @@ -15,7 +15,7 @@ export const LogMessages = { // logInfo from '@grafana/runtime' should be used, but it doesn't handle Grafana JS Agent and Sentry correctly export function logInfo(message: string, context: Record = {}) { if (config.grafanaJavascriptAgent.enabled) { - agent.api.pushLog([message], { + faro.api.pushLog([message], { level: GrafanaLogLevel.INFO, context: { ...context, module: 'Alerting' }, }); diff --git a/yarn.lock b/yarn.lock index b4e12cf68a2..faa565e44dd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4291,29 +4291,6 @@ __metadata: languageName: unknown linkType: soft -"@grafana/agent-core@npm:0.4.0, @grafana/agent-core@npm:^0.4.0": - version: 0.4.0 - resolution: "@grafana/agent-core@npm:0.4.0" - dependencies: - "@opentelemetry/api": ^1.1.0 - "@opentelemetry/api-metrics": ^0.29.1 - "@opentelemetry/otlp-transformer": ^0.29.1 - uuid: ^8.3.2 - checksum: a71669dd0ec00f8e97dcf9e525b77221b64989918ab6a86c606caa87297a559c8da1f886cfa4c7ac7ade483dfaec24cf9733c93962f271c79540828ba06271a3 - languageName: node - linkType: hard - -"@grafana/agent-web@npm:0.4.0, @grafana/agent-web@npm:^0.4.0": - version: 0.4.0 - resolution: "@grafana/agent-web@npm:0.4.0" - dependencies: - "@grafana/agent-core": ^0.4.0 - ua-parser-js: ^1.0.2 - web-vitals: ^2.1.4 - checksum: 149b23dd387a70dfbc0f555c25712295e0eadcafcd13eb97d88e584b36388ddc819f2c59435101f7747151576cc3f616739efc8ad77eb77b84bd0c02204f9113 - languageName: node - linkType: hard - "@grafana/aws-sdk@npm:0.0.37": version: 0.0.37 resolution: "@grafana/aws-sdk@npm:0.0.37" @@ -4482,6 +4459,29 @@ __metadata: languageName: node linkType: hard +"@grafana/faro-core@npm:1.0.0-beta2, @grafana/faro-core@npm:^1.0.0-beta2": + version: 1.0.0-beta2 + resolution: "@grafana/faro-core@npm:1.0.0-beta2" + dependencies: + "@opentelemetry/api": ^1.1.0 + "@opentelemetry/api-metrics": ^0.33.0 + "@opentelemetry/otlp-transformer": ^0.33.0 + fast-deep-equal: ^3.1.3 + checksum: 0c807f5212e502313b149b087e3f2c0cebf59bfe95bcd558f6fd421727a6f7eeb735abb12661f9b76e14bbcebca4773763332a1fb992461e4a673f1326a9acce + languageName: node + linkType: hard + +"@grafana/faro-web-sdk@npm:1.0.0-beta2": + version: 1.0.0-beta2 + resolution: "@grafana/faro-web-sdk@npm:1.0.0-beta2" + dependencies: + "@grafana/faro-core": ^1.0.0-beta2 + ua-parser-js: ^1.0.32 + web-vitals: ^3.0.4 + checksum: 7919c4856653880c71d384b14e8e8a7fa2edc17cf57bdc55dc6afd8a8c94b6787a0b9186540b6fb1c4f6d720de7ec8b3ddd00517a2e8117ede94de5b3f8c5559 + languageName: node + linkType: hard + "@grafana/google-sdk@npm:0.0.4": version: 0.0.4 resolution: "@grafana/google-sdk@npm:0.0.4" @@ -4511,9 +4511,9 @@ __metadata: version: 0.0.0-use.local resolution: "@grafana/runtime@workspace:packages/grafana-runtime" dependencies: - "@grafana/agent-web": ^0.4.0 "@grafana/data": 9.3.0-pre "@grafana/e2e-selectors": 9.3.0-pre + "@grafana/faro-web-sdk": 1.0.0-beta2 "@grafana/tsconfig": ^1.2.0-rc1 "@grafana/ui": 9.3.0-pre "@rollup/plugin-commonjs": 23.0.2 @@ -7151,12 +7151,12 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/api-metrics@npm:0.29.2, @opentelemetry/api-metrics@npm:^0.29.1": - version: 0.29.2 - resolution: "@opentelemetry/api-metrics@npm:0.29.2" +"@opentelemetry/api-metrics@npm:0.33.0, @opentelemetry/api-metrics@npm:^0.33.0": + version: 0.33.0 + resolution: "@opentelemetry/api-metrics@npm:0.33.0" dependencies: "@opentelemetry/api": ^1.0.0 - checksum: 6197a1f05c8bfc72db7052b65d0612155f675282d796f4566fc1f99228f6c0b21df52bf9d865456992298d1a1720ea58dd79ec4b27b85563ec13f820dcaf2d3a + checksum: 8c4fc342e96bc3bea8d5f152faab7dec479c75b9a9b0796a4a8f17525734dcabab2366c0ea0f3d1f3e575d5e26315086b0ddf6ceda5625f5bd6322f425a2c074 languageName: node linkType: hard @@ -7186,14 +7186,14 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/core@npm:1.3.1": - version: 1.3.1 - resolution: "@opentelemetry/core@npm:1.3.1" +"@opentelemetry/core@npm:1.7.0": + version: 1.7.0 + resolution: "@opentelemetry/core@npm:1.7.0" dependencies: - "@opentelemetry/semantic-conventions": 1.3.1 + "@opentelemetry/semantic-conventions": 1.7.0 peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.2.0" - checksum: a59d0e8b7af2054d4b741a076abb992fb9bb241b1e7e2563a7d03b8a810155eb5c5c4eab28ebae39ce67d9ae66ae2a8d5d038de3b7ddc6301ac636840ceb876c + "@opentelemetry/api": ">=1.0.0 <1.3.0" + checksum: 94fcae57c3c2c3a1cff6311246f32a228b216533449bfcec2f8eb03ea023f0ace4e0929c8cf5145772c6f25263d5f2d5d3485a39ab0ced4e11f5a0fed7497e9c languageName: node linkType: hard @@ -7212,18 +7212,18 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/otlp-transformer@npm:^0.29.1": - version: 0.29.2 - resolution: "@opentelemetry/otlp-transformer@npm:0.29.2" +"@opentelemetry/otlp-transformer@npm:^0.33.0": + version: 0.33.0 + resolution: "@opentelemetry/otlp-transformer@npm:0.33.0" dependencies: - "@opentelemetry/api-metrics": 0.29.2 - "@opentelemetry/core": 1.3.1 - "@opentelemetry/resources": 1.3.1 - "@opentelemetry/sdk-metrics-base": 0.29.2 - "@opentelemetry/sdk-trace-base": 1.3.1 + "@opentelemetry/api-metrics": 0.33.0 + "@opentelemetry/core": 1.7.0 + "@opentelemetry/resources": 1.7.0 + "@opentelemetry/sdk-metrics": 0.33.0 + "@opentelemetry/sdk-trace-base": 1.7.0 peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.2.0" - checksum: e86dc023c96fcf2faa72d47300bb43d2820a5f3f75446d17b109c4a16accec2257642dbe0856ec65ef4c6a9ba9ac551ace5a429bd7222da64563acd7002f8698 + "@opentelemetry/api": ">=1.0.0 <1.3.0" + checksum: f2a68957588a5bf7de3974dd210440dc64f29dd93c3f6f79c2e0cf69d3e487432cfec6d2c14752d7ba007f93140a23f8ea39135451e7bf455789b4a2d8ad84d1 languageName: node linkType: hard @@ -7239,15 +7239,15 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/resources@npm:1.3.1": - version: 1.3.1 - resolution: "@opentelemetry/resources@npm:1.3.1" +"@opentelemetry/resources@npm:1.7.0": + version: 1.7.0 + resolution: "@opentelemetry/resources@npm:1.7.0" dependencies: - "@opentelemetry/core": 1.3.1 - "@opentelemetry/semantic-conventions": 1.3.1 + "@opentelemetry/core": 1.7.0 + "@opentelemetry/semantic-conventions": 1.7.0 peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.2.0" - checksum: 2aeb76e23364f2ede34d27c912d3489e219dbdb430c7ae33e30c38d4451f05fc58c0ff05332a8eac428d889f456692450417b8477585089cd047165fb25681ea + "@opentelemetry/api": ">=1.0.0 <1.3.0" + checksum: 9d669e4170120ef240757f9d82b5ef411335606114d19bd9f7a534a8328638871de0a06487f5da2dc0eb2ea540bb3ccbeea2f41c75a27de4e13e270452dd38eb languageName: node linkType: hard @@ -7265,17 +7265,17 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/sdk-metrics-base@npm:0.29.2": - version: 0.29.2 - resolution: "@opentelemetry/sdk-metrics-base@npm:0.29.2" +"@opentelemetry/sdk-metrics@npm:0.33.0": + version: 0.33.0 + resolution: "@opentelemetry/sdk-metrics@npm:0.33.0" dependencies: - "@opentelemetry/api-metrics": 0.29.2 - "@opentelemetry/core": 1.3.1 - "@opentelemetry/resources": 1.3.1 + "@opentelemetry/api-metrics": 0.33.0 + "@opentelemetry/core": 1.7.0 + "@opentelemetry/resources": 1.7.0 lodash.merge: 4.6.2 peerDependencies: "@opentelemetry/api": ^1.0.0 - checksum: 3518b881991ce13bc1a93346889bb4e5e9581528b511151981049b60bf78acf85f44701597e303f23629f2282ba36ac26d55c39740ef288e227d8253658933aa + checksum: 2c99c7ece4e545a3da0280e8dc9699458fdbb5c2bf9bcf09a9524612a844b28516d864ab1e0b5bedd12f9cccfc5d4f01663686538e8144b4d0185d2f8a581f0e languageName: node linkType: hard @@ -7293,16 +7293,16 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/sdk-trace-base@npm:1.3.1": - version: 1.3.1 - resolution: "@opentelemetry/sdk-trace-base@npm:1.3.1" +"@opentelemetry/sdk-trace-base@npm:1.7.0": + version: 1.7.0 + resolution: "@opentelemetry/sdk-trace-base@npm:1.7.0" dependencies: - "@opentelemetry/core": 1.3.1 - "@opentelemetry/resources": 1.3.1 - "@opentelemetry/semantic-conventions": 1.3.1 + "@opentelemetry/core": 1.7.0 + "@opentelemetry/resources": 1.7.0 + "@opentelemetry/semantic-conventions": 1.7.0 peerDependencies: - "@opentelemetry/api": ">=1.0.0 <1.2.0" - checksum: 9f3074f226854ff285e15d1f636f6c912b9760306c3617fd731dc2c9cb4816d59b7b74185ce1d3be9131d4852a881599cbba2d721cc02871bdf2827a028f7a62 + "@opentelemetry/api": ">=1.0.0 <1.3.0" + checksum: f6ebfe1614d481ab11f4ebca4ae45ae92790e9b27a6b30cdeedf968918ac85e6d5cd695dd26ba3d0db0e665830a9c73ed25b4bd286c019c4adf084a05776bb9c languageName: node linkType: hard @@ -7313,13 +7313,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/semantic-conventions@npm:1.3.1": - version: 1.3.1 - resolution: "@opentelemetry/semantic-conventions@npm:1.3.1" - checksum: 83fa3b8a8198f6a5265a4191a89cfcce042240b92e034cf29631b0fe749993f4f74f4d21d89b10f6b05984246424adf8d037f8be507fcf0adf60933ab7143f07 - languageName: node - linkType: hard - "@opentelemetry/semantic-conventions@npm:1.7.0": version: 1.7.0 resolution: "@opentelemetry/semantic-conventions@npm:1.7.0" @@ -21519,14 +21512,14 @@ __metadata: "@emotion/css": 11.10.5 "@emotion/eslint-plugin": 11.10.0 "@emotion/react": 11.10.5 - "@grafana/agent-core": 0.4.0 - "@grafana/agent-web": 0.4.0 "@grafana/aws-sdk": 0.0.37 "@grafana/data": "workspace:*" "@grafana/e2e": "workspace:*" "@grafana/e2e-selectors": "workspace:*" "@grafana/eslint-config": 5.0.0 "@grafana/experimental": 1.0.1 + "@grafana/faro-core": 1.0.0-beta2 + "@grafana/faro-web-sdk": 1.0.0-beta2 "@grafana/google-sdk": 0.0.4 "@grafana/lezer-logql": 0.1.1 "@grafana/monaco-logql": ^0.0.6 @@ -37399,10 +37392,10 @@ __metadata: languageName: node linkType: hard -"ua-parser-js@npm:^1.0.2": - version: 1.0.2 - resolution: "ua-parser-js@npm:1.0.2" - checksum: ff7f6d79a9c1a38aa85a0e751040fc7e17a0b621bda876838d14ebe55aca4e50e68da0350f181e58801c2d8a35e7db4e12473776e558910c4b7cabcec96aa3bf +"ua-parser-js@npm:^1.0.32": + version: 1.0.32 + resolution: "ua-parser-js@npm:1.0.32" + checksum: 79a80efd9c21511fdafc042ab748e0e93c8cdb0e8925bf6d48ad7dbb08e808c60fcecd49e679670def44ef428c005aa1810810f6773e7d8135a7817338080813 languageName: node linkType: hard @@ -38419,10 +38412,10 @@ __metadata: languageName: node linkType: hard -"web-vitals@npm:^2.1.4": - version: 2.1.4 - resolution: "web-vitals@npm:2.1.4" - checksum: 03d3f47dbf55c3dce07beb0ff5de8ddd52e2d0a53a8df5c84e7a16dda93543341d67231fa79b1d9772b091419af4ec0fd395b8bcf451a0e26846e3f76b3d0efc +"web-vitals@npm:^3.0.4": + version: 3.0.4 + resolution: "web-vitals@npm:3.0.4" + checksum: b618a8e049e0c64948eea09c372db490802bcc8bcb30230a2bc69d9e243b1a2fa54d0f0ae19d5e63f19381df86db2a9260ca15ef620e10024888eab487a77d56 languageName: node linkType: hard