diff --git a/.betterer.results b/.betterer.results index a5ae922b47a..46ecf2ed512 100644 --- a/.betterer.results +++ b/.betterer.results @@ -4144,9 +4144,6 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "1"], [0, 0, 0, "Do not use any type assertions.", "2"] ], - "public/app/plugins/datasource/influxdb/components/editor/query/influxql/InfluxCheatSheet.tsx:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"] - ], "public/app/plugins/datasource/influxdb/datasource.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"], diff --git a/CHANGELOG.md b/CHANGELOG.md index 379d4f1e7cd..c475d65bdce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ ### Features and enhancements +- **Alerting:** Migrate unknown NoData\Error settings to the default. [#69010](https://github.com/grafana/grafana/issues/69010), [@grafanabot](https://github.com/grafanabot) +- **Drawer:** Position under nav & minor redesign . [#68396](https://github.com/grafana/grafana/issues/68396), [@grafanabot](https://github.com/grafanabot) +- **Navigation:** Add keyboard shortcut to navigate directly to Dashboards. [#68374](https://github.com/grafana/grafana/issues/68374), [@grafanabot](https://github.com/grafanabot) +- **Explore:** Promote exploreMixedDatasource to Stable & enable by default. [#68353](https://github.com/grafana/grafana/issues/68353), [@Elfo404](https://github.com/Elfo404) +- **Tempo:** Escape regex-sensitive characters in span name before building promql query. [#68313](https://github.com/grafana/grafana/issues/68313), [@grafanabot](https://github.com/grafanabot) +- **Drawer:** Introduce a size property that set's width percentage and minWidth . [#68128](https://github.com/grafana/grafana/issues/68128), [@grafanabot](https://github.com/grafanabot) +- **AngularDeprecation:** Show warnings in panel edit for angular panels. [#68083](https://github.com/grafana/grafana/issues/68083), [@grafanabot](https://github.com/grafanabot) +- **Dashboard:** Change add panel button to fill to remove outline border. [#68017](https://github.com/grafana/grafana/issues/68017), [@grafanabot](https://github.com/grafanabot) - **Query History:** Remove migration. [#67470](https://github.com/grafana/grafana/issues/67470), [@Elfo404](https://github.com/Elfo404) - **Alerting:** Implement template testing endpoint. [#67450](https://github.com/grafana/grafana/issues/67450), [@JacobsonMT](https://github.com/JacobsonMT) - **Trace View:** Export trace button . [#67368](https://github.com/grafana/grafana/issues/67368), [@adrapereira](https://github.com/adrapereira) @@ -100,6 +108,37 @@ ### Bug fixes +- **ResourcePicker:** Fix missing border bug on cancel button. [#69113](https://github.com/grafana/grafana/issues/69113), [@nmarrs](https://github.com/nmarrs) +- **TimeSeries:** Fix centeredZero y axis ranging when all values are 0. [#69112](https://github.com/grafana/grafana/issues/69112), [@grafanabot](https://github.com/grafanabot) +- **StatusHistory:** Fix rendering of value-mapped null. [#69108](https://github.com/grafana/grafana/issues/69108), [@grafanabot](https://github.com/grafanabot) +- **Alerting:** Fix provenance guard checks for Alertmanager configuration to not cause panic when compared nested objects. [#69094](https://github.com/grafana/grafana/issues/69094), [@grafanabot](https://github.com/grafanabot) +- **Alerting:** Add support for Alert State History Loki primary. [#69077](https://github.com/grafana/grafana/issues/69077), [@grafanabot](https://github.com/grafanabot) +- **Dashboards:** Fix undefined aria labels in Annotation Checkboxes for Programmatic Access. [#68873](https://github.com/grafana/grafana/issues/68873), [@grafanabot](https://github.com/grafanabot) +- **Alerting:** Fix stale query preview error. [#68836](https://github.com/grafana/grafana/issues/68836), [@grafanabot](https://github.com/grafanabot) +- **AnonymousAuth:** Fix concurrent read-write crash. [#68803](https://github.com/grafana/grafana/issues/68803), [@grafanabot](https://github.com/grafanabot) +- **AzureMonitor:** Ensure legacy properties containing template variables are correctly migrated. [#68792](https://github.com/grafana/grafana/issues/68792), [@grafanabot](https://github.com/grafanabot) +- **Alerting:** Add additional contact points for external AM. [#68778](https://github.com/grafana/grafana/issues/68778), [@grafanabot](https://github.com/grafanabot) +- **RBAC:** Remove legacy AC editor and admin role on new dashboard route. [#68777](https://github.com/grafana/grafana/issues/68777), [@grafanabot](https://github.com/grafanabot) +- **Azure Monitor:** Fix bug with top value so more than 10 resources can be shown . [#68725](https://github.com/grafana/grafana/issues/68725), [@grafanabot](https://github.com/grafanabot) +- **NodeGraph:** Fix overlaps preventing opening an edge context menu when nodes were too close. [#68628](https://github.com/grafana/grafana/issues/68628), [@grafanabot](https://github.com/grafanabot) +- **Plugins:** Correct the usage of mutex for gRPC plugin implementation. [#68609](https://github.com/grafana/grafana/issues/68609), [@grafanabot](https://github.com/grafanabot) +- **Azure Monitor:** Fix bug that did not show alert rule preview. [#68581](https://github.com/grafana/grafana/issues/68581), [@grafanabot](https://github.com/grafanabot) +- **FlameGraph:** Fix table sort being reset when search changes. [#68454](https://github.com/grafana/grafana/issues/68454), [@grafanabot](https://github.com/grafanabot) +- **Command Palette:** Prevent stale search results from overwriting newer results. [#68392](https://github.com/grafana/grafana/issues/68392), [@grafanabot](https://github.com/grafanabot) +- **Search:** Fix Search returning results out of order. [#68387](https://github.com/grafana/grafana/issues/68387), [@joshhunt](https://github.com/joshhunt) +- **Explore:** Remove data source onboarding page. [#68381](https://github.com/grafana/grafana/issues/68381), [@grafanabot](https://github.com/grafanabot) +- **Flamegraph:** Fix tooltip positioning. [#68312](https://github.com/grafana/grafana/issues/68312), [@grafanabot](https://github.com/grafanabot) +- **Pyroscope:** Add authentication when calling backendType resource API. [#68311](https://github.com/grafana/grafana/issues/68311), [@grafanabot](https://github.com/grafanabot) +- **Histogram:** Respect min/max panel settings for x-axis. [#68245](https://github.com/grafana/grafana/issues/68245), [@grafanabot](https://github.com/grafanabot) +- **QueryRow:** Make toggle actions screen-readers accessible. [#68210](https://github.com/grafana/grafana/issues/68210), [@grafanabot](https://github.com/grafanabot) +- **Heatmap:** Fix color rendering for value ranges < 1. [#68164](https://github.com/grafana/grafana/issues/68164), [@grafanabot](https://github.com/grafanabot) +- **Heatmap:** Handle unsorted timestamps in calculate mode. [#68151](https://github.com/grafana/grafana/issues/68151), [@grafanabot](https://github.com/grafanabot) +- **Alerting:** Fixes Alert list panel "ungrouped" regression. [#68090](https://github.com/grafana/grafana/issues/68090), [@grafanabot](https://github.com/grafanabot) +- **Alerting:** Show export button for org admins. [#67995](https://github.com/grafana/grafana/issues/67995), [@grafanabot](https://github.com/grafanabot) +- **Navigation:** Fix 'Page not found' when sending or going back from 'Invitate user' page. [#67972](https://github.com/grafana/grafana/issues/67972), [@grafanabot](https://github.com/grafanabot) +- **InspectDrawer:** Fixes issue with double scrollbars. [#67888](https://github.com/grafana/grafana/issues/67888), [@grafanabot](https://github.com/grafanabot) +- **Connections:** Show core datasource plugins as well. [#67886](https://github.com/grafana/grafana/issues/67886), [@grafanabot](https://github.com/grafanabot) +- **Gauge:** Set min and max for percent unit. [#67719](https://github.com/grafana/grafana/issues/67719), [@grafanabot](https://github.com/grafanabot) - **TimeSeries:** Fix leading null-fill for missing intervals. [#67570](https://github.com/grafana/grafana/issues/67570), [@leeoniya](https://github.com/leeoniya) - **Pyroscope:** Fix autodetection in case of using Phlare backend. [#67536](https://github.com/grafana/grafana/issues/67536), [@aocenas](https://github.com/aocenas) - **Dashboard:** Revert fixed header shown on mobile devices in the new panel header. [#67510](https://github.com/grafana/grafana/issues/67510), [@axelavargas](https://github.com/axelavargas) @@ -181,13 +220,15 @@ The deprecated `plugin:test` and `plugin:dev` commands in the Grafana Toolkit ha The type signature of the `testDatasource()` method on the `DataSourceWithBackend` class [has changed](https://github.com/grafana/grafana/pull/67014/files/a5608dc4f27ab4459e725b22ff60b8fc05390c08#diff-c58fc1a09e9b9b17e5f45efbfb646273e69145f7687facb134440da4edafc745R263), the returned Promise is now typed stricter, which is probably going to cause type-errors while building plugins against the latest Grafana versions. -````typescript +```typescript // Before abstract testDatasource(): Promise; // After abstract testDatasource(): Promise; -``` Issue [#67014](https://github.com/grafana/grafana/issues/67014) +``` + +Issue [#67014](https://github.com/grafana/grafana/issues/67014) Grafana requires an Elasticsearch version of 7.16 or newer. If you use an older Elasticsearch version, you will get warnings in the query editor and on the datasource configuration page. Issue [#66928](https://github.com/grafana/grafana/issues/66928) @@ -200,19 +241,19 @@ We've removed some now unused properties from the `NavModel` interface. Issue [# We removed previously deprecated components from `@grafana/data` : `getLogLevel`, `getLogLevelFromKey`, `addLogLevelToSeries`, `LogsParser`, `LogsParsers`, `calculateFieldStats`, `calculateLogsLabelStats`, `calculateStats`, `getParser`, `sortInAscendingOrder`, `sortInDescendingOrder`, `sortLogsResult`, `sortLogRows`, `checkLogsError`, `escapeUnescapedString`. Issue [#66271](https://github.com/grafana/grafana/issues/66271) We removed previously deprecated components from `@grafana/ui` : `LogLabels`, `LogMessageAnsi`, `LogRows`, `getLogRowStyles`. - Issue [#66268](https://github.com/grafana/grafana/issues/66268) +Issue [#66268](https://github.com/grafana/grafana/issues/66268) -We removed previously deprecated `DataSourceWithLogsVolumeSupport` that was replaced with `DataSourceWithSupplementaryQueriesSupport`. Both APIs are for internal use only. Issue [#66266](https://github.com/grafana/grafana/issues/66266) +We removed previously deprecated `DataSourceWithLogsVolumeSupport` that was replaced with `DataSourceWithSupplementaryQueriesSupport`. Both APIs are for internal use only. Issue [#66266](https://github.com/grafana/grafana/issues/66266) -Additional functions (map/filter/forEach/iterator) have been added to the root Vector interface. Any code using vectors will continue to work unchanged, but in the rare case that you have implemented Vector directly, it be missing these functions. The easiest fix is to extend [FunctionalVector](https://github.com/grafana/grafana/blob/main/packages/grafana-data/src/vector/FunctionalVector.ts). +Additional functions (map/filter/forEach/iterator) have been added to the root Vector interface. Any code using vectors will continue to work unchanged, but in the rare case that you have implemented Vector directly, it be missing these functions. The easiest fix is to extend [FunctionalVector](https://github.com/grafana/grafana/blob/main/packages/grafana-data/src/vector/FunctionalVector.ts). The `ArrayVector` class now extends the native JavaScript `Array` and gains all of its prototype/instance methods as a result. Issue [#66187](https://github.com/grafana/grafana/issues/66187) We've removed the ability for functions to be passed as children to the `Dropdown` component. Previously, this was used to access the `isOpen` state of the dropdown. This can be now be achieved with the `onVisibleChange` prop. Before: -```` +``` return ( {(isOpen) => @@ -220,12 +261,11 @@ return ( } ); - ``` After: -``` +```` const [isOpen, setIsOpen] = useState(false); ... @@ -235,8 +275,7 @@ return ( ); - -````Issue [#65467](https://github.com/grafana/grafana/issues/65467) +``` Issue [#65467](https://github.com/grafana/grafana/issues/65467) (relevant for plugin developers) The deprecated internal `dashboardId` is now removed from the request context. For usage tracking use the `dashboardUid` @@ -3317,8 +3356,8 @@ The change in behavior is that negative-valued series are now stacked downwards The meaning of the default data source has now changed from being a persisted property in a panel. Before when you selected the default data source for a panel and later changed the default data source to another data source it would change all panels who were configured to use the default data source. From now on the default data source is just the default for new panels and changing the default will not impact any currently saved dashboards. Issue [#45132](https://github.com/grafana/grafana/issues/45132) -The Tooltip component provided by `@grafana/ui` is no longer automatically interactive (that is you can hover onto it and click a link or select text). It will from now on by default close automatically when you mouse out from the trigger element. To make tooltips behave like before set the new `interactive` property to true. - Issue [#45053](https://github.com/grafana/grafana/issues/45053) +The Tooltip component provided by `@grafana/ui` is no longer automatically interactive (that is you can hover onto it and click a link or select text). It will from now on by default close automatically when you mouse out from the trigger element. To make tooltips behave like before set the new `interactive` property to true. +Issue [#45053](https://github.com/grafana/grafana/issues/45053) ### Deprecations diff --git a/contribute/style-guides/testing.md b/contribute/style-guides/testing.md new file mode 100644 index 00000000000..7ca50d926b9 --- /dev/null +++ b/contribute/style-guides/testing.md @@ -0,0 +1,225 @@ +# Testing Guidelines + +The goal of this document is to address the most frequently asked "How to" questions related to unit testing. + +## Best practices + +- Default to the `*ByRole` queries when testing components as it encourages testing with accessibility concerns in mind. It's also possible to use `*ByLabelText` queries. However, the `*ByRole` queries are [more robust](https://testing-library.com/docs/queries/bylabeltext/#name) and are generally recommended over the former. + +## Testing User Interactions + +We use the [user-event](https://testing-library.com/docs/user-event/intro) library for simulating user interactions during testing. This library is preferred over the built-in `fireEvent` method, as it more accurately mirrors real user interactions with elements. + +There are two important considerations when working with `userEvent`: + +1. All methods in `userEvent` are asynchronous, and thus require the use of `await` when called. +2. Directly calling methods from `userEvent` may not be supported in future versions. As such, it's necessary to first call `userEvent.setup()` prior to the tests. This method returns a `userEvent` instance, complete with all its methods. This setup process can be simplified using a utility function: + +```tsx +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; + +function setup(jsx: JSX.Element) { + return { + user: userEvent.setup(), + ...render(jsx), + }; +} + +it('should render', async () => { + const { user } = setup( + + + + )} + + ); +} diff --git a/public/app/features/dashboard/containers/DashboardPage.tsx b/public/app/features/dashboard/containers/DashboardPage.tsx index e9c5a1fa95a..24514467686 100644 --- a/public/app/features/dashboard/containers/DashboardPage.tsx +++ b/public/app/features/dashboard/containers/DashboardPage.tsx @@ -437,23 +437,25 @@ function updateStatePageNavFromProps(props: Props, state: State): State { }; } - // Check if folder changed const { folderTitle, folderUid } = dashboard.meta; - if (folderTitle && folderUid && pageNav && pageNav.parentItem?.text !== folderTitle) { + if (folderUid && pageNav) { if (config.featureToggles.nestedFolders) { - const folderNavModel = folderUid ? getNavModel(navIndex, `folder-dashboards-${folderUid}`).main : undefined; + const folderNavModel = getNavModel(navIndex, `folder-dashboards-${folderUid}`).main; pageNav = { ...pageNav, parentItem: folderNavModel, }; } else { - pageNav = { - ...pageNav, - parentItem: { - text: folderTitle, - url: `/dashboards/f/${dashboard.meta.folderUid}`, - }, - }; + // Check if folder changed + if (folderTitle && pageNav.parentItem?.text !== folderTitle) { + pageNav = { + ...pageNav, + parentItem: { + text: folderTitle, + url: `/dashboards/f/${dashboard.meta.folderUid}`, + }, + }; + } } } diff --git a/public/app/features/dashboard/services/DashboardSrv.ts b/public/app/features/dashboard/services/DashboardSrv.ts index b562b70b853..c1168e31099 100644 --- a/public/app/features/dashboard/services/DashboardSrv.ts +++ b/public/app/features/dashboard/services/DashboardSrv.ts @@ -50,14 +50,11 @@ export class DashboardSrv { return new DashboardModel(dashboard, meta); } - setCurrent(dashboard: DashboardModel) { + setCurrent(dashboard: DashboardModel | undefined) { this.dashboard = dashboard; } getCurrent(): DashboardModel | undefined { - if (!this.dashboard) { - console.warn('Calling getDashboardSrv().getCurrent() without calling getDashboardSrv().setCurrent() first.'); - } return this.dashboard; } diff --git a/public/app/features/dashboard/state/DashboardModel.ts b/public/app/features/dashboard/state/DashboardModel.ts index a8e9af013a4..4af55f70582 100644 --- a/public/app/features/dashboard/state/DashboardModel.ts +++ b/public/app/features/dashboard/state/DashboardModel.ts @@ -768,6 +768,7 @@ export class DashboardModel implements TimeModel { for (let optionIndex = 0; optionIndex < selectedOptions.length; optionIndex++) { const option = selectedOptions[optionIndex]; const rowCopy = this.getRowRepeatClone(panel, optionIndex, panelIndex); + setScopedVars(rowCopy, option); const rowHeight = this.getRowHeight(rowCopy); @@ -955,6 +956,10 @@ export class DashboardModel implements TimeModel { row.collapsed = false; const rowPanels = row.panels ?? []; const hasRepeat = rowPanels.some((p: PanelModel) => p.repeat); + + // This is set only for the row being repeated. + const rowRepeatVariable = row.repeat; + if (rowPanels.length > 0) { // Use first panel to figure out if it was moved or pushed // If the panel doesn't have gridPos.y, use the row gridPos.y instead. @@ -969,6 +974,18 @@ export class DashboardModel implements TimeModel { let yMax = row.gridPos.y; for (const panel of rowPanels) { + // When expanding original row that's repeated, set scopedVars for repeated row panels. + if (rowRepeatVariable) { + const variable = this.getPanelRepeatVariable(row); + panel.scopedVars ??= {}; + if (variable) { + const selectedOptions = this.getSelectedVariableOptions(variable); + panel.scopedVars = { + ...panel.scopedVars, + [variable.name]: selectedOptions[0], + }; + } + } // set the y gridPos if it wasn't already set panel.gridPos.y ?? (panel.gridPos.y = row.gridPos.y); // (Safari 13.1 lacks ??= support) // make sure y is adjusted (in case row moved while collapsed) diff --git a/public/app/features/dashboard/state/actions.ts b/public/app/features/dashboard/state/actions.ts index 1b089434123..7d449b7616f 100644 --- a/public/app/features/dashboard/state/actions.ts +++ b/public/app/features/dashboard/state/actions.ts @@ -9,6 +9,7 @@ import { DashboardAcl, DashboardAclUpdateDTO, NewDashboardAclItem, PermissionLev import { loadPluginDashboards } from '../../plugins/admin/state/actions'; import { cancelVariables } from '../../variables/state/actions'; +import { getDashboardSrv } from '../services/DashboardSrv'; import { getTimeSrv } from '../services/TimeSrv'; import { cleanUpDashboard, loadDashboardPermissions } from './reducers'; @@ -124,10 +125,12 @@ export const cleanUpDashboardAndVariables = (): ThunkResult => (dispatch, } getTimeSrv().stopAutoRefresh(); - dispatch(cleanUpDashboard()); dispatch(removeAllPanels()); + dashboardWatcher.leave(); + + getDashboardSrv().setCurrent(undefined); }; export const updateTimeZoneDashboard = diff --git a/public/app/features/dashboard/state/initDashboard.ts b/public/app/features/dashboard/state/initDashboard.ts index c4786a2529d..9964b32a700 100644 --- a/public/app/features/dashboard/state/initDashboard.ts +++ b/public/app/features/dashboard/state/initDashboard.ts @@ -104,6 +104,12 @@ async function fetchDashboard( return dashDTO; } case DashboardRoutes.New: { + // only the folder API has information about ancestors + // get parent folder (if it exists) and put it in the store + // this will be used to populate the full breadcrumb trail + if (config.featureToggles.nestedFolders && args.urlFolderUid) { + await dispatch(getFolderByUid(args.urlFolderUid)); + } return getNewDashboardModelData(args.urlFolderUid, args.panelType); } case DashboardRoutes.Path: { diff --git a/public/app/features/logs/components/getLogRowStyles.ts b/public/app/features/logs/components/getLogRowStyles.ts index 4c737403bbc..2062fdec656 100644 --- a/public/app/features/logs/components/getLogRowStyles.ts +++ b/public/app/features/logs/components/getLogRowStyles.ts @@ -70,7 +70,6 @@ export const getLogRowStyles = memoizeOne((theme: GrafanaTheme2) => { font-family: ${theme.typography.fontFamilyMonospace}; font-size: ${theme.typography.bodySmall.fontSize}; width: 100%; - margin-bottom: ${theme.spacing(2.25)}; /* This is to make sure the last row's LogRowMenu is not cut off. */ `, contextBackground: css` background: ${hoverBgColor}; diff --git a/public/app/features/plugins/datasource_srv.ts b/public/app/features/plugins/datasource_srv.ts index c31c13c1900..0ebe1891ce2 100644 --- a/public/app/features/plugins/datasource_srv.ts +++ b/public/app/features/plugins/datasource_srv.ts @@ -254,7 +254,8 @@ export class DatasourceSrv implements DataSourceService { // Support for multi-value variables with only one selected datasource dsValue = dsValue[0]; } - const dsSettings = !Array.isArray(dsValue) && this.settingsMapByName[dsValue]; + const dsSettings = + !Array.isArray(dsValue) && (this.settingsMapByName[dsValue] || this.settingsMapByUid[dsValue]); if (dsSettings) { const key = `$\{${variable.name}\}`; diff --git a/public/app/features/plugins/tests/datasource_srv.test.ts b/public/app/features/plugins/tests/datasource_srv.test.ts index 319cf5ed141..a6ff1cc3b2c 100644 --- a/public/app/features/plugins/tests/datasource_srv.test.ts +++ b/public/app/features/plugins/tests/datasource_srv.test.ts @@ -18,6 +18,13 @@ const templateSrv: any = { value: 'BBB', }, }, + { + type: 'datasource', + name: 'datasourceByUid', + current: { + value: 'uid-code-DDDD', + }, + }, { type: 'datasource', name: 'datasourceDefault', @@ -32,6 +39,7 @@ const templateSrv: any = { } let result = v.replace('${datasource}', 'BBB'); + result = result.replace('${datasourceByUid}', 'DDDD'); result = result.replace('${datasourceDefault}', 'default'); return result; }, @@ -103,6 +111,12 @@ describe('datasource_srv', () => { meta: { metrics: true }, isDefault: true, }, + DDDD: { + type: 'test-db', + name: 'DDDD', + uid: 'uid-code-DDDD', + meta: { metrics: true }, + }, Jaeger: { type: 'jaeger-db', name: 'Jaeger', @@ -165,7 +179,7 @@ describe('datasource_srv', () => { expect(dataSourceSrv.getInstanceSettings({ uid: 'uid-code-mmm' })).toBe(ds); }); - it('should work with variable', () => { + it('should work with variable by ds name', () => { const ds = dataSourceSrv.getInstanceSettings('${datasource}'); expect(ds?.name).toBe('${datasource}'); expect(ds?.uid).toBe('${datasource}'); @@ -177,6 +191,18 @@ describe('datasource_srv', () => { `); }); + it('should work with variable by ds value (uid)', () => { + const ds = dataSourceSrv.getInstanceSettings('${datasourceByUid}'); + expect(ds?.name).toBe('${datasourceByUid}'); + expect(ds?.uid).toBe('${datasourceByUid}'); + expect(ds?.rawRef).toMatchInlineSnapshot(` + { + "type": "test-db", + "uid": "uid-code-DDDD", + } + `); + }); + it('should work with variable via scopedVars', () => { const ds = dataSourceSrv.getInstanceSettings('${datasource}', { datasource: { text: 'Prom', value: 'uid-code-aaa' }, @@ -247,7 +273,7 @@ describe('datasource_srv', () => { describe('when getting external metric sources', () => { it('should return list of explore sources', () => { const externalSources = dataSourceSrv.getExternal(); - expect(externalSources.length).toBe(6); + expect(externalSources.length).toBe(7); }); }); @@ -260,8 +286,9 @@ describe('datasource_srv', () => { it('Can get list of data sources with variables: true', () => { const list = dataSourceSrv.getList({ metrics: true, variables: true }); - expect(list[0].name).toBe('${datasourceDefault}'); - expect(list[1].name).toBe('${datasource}'); + expect(list[0].name).toBe('${datasourceByUid}'); + expect(list[1].name).toBe('${datasourceDefault}'); + expect(list[2].name).toBe('${datasource}'); }); it('Can get list of data sources with tracing: true', () => { @@ -300,6 +327,14 @@ describe('datasource_srv', () => { "type": "test-db", "uid": "uid-code-BBB", }, + { + "meta": { + "metrics": true, + }, + "name": "DDDD", + "type": "test-db", + "uid": "uid-code-DDDD", + }, { "meta": { "annotations": true, diff --git a/public/app/features/search/tempI18nPhrases.ts b/public/app/features/search/tempI18nPhrases.ts index 83b99bf2570..40c276270ae 100644 --- a/public/app/features/search/tempI18nPhrases.ts +++ b/public/app/features/search/tempI18nPhrases.ts @@ -10,11 +10,11 @@ export function getSearchPlaceholder(includePanels = false) { } export function getNewDashboardPhrase() { - return t('search.dashboard-actions.new-dashboard', 'New Dashboard'); + return t('search.dashboard-actions.new-dashboard', 'New dashboard'); } export function getNewFolderPhrase() { - return t('search.dashboard-actions.new-folder', 'New Folder'); + return t('search.dashboard-actions.new-folder', 'New folder'); } export function getImportPhrase() { diff --git a/public/app/features/transformers/configFromQuery/configFromQuery.ts b/public/app/features/transformers/configFromQuery/configFromQuery.ts index 5b3bc7cb2c6..0ac2fc25788 100644 --- a/public/app/features/transformers/configFromQuery/configFromQuery.ts +++ b/public/app/features/transformers/configFromQuery/configFromQuery.ts @@ -66,6 +66,7 @@ export function extractConfigFromQuery(options: ConfigFromQueryTransformOptions, const outputFrame: DataFrame = { fields: [], length: frame.length, + refId: frame.refId, }; for (const field of frame.fields) { @@ -85,7 +86,6 @@ export function extractConfigFromQuery(options: ConfigFromQueryTransformOptions, output.push(outputFrame); } - return output; } diff --git a/public/app/features/variables/datasource/reducer.ts b/public/app/features/variables/datasource/reducer.ts index 9e422dae7b5..d28abaf014f 100644 --- a/public/app/features/variables/datasource/reducer.ts +++ b/public/app/features/variables/datasource/reducer.ts @@ -42,7 +42,7 @@ export const dataSourceVariableSlice = createSlice({ } if (isValid(source, regex)) { - options.push({ text: source.name, value: source.name, selected: false }); + options.push({ text: source.name, value: source.uid, selected: false }); } if (isDefault(source, regex)) { diff --git a/public/app/features/variables/shared/testing/helpers.ts b/public/app/features/variables/shared/testing/helpers.ts index ea9abfb7f48..83e02bf29e2 100644 --- a/public/app/features/variables/shared/testing/helpers.ts +++ b/public/app/features/variables/shared/testing/helpers.ts @@ -3,7 +3,7 @@ import { DataSourceInstanceSettings, DataSourceJsonData, DataSourcePluginMeta } export function getDataSourceInstanceSetting(name: string, meta: DataSourcePluginMeta): DataSourceInstanceSettings { return { id: 1, - uid: '', + uid: name, type: '', name, meta, diff --git a/public/app/features/variables/shared/testing/optionsVariableBuilder.ts b/public/app/features/variables/shared/testing/optionsVariableBuilder.ts index 18f2100e0b1..97bed58572a 100644 --- a/public/app/features/variables/shared/testing/optionsVariableBuilder.ts +++ b/public/app/features/variables/shared/testing/optionsVariableBuilder.ts @@ -3,14 +3,20 @@ import { VariableOption, VariableWithOptions } from 'app/features/variables/type import { VariableBuilder } from './variableBuilder'; export class OptionsVariableBuilder extends VariableBuilder { - withOptions(...texts: string[]) { + withOptions(...options: Array) { this.variable.options = []; - for (let index = 0; index < texts.length; index++) { - this.variable.options.push({ - text: texts[index], - value: texts[index], - selected: false, - }); + for (let index = 0; index < options.length; index++) { + const option = options[index]; + + if (typeof option === 'string') { + this.variable.options.push({ + text: option, + value: option, + selected: false, + }); + } else { + this.variable.options.push({ ...option, selected: false }); + } } return this; } diff --git a/public/app/features/variables/state/actions.test.ts b/public/app/features/variables/state/actions.test.ts index 3ec73fe3137..675c39c3cb4 100644 --- a/public/app/features/variables/state/actions.test.ts +++ b/public/app/features/variables/state/actions.test.ts @@ -381,6 +381,74 @@ describe('shared actions', () => { }); }); + describe('and not multivalue, but with currentValue specified', () => { + const A = { text: 'A', value: 'a-uid' }; + const B = { text: 'B', value: 'b-uid' }; + const C = { text: 'C', value: 'c-uid' }; + + it.each` + withOptions | currentText | currentValue | defaultValue | expected + ${[A, B, C]} | ${undefined} | ${undefined} | ${undefined} | ${A} + ${[A, B, C]} | ${'B'} | ${'b-uid'} | ${undefined} | ${B} + ${[A, B, C]} | ${'B'} | ${undefined} | ${undefined} | ${B} + ${[A, B, C]} | ${undefined} | ${'b-uid'} | ${undefined} | ${B} + ${[A, B, C]} | ${'Old B'} | ${'b-uid'} | ${undefined} | ${B} + ${[A, B, C]} | ${undefined} | ${'x-uid'} | ${'b-uid'} | ${B} + ${[A, B, C]} | ${undefined} | ${'b-uid'} | ${'c-uid'} | ${B} + ${[A, B, C]} | ${undefined} | ${'x-uid'} | ${undefined} | ${A} + ${undefined} | ${undefined} | ${'b-uid'} | ${undefined} | ${'should not dispatch setCurrentVariableValue'} + `( + 'then correct actions are dispatched', + async ({ withOptions, currentText, currentValue, defaultValue, expected }) => { + let custom; + const key = 'key'; + if (!withOptions) { + custom = customBuilder() + .withId('0') + .withRootStateKey(key) + .withCurrent(currentText, currentValue) + .withoutOptions() + .build(); + } else { + custom = customBuilder() + .withId('0') + .withRootStateKey(key) + .withOptions(...withOptions) + .withCurrent(currentText, currentValue) + .build(); + } + + const tester = await reduxTester() + .givenRootReducer(getTemplatingRootReducer()) + .whenActionIsDispatched( + toKeyedAction(key, addVariable(toVariablePayload(custom, { global: false, index: 0, model: custom }))) + ) + .whenAsyncActionIsDispatched( + validateVariableSelectionState(toKeyedVariableIdentifier(custom), defaultValue), + true + ); + + await tester.thenDispatchedActionsPredicateShouldEqual((dispatchedActions) => { + const expectedActions: AnyAction[] = withOptions + ? [ + toKeyedAction( + key, + setCurrentVariableValue( + toVariablePayload( + { type: 'custom', id: '0' }, + { option: { text: expected.text, value: expected.value, selected: false } } + ) + ) + ), + ] + : []; + expect(dispatchedActions).toEqual(expectedActions); + return true; + }); + } + ); + }); + describe('and multivalue', () => { it.each` withOptions | withCurrent | defaultValue | expectedText | expectedSelected diff --git a/public/app/features/variables/state/actions.ts b/public/app/features/variables/state/actions.ts index 4cd626cba7d..612f1217683 100644 --- a/public/app/features/variables/state/actions.ts +++ b/public/app/features/variables/state/actions.ts @@ -60,6 +60,7 @@ import { ensureStringValues, ExtendedUrlQueryMap, getCurrentText, + getCurrentValue, getVariableRefresh, hasOngoingTransaction, toKeyedVariableIdentifier, @@ -522,14 +523,16 @@ export const validateVariableSelectionState = ( // 1. find the current value const text = getCurrentText(variableInState); - option = variableInState.options?.find((v) => v.text === text); + const value = getCurrentValue(variableInState); + + option = variableInState.options?.find((v: VariableOption) => v.text === text || v.value === value); if (option) { return setValue(variableInState, option); } // 2. find the default value if (defaultValue) { - option = variableInState.options?.find((v) => v.text === defaultValue); + option = variableInState.options?.find((v) => v.text === defaultValue || v.value === defaultValue); if (option) { return setValue(variableInState, option); } diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/InfluxCheatSheet.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/InfluxCheatSheet.tsx index 7bf562c2cff..04b573159c6 100644 --- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/InfluxCheatSheet.tsx +++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/InfluxCheatSheet.tsx @@ -8,7 +8,7 @@ const CHEAT_SHEET_ITEMS = [ }, ]; -const InfluxCheatSheet = (props: any) => ( +export const InfluxCheatSheet = () => (

