@grafana/scenes 0.0.5 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,9 +1,10 @@
1
1
  import { cloneDeep } from 'lodash';
2
2
  import { mergeMap, of, map } from 'rxjs';
3
3
  import { CoreApp, rangeUtil, transformDataFrame } from '@grafana/data';
4
- import { getRunRequest, getDataSourceSrv } from '@grafana/runtime';
4
+ import { getRunRequest } from '@grafana/runtime';
5
5
  import { SceneObjectBase } from '../core/SceneObjectBase.js';
6
6
  import { sceneGraph } from '../core/sceneGraph.js';
7
+ import { getDataSource } from '../utils/getDataSource.js';
7
8
  import { VariableDependencyConfig } from '../variables/VariableDependencyConfig.js';
8
9
 
9
10
  var __defProp = Object.defineProperty;
@@ -33,7 +34,7 @@ class SceneQueryRunner extends SceneObjectBase {
33
34
  constructor() {
34
35
  super(...arguments);
35
36
  this._variableDependency = new VariableDependencyConfig(this, {
36
- statePaths: ["queries"],
37
+ statePaths: ["queries", "datasource"],
37
38
  onReferencedVariableValueChanged: () => this.runQueries()
38
39
  });
39
40
  this.onDataReceived = (data) => {
@@ -94,6 +95,9 @@ class SceneQueryRunner extends SceneObjectBase {
94
95
  }
95
96
  async runWithTimeRange(timeRange) {
96
97
  const { datasource, minInterval, queries } = this.state;
98
+ const sceneObjectScopedVar = {
99
+ __sceneObject: { text: "__sceneObject", value: this }
100
+ };
97
101
  const request = {
98
102
  app: CoreApp.Dashboard,
99
103
  requestId: getNextRequestId(),
@@ -105,7 +109,7 @@ class SceneQueryRunner extends SceneObjectBase {
105
109
  intervalMs: 1e3,
106
110
  targets: cloneDeep(queries),
107
111
  maxDataPoints: this.getMaxDataPoints(),
108
- scopedVars: {},
112
+ scopedVars: sceneObjectScopedVar,
109
113
  startTime: Date.now()
110
114
  };
111
115
  try {
@@ -133,12 +137,6 @@ class SceneQueryRunner extends SceneObjectBase {
133
137
  }
134
138
  }
135
139
  }
136
- async function getDataSource(datasource, scopedVars) {
137
- if (datasource && datasource.query) {
138
- return datasource;
139
- }
140
- return await getDataSourceSrv().get(datasource, scopedVars);
141
- }
142
140
  const getTransformationsStream = (sceneObject, transformations) => (inputStream) => {
143
141
  return inputStream.pipe(
144
142
  mergeMap((data) => {
@@ -1 +1 @@
1
- {"version":3,"file":"SceneQueryRunner.js","sources":["../../../src/querying/SceneQueryRunner.ts"],"sourcesContent":["import { cloneDeep } from 'lodash';\nimport { mergeMap, MonoTypeOperatorFunction, Unsubscribable, map, of } from 'rxjs';\n\nimport {\n CoreApp,\n DataQuery,\n DataQueryRequest,\n DataSourceApi,\n DataSourceRef,\n DataTransformerConfig,\n PanelData,\n rangeUtil,\n ScopedVars,\n TimeRange,\n transformDataFrame,\n} from '@grafana/data';\nimport { getDataSourceSrv, getRunRequest } from '@grafana/runtime';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneObject, SceneObjectStatePlain } from '../core/types';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\n\nlet counter = 100;\n\nexport function getNextRequestId() {\n return 'QS' + counter++;\n}\n\nexport interface QueryRunnerState extends SceneObjectStatePlain {\n data?: PanelData;\n queries: DataQueryExtended[];\n transformations?: DataTransformerConfig[];\n datasource?: DataSourceRef;\n minInterval?: string;\n maxDataPoints?: number;\n // Non persisted state\n maxDataPointsFromWidth?: boolean;\n}\n\nexport interface DataQueryExtended extends DataQuery {\n [key: string]: any;\n}\n\nexport class SceneQueryRunner extends SceneObjectBase<QueryRunnerState> {\n private _querySub?: Unsubscribable;\n private _containerWidth?: number;\n\n protected _variableDependency = new VariableDependencyConfig(this, {\n statePaths: ['queries'],\n onReferencedVariableValueChanged: () => this.runQueries(),\n });\n\n public activate() {\n super.activate();\n\n const timeRange = sceneGraph.getTimeRange(this);\n\n this._subs.add(\n timeRange.subscribeToState({\n next: (timeRange) => {\n this.runWithTimeRange(timeRange.value);\n },\n })\n );\n\n if (this.shouldRunQueriesOnActivate()) {\n this.runQueries();\n }\n }\n\n private shouldRunQueriesOnActivate() {\n // If we already have data, no need\n // TODO validate that time range is similar and if not we should run queries again\n if (this.state.data) {\n return false;\n }\n\n // If no maxDataPoints specified we need might to wait for container width to be set from the outside\n if (!this.state.maxDataPoints && this.state.maxDataPointsFromWidth && !this._containerWidth) {\n return false;\n }\n\n return true;\n }\n\n public deactivate(): void {\n super.deactivate();\n\n if (this._querySub) {\n this._querySub.unsubscribe();\n this._querySub = undefined;\n }\n }\n\n public setContainerWidth(width: number) {\n // If we don't have a width we should run queries\n if (!this._containerWidth && width > 0) {\n this._containerWidth = width;\n\n // If we don't have maxDataPoints specifically set and maxDataPointsFromWidth is true\n if (this.state.maxDataPointsFromWidth && !this.state.maxDataPoints) {\n // As this is called from render path we need to wait for next tick before running queries\n setTimeout(() => {\n if (this.isActive && !this._querySub) {\n this.runQueries();\n }\n }, 0);\n }\n } else {\n // let's just remember the width until next query issue\n this._containerWidth = width;\n }\n }\n\n public runQueries() {\n const timeRange = sceneGraph.getTimeRange(this);\n this.runWithTimeRange(timeRange.state.value);\n }\n\n private getMaxDataPoints() {\n return this.state.maxDataPoints ?? this._containerWidth ?? 500;\n }\n\n private async runWithTimeRange(timeRange: TimeRange) {\n const { datasource, minInterval, queries } = this.state;\n\n const request: DataQueryRequest = {\n app: CoreApp.Dashboard,\n requestId: getNextRequestId(),\n timezone: 'browser',\n panelId: 1,\n dashboardId: 1,\n range: timeRange,\n interval: '1s',\n intervalMs: 1000,\n targets: cloneDeep(queries),\n maxDataPoints: this.getMaxDataPoints(),\n scopedVars: {},\n startTime: Date.now(),\n };\n\n try {\n const ds = await getDataSource(datasource, request.scopedVars);\n\n // Attach the data source name to each query\n request.targets = request.targets.map((query) => {\n if (!query.datasource) {\n query.datasource = ds.getRef();\n }\n return query;\n });\n\n // TODO interpolate minInterval\n const lowerIntervalLimit = minInterval ? minInterval : ds.interval;\n const norm = rangeUtil.calculateInterval(timeRange, request.maxDataPoints!, lowerIntervalLimit);\n\n // make shallow copy of scoped vars,\n // and add built in variables interval and interval_ms\n request.scopedVars = Object.assign({}, request.scopedVars, {\n __interval: { text: norm.interval, value: norm.interval },\n __interval_ms: { text: norm.intervalMs.toString(), value: norm.intervalMs },\n });\n\n request.interval = norm.interval;\n request.intervalMs = norm.intervalMs;\n\n const runRequest = getRunRequest();\n this._querySub = runRequest(ds, request)\n .pipe(getTransformationsStream(this, this.state.transformations))\n .subscribe({\n next: this.onDataReceived,\n });\n } catch (err) {\n console.error('PanelQueryRunner Error', err);\n }\n }\n\n private onDataReceived = (data: PanelData) => {\n this.setState({ data });\n };\n}\n\nasync function getDataSource(datasource: DataSourceRef | undefined, scopedVars: ScopedVars): Promise<DataSourceApi> {\n if (datasource && (datasource as any).query) {\n return datasource as DataSourceApi;\n }\n return await getDataSourceSrv().get(datasource as string, scopedVars);\n}\n\nexport const getTransformationsStream: (\n sceneObject: SceneObject,\n transformations?: DataTransformerConfig[]\n) => MonoTypeOperatorFunction<PanelData> = (sceneObject, transformations) => (inputStream) => {\n return inputStream.pipe(\n mergeMap((data) => {\n if (!transformations || transformations.length === 0) {\n return of(data);\n }\n\n const ctx = {\n interpolate: (value: string) => {\n return sceneGraph.interpolate(sceneObject, value, data?.request?.scopedVars);\n },\n };\n\n return transformDataFrame(transformations, data.series, ctx).pipe(map((series) => ({ ...data, series })));\n })\n );\n};\n"],"names":["timeRange"],"mappings":"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"}
1
+ {"version":3,"file":"SceneQueryRunner.js","sources":["../../../src/querying/SceneQueryRunner.ts"],"sourcesContent":["import { cloneDeep } from 'lodash';\nimport { mergeMap, MonoTypeOperatorFunction, Unsubscribable, map, of } from 'rxjs';\n\nimport {\n CoreApp,\n DataQuery,\n DataQueryRequest,\n DataSourceRef,\n DataTransformerConfig,\n PanelData,\n rangeUtil,\n ScopedVar,\n TimeRange,\n transformDataFrame,\n} from '@grafana/data';\nimport { getRunRequest } from '@grafana/runtime';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneObject, SceneObjectStatePlain } from '../core/types';\nimport { getDataSource } from '../utils/getDataSource';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\n\nlet counter = 100;\n\nexport function getNextRequestId() {\n return 'QS' + counter++;\n}\n\nexport interface QueryRunnerState extends SceneObjectStatePlain {\n data?: PanelData;\n queries: DataQueryExtended[];\n transformations?: DataTransformerConfig[];\n datasource?: DataSourceRef;\n minInterval?: string;\n maxDataPoints?: number;\n // Non persisted state\n maxDataPointsFromWidth?: boolean;\n}\n\nexport interface DataQueryExtended extends DataQuery {\n [key: string]: any;\n}\n\nexport class SceneQueryRunner extends SceneObjectBase<QueryRunnerState> {\n private _querySub?: Unsubscribable;\n private _containerWidth?: number;\n\n protected _variableDependency = new VariableDependencyConfig(this, {\n statePaths: ['queries', 'datasource'],\n onReferencedVariableValueChanged: () => this.runQueries(),\n });\n\n public activate() {\n super.activate();\n const timeRange = sceneGraph.getTimeRange(this);\n\n this._subs.add(\n timeRange.subscribeToState({\n next: (timeRange) => {\n this.runWithTimeRange(timeRange.value);\n },\n })\n );\n\n if (this.shouldRunQueriesOnActivate()) {\n this.runQueries();\n }\n }\n\n private shouldRunQueriesOnActivate() {\n // If we already have data, no need\n // TODO validate that time range is similar and if not we should run queries again\n if (this.state.data) {\n return false;\n }\n\n // If no maxDataPoints specified we need might to wait for container width to be set from the outside\n if (!this.state.maxDataPoints && this.state.maxDataPointsFromWidth && !this._containerWidth) {\n return false;\n }\n\n return true;\n }\n\n public deactivate(): void {\n super.deactivate();\n\n if (this._querySub) {\n this._querySub.unsubscribe();\n this._querySub = undefined;\n }\n }\n\n public setContainerWidth(width: number) {\n // If we don't have a width we should run queries\n if (!this._containerWidth && width > 0) {\n this._containerWidth = width;\n\n // If we don't have maxDataPoints specifically set and maxDataPointsFromWidth is true\n if (this.state.maxDataPointsFromWidth && !this.state.maxDataPoints) {\n // As this is called from render path we need to wait for next tick before running queries\n setTimeout(() => {\n if (this.isActive && !this._querySub) {\n this.runQueries();\n }\n }, 0);\n }\n } else {\n // let's just remember the width until next query issue\n this._containerWidth = width;\n }\n }\n\n public runQueries() {\n const timeRange = sceneGraph.getTimeRange(this);\n this.runWithTimeRange(timeRange.state.value);\n }\n\n private getMaxDataPoints() {\n return this.state.maxDataPoints ?? this._containerWidth ?? 500;\n }\n\n private async runWithTimeRange(timeRange: TimeRange) {\n const { datasource, minInterval, queries } = this.state;\n const sceneObjectScopedVar: Record<string, ScopedVar<SceneQueryRunner>> = {\n __sceneObject: { text: '__sceneObject', value: this },\n };\n const request: DataQueryRequest = {\n app: CoreApp.Dashboard,\n requestId: getNextRequestId(),\n timezone: 'browser',\n panelId: 1,\n dashboardId: 1,\n range: timeRange,\n interval: '1s',\n intervalMs: 1000,\n targets: cloneDeep(queries),\n maxDataPoints: this.getMaxDataPoints(),\n scopedVars: sceneObjectScopedVar,\n startTime: Date.now(),\n };\n\n try {\n const ds = await getDataSource(datasource, request.scopedVars);\n\n // Attach the data source name to each query\n request.targets = request.targets.map((query) => {\n if (!query.datasource) {\n query.datasource = ds.getRef();\n }\n return query;\n });\n\n // TODO interpolate minInterval\n const lowerIntervalLimit = minInterval ? minInterval : ds.interval;\n const norm = rangeUtil.calculateInterval(timeRange, request.maxDataPoints!, lowerIntervalLimit);\n\n // make shallow copy of scoped vars,\n // and add built in variables interval and interval_ms\n request.scopedVars = Object.assign({}, request.scopedVars, {\n __interval: { text: norm.interval, value: norm.interval },\n __interval_ms: { text: norm.intervalMs.toString(), value: norm.intervalMs },\n });\n\n request.interval = norm.interval;\n request.intervalMs = norm.intervalMs;\n\n const runRequest = getRunRequest();\n this._querySub = runRequest(ds, request)\n .pipe(getTransformationsStream(this, this.state.transformations))\n .subscribe({\n next: this.onDataReceived,\n });\n } catch (err) {\n console.error('PanelQueryRunner Error', err);\n }\n }\n\n private onDataReceived = (data: PanelData) => {\n this.setState({ data });\n };\n}\n\nexport const getTransformationsStream: (\n sceneObject: SceneObject,\n transformations?: DataTransformerConfig[]\n) => MonoTypeOperatorFunction<PanelData> = (sceneObject, transformations) => (inputStream) => {\n return inputStream.pipe(\n mergeMap((data) => {\n if (!transformations || transformations.length === 0) {\n return of(data);\n }\n\n const ctx = {\n interpolate: (value: string) => {\n return sceneGraph.interpolate(sceneObject, value, data?.request?.scopedVars);\n },\n };\n\n return transformDataFrame(transformations, data.series, ctx).pipe(map((series) => ({ ...data, series })));\n })\n );\n};\n"],"names":["timeRange"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { getDataSourceSrv } from '@grafana/runtime';
2
+
3
+ async function getDataSource(datasource, scopedVars) {
4
+ if (datasource && datasource.query) {
5
+ return datasource;
6
+ }
7
+ return await getDataSourceSrv().get(datasource, scopedVars);
8
+ }
9
+
10
+ export { getDataSource };
11
+ //# sourceMappingURL=getDataSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getDataSource.js","sources":["../../../src/utils/getDataSource.ts"],"sourcesContent":["import { DataSourceApi, DataSourceRef, ScopedVars } from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\n\nexport async function getDataSource(\n datasource: DataSourceRef | undefined,\n scopedVars: ScopedVars\n): Promise<DataSourceApi> {\n if (datasource && (datasource as any).query) {\n return datasource as DataSourceApi;\n }\n return await getDataSourceSrv().get(datasource as string, scopedVars);\n}\n"],"names":[],"mappings":";;AAGsB,eAAA,aAAA,CACpB,YACA,UACwB,EAAA;AACxB,EAAI,IAAA,UAAA,IAAe,WAAmB,KAAO,EAAA;AAC3C,IAAO,OAAA,UAAA,CAAA;AAAA,GACT;AACA,EAAA,OAAO,MAAM,gBAAA,EAAmB,CAAA,GAAA,CAAI,YAAsB,UAAU,CAAA,CAAA;AACtE;;;;"}
@@ -2,10 +2,10 @@ import React from 'react';
2
2
  import { of, from, mergeMap, filter, take, throwError, catchError } from 'rxjs';
3
3
  import { v4 } from 'uuid';
4
4
  import { VariableRefresh, VariableSort, LoadingState, getDefaultTimeRange, CoreApp } from '@grafana/data';
5
- import { getDataSourceSrv } from '@grafana/runtime';
6
5
  import { sceneGraph } from '../../../core/sceneGraph.js';
7
6
  import { VariableDependencyConfig } from '../../VariableDependencyConfig.js';
8
7
  import { VariableValueSelect } from '../../components/VariableValueSelect.js';
8
+ import { getDataSource } from '../../../utils/getDataSource.js';
9
9
  import { MultiValueVariable } from '../MultiValueVariable.js';
10
10
  import { createQueryVariableRunner } from './createQueryVariableRunner.js';
11
11
  import { metricNamesToVariableValues } from './utils.js';
@@ -71,7 +71,11 @@ class QueryVariable extends MultiValueVariable {
71
71
  if (this.state.query === "" || !this.state.datasource) {
72
72
  return of([]);
73
73
  }
74
- return from(this.getDataSource()).pipe(
74
+ return from(
75
+ getDataSource(this.state.datasource, {
76
+ __sceneObject: { text: "__sceneObject", value: this }
77
+ })
78
+ ).pipe(
75
79
  mergeMap((ds) => {
76
80
  const runner = createQueryVariableRunner(ds);
77
81
  const target = runner.getTarget(this);
@@ -103,11 +107,6 @@ class QueryVariable extends MultiValueVariable {
103
107
  })
104
108
  );
105
109
  }
106
- async getDataSource() {
107
- return getDataSourceSrv().get(this.state.datasource, {
108
- __sceneObject: { text: "__sceneObject", value: this }
109
- });
110
- }
111
110
  getRequest(target) {
112
111
  const scopedVars = {
113
112
  __sceneObject: { text: "__sceneObject", value: this }
@@ -1 +1 @@
1
- {"version":3,"file":"QueryVariable.js","sources":["../../../../../src/variables/variants/query/QueryVariable.tsx"],"sourcesContent":["import React from 'react';\nimport { Observable, Subject, of, Unsubscribable, filter, take, mergeMap, catchError, throwError, from } from 'rxjs';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n CoreApp,\n DataQuery,\n DataQueryRequest,\n DataSourceApi,\n DataSourceRef,\n getDefaultTimeRange,\n LoadingState,\n PanelData,\n ScopedVars,\n VariableRefresh,\n VariableSort,\n} from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\n\nimport { sceneGraph } from '../../../core/sceneGraph';\nimport { SceneComponentProps } from '../../../core/types';\nimport { VariableDependencyConfig } from '../../VariableDependencyConfig';\nimport { VariableValueSelect } from '../../components/VariableValueSelect';\nimport { VariableValueOption } from '../../types';\nimport { MultiValueVariable, MultiValueVariableState, VariableGetOptionsArgs } from '../MultiValueVariable';\n\nimport { createQueryVariableRunner } from './createQueryVariableRunner';\nimport { metricNamesToVariableValues } from './utils';\nimport { toMetricFindValues } from './toMetricFindValues';\n\nexport interface QueryVariableState extends MultiValueVariableState {\n type: 'query';\n datasource: DataSourceRef | null;\n query: any;\n regex: string;\n refresh: VariableRefresh;\n sort: VariableSort;\n}\n\nexport class QueryVariable extends MultiValueVariable<QueryVariableState> {\n private updateSubscription?: Unsubscribable;\n private dataSourceSubject?: Subject<DataSourceApi>;\n\n protected _variableDependency = new VariableDependencyConfig(this, {\n statePaths: ['regex', 'query', 'datasource'],\n });\n\n public constructor(initialState: Partial<QueryVariableState>) {\n super({\n type: 'query',\n name: '',\n value: '',\n text: '',\n query: '',\n options: [],\n datasource: null,\n regex: '',\n refresh: VariableRefresh.onDashboardLoad,\n sort: VariableSort.alphabeticalAsc,\n ...initialState,\n });\n }\n\n public activate(): void {\n super.activate();\n const timeRange = sceneGraph.getTimeRange(this);\n\n if (this.state.refresh === VariableRefresh.onTimeRangeChanged) {\n this._subs.add(\n timeRange.subscribeToState({\n next: () => {\n this.updateSubscription = this.validateAndUpdate().subscribe();\n },\n })\n );\n }\n }\n\n public deactivate(): void {\n super.deactivate();\n if (this.updateSubscription) {\n this.updateSubscription.unsubscribe();\n }\n\n if (this.dataSourceSubject) {\n this.dataSourceSubject.unsubscribe();\n }\n }\n\n public getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]> {\n if (this.state.query === '' || !this.state.datasource) {\n return of([]);\n }\n\n return from(this.getDataSource()).pipe(\n mergeMap((ds) => {\n const runner = createQueryVariableRunner(ds);\n const target = runner.getTarget(this);\n const request = this.getRequest(target);\n return runner.runRequest({ variable: this }, request).pipe(\n filter((data) => data.state === LoadingState.Done || data.state === LoadingState.Error), // we only care about done or error for now\n take(1), // take the first result, using first caused a bug where it in some situations throw an uncaught error because of no results had been received yet\n mergeMap((data: PanelData) => {\n if (data.state === LoadingState.Error) {\n return throwError(() => data.error);\n }\n return of(data);\n }),\n toMetricFindValues(),\n mergeMap((values) => {\n let regex = '';\n if (this.state.regex) {\n regex = sceneGraph.interpolate(this, this.state.regex, undefined, 'regex');\n }\n return of(metricNamesToVariableValues(regex, this.state.sort, values));\n }),\n catchError((error) => {\n if (error.cancelled) {\n return of([]);\n }\n return throwError(() => error);\n })\n );\n })\n );\n }\n\n private async getDataSource(): Promise<DataSourceApi> {\n return getDataSourceSrv().get(this.state.datasource, {\n __sceneObject: { text: '__sceneObject', value: this },\n });\n }\n\n private getRequest(target: DataQuery) {\n // TODO: add support for search filter\n // const { searchFilter } = this.state.searchFilter;\n // const searchFilterScope = { searchFilter: { text: searchFilter, value: searchFilter } };\n // const searchFilterAsVars = searchFilter ? searchFilterScope : {};\n const scopedVars: ScopedVars = {\n // ...searchFilterAsVars,\n __sceneObject: { text: '__sceneObject', value: this },\n };\n\n const range =\n this.state.refresh === VariableRefresh.onTimeRangeChanged\n ? sceneGraph.getTimeRange(this).state.value\n : getDefaultTimeRange();\n\n const request: DataQueryRequest = {\n app: CoreApp.Dashboard,\n requestId: uuidv4(),\n timezone: '',\n range,\n interval: '',\n intervalMs: 0,\n targets: [target],\n scopedVars,\n startTime: Date.now(),\n };\n return request;\n }\n\n public static Component = ({ model }: SceneComponentProps<MultiValueVariable>) => {\n return <VariableValueSelect model={model} />;\n };\n}\n"],"names":["uuidv4"],"mappings":"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"}
1
+ {"version":3,"file":"QueryVariable.js","sources":["../../../../../src/variables/variants/query/QueryVariable.tsx"],"sourcesContent":["import React from 'react';\nimport { Observable, Subject, of, Unsubscribable, filter, take, mergeMap, catchError, throwError, from } from 'rxjs';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n CoreApp,\n DataQuery,\n DataQueryRequest,\n DataSourceApi,\n DataSourceRef,\n getDefaultTimeRange,\n LoadingState,\n PanelData,\n ScopedVars,\n VariableRefresh,\n VariableSort,\n} from '@grafana/data';\n\nimport { sceneGraph } from '../../../core/sceneGraph';\nimport { SceneComponentProps } from '../../../core/types';\nimport { VariableDependencyConfig } from '../../VariableDependencyConfig';\nimport { VariableValueSelect } from '../../components/VariableValueSelect';\nimport { VariableValueOption } from '../../types';\nimport { getDataSource } from '../../../utils/getDataSource';\nimport { MultiValueVariable, MultiValueVariableState, VariableGetOptionsArgs } from '../MultiValueVariable';\n\nimport { createQueryVariableRunner } from './createQueryVariableRunner';\nimport { metricNamesToVariableValues } from './utils';\nimport { toMetricFindValues } from './toMetricFindValues';\n\nexport interface QueryVariableState extends MultiValueVariableState {\n type: 'query';\n datasource: DataSourceRef | null;\n query: any;\n regex: string;\n refresh: VariableRefresh;\n sort: VariableSort;\n}\n\nexport class QueryVariable extends MultiValueVariable<QueryVariableState> {\n private updateSubscription?: Unsubscribable;\n private dataSourceSubject?: Subject<DataSourceApi>;\n\n protected _variableDependency = new VariableDependencyConfig(this, {\n statePaths: ['regex', 'query', 'datasource'],\n });\n\n public constructor(initialState: Partial<QueryVariableState>) {\n super({\n type: 'query',\n name: '',\n value: '',\n text: '',\n query: '',\n options: [],\n datasource: null,\n regex: '',\n refresh: VariableRefresh.onDashboardLoad,\n sort: VariableSort.alphabeticalAsc,\n ...initialState,\n });\n }\n\n public activate(): void {\n super.activate();\n const timeRange = sceneGraph.getTimeRange(this);\n\n if (this.state.refresh === VariableRefresh.onTimeRangeChanged) {\n this._subs.add(\n timeRange.subscribeToState({\n next: () => {\n this.updateSubscription = this.validateAndUpdate().subscribe();\n },\n })\n );\n }\n }\n\n public deactivate(): void {\n super.deactivate();\n if (this.updateSubscription) {\n this.updateSubscription.unsubscribe();\n }\n\n if (this.dataSourceSubject) {\n this.dataSourceSubject.unsubscribe();\n }\n }\n\n public getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]> {\n if (this.state.query === '' || !this.state.datasource) {\n return of([]);\n }\n\n return from(\n getDataSource(this.state.datasource, {\n __sceneObject: { text: '__sceneObject', value: this },\n })\n ).pipe(\n mergeMap((ds) => {\n const runner = createQueryVariableRunner(ds);\n const target = runner.getTarget(this);\n const request = this.getRequest(target);\n return runner.runRequest({ variable: this }, request).pipe(\n filter((data) => data.state === LoadingState.Done || data.state === LoadingState.Error), // we only care about done or error for now\n take(1), // take the first result, using first caused a bug where it in some situations throw an uncaught error because of no results had been received yet\n mergeMap((data: PanelData) => {\n if (data.state === LoadingState.Error) {\n return throwError(() => data.error);\n }\n return of(data);\n }),\n toMetricFindValues(),\n mergeMap((values) => {\n let regex = '';\n if (this.state.regex) {\n regex = sceneGraph.interpolate(this, this.state.regex, undefined, 'regex');\n }\n return of(metricNamesToVariableValues(regex, this.state.sort, values));\n }),\n catchError((error) => {\n if (error.cancelled) {\n return of([]);\n }\n return throwError(() => error);\n })\n );\n })\n );\n }\n\n private getRequest(target: DataQuery) {\n // TODO: add support for search filter\n // const { searchFilter } = this.state.searchFilter;\n // const searchFilterScope = { searchFilter: { text: searchFilter, value: searchFilter } };\n // const searchFilterAsVars = searchFilter ? searchFilterScope : {};\n const scopedVars: ScopedVars = {\n // ...searchFilterAsVars,\n __sceneObject: { text: '__sceneObject', value: this },\n };\n\n const range =\n this.state.refresh === VariableRefresh.onTimeRangeChanged\n ? sceneGraph.getTimeRange(this).state.value\n : getDefaultTimeRange();\n\n const request: DataQueryRequest = {\n app: CoreApp.Dashboard,\n requestId: uuidv4(),\n timezone: '',\n range,\n interval: '',\n intervalMs: 0,\n targets: [target],\n scopedVars,\n startTime: Date.now(),\n };\n return request;\n }\n\n public static Component = ({ model }: SceneComponentProps<MultiValueVariable>) => {\n return <VariableValueSelect model={model} />;\n };\n}\n"],"names":["uuidv4"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -581,7 +581,6 @@ declare class QueryVariable extends MultiValueVariable<QueryVariableState> {
581
581
  activate(): void;
582
582
  deactivate(): void;
583
583
  getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]>;
584
- private getDataSource;
585
584
  private getRequest;
586
585
  static Component: ({ model }: SceneComponentProps<MultiValueVariable>) => JSX.Element;
587
586
  }
package/dist/index.js CHANGED
@@ -1008,6 +1008,13 @@ const sceneGraph = {
1008
1008
  interpolate
1009
1009
  };
1010
1010
 
1011
+ async function getDataSource(datasource, scopedVars) {
1012
+ if (datasource && datasource.query) {
1013
+ return datasource;
1014
+ }
1015
+ return await runtime.getDataSourceSrv().get(datasource, scopedVars);
1016
+ }
1017
+
1011
1018
  class VariableDependencyConfig {
1012
1019
  constructor(_sceneObject, options) {
1013
1020
  this._sceneObject = _sceneObject;
@@ -1117,7 +1124,7 @@ class SceneQueryRunner extends SceneObjectBase {
1117
1124
  constructor() {
1118
1125
  super(...arguments);
1119
1126
  this._variableDependency = new VariableDependencyConfig(this, {
1120
- statePaths: ["queries"],
1127
+ statePaths: ["queries", "datasource"],
1121
1128
  onReferencedVariableValueChanged: () => this.runQueries()
1122
1129
  });
1123
1130
  this.onDataReceived = (data) => {
@@ -1178,6 +1185,9 @@ class SceneQueryRunner extends SceneObjectBase {
1178
1185
  }
1179
1186
  async runWithTimeRange(timeRange) {
1180
1187
  const { datasource, minInterval, queries } = this.state;
1188
+ const sceneObjectScopedVar = {
1189
+ __sceneObject: { text: "__sceneObject", value: this }
1190
+ };
1181
1191
  const request = {
1182
1192
  app: data.CoreApp.Dashboard,
1183
1193
  requestId: getNextRequestId(),
@@ -1189,7 +1199,7 @@ class SceneQueryRunner extends SceneObjectBase {
1189
1199
  intervalMs: 1e3,
1190
1200
  targets: lodash.cloneDeep(queries),
1191
1201
  maxDataPoints: this.getMaxDataPoints(),
1192
- scopedVars: {},
1202
+ scopedVars: sceneObjectScopedVar,
1193
1203
  startTime: Date.now()
1194
1204
  };
1195
1205
  try {
@@ -1217,12 +1227,6 @@ class SceneQueryRunner extends SceneObjectBase {
1217
1227
  }
1218
1228
  }
1219
1229
  }
1220
- async function getDataSource(datasource, scopedVars) {
1221
- if (datasource && datasource.query) {
1222
- return datasource;
1223
- }
1224
- return await runtime.getDataSourceSrv().get(datasource, scopedVars);
1225
- }
1226
1230
  const getTransformationsStream = (sceneObject, transformations) => (inputStream) => {
1227
1231
  return inputStream.pipe(
1228
1232
  rxjs.mergeMap((data$1) => {
@@ -2055,7 +2059,11 @@ class QueryVariable extends MultiValueVariable {
2055
2059
  if (this.state.query === "" || !this.state.datasource) {
2056
2060
  return rxjs.of([]);
2057
2061
  }
2058
- return rxjs.from(this.getDataSource()).pipe(
2062
+ return rxjs.from(
2063
+ getDataSource(this.state.datasource, {
2064
+ __sceneObject: { text: "__sceneObject", value: this }
2065
+ })
2066
+ ).pipe(
2059
2067
  rxjs.mergeMap((ds) => {
2060
2068
  const runner = createQueryVariableRunner(ds);
2061
2069
  const target = runner.getTarget(this);
@@ -2087,11 +2095,6 @@ class QueryVariable extends MultiValueVariable {
2087
2095
  })
2088
2096
  );
2089
2097
  }
2090
- async getDataSource() {
2091
- return runtime.getDataSourceSrv().get(this.state.datasource, {
2092
- __sceneObject: { text: "__sceneObject", value: this }
2093
- });
2094
- }
2095
2098
  getRequest(target) {
2096
2099
  const scopedVars = {
2097
2100
  __sceneObject: { text: "__sceneObject", value: this }