datasource.ts 4.2 KB

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