datasource.ts 6.3 KB

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