datasource.ts 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. import _ from 'lodash';
  2. import ResponseParser from './response_parser';
  3. import MysqlQuery from 'app/plugins/datasource/mysql/mysql_query';
  4. import { BackendSrv } from 'app/core/services/backend_srv';
  5. import { IQService } from 'angular';
  6. import { TemplateSrv } from 'app/features/templating/template_srv';
  7. import { TimeSrv } from 'app/features/dashboard/services/TimeSrv';
  8. export class MysqlDatasource {
  9. id: any;
  10. name: any;
  11. responseParser: ResponseParser;
  12. queryModel: MysqlQuery;
  13. interval: string;
  14. /** @ngInject */
  15. constructor(
  16. instanceSettings: any,
  17. private backendSrv: BackendSrv,
  18. private $q: IQService,
  19. private templateSrv: TemplateSrv,
  20. private timeSrv: TimeSrv
  21. ) {
  22. this.name = instanceSettings.name;
  23. this.id = instanceSettings.id;
  24. this.responseParser = new ResponseParser(this.$q);
  25. this.queryModel = new MysqlQuery({});
  26. this.interval = (instanceSettings.jsonData || {}).timeInterval || '1m';
  27. }
  28. interpolateVariable = (value: string, variable: any) => {
  29. if (typeof value === 'string') {
  30. if (variable.multi || variable.includeAll) {
  31. return this.queryModel.quoteLiteral(value);
  32. } else {
  33. return value;
  34. }
  35. }
  36. if (typeof value === 'number') {
  37. return value;
  38. }
  39. const quotedValues = _.map(value, (v: any) => {
  40. return this.queryModel.quoteLiteral(v);
  41. });
  42. return quotedValues.join(',');
  43. };
  44. query(options: any) {
  45. const queries = _.filter(options.targets, target => {
  46. return target.hide !== true;
  47. }).map(target => {
  48. const queryModel = new MysqlQuery(target, this.templateSrv, options.scopedVars);
  49. return {
  50. refId: target.refId,
  51. intervalMs: options.intervalMs,
  52. maxDataPoints: options.maxDataPoints,
  53. datasourceId: this.id,
  54. rawSql: queryModel.render(this.interpolateVariable as any),
  55. format: target.format,
  56. };
  57. });
  58. if (queries.length === 0) {
  59. return this.$q.when({ data: [] });
  60. }
  61. return this.backendSrv
  62. .datasourceRequest({
  63. url: '/api/tsdb/query',
  64. method: 'POST',
  65. data: {
  66. from: options.range.from.valueOf().toString(),
  67. to: options.range.to.valueOf().toString(),
  68. queries: queries,
  69. },
  70. })
  71. .then(this.responseParser.processQueryResult);
  72. }
  73. annotationQuery(options: any) {
  74. if (!options.annotation.rawQuery) {
  75. return this.$q.reject({
  76. message: 'Query missing in annotation definition',
  77. });
  78. }
  79. const query = {
  80. refId: options.annotation.name,
  81. datasourceId: this.id,
  82. rawSql: this.templateSrv.replace(options.annotation.rawQuery, options.scopedVars, this.interpolateVariable),
  83. format: 'table',
  84. };
  85. return this.backendSrv
  86. .datasourceRequest({
  87. url: '/api/tsdb/query',
  88. method: 'POST',
  89. data: {
  90. from: options.range.from.valueOf().toString(),
  91. to: options.range.to.valueOf().toString(),
  92. queries: [query],
  93. },
  94. })
  95. .then((data: any) => this.responseParser.transformAnnotationResponse(options, data));
  96. }
  97. metricFindQuery(query: string, optionalOptions: any) {
  98. let refId = 'tempvar';
  99. if (optionalOptions && optionalOptions.variable && optionalOptions.variable.name) {
  100. refId = optionalOptions.variable.name;
  101. }
  102. const interpolatedQuery = {
  103. refId: refId,
  104. datasourceId: this.id,
  105. rawSql: this.templateSrv.replace(query, {}, this.interpolateVariable),
  106. format: 'table',
  107. };
  108. const range = this.timeSrv.timeRange();
  109. const data = {
  110. queries: [interpolatedQuery],
  111. from: range.from.valueOf().toString(),
  112. to: range.to.valueOf().toString(),
  113. };
  114. if (optionalOptions && optionalOptions.range && optionalOptions.range.from) {
  115. data['from'] = optionalOptions.range.from.valueOf().toString();
  116. }
  117. if (optionalOptions && optionalOptions.range && optionalOptions.range.to) {
  118. data['to'] = optionalOptions.range.to.valueOf().toString();
  119. }
  120. return this.backendSrv
  121. .datasourceRequest({
  122. url: '/api/tsdb/query',
  123. method: 'POST',
  124. data: data,
  125. })
  126. .then((data: any) => this.responseParser.parseMetricFindQueryResult(refId, data));
  127. }
  128. testDatasource() {
  129. return this.backendSrv
  130. .datasourceRequest({
  131. url: '/api/tsdb/query',
  132. method: 'POST',
  133. data: {
  134. from: '5m',
  135. to: 'now',
  136. queries: [
  137. {
  138. refId: 'A',
  139. intervalMs: 1,
  140. maxDataPoints: 1,
  141. datasourceId: this.id,
  142. rawSql: 'SELECT 1',
  143. format: 'table',
  144. },
  145. ],
  146. },
  147. })
  148. .then((res: any) => {
  149. return { status: 'success', message: 'Database Connection OK' };
  150. })
  151. .catch((err: any) => {
  152. console.log(err);
  153. if (err.data && err.data.message) {
  154. return { status: 'error', message: err.data.message };
  155. } else {
  156. return { status: 'error', message: err.status };
  157. }
  158. });
  159. }
  160. }