datasource.ts 6.0 KB

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