datasource.ts 3.6 KB

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