InfluxDB Cheat Sheet

{CHEAT_SHEET_ITEMS.map((item) => ( @@ -19,5 +19,3 @@ const InfluxCheatSheet = (props: any) => ( ))}
); - -export default InfluxCheatSheet; diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/InfluxStartPage.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/InfluxStartPage.tsx index f5ac86a24d2..10f35190d08 100644 --- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/InfluxStartPage.tsx +++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/InfluxStartPage.tsx @@ -1,11 +1,7 @@ -import React, { PureComponent } from 'react'; +import React from 'react'; -import { QueryEditorHelpProps } from '@grafana/data'; +import { InfluxCheatSheet } from './InfluxCheatSheet'; -import InfluxCheatSheet from './InfluxCheatSheet'; - -export default class InfluxStartPage extends PureComponent { - render() { - return ; - } +export function InfluxStartPage() { + return ; } diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/code/RawInfluxQLEditor.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/code/RawInfluxQLEditor.tsx index 887bec9ee93..0df57b7b26d 100644 --- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/code/RawInfluxQLEditor.tsx +++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/code/RawInfluxQLEditor.tsx @@ -4,7 +4,7 @@ import { HorizontalGroup, InlineFormLabel, Input, Select, TextArea } from '@graf import { InfluxQuery } from '../../../../../types'; import { DEFAULT_RESULT_FORMAT, RESULT_FORMATS } from '../../../constants'; -import { useShadowedState } from '../../hooks/useShadowedState'; +import { useShadowedState } from '../hooks/useShadowedState'; type Props = { query: InfluxQuery; diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/hooks/useRetentionPolicies.test.ts b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/hooks/useRetentionPolicies.test.ts new file mode 100644 index 00000000000..e4648e2f1e7 --- /dev/null +++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/hooks/useRetentionPolicies.test.ts @@ -0,0 +1,44 @@ +import { renderHook } from '@testing-library/react-hooks'; + +import config from 'app/core/config'; + +import { getMockDS, getMockDSInstanceSettings, mockBackendService } from '../../../../../specs/mocks'; + +import { useRetentionPolicies } from './useRetentionPolicies'; + +jest.mock('@grafana/runtime', () => ({ + ...jest.requireActual('@grafana/runtime'), +})); + +describe('useRetentionPolicies', () => { + it('should return all policies when influxdbBackendMigration feature toggle enabled', async () => { + const instanceSettings = getMockDSInstanceSettings(); + const datasource = getMockDS(instanceSettings); + mockBackendService(response); + + config.featureToggles.influxdbBackendMigration = true; + const { result, waitForNextUpdate } = renderHook(() => useRetentionPolicies(datasource)); + await waitForNextUpdate(); + expect(result.current.retentionPolicies.length).toEqual(4); + expect(result.current.retentionPolicies[0]).toEqual('autogen'); + }); +}); + +const response = { + data: { + results: { + metadataQuery: { + status: 200, + frames: [ + { + schema: { + refId: 'metadataQuery', + fields: [{ name: 'value', type: 'string', typeInfo: { frame: 'string' } }], + }, + data: { values: [['autogen', 'bar', '5m_avg', '1m_avg']] }, + }, + ], + }, + }, + }, +}; diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/hooks/useRetentionPolicies.ts b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/hooks/useRetentionPolicies.ts new file mode 100644 index 00000000000..c25b795294c --- /dev/null +++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/hooks/useRetentionPolicies.ts @@ -0,0 +1,15 @@ +import { useEffect, useState } from 'react'; + +import InfluxDatasource from '../../../../../datasource'; +import { getAllPolicies } from '../../../../../influxql_metadata_query'; + +export const useRetentionPolicies = (datasource: InfluxDatasource) => { + const [retentionPolicies, setRetentionPolicies] = useState([]); + useEffect(() => { + getAllPolicies(datasource).then((data) => { + setRetentionPolicies(data); + }); + }, [datasource]); + + return { retentionPolicies }; +}; diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/hooks/useShadowedState.test.ts b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/hooks/useShadowedState.test.ts similarity index 100% rename from public/app/plugins/datasource/influxdb/components/editor/query/hooks/useShadowedState.test.ts rename to public/app/plugins/datasource/influxdb/components/editor/query/influxql/hooks/useShadowedState.test.ts diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/hooks/useShadowedState.ts b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/hooks/useShadowedState.ts similarity index 100% rename from public/app/plugins/datasource/influxdb/components/editor/query/hooks/useShadowedState.ts rename to public/app/plugins/datasource/influxdb/components/editor/query/influxql/hooks/useShadowedState.ts diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/filterTags.ts b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/filterTags.ts new file mode 100644 index 00000000000..904de835063 --- /dev/null +++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/filterTags.ts @@ -0,0 +1,7 @@ +// it is possible to add fields into the `InfluxQueryTag` structures, and they do work, +// but in some cases, when we do metadata queries, we have to remove them from the queries. +import { InfluxQueryTag } from '../../../../../types'; + +export function filterTags(parts: InfluxQueryTag[], allTagKeys: Set): InfluxQueryTag[] { + return parts.filter((t) => t.key.endsWith('::tag') || allTagKeys.has(t.key + '::tag')); +} diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/getTemplateVariableOptions.ts b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/getTemplateVariableOptions.ts new file mode 100644 index 00000000000..51db862e4d9 --- /dev/null +++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/getTemplateVariableOptions.ts @@ -0,0 +1,12 @@ +import { TypedVariableModel } from '@grafana/data/src'; +import { getTemplateSrv } from '@grafana/runtime/src'; + +export function getTemplateVariableOptions(wrapper: (v: TypedVariableModel) => string) { + return ( + getTemplateSrv() + .getVariables() + // we make them regex-params, i'm not 100% sure why. + // probably because this way multi-value variables work ok too. + .map(wrapper) + ); +} diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/withTemplateVariableOptions.ts b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/withTemplateVariableOptions.ts new file mode 100644 index 00000000000..89bd1372bcd --- /dev/null +++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/withTemplateVariableOptions.ts @@ -0,0 +1,16 @@ +// helper function to make it easy to call this from the widget-render-code +import { TypedVariableModel } from '@grafana/data/src'; + +import { getTemplateVariableOptions } from './getTemplateVariableOptions'; + +export function withTemplateVariableOptions( + optionsPromise: Promise, + wrapper: (v: TypedVariableModel) => string, + filter?: string +): Promise { + let templateVariableOptions = getTemplateVariableOptions(wrapper); + if (filter) { + templateVariableOptions = templateVariableOptions.filter((tvo) => tvo.indexOf(filter) > -1); + } + return optionsPromise.then((options) => [...templateVariableOptions, ...options]); +} diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/wrapper.ts b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/wrapper.ts new file mode 100644 index 00000000000..769a9a435a4 --- /dev/null +++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/utils/wrapper.ts @@ -0,0 +1,9 @@ +import { TypedVariableModel } from '@grafana/data/src'; + +export function wrapRegex(v: TypedVariableModel): string { + return `/^$${v.name}$/`; +} + +export function wrapPure(v: TypedVariableModel): string { + return `$${v.name}`; +} diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/InputSection.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/InputSection.tsx index 6bf9e24e9b5..71b9fad90d3 100644 --- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/InputSection.tsx +++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/InputSection.tsx @@ -3,7 +3,7 @@ import React from 'react'; import { Input } from '@grafana/ui'; -import { useShadowedState } from '../../hooks/useShadowedState'; +import { useShadowedState } from '../hooks/useShadowedState'; import { paddingRightClass } from './styles'; diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/Seg.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/Seg.tsx index 8a2077b0e66..28b679fd5e3 100644 --- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/Seg.tsx +++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/Seg.tsx @@ -6,7 +6,7 @@ import { useAsyncFn } from 'react-use'; import { SelectableValue } from '@grafana/data'; import { AsyncSelect, InlineLabel, Input, Select } from '@grafana/ui'; -import { useShadowedState } from '../../hooks/useShadowedState'; +import { useShadowedState } from '../hooks/useShadowedState'; // this file is a simpler version of `grafana-ui / SegmentAsync.tsx` // with some changes: diff --git a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/VisualInfluxQLEditor.tsx b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/VisualInfluxQLEditor.tsx index 0a00132e9e1..21951edc28a 100644 --- a/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/VisualInfluxQLEditor.tsx +++ b/public/app/plugins/datasource/influxdb/components/editor/query/influxql/visual/VisualInfluxQLEditor.tsx @@ -1,9 +1,7 @@ import { css } from '@emotion/css'; import React, { useId, useMemo } from 'react'; -import { useAsync } from 'react-use'; -import { GrafanaTheme2, TypedVariableModel } from '@grafana/data'; -import { getTemplateSrv } from '@grafana/runtime'; +import { GrafanaTheme2 } from '@grafana/data'; import { InlineLabel, SegmentSection, useStyles2 } from '@grafana/ui'; import InfluxDatasource from '../../../../../datasource'; @@ -25,7 +23,11 @@ import { } from '../../../../../queryUtils'; import { InfluxQuery, InfluxQueryTag } from '../../../../../types'; import { DEFAULT_RESULT_FORMAT } from '../../../constants'; +import { useRetentionPolicies } from '../hooks/useRetentionPolicies'; +import { filterTags } from '../utils/filterTags'; import { getNewGroupByPartOptions, getNewSelectPartOptions, makePartList } from '../utils/partListUtils'; +import { withTemplateVariableOptions } from '../utils/withTemplateVariableOptions'; +import { wrapPure, wrapRegex } from '../utils/wrapper'; import { FormatAsSection } from './FormatAsSection'; import { FromSection } from './FromSection'; @@ -41,43 +43,6 @@ type Props = { datasource: InfluxDatasource; }; -function wrapRegex(v: TypedVariableModel): string { - return `/^$${v.name}$/`; -} - -function wrapPure(v: TypedVariableModel): string { - return `$${v.name}`; -} - -function getTemplateVariableOptions(wrapper: (v: TypedVariableModel) => string) { - return ( - getTemplateSrv() - .getVariables() - // we make them regex-params, i'm not 100% sure why. - // probably because this way multi-value variables work ok too. - .map(wrapper) - ); -} - -// helper function to make it easy to call this from the widget-render-code -function withTemplateVariableOptions( - optionsPromise: Promise, - wrapper: (v: TypedVariableModel) => string, - filter?: string -): Promise { - let templateVariableOptions = getTemplateVariableOptions(wrapper); - if (filter) { - templateVariableOptions = templateVariableOptions.filter((tvo) => tvo.indexOf(filter) > -1); - } - return optionsPromise.then((options) => [...templateVariableOptions, ...options]); -} - -// it is possible to add fields into the `InfluxQueryTag` structures, and they do work, -// but in some cases, when we do metadata queries, we have to remove them from the queries. -function filterTags(parts: InfluxQueryTag[], allTagKeys: Set): InfluxQueryTag[] { - return parts.filter((t) => t.key.endsWith('::tag') || allTagKeys.has(t.key + '::tag')); -} - export const VisualInfluxQLEditor = (props: Props): JSX.Element => { const uniqueId = useId(); const formatAsId = `influxdb-qe-format-as-${uniqueId}`; @@ -87,9 +52,7 @@ export const VisualInfluxQLEditor = (props: Props): JSX.Element => { const query = normalizeQuery(props.query); const { datasource } = props; const { measurement, policy } = query; - - const policyData = useAsync(() => getAllPolicies(datasource), [datasource]); - const retentionPolicies = !!policyData.error ? [] : policyData.value ?? []; + const { retentionPolicies } = useRetentionPolicies(datasource); const allTagKeys = useMemo(async () => { const tagKeys = (await getTagKeysForMeasurementAndTags(datasource, [], measurement, policy)).map( diff --git a/public/app/plugins/datasource/influxdb/module.ts b/public/app/plugins/datasource/influxdb/module.ts index da229451278..c293c017d6f 100644 --- a/public/app/plugins/datasource/influxdb/module.ts +++ b/public/app/plugins/datasource/influxdb/module.ts @@ -2,7 +2,7 @@ import { DataSourcePlugin } from '@grafana/data'; import ConfigEditor from './components/editor/config/ConfigEditor'; import { QueryEditor } from './components/editor/query/QueryEditor'; -import InfluxStartPage from './components/editor/query/influxql/InfluxStartPage'; +import { InfluxStartPage } from './components/editor/query/influxql/InfluxStartPage'; import VariableQueryEditor from './components/editor/variable/VariableQueryEditor'; import InfluxDatasource from './datasource'; diff --git a/public/app/plugins/datasource/influxdb/specs/mocks.ts b/public/app/plugins/datasource/influxdb/specs/mocks.ts index 9402f08aa44..72c01d4453a 100644 --- a/public/app/plugins/datasource/influxdb/specs/mocks.ts +++ b/public/app/plugins/datasource/influxdb/specs/mocks.ts @@ -58,6 +58,6 @@ export function getMockDSInstanceSettings(): DataSourceInstanceSettings) { const queries = request.targets.filter((query) => !query.hide); - const [nonSplittingQueries, normalQueries] = partition(queries, (query) => !querySupporstSplitting(query)); + const [nonSplittingQueries, normalQueries] = partition(queries, (query) => !querySupportsSplitting(query)); const [logQueries, metricQueries] = partition(normalQueries, (query) => isLogsQuery(query.expr)); request.queryGroupId = uuidv4(); diff --git a/public/app/plugins/datasource/loki/queryUtils.test.ts b/public/app/plugins/datasource/loki/queryUtils.test.ts index c1d2559bb42..5a500457397 100644 --- a/public/app/plugins/datasource/loki/queryUtils.test.ts +++ b/public/app/plugins/datasource/loki/queryUtils.test.ts @@ -10,6 +10,7 @@ import { obfuscate, requestSupportsSplitting, isQueryWithDistinct, + isQueryWithRangeVariable, } from './queryUtils'; import { LokiQuery, LokiQueryType } from './types'; @@ -294,6 +295,28 @@ describe('isQueryWithDistinct', () => { }); }); +describe('isQueryWithRangeVariableDuration', () => { + it('identifies queries using $__range variable', () => { + expect(isQueryWithRangeVariable('rate({job="grafana"}[$__range])')).toBe(true); + }); + + it('identifies queries using $__range_s variable', () => { + expect(isQueryWithRangeVariable('rate({job="grafana"}[$__range_s])')).toBe(true); + }); + + it('identifies queries using $__range_ms variable', () => { + expect(isQueryWithRangeVariable('rate({job="grafana"}[$__range_ms])')).toBe(true); + }); + + it('does not return false positives', () => { + expect(isQueryWithRangeVariable('rate({job="grafana"} | logfmt | value="$__range" [5m])')).toBe(false); + expect(isQueryWithRangeVariable('rate({job="grafana"} | logfmt | value="[$__range]" [5m])')).toBe(false); + expect(isQueryWithRangeVariable('rate({job="grafana"} [$range])')).toBe(false); + expect(isQueryWithRangeVariable('rate({job="grafana"} [$_range])')).toBe(false); + expect(isQueryWithRangeVariable('rate({job="grafana"} [$_range_ms])')).toBe(false); + }); +}); + describe('getParserFromQuery', () => { it('returns no parser', () => { expect(getParserFromQuery('{job="grafana"}')).toBeUndefined(); diff --git a/public/app/plugins/datasource/loki/queryUtils.ts b/public/app/plugins/datasource/loki/queryUtils.ts index 3547891145f..a94a91df256 100644 --- a/public/app/plugins/datasource/loki/queryUtils.ts +++ b/public/app/plugins/datasource/loki/queryUtils.ts @@ -18,6 +18,7 @@ import { Matcher, Identifier, Distinct, + Range, } from '@grafana/lezer-logql'; import { DataQuery } from '@grafana/schema'; @@ -303,6 +304,22 @@ export function isQueryWithDistinct(query: string): boolean { return hasDistinct; } +export function isQueryWithRangeVariable(query: string): boolean { + let hasRangeVariableDuration = false; + const tree = parser.parse(query); + tree.iterate({ + enter: ({ type, from, to }): false | void => { + if (type.id === Range) { + if (query.substring(from, to).match(/\[\$__range(_s|_ms)?/)) { + hasRangeVariableDuration = true; + return false; + } + } + }, + }); + return hasRangeVariableDuration; +} + export function getStreamSelectorsFromQuery(query: string): string[] { const labelMatcherPositions = getStreamSelectorPositions(query); diff --git a/public/app/plugins/datasource/tempo/graphTransform.test.ts b/public/app/plugins/datasource/tempo/graphTransform.test.ts index c5e8f9f049b..a81f776de51 100644 --- a/public/app/plugins/datasource/tempo/graphTransform.test.ts +++ b/public/app/plugins/datasource/tempo/graphTransform.test.ts @@ -1,4 +1,4 @@ -import { DataFrameView, dateTime, createDataFrame } from '@grafana/data'; +import { DataFrameView, dateTime, createDataFrame, FieldType } from '@grafana/data'; import { createGraphFrames, mapPromMetricsToServiceMap } from './graphTransform'; import { bigResponse } from './testResponse'; @@ -59,6 +59,26 @@ describe('createGraphFrames', () => { }); }); +it('assigns correct field type even if values are numbers', async () => { + const range = { + from: dateTime('2000-01-01T00:00:00'), + to: dateTime('2000-01-01T00:01:00'), + }; + const { nodes } = mapPromMetricsToServiceMap([{ data: [serverIsANumber, serverIsANumber] }], { + ...range, + raw: range, + }); + + expect(nodes.fields).toMatchObject([ + { name: 'id', values: ['0', '1'], type: FieldType.string }, + { name: 'title', values: ['0', '1'], type: FieldType.string }, + { name: 'mainstat', values: [NaN, NaN], type: FieldType.number }, + { name: 'secondarystat', values: [10, 20], type: FieldType.number }, + { name: 'arc__success', values: [1, 1], type: FieldType.number }, + { name: 'arc__failed', values: [0, 0], type: FieldType.number }, + ]); +}); + describe('mapPromMetricsToServiceMap', () => { it('transforms prom metrics to service graph', async () => { const range = { @@ -191,3 +211,16 @@ const invalidFailedPromMetric = createDataFrame({ { name: 'Value #traces_service_graph_request_failed_total', values: [20, 40] }, ], }); + +const serverIsANumber = createDataFrame({ + refId: 'traces_service_graph_request_total', + fields: [ + { name: 'Time', values: [1628169788000, 1628169788000] }, + { name: 'client', values: ['0', '1'] }, + { name: 'instance', values: ['127.0.0.1:12345', '127.0.0.1:12345'] }, + { name: 'job', values: ['local_scrape', 'local_scrape'] }, + { name: 'server', values: ['0', '1'] }, + { name: 'tempo_config', values: ['default', 'default'] }, + { name: 'Value #traces_service_graph_request_total', values: [10, 20] }, + ], +}); diff --git a/public/app/plugins/datasource/tempo/graphTransform.ts b/public/app/plugins/datasource/tempo/graphTransform.ts index 292d059876f..eb36c6f8737 100644 --- a/public/app/plugins/datasource/tempo/graphTransform.ts +++ b/public/app/plugins/datasource/tempo/graphTransform.ts @@ -7,6 +7,7 @@ import { MutableDataFrame, NodeGraphDataFrameFieldNames as Fields, TimeRange, + FieldType, } from '@grafana/data'; import { getNonOverlappingDuration, getStats, makeFrames, makeSpanMap } from '../../../core/utils/tracing'; @@ -188,28 +189,35 @@ function createServiceMapDataFrames() { } const nodes = createDF('Nodes', [ - { name: Fields.id }, - { name: Fields.title, config: { displayName: 'Service name' } }, - { name: Fields.mainStat, config: { unit: 'ms/r', displayName: 'Average response time' } }, + { name: Fields.id, type: FieldType.string }, + { name: Fields.title, type: FieldType.string, config: { displayName: 'Service name' } }, + { name: Fields.mainStat, type: FieldType.number, config: { unit: 'ms/r', displayName: 'Average response time' } }, { name: Fields.secondaryStat, + type: FieldType.number, config: { unit: 'r/sec', displayName: 'Requests per second' }, }, { name: Fields.arc + 'success', + type: FieldType.number, config: { displayName: 'Success', color: { fixedColor: 'green', mode: FieldColorModeId.Fixed } }, }, { name: Fields.arc + 'failed', + type: FieldType.number, config: { displayName: 'Failed', color: { fixedColor: 'red', mode: FieldColorModeId.Fixed } }, }, ]); const edges = createDF('Edges', [ - { name: Fields.id }, - { name: Fields.source }, - { name: Fields.target }, - { name: Fields.mainStat, config: { unit: 'ms/r', displayName: 'Average response time' } }, - { name: Fields.secondaryStat, config: { unit: 'r/sec', displayName: 'Requests per second' } }, + { name: Fields.id, type: FieldType.string }, + { name: Fields.source, type: FieldType.string }, + { name: Fields.target, type: FieldType.string }, + { name: Fields.mainStat, type: FieldType.number, config: { unit: 'ms/r', displayName: 'Average response time' } }, + { + name: Fields.secondaryStat, + type: FieldType.number, + config: { unit: 'r/sec', displayName: 'Requests per second' }, + }, ]); return [nodes, edges]; diff --git a/public/app/plugins/panel/geomap/utils/tootltip.ts b/public/app/plugins/panel/geomap/utils/tootltip.ts index dbdd792418c..aa5600dbee3 100644 --- a/public/app/plugins/panel/geomap/utils/tootltip.ts +++ b/public/app/plugins/panel/geomap/utils/tootltip.ts @@ -32,9 +32,12 @@ export const pointerMoveListener = (evt: MapBrowserEvent, panel: Geo if (panel.state.measureMenuActive) { return true; } - if (!panel.map || panel.state.ttipOpen) { + + // Eject out of this function if map is not loaded or valid tooltip is already open + if (!panel.map || (panel.state.ttipOpen && panel.state?.ttip?.layers?.length)) { return false; } + const mouse = evt.originalEvent; const pixel = panel.map.getEventPixel(mouse); const hover = toLonLat(panel.map.getCoordinateFromPixel(pixel)); diff --git a/public/app/plugins/panel/heatmap/fields.ts b/public/app/plugins/panel/heatmap/fields.ts index 07bc18baf8b..a11390b7ef4 100644 --- a/public/app/plugins/panel/heatmap/fields.ts +++ b/public/app/plugins/panel/heatmap/fields.ts @@ -108,7 +108,20 @@ export function prepareHeatmapData( })!, ][0]; } else { - rowsHeatmap = frames[0]; + let frame = frames[0]; + let numberFields = frame.fields.filter((field) => field.type === FieldType.number); + let allNamesNumeric = numberFields.every((field) => !Number.isNaN(parseSampleValue(field.name))); + + if (allNamesNumeric) { + numberFields.sort((a, b) => parseSampleValue(a.name) - parseSampleValue(b.name)); + + rowsHeatmap = { + ...frame, + fields: [frame.fields.find((f) => f.type === FieldType.time)!, ...numberFields], + }; + } else { + rowsHeatmap = frame; + } } } diff --git a/public/app/plugins/panel/logs/LogsPanel.tsx b/public/app/plugins/panel/logs/LogsPanel.tsx index 3aff98323e9..85ab80ae0b5 100644 --- a/public/app/plugins/panel/logs/LogsPanel.tsx +++ b/public/app/plugins/panel/logs/LogsPanel.tsx @@ -1,4 +1,4 @@ -import { css } from '@emotion/css'; +import { css, cx } from '@emotion/css'; import React, { useCallback, useMemo, useRef, useLayoutEffect, useState } from 'react'; import { @@ -42,7 +42,7 @@ export const LogsPanel = ({ id, }: LogsPanelProps) => { const isAscending = sortOrder === LogsSortOrder.Ascending; - const style = useStyles2(getStyles(title, isAscending)); + const style = useStyles2(getStyles); const [scrollTop, setScrollTop] = useState(0); const logsContainerRef = useRef(null); @@ -95,7 +95,7 @@ export const LogsPanel = ({ } const renderCommonLabels = () => ( -
+
Common labels:
@@ -127,20 +127,21 @@ export const LogsPanel = ({ ); }; -const getStyles = (title: string, isAscending: boolean) => (theme: GrafanaTheme2) => ({ - container: css` - margin-bottom: ${theme.spacing(1.5)}; - //We can remove this hot-fix when we fix panel menu with no title overflowing top of all panels - margin-top: ${theme.spacing(!title ? 2.5 : 0)}; - `, - labelContainer: css` - margin: ${isAscending ? theme.spacing(0.5, 0, 0.5, 0) : theme.spacing(0, 0, 0.5, 0.5)}; - display: flex; - align-items: center; - `, - label: css` - margin-right: ${theme.spacing(0.5)}; - font-size: ${theme.typography.bodySmall.fontSize}; - font-weight: ${theme.typography.fontWeightMedium}; - `, +const getStyles = (theme: GrafanaTheme2) => ({ + container: css({ + marginBottom: theme.spacing(1.5), + }), + labelContainer: css({ + margin: theme.spacing(0, 0, 0.5, 0.5), + display: 'flex', + alignItems: 'center', + }), + labelContainerAscending: css({ + margin: theme.spacing(0.5, 0, 0.5, 0), + }), + label: css({ + marginRight: theme.spacing(0.5), + fontSize: theme.typography.bodySmall.fontSize, + fontWeight: theme.typography.fontWeightMedium, + }), }); diff --git a/public/locales/en-US/grafana.json b/public/locales/en-US/grafana.json index 920c860799c..f789b63014b 100644 --- a/public/locales/en-US/grafana.json +++ b/public/locales/en-US/grafana.json @@ -408,8 +408,8 @@ "dashboard-actions": { "import": "Import", "new": "New", - "new-dashboard": "New Dashboard", - "new-folder": "New Folder" + "new-dashboard": "New dashboard", + "new-folder": "New folder" }, "folder-view": { "go-to-folder": "Go to folder", diff --git a/public/locales/pseudo-LOCALE/grafana.json b/public/locales/pseudo-LOCALE/grafana.json index bbfc8c0ab83..f0f3b927701 100644 --- a/public/locales/pseudo-LOCALE/grafana.json +++ b/public/locales/pseudo-LOCALE/grafana.json @@ -408,8 +408,8 @@ "dashboard-actions": { "import": "Ĩmpőřŧ", "new": "Ńęŵ", - "new-dashboard": "Ńęŵ Đäşĥþőäřđ", - "new-folder": "Ńęŵ Főľđęř" + "new-dashboard": "Ńęŵ đäşĥþőäřđ", + "new-folder": "Ńęŵ ƒőľđęř" }, "folder-view": { "go-to-folder": "Ğő ŧő ƒőľđęř", diff --git a/yarn.lock b/yarn.lock index ac5bf05dc0b..7058aa764ed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -42,6 +42,15 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/code-frame@npm:7.22.5" + dependencies: + "@babel/highlight": ^7.22.5 + checksum: cfe804f518f53faaf9a1d3e0f9f74127ab9a004912c3a16fda07fb6a633393ecb9918a053cb71804204c1b7ec3d49e1699604715e2cfb0c9f7bc4933d324ebb6 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.17.7, @babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.21.4, @babel/compat-data@npm:^7.22.0, @babel/compat-data@npm:^7.22.3": version: 7.22.3 resolution: "@babel/compat-data@npm:7.22.3" @@ -119,6 +128,18 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/generator@npm:7.22.5" + dependencies: + "@babel/types": ^7.22.5 + "@jridgewell/gen-mapping": ^0.3.2 + "@jridgewell/trace-mapping": ^0.3.17 + jsesc: ^2.5.1 + checksum: efa64da70ca88fe69f05520cf5feed6eba6d30a85d32237671488cc355fdc379fe2c3246382a861d49574c4c2f82a317584f8811e95eb024e365faff3232b49d + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-annotate-as-pure@npm:7.18.6" @@ -128,6 +149,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-annotate-as-pure@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-annotate-as-pure@npm:7.22.5" + dependencies: + "@babel/types": ^7.22.5 + checksum: 53da330f1835c46f26b7bf4da31f7a496dee9fd8696cca12366b94ba19d97421ce519a74a837f687749318f94d1a37f8d1abcbf35e8ed22c32d16373b2f6198d + languageName: node + linkType: hard + "@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.18.6": version: 7.18.9 resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.18.9" @@ -172,6 +202,25 @@ __metadata: languageName: node linkType: hard +"@babel/helper-create-class-features-plugin@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-create-class-features-plugin@npm:7.22.5" + dependencies: + "@babel/helper-annotate-as-pure": ^7.22.5 + "@babel/helper-environment-visitor": ^7.22.5 + "@babel/helper-function-name": ^7.22.5 + "@babel/helper-member-expression-to-functions": ^7.22.5 + "@babel/helper-optimise-call-expression": ^7.22.5 + "@babel/helper-replace-supers": ^7.22.5 + "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 + "@babel/helper-split-export-declaration": ^7.22.5 + semver: ^6.3.0 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: f1e91deae06dbee6dd956c0346bca600adfbc7955427795d9d8825f0439a3c3290c789ba2b4a02a1cdf6c1a1bd163dfa16d3d5e96b02a8efb639d2a774e88ed9 + languageName: node + linkType: hard + "@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.1": version: 7.22.1 resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.1" @@ -208,6 +257,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-environment-visitor@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-environment-visitor@npm:7.22.5" + checksum: 248532077d732a34cd0844eb7b078ff917c3a8ec81a7f133593f71a860a582f05b60f818dc5049c2212e5baa12289c27889a4b81d56ef409b4863db49646c4b1 + languageName: node + linkType: hard + "@babel/helper-explode-assignable-expression@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-explode-assignable-expression@npm:7.18.6" @@ -227,6 +283,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-function-name@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-function-name@npm:7.22.5" + dependencies: + "@babel/template": ^7.22.5 + "@babel/types": ^7.22.5 + checksum: 6b1f6ce1b1f4e513bf2c8385a557ea0dd7fa37971b9002ad19268ca4384bbe90c09681fe4c076013f33deabc63a53b341ed91e792de741b4b35e01c00238177a + languageName: node + linkType: hard + "@babel/helper-hoist-variables@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-hoist-variables@npm:7.18.6" @@ -236,6 +302,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-hoist-variables@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-hoist-variables@npm:7.22.5" + dependencies: + "@babel/types": ^7.22.5 + checksum: 394ca191b4ac908a76e7c50ab52102669efe3a1c277033e49467913c7ed6f7c64d7eacbeabf3bed39ea1f41731e22993f763b1edce0f74ff8563fd1f380d92cc + languageName: node + linkType: hard + "@babel/helper-member-expression-to-functions@npm:^7.0.0, @babel/helper-member-expression-to-functions@npm:^7.22.0": version: 7.22.3 resolution: "@babel/helper-member-expression-to-functions@npm:7.22.3" @@ -245,6 +320,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-member-expression-to-functions@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-member-expression-to-functions@npm:7.22.5" + dependencies: + "@babel/types": ^7.22.5 + checksum: 4bd5791529c280c00743e8bdc669ef0d4cd1620d6e3d35e0d42b862f8262bc2364973e5968007f960780344c539a4b9cf92ab41f5b4f94560a9620f536de2a39 + languageName: node + linkType: hard + "@babel/helper-module-imports@npm:^7.0.0, @babel/helper-module-imports@npm:^7.12.13, @babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-module-imports@npm:7.18.6" @@ -263,6 +347,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-imports@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-module-imports@npm:7.22.5" + dependencies: + "@babel/types": ^7.22.5 + checksum: 9ac2b0404fa38b80bdf2653fbeaf8e8a43ccb41bd505f9741d820ed95d3c4e037c62a1bcdcb6c9527d7798d2e595924c4d025daed73283badc180ada2c9c49ad + languageName: node + linkType: hard + "@babel/helper-module-transforms@npm:^7.18.6, @babel/helper-module-transforms@npm:^7.20.11, @babel/helper-module-transforms@npm:^7.21.2, @babel/helper-module-transforms@npm:^7.21.5, @babel/helper-module-transforms@npm:^7.22.1": version: 7.22.1 resolution: "@babel/helper-module-transforms@npm:7.22.1" @@ -279,6 +372,22 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-transforms@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-module-transforms@npm:7.22.5" + dependencies: + "@babel/helper-environment-visitor": ^7.22.5 + "@babel/helper-module-imports": ^7.22.5 + "@babel/helper-simple-access": ^7.22.5 + "@babel/helper-split-export-declaration": ^7.22.5 + "@babel/helper-validator-identifier": ^7.22.5 + "@babel/template": ^7.22.5 + "@babel/traverse": ^7.22.5 + "@babel/types": ^7.22.5 + checksum: 8985dc0d971fd17c467e8b84fe0f50f3dd8610e33b6c86e5b3ca8e8859f9448bcc5c84e08a2a14285ef388351c0484797081c8f05a03770bf44fc27bf4900e68 + languageName: node + linkType: hard + "@babel/helper-optimise-call-expression@npm:^7.0.0, @babel/helper-optimise-call-expression@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-optimise-call-expression@npm:7.18.6" @@ -288,6 +397,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-optimise-call-expression@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-optimise-call-expression@npm:7.22.5" + dependencies: + "@babel/types": ^7.22.5 + checksum: c70ef6cc6b6ed32eeeec4482127e8be5451d0e5282d5495d5d569d39eb04d7f1d66ec99b327f45d1d5842a9ad8c22d48567e93fc502003a47de78d122e355f7c + languageName: node + linkType: hard + "@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.16.7, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.18.9, @babel/helper-plugin-utils@npm:^7.19.0, @babel/helper-plugin-utils@npm:^7.20.2, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": version: 7.20.2 resolution: "@babel/helper-plugin-utils@npm:7.20.2" @@ -302,6 +420,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-plugin-utils@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-plugin-utils@npm:7.22.5" + checksum: c0fc7227076b6041acd2f0e818145d2e8c41968cc52fb5ca70eed48e21b8fe6dd88a0a91cbddf4951e33647336eb5ae184747ca706817ca3bef5e9e905151ff5 + languageName: node + linkType: hard + "@babel/helper-remap-async-to-generator@npm:^7.18.9": version: 7.18.9 resolution: "@babel/helper-remap-async-to-generator@npm:7.18.9" @@ -330,6 +455,20 @@ __metadata: languageName: node linkType: hard +"@babel/helper-replace-supers@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-replace-supers@npm:7.22.5" + dependencies: + "@babel/helper-environment-visitor": ^7.22.5 + "@babel/helper-member-expression-to-functions": ^7.22.5 + "@babel/helper-optimise-call-expression": ^7.22.5 + "@babel/template": ^7.22.5 + "@babel/traverse": ^7.22.5 + "@babel/types": ^7.22.5 + checksum: af29deff6c6dc3fa2d1a517390716aa3f4d329855e8689f1d5c3cb07c1b898e614a5e175f1826bb58e9ff1480e6552885a71a9a0ba5161787aaafa2c79b216cc + languageName: node + linkType: hard + "@babel/helper-simple-access@npm:^7.20.2": version: 7.20.2 resolution: "@babel/helper-simple-access@npm:7.20.2" @@ -348,6 +487,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-simple-access@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-simple-access@npm:7.22.5" + dependencies: + "@babel/types": ^7.22.5 + checksum: fe9686714caf7d70aedb46c3cce090f8b915b206e09225f1e4dbc416786c2fdbbee40b38b23c268b7ccef749dd2db35f255338fb4f2444429874d900dede5ad2 + languageName: node + linkType: hard + "@babel/helper-skip-transparent-expression-wrappers@npm:^7.20.0": version: 7.20.0 resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.20.0" @@ -357,6 +505,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.22.5" + dependencies: + "@babel/types": ^7.22.5 + checksum: 1012ef2295eb12dc073f2b9edf3425661e9b8432a3387e62a8bc27c42963f1f216ab3124228015c748770b2257b4f1fda882ca8fa34c0bf485e929ae5bc45244 + languageName: node + linkType: hard + "@babel/helper-split-export-declaration@npm:^7.18.6": version: 7.18.6 resolution: "@babel/helper-split-export-declaration@npm:7.18.6" @@ -366,6 +523,15 @@ __metadata: languageName: node linkType: hard +"@babel/helper-split-export-declaration@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-split-export-declaration@npm:7.22.5" + dependencies: + "@babel/types": ^7.22.5 + checksum: d10e05a02f49c1f7c578cea63d2ac55356501bbf58856d97ac9bfde4957faee21ae97c7f566aa309e38a256eef58b58e5b670a7f568b362c00e93dfffe072650 + languageName: node + linkType: hard + "@babel/helper-string-parser@npm:^7.19.4": version: 7.19.4 resolution: "@babel/helper-string-parser@npm:7.19.4" @@ -380,6 +546,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-string-parser@npm:7.22.5" + checksum: 836851ca5ec813077bbb303acc992d75a360267aa3b5de7134d220411c852a6f17de7c0d0b8c8dcc0f567f67874c00f4528672b2a4f1bc978a3ada64c8c78467 + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.18.6, @babel/helper-validator-identifier@npm:^7.19.1": version: 7.19.1 resolution: "@babel/helper-validator-identifier@npm:7.19.1" @@ -387,6 +560,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-validator-identifier@npm:7.22.5" + checksum: 7f0f30113474a28298c12161763b49de5018732290ca4de13cdaefd4fd0d635a6fe3f6686c37a02905fb1e64f21a5ee2b55140cf7b070e729f1bd66866506aea + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.21.0": version: 7.21.0 resolution: "@babel/helper-validator-option@npm:7.21.0" @@ -394,6 +574,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-option@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/helper-validator-option@npm:7.22.5" + checksum: bbeca8a85ee86990215c0424997438b388b8d642d69b9f86c375a174d3cdeb270efafd1ff128bc7a1d370923d13b6e45829ba8581c027620e83e3a80c5c414b3 + languageName: node + linkType: hard + "@babel/helper-wrap-function@npm:^7.18.9": version: 7.20.5 resolution: "@babel/helper-wrap-function@npm:7.20.5" @@ -428,6 +615,17 @@ __metadata: languageName: node linkType: hard +"@babel/highlight@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/highlight@npm:7.22.5" + dependencies: + "@babel/helper-validator-identifier": ^7.22.5 + chalk: ^2.0.0 + js-tokens: ^4.0.0 + checksum: f61ae6de6ee0ea8d9b5bcf2a532faec5ab0a1dc0f7c640e5047fc61630a0edb88b18d8c92eb06566d30da7a27db841aca11820ecd3ebe9ce514c9350fbed39c4 + languageName: node + linkType: hard + "@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.21.9, @babel/parser@npm:^7.22.0, @babel/parser@npm:^7.22.4": version: 7.22.4 resolution: "@babel/parser@npm:7.22.4" @@ -446,6 +644,15 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/parser@npm:7.22.5" + bin: + parser: ./bin/babel-parser.js + checksum: 470ebba516417ce8683b36e2eddd56dcfecb32c54b9bb507e28eb76b30d1c3e618fd0cfeee1f64d8357c2254514e1a19e32885cfb4e73149f4ae875436a6d59c + languageName: node + linkType: hard + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.18.6" @@ -802,6 +1009,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-jsx@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-syntax-jsx@npm:7.22.5" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 8829d30c2617ab31393d99cec2978e41f014f4ac6f01a1cecf4c4dd8320c3ec12fdc3ce121126b2d8d32f6887e99ca1a0bad53dedb1e6ad165640b92b24980ce + languageName: node + linkType: hard + "@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4, @babel/plugin-syntax-logical-assignment-operators@npm:^7.8.3": version: 7.10.4 resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" @@ -901,6 +1119,17 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-syntax-typescript@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-syntax-typescript@npm:7.22.5" + dependencies: + "@babel/helper-plugin-utils": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 8ab7718fbb026d64da93681a57797d60326097fd7cb930380c8bffd9eb101689e90142c760a14b51e8e69c88a73ba3da956cb4520a3b0c65743aee5c71ef360a + languageName: node + linkType: hard + "@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": version: 7.18.6 resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" @@ -1253,6 +1482,19 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-modules-commonjs@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.22.5" + dependencies: + "@babel/helper-module-transforms": ^7.22.5 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-simple-access": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 2067aca8f6454d54ffcce69b02c457cfa61428e11372f6a1d99ff4fcfbb55c396ed2ca6ca886bf06c852e38c1a205b8095921b2364fd0243f3e66bc1dda61caa + languageName: node + linkType: hard + "@babel/plugin-transform-modules-systemjs@npm:^7.20.11, @babel/plugin-transform-modules-systemjs@npm:^7.22.3": version: 7.22.3 resolution: "@babel/plugin-transform-modules-systemjs@npm:7.22.3" @@ -1607,6 +1849,20 @@ __metadata: languageName: node linkType: hard +"@babel/plugin-transform-typescript@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/plugin-transform-typescript@npm:7.22.5" + dependencies: + "@babel/helper-annotate-as-pure": ^7.22.5 + "@babel/helper-create-class-features-plugin": ^7.22.5 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/plugin-syntax-typescript": ^7.22.5 + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: d12f1ca1ef1f2a54432eb044d2999705d1205ebe211c2a7f05b12e8eb2d2a461fd7657b5486b2f2f1efe7c0c0dc8e80725b767073d40fe4ae059a7af057b05e4 + languageName: node + linkType: hard + "@babel/plugin-transform-unicode-escapes@npm:^7.18.10": version: 7.18.10 resolution: "@babel/plugin-transform-unicode-escapes@npm:7.18.10" @@ -1894,18 +2150,18 @@ __metadata: languageName: node linkType: hard -"@babel/preset-typescript@npm:7.21.5": - version: 7.21.5 - resolution: "@babel/preset-typescript@npm:7.21.5" +"@babel/preset-typescript@npm:7.22.5": + version: 7.22.5 + resolution: "@babel/preset-typescript@npm:7.22.5" dependencies: - "@babel/helper-plugin-utils": ^7.21.5 - "@babel/helper-validator-option": ^7.21.0 - "@babel/plugin-syntax-jsx": ^7.21.4 - "@babel/plugin-transform-modules-commonjs": ^7.21.5 - "@babel/plugin-transform-typescript": ^7.21.3 + "@babel/helper-plugin-utils": ^7.22.5 + "@babel/helper-validator-option": ^7.22.5 + "@babel/plugin-syntax-jsx": ^7.22.5 + "@babel/plugin-transform-modules-commonjs": ^7.22.5 + "@babel/plugin-transform-typescript": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e7b35c435139eec1d6bd9f57e8f3eb79bfc2da2c57a34ad9e9ea848ba4ecd72791cf4102df456604ab07c7f4518525b0764754b6dd5898036608b351e0792448 + checksum: 7be1670cb4404797d3a473bd72d66eb2b3e0f2f8a672a5e40bdb0812cc66085ec84bcd7b896709764cabf042fdc6b7f2d4755ac7cce10515eb596ff61dab5154 languageName: node linkType: hard @@ -1976,6 +2232,17 @@ __metadata: languageName: node linkType: hard +"@babel/template@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/template@npm:7.22.5" + dependencies: + "@babel/code-frame": ^7.22.5 + "@babel/parser": ^7.22.5 + "@babel/types": ^7.22.5 + checksum: c5746410164039aca61829cdb42e9a55410f43cace6f51ca443313f3d0bdfa9a5a330d0b0df73dc17ef885c72104234ae05efede37c1cc8a72dc9f93425977a3 + languageName: node + linkType: hard + "@babel/traverse@npm:^7.1.6, @babel/traverse@npm:^7.21.4, @babel/traverse@npm:~7.21.2": version: 7.21.4 resolution: "@babel/traverse@npm:7.21.4" @@ -2012,6 +2279,24 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/traverse@npm:7.22.5" + dependencies: + "@babel/code-frame": ^7.22.5 + "@babel/generator": ^7.22.5 + "@babel/helper-environment-visitor": ^7.22.5 + "@babel/helper-function-name": ^7.22.5 + "@babel/helper-hoist-variables": ^7.22.5 + "@babel/helper-split-export-declaration": ^7.22.5 + "@babel/parser": ^7.22.5 + "@babel/types": ^7.22.5 + debug: ^4.1.0 + globals: ^11.1.0 + checksum: 560931422dc1761f2df723778dcb4e51ce0d02e560cf2caa49822921578f49189a5a7d053b78a32dca33e59be886a6b2200a6e24d4ae9b5086ca0ba803815694 + languageName: node + linkType: hard + "@babel/types@npm:^7.0.0, @babel/types@npm:^7.18.6, @babel/types@npm:^7.18.9, @babel/types@npm:^7.2.0, @babel/types@npm:^7.20.0, @babel/types@npm:^7.20.2, @babel/types@npm:^7.20.5, @babel/types@npm:^7.20.7, @babel/types@npm:^7.21.0, @babel/types@npm:^7.21.5, @babel/types@npm:^7.22.0, @babel/types@npm:^7.22.3, @babel/types@npm:^7.22.4, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": version: 7.22.4 resolution: "@babel/types@npm:7.22.4" @@ -2034,6 +2319,17 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.22.5": + version: 7.22.5 + resolution: "@babel/types@npm:7.22.5" + dependencies: + "@babel/helper-string-parser": ^7.22.5 + "@babel/helper-validator-identifier": ^7.22.5 + to-fast-properties: ^2.0.0 + checksum: c13a9c1dc7d2d1a241a2f8363540cb9af1d66e978e8984b400a20c4f38ba38ca29f06e26a0f2d49a70bad9e57615dac09c35accfddf1bb90d23cd3e0a0bab892 + languageName: node + linkType: hard + "@base2/pretty-print-object@npm:1.0.1": version: 1.0.1 resolution: "@base2/pretty-print-object@npm:1.0.1" @@ -3463,25 +3759,26 @@ __metadata: languageName: node linkType: hard -"@grafana/faro-core@npm:1.0.2, @grafana/faro-core@npm:^1.0.2": - version: 1.0.2 - resolution: "@grafana/faro-core@npm:1.0.2" +"@grafana/faro-core@npm:1.1.0, @grafana/faro-core@npm:^1.1.0": + version: 1.1.0 + resolution: "@grafana/faro-core@npm:1.1.0" dependencies: - "@opentelemetry/api": ^1.4.0 + "@opentelemetry/api": ^1.4.1 "@opentelemetry/api-metrics": ^0.33.0 - "@opentelemetry/otlp-transformer": ^0.35.0 - checksum: 09c3c6687b955aacd17de73dca319dbb2abda8dd26f5c038618266ffefbc1f915cfe12167cd4b49db5c639ab70b7141bb9794c3cbdc682bb63174f95df9d9dfd + "@opentelemetry/otlp-transformer": ^0.37.0 + murmurhash-js: ^1.0.0 + checksum: 1e8504f3cab4ead385347002e265e6e7b32900704fa10dfe19ee72fe5bc50c9acb2fc6fc46f8e7d8efdc796fac9d06ba6d1b5a6512b47f09928c52df2a5fc3dd languageName: node linkType: hard -"@grafana/faro-web-sdk@npm:1.0.2": - version: 1.0.2 - resolution: "@grafana/faro-web-sdk@npm:1.0.2" +"@grafana/faro-web-sdk@npm:1.1.0": + version: 1.1.0 + resolution: "@grafana/faro-web-sdk@npm:1.1.0" dependencies: - "@grafana/faro-core": ^1.0.2 + "@grafana/faro-core": ^1.1.0 ua-parser-js: ^1.0.32 web-vitals: ^3.1.1 - checksum: ca04add8469778d73e1bc15f057d063d93a88b9d76325c79060848ad3211fa929e30b6a85365981f7bcef023704f9f92f67678311bfed13dd521399c0f00e92f + checksum: e4fad2ff3c7d2d3cbc9e485e05a078a4ec0bc216907ed05361f91071611b7ce4256ba9cc8bbf6b23068efd02d32dfd42cfcd5d8a2b868c8ba006db27cd71c2a7 languageName: node linkType: hard @@ -3521,7 +3818,7 @@ __metadata: dependencies: "@grafana/data": 10.1.0-pre "@grafana/e2e-selectors": 10.1.0-pre - "@grafana/faro-web-sdk": 1.0.2 + "@grafana/faro-web-sdk": 1.1.0 "@grafana/tsconfig": ^1.2.0-rc1 "@grafana/ui": 10.1.0-pre "@rollup/plugin-commonjs": 23.0.2 @@ -3624,7 +3921,7 @@ __metadata: "@emotion/react": 11.10.6 "@grafana/data": 10.1.0-pre "@grafana/e2e-selectors": 10.1.0-pre - "@grafana/faro-web-sdk": 1.0.2 + "@grafana/faro-web-sdk": 1.1.0 "@grafana/schema": 10.1.0-pre "@grafana/tsconfig": ^1.2.0-rc1 "@leeoniya/ufuzzy": 1.0.6 @@ -5816,7 +6113,7 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/api@npm:1.4.0, @opentelemetry/api@npm:^1.4.0": +"@opentelemetry/api@npm:1.4.0": version: 1.4.0 resolution: "@opentelemetry/api@npm:1.4.0" checksum: 8dc522194e20d2e8aa6cac155dbce19d3fc9cfac59e953ece1064158c6348ccd9560ee99d2f2381e82c2f8c9a129b57fa7b640027383315504de1fa712b6d7f1 @@ -5830,6 +6127,13 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/api@npm:^1.4.1": + version: 1.4.1 + resolution: "@opentelemetry/api@npm:1.4.1" + checksum: e783c40d1a518abf9c4c5d65223237c1392cd9a6c53ac6e2c3ef0c05ff7266e3dfc4fd9874316dae0dcb7a97950878deb513bcbadfaad653d48f0215f2a0911b + languageName: node + linkType: hard + "@opentelemetry/core@npm:0.25.0": version: 0.25.0 resolution: "@opentelemetry/core@npm:0.25.0" @@ -5842,14 +6146,14 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/core@npm:1.9.1": - version: 1.9.1 - resolution: "@opentelemetry/core@npm:1.9.1" +"@opentelemetry/core@npm:1.11.0": + version: 1.11.0 + resolution: "@opentelemetry/core@npm:1.11.0" dependencies: - "@opentelemetry/semantic-conventions": 1.9.1 + "@opentelemetry/semantic-conventions": 1.11.0 peerDependencies: "@opentelemetry/api": ">=1.0.0 <1.5.0" - checksum: 5581a809e2caff142136734634f45255ce9f1ed701cf38629b9e17d91a8d15449b467fb3a7f3d0d8b076f653090e50cc31d3b1db4cfefeda9b6b901c60581024 + checksum: 866e4a85dde90d228e1822fc7238953d7353ddc1528c2936253a1c8dd47b260fe45551d9172cf97b6e34d851ee5204b391ebc66ab244e1994ac6d816e790c78e languageName: node linkType: hard @@ -5868,17 +6172,17 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/otlp-transformer@npm:^0.35.0": - version: 0.35.1 - resolution: "@opentelemetry/otlp-transformer@npm:0.35.1" +"@opentelemetry/otlp-transformer@npm:^0.37.0": + version: 0.37.0 + resolution: "@opentelemetry/otlp-transformer@npm:0.37.0" dependencies: - "@opentelemetry/core": 1.9.1 - "@opentelemetry/resources": 1.9.1 - "@opentelemetry/sdk-metrics": 1.9.1 - "@opentelemetry/sdk-trace-base": 1.9.1 + "@opentelemetry/core": 1.11.0 + "@opentelemetry/resources": 1.11.0 + "@opentelemetry/sdk-metrics": 1.11.0 + "@opentelemetry/sdk-trace-base": 1.11.0 peerDependencies: "@opentelemetry/api": ">=1.3.0 <1.5.0" - checksum: e0a68b2be28d5535aaaa58be31a5e85b268b42025c8b3a34498f00b019fbd172530b1b484c4257fd330c5890007130eedec288b8fe8f2b85176198f9ffc2507e + checksum: 353a0f29d27a6b969d1458de7d829da06866bce58e9e24a9ae98d463056fecc1120a88660a9e1a72643e4a3e9de0fd731e54ded02c7abb99118cf7992229234d languageName: node linkType: hard @@ -5894,15 +6198,15 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/resources@npm:1.9.1": - version: 1.9.1 - resolution: "@opentelemetry/resources@npm:1.9.1" +"@opentelemetry/resources@npm:1.11.0": + version: 1.11.0 + resolution: "@opentelemetry/resources@npm:1.11.0" dependencies: - "@opentelemetry/core": 1.9.1 - "@opentelemetry/semantic-conventions": 1.9.1 + "@opentelemetry/core": 1.11.0 + "@opentelemetry/semantic-conventions": 1.11.0 peerDependencies: "@opentelemetry/api": ">=1.0.0 <1.5.0" - checksum: cf15e5faa698df3f0abcee35f7b4271c019b6cb81cb521b07793fe622c716d9c6873216219879afd57a28202f748a839ecaf28e04268e490004f14bbb850c96e + checksum: 3d4577d06f166d7efcf33ecc909115502d30cdf6bc53536c1672a8e76071447f3a01b2546159c7f44440c83549807e1d546ff1a0d4c169c8368013ed1d7d75f5 languageName: node linkType: hard @@ -5920,16 +6224,16 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/sdk-metrics@npm:1.9.1": - version: 1.9.1 - resolution: "@opentelemetry/sdk-metrics@npm:1.9.1" +"@opentelemetry/sdk-metrics@npm:1.11.0": + version: 1.11.0 + resolution: "@opentelemetry/sdk-metrics@npm:1.11.0" dependencies: - "@opentelemetry/core": 1.9.1 - "@opentelemetry/resources": 1.9.1 + "@opentelemetry/core": 1.11.0 + "@opentelemetry/resources": 1.11.0 lodash.merge: 4.6.2 peerDependencies: "@opentelemetry/api": ">=1.3.0 <1.5.0" - checksum: 08e8215841da74ffc36f2e5c414ab4230e5a2676a4329f9c98fbde4b162b6166612ab48bcc701cebf8ded3e2b5a68981f72987751df4393e0839089fa0c5ee13 + checksum: 158ebcb79fc08f7e1530dcd2f0bfb9afbe2668396721df98fc7a7f5a75ceed4bceb7102aae0efcc24cd9bd5c92b51aa55a86f2cc904b538a45641ca0315b2e06 languageName: node linkType: hard @@ -5947,16 +6251,16 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/sdk-trace-base@npm:1.9.1": - version: 1.9.1 - resolution: "@opentelemetry/sdk-trace-base@npm:1.9.1" +"@opentelemetry/sdk-trace-base@npm:1.11.0": + version: 1.11.0 + resolution: "@opentelemetry/sdk-trace-base@npm:1.11.0" dependencies: - "@opentelemetry/core": 1.9.1 - "@opentelemetry/resources": 1.9.1 - "@opentelemetry/semantic-conventions": 1.9.1 + "@opentelemetry/core": 1.11.0 + "@opentelemetry/resources": 1.11.0 + "@opentelemetry/semantic-conventions": 1.11.0 peerDependencies: "@opentelemetry/api": ">=1.0.0 <1.5.0" - checksum: f9448132686b1a8c1fde7539845a2b31bcb315c3bbabccb20a18142db80eeed433b3713e2761151348c1b626ad00183f4b7e9b9868d1a8ab8c541dce1d082f38 + checksum: 64f00f8ede6f9fe5749021b820c412a78d984883dbe7db0ab2ed24fb3e2db0bcb9b928361cccb839b8a89007391fac0ad18386140394cc165716299b9b3b37e9 languageName: node linkType: hard @@ -5967,6 +6271,13 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/semantic-conventions@npm:1.11.0": + version: 1.11.0 + resolution: "@opentelemetry/semantic-conventions@npm:1.11.0" + checksum: 310f2aad2a958b02ea2e661251e202989c662306e85a1c27bc99dec9c4d42fce5fc9b34bf21169276798acdae9d52af3b7ec19d8e5e9bb420fc145d0b901823c + languageName: node + linkType: hard + "@opentelemetry/semantic-conventions@npm:1.14.0": version: 1.14.0 resolution: "@opentelemetry/semantic-conventions@npm:1.14.0" @@ -5974,13 +6285,6 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/semantic-conventions@npm:1.9.1": - version: 1.9.1 - resolution: "@opentelemetry/semantic-conventions@npm:1.9.1" - checksum: 6217ba14b8f0068a3400f054c1f9d918b2e22d1cf8d31112baa712b8d196e207aed7421c6df37ed1403f7109f51c7834c230cbe180313eee07db6f7e0a7797bc - languageName: node - linkType: hard - "@parcel/watcher@npm:2.0.4": version: 2.0.4 resolution: "@parcel/watcher@npm:2.0.4" @@ -18261,7 +18565,7 @@ __metadata: "@babel/plugin-transform-typescript": 7.22.3 "@babel/preset-env": 7.22.4 "@babel/preset-react": 7.22.3 - "@babel/preset-typescript": 7.21.5 + "@babel/preset-typescript": 7.22.5 "@babel/runtime": 7.22.3 "@betterer/betterer": 5.4.0 "@betterer/cli": 5.4.0 @@ -18279,8 +18583,8 @@ __metadata: "@grafana/eslint-config": 5.1.0 "@grafana/eslint-plugin": "link:./packages/grafana-eslint-rules" "@grafana/experimental": 1.4.2 - "@grafana/faro-core": 1.0.2 - "@grafana/faro-web-sdk": 1.0.2 + "@grafana/faro-core": 1.1.0 + "@grafana/faro-web-sdk": 1.1.0 "@grafana/google-sdk": 0.1.1 "@grafana/lezer-logql": 0.1.5 "@grafana/monaco-logql": ^0.0.7 @@ -23174,6 +23478,13 @@ __metadata: languageName: node linkType: hard +"murmurhash-js@npm:^1.0.0": + version: 1.0.0 + resolution: "murmurhash-js@npm:1.0.0" + checksum: 083cea92a11bc9eb25be1446fc92eded3f49731bc1ad34fa8023afd68c234d1dd59458d70eb20e667b1383bedeeb8dfb1a16c89913b6ffe3584fd22fb598739d + languageName: node + linkType: hard + "mutationobserver-shim@npm:0.3.7": version: 0.3.7 resolution: "mutationobserver-shim@npm:0.3.7"