From 1d8786e3a6a6717b67dabca5ad4b5ba060c6fafe Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Wed, 8 May 2019 00:37:50 -0700 Subject: [PATCH] DataSource Plugins: consistent generics order (#16936) * consistent TQuery,TOptions * add json for azure * cloudwatch --- packages/grafana-ui/src/types/datasource.ts | 28 +++++++++++-------- .../dashboard/state/PanelQueryRunner.ts | 17 +++++++++-- .../datasource/cloudwatch/datasource.ts | 15 ++++++++-- .../cloudwatch/specs/datasource.test.ts | 11 +++++--- .../app_insights/app_insights_datasource.ts | 11 +++++++- .../azure_log_analytics_datasource.ts | 13 +++++++-- .../azure_monitor/azure_monitor_datasource.ts | 12 ++++++-- .../datasource.ts | 15 +++++++--- .../grafana-azure-monitor-datasource/types.ts | 21 +++++++++++++- .../datasource/input/InputDatasource.ts | 2 +- public/app/plugins/datasource/input/module.ts | 2 +- 11 files changed, 112 insertions(+), 35 deletions(-) diff --git a/packages/grafana-ui/src/types/datasource.ts b/packages/grafana-ui/src/types/datasource.ts index f918063d06b..c50c04063e5 100644 --- a/packages/grafana-ui/src/types/datasource.ts +++ b/packages/grafana-ui/src/types/datasource.ts @@ -11,13 +11,13 @@ export interface DataSourcePluginOptionsEditorProps { } export class DataSourcePlugin< - TOptions extends DataSourceJsonData = DataSourceJsonData, - TQuery extends DataQuery = DataQuery + TQuery extends DataQuery = DataQuery, + TOptions extends DataSourceJsonData = DataSourceJsonData > extends GrafanaPlugin { - DataSourceClass: DataSourceConstructor; - components: DataSourcePluginComponents; + DataSourceClass: DataSourceConstructor; + components: DataSourcePluginComponents; - constructor(DataSourceClass: DataSourceConstructor) { + constructor(DataSourceClass: DataSourceConstructor) { super(); this.DataSourceClass = DataSourceClass; this.components = {}; @@ -89,8 +89,8 @@ interface PluginMetaQueryOptions { } export interface DataSourcePluginComponents< - TOptions extends DataSourceJsonData = DataSourceJsonData, - TQuery extends DataQuery = DataQuery + TQuery extends DataQuery = DataQuery, + TOptions extends DataSourceJsonData = DataSourceJsonData > { QueryCtrl?: any; AnnotationsQueryCtrl?: any; @@ -101,14 +101,20 @@ export interface DataSourcePluginComponents< ConfigEditor?: React.ComponentType>>; } -export interface DataSourceConstructor { - new (instanceSettings: DataSourceInstanceSettings, ...args: any[]): DataSourceApi; +export interface DataSourceConstructor< + TQuery extends DataQuery = DataQuery, + TOptions extends DataSourceJsonData = DataSourceJsonData +> { + new (instanceSettings: DataSourceInstanceSettings, ...args: any[]): DataSourceApi; } /** * The main data source abstraction interface, represents an instance of a data source */ -export interface DataSourceApi { +export interface DataSourceApi< + TQuery extends DataQuery = DataQuery, + TOptions extends DataSourceJsonData = DataSourceJsonData +> { /** * min interval range */ @@ -158,7 +164,7 @@ export interface DataSourceApi { * Set after constructor call, as the data source instance is the most common thing to pass around * we attach the components to this instance for easy access */ - components?: DataSourcePluginComponents; + components?: DataSourcePluginComponents; /** * static information about the datasource diff --git a/public/app/features/dashboard/state/PanelQueryRunner.ts b/public/app/features/dashboard/state/PanelQueryRunner.ts index 04c4f9f7a74..00f6e3a00f0 100644 --- a/public/app/features/dashboard/state/PanelQueryRunner.ts +++ b/public/app/features/dashboard/state/PanelQueryRunner.ts @@ -10,10 +10,21 @@ import templateSrv from 'app/features/templating/template_srv'; import { PanelQueryState } from './PanelQueryState'; // Types -import { PanelData, DataQuery, TimeRange, ScopedVars, DataQueryRequest, DataSourceApi } from '@grafana/ui'; +import { + PanelData, + DataQuery, + TimeRange, + ScopedVars, + DataQueryRequest, + DataSourceApi, + DataSourceJsonData, +} from '@grafana/ui'; -export interface QueryRunnerOptions { - datasource: string | DataSourceApi; +export interface QueryRunnerOptions< + TQuery extends DataQuery = DataQuery, + TOptions extends DataSourceJsonData = DataSourceJsonData +> { + datasource: string | DataSourceApi; queries: TQuery[]; panelId: number; dashboardId?: number; diff --git a/public/app/plugins/datasource/cloudwatch/datasource.ts b/public/app/plugins/datasource/cloudwatch/datasource.ts index 205d7cad07c..76ba2b8b9b6 100644 --- a/public/app/plugins/datasource/cloudwatch/datasource.ts +++ b/public/app/plugins/datasource/cloudwatch/datasource.ts @@ -3,7 +3,10 @@ import _ from 'lodash'; import * as dateMath from '@grafana/ui/src/utils/datemath'; import kbn from 'app/core/utils/kbn'; import { CloudWatchQuery } from './types'; -import { DataSourceApi, DataQueryRequest } from '@grafana/ui/src/types'; +import { DataSourceApi, DataQueryRequest, DataSourceInstanceSettings } from '@grafana/ui/src/types'; +import { BackendSrv } from 'app/core/services/backend_srv'; +import { TemplateSrv } from 'app/features/templating/template_srv'; +import { TimeSrv } from 'app/features/dashboard/services/TimeSrv'; // import * as moment from 'moment'; export default class CloudWatchDatasource implements DataSourceApi { @@ -11,10 +14,16 @@ export default class CloudWatchDatasource implements DataSourceApi { const instanceSettings = { - jsonData: { defaultRegion: 'us-east-1', access: 'proxy' }, - }; + jsonData: { defaultRegion: 'us-east-1' }, + } as DataSourceInstanceSettings; const templateSrv = new TemplateSrv(); @@ -21,8 +24,8 @@ describe('CloudWatchDatasource', () => { to: dateMath.parse(timeSrv.time.to, true), }; }, - }; - const backendSrv = {}; + } as TimeSrv; + const backendSrv = {} as BackendSrv; const ctx = { backendSrv, templateSrv, diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/app_insights/app_insights_datasource.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/app_insights/app_insights_datasource.ts index 97f76d229fb..696baca9352 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/app_insights/app_insights_datasource.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/app_insights/app_insights_datasource.ts @@ -2,6 +2,10 @@ import _ from 'lodash'; import AppInsightsQuerystringBuilder from './app_insights_querystring_builder'; import LogAnalyticsQuerystringBuilder from '../log_analytics/querystring_builder'; import ResponseParser from './response_parser'; +import { DataSourceInstanceSettings } from '@grafana/ui'; +import { AzureDataSourceJsonData } from '../types'; +import { BackendSrv } from 'app/core/services/backend_srv'; +import { TemplateSrv } from 'app/features/templating/template_srv'; export interface LogAnalyticsColumn { text: string; @@ -16,7 +20,12 @@ export default class AppInsightsDatasource { logAnalyticsColumns: { [key: string]: LogAnalyticsColumn[] } = {}; /** @ngInject */ - constructor(instanceSettings, private backendSrv, private templateSrv, private $q) { + constructor( + instanceSettings: DataSourceInstanceSettings, + private backendSrv: BackendSrv, + private templateSrv: TemplateSrv, + private $q + ) { this.id = instanceSettings.id; this.applicationId = instanceSettings.jsonData.appInsightsAppId; this.baseUrl = `/appinsights/${this.version}/apps/${this.applicationId}`; diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/azure_log_analytics_datasource.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/azure_log_analytics_datasource.ts index 3df2a244e97..b56ec7a8575 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/azure_log_analytics_datasource.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_log_analytics/azure_log_analytics_datasource.ts @@ -1,8 +1,10 @@ import _ from 'lodash'; import LogAnalyticsQuerystringBuilder from '../log_analytics/querystring_builder'; import ResponseParser from './response_parser'; -import { AzureMonitorQuery } from '../types'; -import { DataQueryRequest } from '@grafana/ui/src/types'; +import { AzureMonitorQuery, AzureDataSourceJsonData } from '../types'; +import { DataQueryRequest, DataSourceInstanceSettings } from '@grafana/ui/src/types'; +import { BackendSrv } from 'app/core/services/backend_srv'; +import { TemplateSrv } from 'app/features/templating/template_srv'; export default class AzureLogAnalyticsDatasource { id: number; @@ -14,7 +16,12 @@ export default class AzureLogAnalyticsDatasource { subscriptionId: string; /** @ngInject */ - constructor(private instanceSettings, private backendSrv, private templateSrv, private $q) { + constructor( + private instanceSettings: DataSourceInstanceSettings, + private backendSrv: BackendSrv, + private templateSrv: TemplateSrv, + private $q + ) { this.id = instanceSettings.id; this.baseUrl = this.instanceSettings.jsonData.azureLogAnalyticsSameAs ? '/sameasloganalyticsazure' diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/azure_monitor_datasource.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/azure_monitor_datasource.ts index cc7b34551ab..f7e4b5f1171 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/azure_monitor_datasource.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/azure_monitor/azure_monitor_datasource.ts @@ -4,8 +4,10 @@ import UrlBuilder from './url_builder'; import ResponseParser from './response_parser'; import SupportedNamespaces from './supported_namespaces'; import TimegrainConverter from '../time_grain_converter'; -import { AzureMonitorQuery } from '../types'; -import { DataQueryRequest } from '@grafana/ui/src/types'; +import { AzureMonitorQuery, AzureDataSourceJsonData } from '../types'; +import { DataQueryRequest, DataSourceInstanceSettings } from '@grafana/ui/src/types'; +import { BackendSrv } from 'app/core/services/backend_srv'; +import { TemplateSrv } from 'app/features/templating/template_srv'; export default class AzureMonitorDatasource { apiVersion = '2018-01-01'; @@ -20,7 +22,11 @@ export default class AzureMonitorDatasource { supportedMetricNamespaces: any[] = []; /** @ngInject */ - constructor(private instanceSettings, private backendSrv, private templateSrv) { + constructor( + private instanceSettings: DataSourceInstanceSettings, + private backendSrv: BackendSrv, + private templateSrv: TemplateSrv + ) { this.id = instanceSettings.id; this.subscriptionId = instanceSettings.jsonData.subscriptionId; this.cloudName = instanceSettings.jsonData.cloudName || 'azuremonitor'; diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/datasource.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/datasource.ts index dd1ea139b45..ba211cf0a21 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/datasource.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/datasource.ts @@ -2,10 +2,12 @@ import _ from 'lodash'; import AzureMonitorDatasource from './azure_monitor/azure_monitor_datasource'; import AppInsightsDatasource from './app_insights/app_insights_datasource'; import AzureLogAnalyticsDatasource from './azure_log_analytics/azure_log_analytics_datasource'; -import { AzureMonitorQuery } from './types'; -import { DataSourceApi, DataQueryRequest } from '@grafana/ui/src/types'; +import { AzureMonitorQuery, AzureDataSourceJsonData } from './types'; +import { DataSourceApi, DataQueryRequest, DataSourceInstanceSettings } from '@grafana/ui/src/types'; +import { BackendSrv } from 'app/core/services/backend_srv'; +import { TemplateSrv } from 'app/features/templating/template_srv'; -export default class Datasource implements DataSourceApi { +export default class Datasource implements DataSourceApi { id: number; name: string; azureMonitorDatasource: AzureMonitorDatasource; @@ -13,7 +15,12 @@ export default class Datasource implements DataSourceApi { azureLogAnalyticsDatasource: AzureLogAnalyticsDatasource; /** @ngInject */ - constructor(instanceSettings, private backendSrv, private templateSrv, private $q) { + constructor( + instanceSettings: DataSourceInstanceSettings, + private backendSrv: BackendSrv, + private templateSrv: TemplateSrv, + private $q + ) { this.name = instanceSettings.name; this.id = instanceSettings.id; this.azureMonitorDatasource = new AzureMonitorDatasource(instanceSettings, this.backendSrv, this.templateSrv); diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/types.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/types.ts index 9a77ae61259..81d4fc50123 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/types.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/types.ts @@ -1,4 +1,4 @@ -import { DataQuery } from '@grafana/ui/src/types'; +import { DataQuery, DataSourceJsonData } from '@grafana/ui/src/types'; export interface AzureMonitorQuery extends DataQuery { format: string; @@ -8,6 +8,25 @@ export interface AzureMonitorQuery extends DataQuery { // appInsights: any; } +export interface AzureDataSourceJsonData extends DataSourceJsonData { + subscriptionId: string; + cloudName: string; + + // monitor + tenantId?: string; + clientId?: string; + + // logs + logAnalyticsSubscriptionId?: string; + logAnalyticsTenantId?: string; + logAnalyticsClientId?: string; + azureLogAnalyticsSameAs?: string; + logAnalyticsDefaultWorkspace?: string; + + // App Insights + appInsightsAppId?: string; +} + export interface AzureMetricQuery { resourceGroup: string; resourceName: string; diff --git a/public/app/plugins/datasource/input/InputDatasource.ts b/public/app/plugins/datasource/input/InputDatasource.ts index 72b6190a670..15629ea1486 100644 --- a/public/app/plugins/datasource/input/InputDatasource.ts +++ b/public/app/plugins/datasource/input/InputDatasource.ts @@ -8,7 +8,7 @@ import { } from '@grafana/ui/src/types'; import { InputQuery, InputOptions } from './types'; -export class InputDatasource implements DataSourceApi { +export class InputDatasource implements DataSourceApi { data: SeriesData[]; // Filled in by grafana plugin system diff --git a/public/app/plugins/datasource/input/module.ts b/public/app/plugins/datasource/input/module.ts index 05a48c965ca..8aef9d9f53c 100644 --- a/public/app/plugins/datasource/input/module.ts +++ b/public/app/plugins/datasource/input/module.ts @@ -6,6 +6,6 @@ import { InputQueryEditor } from './InputQueryEditor'; import { InputConfigEditor } from './InputConfigEditor'; import { InputOptions, InputQuery } from './types'; -export const plugin = new DataSourcePlugin(InputDatasource) +export const plugin = new DataSourcePlugin(InputDatasource) .setConfigEditor(InputConfigEditor) .setQueryEditor(InputQueryEditor);