datasource.ts 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. import _ from 'lodash';
  2. import AzureMonitorDatasource from './azure_monitor/azure_monitor_datasource';
  3. import AppInsightsDatasource from './app_insights/app_insights_datasource';
  4. import AzureLogAnalyticsDatasource from './azure_log_analytics/azure_log_analytics_datasource';
  5. import { AzureMonitorQuery, AzureDataSourceJsonData } from './types';
  6. import { DataSourceApi, DataQueryRequest, DataSourceInstanceSettings } from '@grafana/ui/src/types';
  7. import { BackendSrv } from 'app/core/services/backend_srv';
  8. import { TemplateSrv } from 'app/features/templating/template_srv';
  9. export default class Datasource extends DataSourceApi<AzureMonitorQuery, AzureDataSourceJsonData> {
  10. azureMonitorDatasource: AzureMonitorDatasource;
  11. appInsightsDatasource: AppInsightsDatasource;
  12. azureLogAnalyticsDatasource: AzureLogAnalyticsDatasource;
  13. /** @ngInject */
  14. constructor(
  15. instanceSettings: DataSourceInstanceSettings<AzureDataSourceJsonData>,
  16. private backendSrv: BackendSrv,
  17. private templateSrv: TemplateSrv,
  18. private $q
  19. ) {
  20. super(instanceSettings);
  21. this.azureMonitorDatasource = new AzureMonitorDatasource(instanceSettings, this.backendSrv, this.templateSrv);
  22. this.appInsightsDatasource = new AppInsightsDatasource(
  23. instanceSettings,
  24. this.backendSrv,
  25. this.templateSrv,
  26. this.$q
  27. );
  28. this.azureLogAnalyticsDatasource = new AzureLogAnalyticsDatasource(
  29. instanceSettings,
  30. this.backendSrv,
  31. this.templateSrv,
  32. this.$q
  33. );
  34. }
  35. async query(options: DataQueryRequest<AzureMonitorQuery>) {
  36. const promises: any[] = [];
  37. const azureMonitorOptions = _.cloneDeep(options);
  38. const appInsightsOptions = _.cloneDeep(options);
  39. const azureLogAnalyticsOptions = _.cloneDeep(options);
  40. azureMonitorOptions.targets = _.filter(azureMonitorOptions.targets, ['queryType', 'Azure Monitor']);
  41. appInsightsOptions.targets = _.filter(appInsightsOptions.targets, ['queryType', 'Application Insights']);
  42. azureLogAnalyticsOptions.targets = _.filter(azureLogAnalyticsOptions.targets, ['queryType', 'Azure Log Analytics']);
  43. if (azureMonitorOptions.targets.length > 0) {
  44. const amPromise = this.azureMonitorDatasource.query(azureMonitorOptions);
  45. if (amPromise) {
  46. promises.push(amPromise);
  47. }
  48. }
  49. if (appInsightsOptions.targets.length > 0) {
  50. const aiPromise = this.appInsightsDatasource.query(appInsightsOptions);
  51. if (aiPromise) {
  52. promises.push(aiPromise);
  53. }
  54. }
  55. if (azureLogAnalyticsOptions.targets.length > 0) {
  56. const alaPromise = this.azureLogAnalyticsDatasource.query(azureLogAnalyticsOptions);
  57. if (alaPromise) {
  58. promises.push(alaPromise);
  59. }
  60. }
  61. if (promises.length === 0) {
  62. return this.$q.when({ data: [] });
  63. }
  64. return Promise.all(promises).then(results => {
  65. return { data: _.flatten(results) };
  66. });
  67. }
  68. async annotationQuery(options) {
  69. return this.azureLogAnalyticsDatasource.annotationQuery(options);
  70. }
  71. async metricFindQuery(query: string) {
  72. if (!query) {
  73. return Promise.resolve([]);
  74. }
  75. const aiResult = this.appInsightsDatasource.metricFindQuery(query);
  76. if (aiResult) {
  77. return aiResult;
  78. }
  79. const amResult = this.azureMonitorDatasource.metricFindQuery(query);
  80. if (amResult) {
  81. return amResult;
  82. }
  83. const alaResult = this.azureLogAnalyticsDatasource.metricFindQuery(query);
  84. if (alaResult) {
  85. return alaResult;
  86. }
  87. return Promise.resolve([]);
  88. }
  89. async testDatasource() {
  90. const promises: any[] = [];
  91. if (this.azureMonitorDatasource.isConfigured()) {
  92. promises.push(this.azureMonitorDatasource.testDatasource());
  93. }
  94. if (this.appInsightsDatasource.isConfigured()) {
  95. promises.push(this.appInsightsDatasource.testDatasource());
  96. }
  97. if (this.azureLogAnalyticsDatasource.isConfigured()) {
  98. promises.push(this.azureLogAnalyticsDatasource.testDatasource());
  99. }
  100. if (promises.length === 0) {
  101. return {
  102. status: 'error',
  103. message: `Nothing configured. At least one of the API's must be configured.`,
  104. title: 'Error',
  105. };
  106. }
  107. return Promise.all(promises).then(results => {
  108. let status = 'success';
  109. let message = '';
  110. for (let i = 0; i < results.length; i++) {
  111. if (results[i].status !== 'success') {
  112. status = results[i].status;
  113. }
  114. message += `${i + 1}. ${results[i].message} `;
  115. }
  116. return {
  117. status: status,
  118. message: message,
  119. title: _.upperFirst(status),
  120. };
  121. });
  122. }
  123. /* Azure Monitor REST API methods */
  124. getResourceGroups(subscriptionId: string) {
  125. return this.azureMonitorDatasource.getResourceGroups(subscriptionId);
  126. }
  127. getMetricDefinitions(subscriptionId: string, resourceGroup: string) {
  128. return this.azureMonitorDatasource.getMetricDefinitions(subscriptionId, resourceGroup);
  129. }
  130. getResourceNames(subscriptionId: string, resourceGroup: string, metricDefinition: string) {
  131. return this.azureMonitorDatasource.getResourceNames(subscriptionId, resourceGroup, metricDefinition);
  132. }
  133. getMetricNames(subscriptionId: string, resourceGroup: string, metricDefinition: string, resourceName: string) {
  134. return this.azureMonitorDatasource.getMetricNames(subscriptionId, resourceGroup, metricDefinition, resourceName);
  135. }
  136. getMetricMetadata(
  137. subscriptionId: string,
  138. resourceGroup: string,
  139. metricDefinition: string,
  140. resourceName: string,
  141. metricName: string
  142. ) {
  143. return this.azureMonitorDatasource.getMetricMetadata(
  144. subscriptionId,
  145. resourceGroup,
  146. metricDefinition,
  147. resourceName,
  148. metricName
  149. );
  150. }
  151. /* Application Insights API method */
  152. getAppInsightsMetricNames() {
  153. return this.appInsightsDatasource.getMetricNames();
  154. }
  155. getAppInsightsMetricMetadata(metricName) {
  156. return this.appInsightsDatasource.getMetricMetadata(metricName);
  157. }
  158. getAppInsightsColumns(refId) {
  159. return this.appInsightsDatasource.logAnalyticsColumns[refId];
  160. }
  161. /*Azure Log Analytics */
  162. getAzureLogAnalyticsWorkspaces(subscriptionId: string) {
  163. return this.azureLogAnalyticsDatasource.getWorkspaces(subscriptionId);
  164. }
  165. getSubscriptions() {
  166. return this.azureMonitorDatasource.getSubscriptions();
  167. }
  168. }