datasource.ts 6.7 KB

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