mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			100 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
| import _ from 'lodash';
 | |
| import { QueryCtrl } from 'app/plugins/sdk';
 | |
| import './query_aggregation_ctrl';
 | |
| import './query_filter_ctrl';
 | |
| 
 | |
| export interface QueryMeta {
 | |
|   alignmentPeriod: string;
 | |
|   rawQuery: string;
 | |
|   rawQueryString: string;
 | |
|   metricLabels: { [key: string]: string[] };
 | |
|   resourceLabels: { [key: string]: string[] };
 | |
| }
 | |
| 
 | |
| export class StackdriverQueryCtrl extends QueryCtrl {
 | |
|   static templateUrl = 'partials/query.editor.html';
 | |
|   target: {
 | |
|     defaultProject: string;
 | |
|     unit: string;
 | |
|     metricType: string;
 | |
|     service: string;
 | |
|     refId: string;
 | |
|     aggregation: {
 | |
|       crossSeriesReducer: string;
 | |
|       alignmentPeriod: string;
 | |
|       perSeriesAligner: string;
 | |
|       groupBys: string[];
 | |
|     };
 | |
|     filters: string[];
 | |
|     aliasBy: string;
 | |
|     metricKind: any;
 | |
|     valueType: any;
 | |
|   };
 | |
| 
 | |
|   defaultDropdownValue = 'Select Metric';
 | |
|   defaultServiceValue = 'All Services';
 | |
| 
 | |
|   defaults = {
 | |
|     defaultProject: 'loading project...',
 | |
|     metricType: this.defaultDropdownValue,
 | |
|     service: this.defaultServiceValue,
 | |
|     metric: '',
 | |
|     unit: '',
 | |
|     aggregation: {
 | |
|       crossSeriesReducer: 'REDUCE_MEAN',
 | |
|       alignmentPeriod: 'stackdriver-auto',
 | |
|       perSeriesAligner: 'ALIGN_MEAN',
 | |
|       groupBys: [],
 | |
|     },
 | |
|     filters: [],
 | |
|     showAggregationOptions: false,
 | |
|     aliasBy: '',
 | |
|     metricKind: '',
 | |
|     valueType: '',
 | |
|   };
 | |
|   projects: any;
 | |
| 
 | |
|   showHelp: boolean;
 | |
|   showLastQuery: boolean;
 | |
|   lastQueryMeta: QueryMeta;
 | |
|   lastQueryError?: string;
 | |
| 
 | |
|   /** @ngInject */
 | |
|   constructor($scope, $injector) {
 | |
|     super($scope, $injector);
 | |
|     _.defaultsDeep(this.target, this.defaults);
 | |
|     this.panelCtrl.events.on('data-received', this.onDataReceived.bind(this), $scope);
 | |
|     this.panelCtrl.events.on('data-error', this.onDataError.bind(this), $scope);
 | |
|   }
 | |
| 
 | |
|   onDataReceived(dataList) {
 | |
|     this.lastQueryError = null;
 | |
|     this.lastQueryMeta = null;
 | |
| 
 | |
|     const anySeriesFromQuery: any = _.find(dataList, { refId: this.target.refId });
 | |
|     if (anySeriesFromQuery) {
 | |
|       this.lastQueryMeta = anySeriesFromQuery.meta;
 | |
|       this.lastQueryMeta.rawQueryString = decodeURIComponent(this.lastQueryMeta.rawQuery);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   onDataError(err) {
 | |
|     if (err.data && err.data.results) {
 | |
|       const queryRes = err.data.results[this.target.refId];
 | |
|       if (queryRes && queryRes.error) {
 | |
|         this.lastQueryMeta = queryRes.meta;
 | |
|         this.lastQueryMeta.rawQueryString = decodeURIComponent(this.lastQueryMeta.rawQuery);
 | |
| 
 | |
|         let jsonBody;
 | |
|         try {
 | |
|           jsonBody = JSON.parse(queryRes.error);
 | |
|         } catch {
 | |
|           this.lastQueryError = queryRes.error;
 | |
|         }
 | |
| 
 | |
|         this.lastQueryError = jsonBody.error.message;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 |