1
- import { getBackendSrv , getTemplateSrv , BackendSrvRequest , FetchResponse } from "@grafana/runtime" ;
1
+ import { getBackendSrv , getTemplateSrv , BackendSrvRequest , FetchResponse , DataSourceWithBackend } from "@grafana/runtime" ;
2
2
import {
3
3
DataQueryRequest ,
4
4
DataQueryResponse ,
5
- DataSourceApi ,
6
5
DataSourceInstanceSettings ,
7
6
MutableDataFrame ,
8
7
DataFrame ,
9
8
FieldType ,
10
9
guessFieldTypeFromValue ,
11
10
MetricFindValue
12
11
} from '@grafana/data' ;
13
- import { lastValueFrom , of } from 'rxjs' ;
12
+ import { lastValueFrom , of , Observable } from 'rxjs' ;
14
13
import { catchError , map } from 'rxjs/operators' ;
15
14
import { isArray , isNull } from "lodash" ;
16
15
@@ -23,7 +22,7 @@ import {
23
22
StreamSchemaResponse ,
24
23
StreamStatsResponse
25
24
} from './types' ;
26
- export class DataSource extends DataSourceApi < MyQuery , MyDataSourceOptions > {
25
+ export class DataSource extends DataSourceWithBackend < MyQuery , MyDataSourceOptions > {
27
26
url : string ;
28
27
withCredentials : boolean ;
29
28
headers : any ;
@@ -45,49 +44,57 @@ export class DataSource extends DataSourceApi<MyQuery, MyDataSourceOptions> {
45
44
return result ;
46
45
}
47
46
48
- async query ( options : DataQueryRequest < MyQuery > ) : Promise < DataQueryResponse > {
49
- options . targets = options . targets . filter ( ( t ) => ! t . hide ) ;
50
- if ( options . targets . length === 0 ) {
51
- return Promise . resolve ( { data : [ ] } ) ;
52
- }
47
+ query ( options : DataQueryRequest < MyQuery > ) : Observable < DataQueryResponse > {
48
+ return new Observable < DataQueryResponse > ( observer => {
49
+ options . targets = options . targets . filter ( ( t ) => ! t . hide ) ;
50
+ if ( options . targets . length === 0 ) {
51
+ observer . next ( { data : [ ] } ) ;
52
+ observer . complete ( ) ;
53
+ return ;
54
+ }
53
55
54
- const { range } = options ;
55
- if ( ! range ) {
56
- return Promise . resolve ( { data : [ ] } ) ;
57
- }
58
- const start = range ! . from ;
59
- const end = range ! . to ;
56
+ const { range } = options ;
57
+ if ( ! range ) {
58
+ observer . next ( { data : [ ] } ) ;
59
+ observer . complete ( ) ;
60
+ return ;
61
+ }
62
+ const start = range ! . from ;
63
+ const end = range ! . to ;
60
64
61
- const calls = options . targets . map ( target => {
62
- const query = getTemplateSrv ( ) . replace ( target . queryText , options . scopedVars , this . formatter ) ;
65
+ const calls = options . targets . map ( target => {
66
+ const query = getTemplateSrv ( ) . replace ( target . queryText , options . scopedVars , this . formatter ) ;
63
67
64
- const request = {
65
- "query" : query ,
66
- "startTime" : start . toISOString ( ) ,
67
- "endTime" : end . toISOString ( ) ,
68
- "send_null" : true
69
- } ;
68
+ const request = {
69
+ "query" : query ,
70
+ "startTime" : start . toISOString ( ) ,
71
+ "endTime" : end . toISOString ( ) ,
72
+ "send_null" : true
73
+ } ;
70
74
71
- return lastValueFrom (
72
- this . doFetch < any [ ] > ( {
73
- url : this . url + '/api/v1/query' ,
74
- data : request ,
75
- method : 'POST' ,
76
- } ) . pipe (
77
- map ( ( response ) => {
78
- return this . arrayToDataFrame ( response . data ) ;
79
- } ) ,
80
- catchError ( ( err ) => {
81
- throw new Error ( err . data . message ) ;
82
- } )
83
- )
84
- ) ;
85
- } ) ;
75
+ return lastValueFrom (
76
+ this . doFetch < any [ ] > ( {
77
+ url : this . url + '/api/v1/query' ,
78
+ data : request ,
79
+ method : 'POST' ,
80
+ } ) . pipe (
81
+ map ( ( response ) => {
82
+ return this . arrayToDataFrame ( response . data ) ;
83
+ } ) ,
84
+ catchError ( ( err ) => {
85
+ throw new Error ( err . data . message ) ;
86
+ } )
87
+ )
88
+ ) ;
89
+ } ) ;
86
90
87
- const data = await Promise . all ( calls ) ;
88
- return {
89
- data,
90
- } ;
91
+ Promise . all ( calls ) . then ( data => {
92
+ observer . next ( { data } ) ;
93
+ observer . complete ( ) ;
94
+ } ) . catch ( error => {
95
+ observer . error ( error ) ;
96
+ } ) ;
97
+ } ) ;
91
98
}
92
99
93
100
private formatter ( value : string | string [ ] , options : any ) : string {
@@ -113,14 +120,21 @@ export class DataSource extends DataSourceApi<MyQuery, MyDataSourceOptions> {
113
120
options . targets = [ ] ;
114
121
options . targets . push ( { queryText : query , scopedVars : { } } ) ;
115
122
116
- const response = await this . query ( options ) ;
117
-
118
- return response . data . map ( ( dataFrame ) => {
119
- return dataFrame . fields [ 0 ] . values . toArray ( ) ;
120
- }
121
- ) . flat ( ) . map ( ( value ) => {
122
- return { text : value } ;
123
- } ) ;
123
+ return new Promise < MetricFindValue [ ] > ( ( resolve , reject ) => {
124
+ this . query ( options ) . subscribe ( {
125
+ next : ( response : DataQueryResponse ) => {
126
+ const values : MetricFindValue [ ] = response . data
127
+ . map ( ( dataFrame : DataFrame ) => dataFrame . fields [ 0 ] . values . toArray ( ) )
128
+ . flat ( )
129
+ . map ( ( value : any ) => ( { text : value } ) ) ;
130
+
131
+ resolve ( values ) ;
132
+ } ,
133
+ error : ( error : any ) => {
134
+ reject ( error ) ;
135
+ } ,
136
+ } ) ;
137
+ } )
124
138
}
125
139
126
140
arrayToDataFrame ( array : any [ ] ) : DataFrame {
0 commit comments