datasource.ts 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. import _ from 'lodash';
  2. import { migrateTargetSchema } from './migrations';
  3. import AzureMonitorDatasource from './azure_monitor/azure_monitor_datasource';
  4. import AppInsightsDatasource from './app_insights/app_insights_datasource';
  5. import AzureLogAnalyticsDatasource from './azure_log_analytics/azure_log_analytics_datasource';
  6. import { AzureMonitorQuery, AzureDataSourceJsonData } from './types';
  7. import { DataSourceApi, DataQueryRequest, DataSourceInstanceSettings } from '@grafana/ui';
  8. import { BackendSrv } from 'app/core/services/backend_srv';
  9. import { TemplateSrv } from 'app/features/templating/template_srv';
  10. import { IQService } from 'angular';
  11. export default class Datasource extends DataSourceApi<AzureMonitorQuery, AzureDataSourceJsonData> {
  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: IQService
  21. ) {
  22. super(instanceSettings);
  23. this.azureMonitorDatasource = new AzureMonitorDatasource(instanceSettings, this.backendSrv, this.templateSrv);
  24. this.appInsightsDatasource = new AppInsightsDatasource(
  25. instanceSettings,
  26. this.backendSrv,
  27. this.templateSrv,
  28. this.$q
  29. );
  30. this.azureLogAnalyticsDatasource = new AzureLogAnalyticsDatasource(
  31. instanceSettings,
  32. this.backendSrv,
  33. this.templateSrv
  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 = azureMonitorOptions.targets
  42. .filter((t: any) => t.queryType === 'Azure Monitor')
  43. .map((t: any) => migrateTargetSchema(t));
  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: any) {
  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(
  137. subscriptionId: string,
  138. resourceGroup: string,
  139. metricDefinition: string,
  140. resourceName: string,
  141. metricNamespace?: string
  142. ) {
  143. return this.azureMonitorDatasource.getMetricNames(
  144. subscriptionId,
  145. resourceGroup,
  146. metricDefinition,
  147. resourceName,
  148. metricNamespace
  149. );
  150. }
  151. getMetricNamespaces(subscriptionId: string, resourceGroup: string, metricDefinition: string, resourceName: string) {
  152. return this.azureMonitorDatasource.getMetricNamespaces(
  153. subscriptionId,
  154. resourceGroup,
  155. metricDefinition,
  156. resourceName
  157. );
  158. }
  159. getMetricMetadata(
  160. subscriptionId: string,
  161. resourceGroup: string,
  162. metricDefinition: string,
  163. resourceName: string,
  164. metricName: string,
  165. metricNamespace?: string
  166. ) {
  167. return this.azureMonitorDatasource.getMetricMetadata(
  168. subscriptionId,
  169. resourceGroup,
  170. metricDefinition,
  171. resourceName,
  172. metricName,
  173. metricNamespace
  174. );
  175. }
  176. getResources(subscriptions: string[]) {
  177. return this.azureMonitorDatasource.getResources(subscriptions);
  178. }
  179. /* Application Insights API method */
  180. getAppInsightsMetricNames() {
  181. return this.appInsightsDatasource.getMetricNames();
  182. }
  183. getAppInsightsMetricMetadata(metricName: string) {
  184. return this.appInsightsDatasource.getMetricMetadata(metricName);
  185. }
  186. getAppInsightsColumns(refId: string | number) {
  187. return this.appInsightsDatasource.logAnalyticsColumns[refId];
  188. }
  189. /*Azure Log Analytics */
  190. getAzureLogAnalyticsWorkspaces(subscriptionId: string) {
  191. return this.azureLogAnalyticsDatasource.getWorkspaces(subscriptionId);
  192. }
  193. getSubscriptions() {
  194. return this.azureMonitorDatasource.getSubscriptions();
  195. }
  196. }