Alexander Zobnin 8 лет назад
Родитель
Сommit
6114f63d7c

+ 7 - 1
public/app/core/utils/version.ts

@@ -1,4 +1,6 @@
-const versionPattern = /(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-([0-9A-Za-z\.]+))?/;
+import _ from 'lodash';
+
+const versionPattern = /^(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:-([0-9A-Za-z\.]+))?/;
 
 export class SemVersion {
   major: number;
@@ -20,6 +22,10 @@ export class SemVersion {
     let compared = new SemVersion(version);
     return !(this.major < compared.major || this.minor < compared.minor || this.patch < compared.patch);
   }
+
+  isValid(): boolean {
+    return _.isNumber(this.major);
+  }
 }
 
 export function isVersionGtOrEq(a: string, b: string): boolean {

+ 15 - 1
public/app/plugins/datasource/graphite/config_ctrl.ts

@@ -2,12 +2,26 @@
 
 export class GraphiteConfigCtrl {
   static templateUrl = 'public/app/plugins/datasource/graphite/partials/config.html';
+  datasourceSrv: any;
   current: any;
 
   /** @ngInject */
-  constructor($scope) {
+  constructor($scope, datasourceSrv) {
+    this.datasourceSrv = datasourceSrv;
     this.current.jsonData = this.current.jsonData || {};
     this.current.jsonData.graphiteVersion = this.current.jsonData.graphiteVersion || '0.9';
+
+    this.autoDetectGraphiteVersion();
+  }
+
+  autoDetectGraphiteVersion() {
+    this.datasourceSrv.loadDatasource(this.current.name)
+    .then((ds) => {
+      return ds.getVersion();
+    }).then((version) => {
+      this.graphiteVersions.push({name: version, value: version});
+      this.current.jsonData.graphiteVersion = version;
+    });
   }
 
   graphiteVersions = [

+ 18 - 1
public/app/plugins/datasource/graphite/datasource.ts

@@ -2,7 +2,7 @@
 
 import _ from 'lodash';
 import * as dateMath from 'app/core/utils/datemath';
-import {isVersionGtOrEq} from 'app/core/utils/version';
+import {isVersionGtOrEq, SemVersion} from 'app/core/utils/version';
 
 /** @ngInject */
 export function GraphiteDatasource(instanceSettings, $q, backendSrv, templateSrv) {
@@ -273,6 +273,23 @@ export function GraphiteDatasource(instanceSettings, $q, backendSrv, templateSrv
     });
   };
 
+  this.getVersion = function() {
+    let httpOptions = {
+      method: 'GET',
+      url: '/version/_', // Prevent last / trimming
+    };
+
+    return this.doGraphiteRequest(httpOptions).then(results => {
+      if (results.data) {
+        let semver = new SemVersion(results.data);
+        return semver.isValid() ? results.data : '';
+      }
+      return '';
+    }).catch(() => {
+      return '';
+    });
+  };
+
   this.testDatasource = function() {
     return this.metricFindQuery('*').then(function () {
       return { status: "success", message: "Data source is working"};