datasource.ts 3.8 KB

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