datasource.ts 4.2 KB

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