Merge pull request #1189 from taosdata/feature/dockerfile
ADD minidevops source file
This commit is contained in:
commit
bfe41e3361
|
@ -0,0 +1,356 @@
|
|||
{
|
||||
"annotations": {
|
||||
"list": [
|
||||
{
|
||||
"builtIn": 1,
|
||||
"datasource": "-- Grafana --",
|
||||
"enable": true,
|
||||
"hide": true,
|
||||
"iconColor": "rgba(0, 211, 255, 1)",
|
||||
"name": "Annotations & Alerts",
|
||||
"type": "dashboard"
|
||||
}
|
||||
]
|
||||
},
|
||||
"editable": true,
|
||||
"gnetId": null,
|
||||
"graphTooltip": 0,
|
||||
"id": 1,
|
||||
"links": [],
|
||||
"panels": [
|
||||
{
|
||||
"datasource": null,
|
||||
"gridPos": {
|
||||
"h": 8,
|
||||
"w": 6,
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
"id": 6,
|
||||
"options": {
|
||||
"fieldOptions": {
|
||||
"calcs": [
|
||||
"mean"
|
||||
],
|
||||
"defaults": {
|
||||
"color": {
|
||||
"mode": "thresholds"
|
||||
},
|
||||
"links": [
|
||||
{
|
||||
"title": "",
|
||||
"url": ""
|
||||
}
|
||||
],
|
||||
"mappings": [],
|
||||
"max": 100,
|
||||
"min": 0,
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green",
|
||||
"value": null
|
||||
},
|
||||
{
|
||||
"color": "red",
|
||||
"value": 80
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "percent"
|
||||
},
|
||||
"overrides": [],
|
||||
"values": false
|
||||
},
|
||||
"orientation": "auto",
|
||||
"showThresholdLabels": false,
|
||||
"showThresholdMarkers": true
|
||||
},
|
||||
"pluginVersion": "6.6.0",
|
||||
"targets": [
|
||||
{
|
||||
"refId": "A",
|
||||
"sql": "select last_row(value) from telegraf.mem where field=\"used_percent\""
|
||||
}
|
||||
],
|
||||
"timeFrom": null,
|
||||
"timeShift": null,
|
||||
"title": "Memory used percent",
|
||||
"type": "gauge"
|
||||
},
|
||||
{
|
||||
"aliasColors": {},
|
||||
"bars": false,
|
||||
"dashLength": 10,
|
||||
"dashes": false,
|
||||
"datasource": null,
|
||||
"fill": 1,
|
||||
"fillGradient": 0,
|
||||
"gridPos": {
|
||||
"h": 8,
|
||||
"w": 12,
|
||||
"x": 6,
|
||||
"y": 0
|
||||
},
|
||||
"hiddenSeries": false,
|
||||
"id": 8,
|
||||
"legend": {
|
||||
"avg": false,
|
||||
"current": false,
|
||||
"max": false,
|
||||
"min": false,
|
||||
"show": true,
|
||||
"total": false,
|
||||
"values": false
|
||||
},
|
||||
"lines": true,
|
||||
"linewidth": 1,
|
||||
"nullPointMode": "null",
|
||||
"options": {
|
||||
"dataLinks": []
|
||||
},
|
||||
"percentage": false,
|
||||
"pointradius": 2,
|
||||
"points": false,
|
||||
"renderer": "flot",
|
||||
"seriesOverrides": [],
|
||||
"spaceLength": 10,
|
||||
"stack": false,
|
||||
"steppedLine": false,
|
||||
"targets": [
|
||||
{
|
||||
"alias": "MEMUSED-PERCENT",
|
||||
"refId": "A",
|
||||
"sql": "select avg(value) from telegraf.mem where field=\"used_percent\" interval(1m)"
|
||||
}
|
||||
],
|
||||
"thresholds": [],
|
||||
"timeFrom": null,
|
||||
"timeRegions": [],
|
||||
"timeShift": null,
|
||||
"title": "MEM",
|
||||
"tooltip": {
|
||||
"shared": true,
|
||||
"sort": 0,
|
||||
"value_type": "individual"
|
||||
},
|
||||
"type": "graph",
|
||||
"xaxis": {
|
||||
"buckets": null,
|
||||
"mode": "time",
|
||||
"name": null,
|
||||
"show": true,
|
||||
"values": []
|
||||
},
|
||||
"yaxes": [
|
||||
{
|
||||
"format": "short",
|
||||
"label": null,
|
||||
"logBase": 1,
|
||||
"max": null,
|
||||
"min": null,
|
||||
"show": true
|
||||
},
|
||||
{
|
||||
"format": "short",
|
||||
"label": null,
|
||||
"logBase": 1,
|
||||
"max": null,
|
||||
"min": null,
|
||||
"show": true
|
||||
}
|
||||
],
|
||||
"yaxis": {
|
||||
"align": false,
|
||||
"alignLevel": null
|
||||
}
|
||||
},
|
||||
{
|
||||
"datasource": null,
|
||||
"gridPos": {
|
||||
"h": 3,
|
||||
"w": 18,
|
||||
"x": 0,
|
||||
"y": 8
|
||||
},
|
||||
"id": 10,
|
||||
"options": {
|
||||
"displayMode": "lcd",
|
||||
"fieldOptions": {
|
||||
"calcs": [
|
||||
"mean"
|
||||
],
|
||||
"defaults": {
|
||||
"mappings": [],
|
||||
"thresholds": {
|
||||
"mode": "absolute",
|
||||
"steps": [
|
||||
{
|
||||
"color": "green",
|
||||
"value": null
|
||||
}
|
||||
]
|
||||
},
|
||||
"unit": "percent"
|
||||
},
|
||||
"overrides": [],
|
||||
"values": false
|
||||
},
|
||||
"orientation": "auto",
|
||||
"showUnfilled": true
|
||||
},
|
||||
"pluginVersion": "6.6.0",
|
||||
"targets": [
|
||||
{
|
||||
"alias": "CPU-SYS",
|
||||
"refId": "A",
|
||||
"sql": "select last_row(value) from telegraf.cpu where field=\"usage_system\""
|
||||
},
|
||||
{
|
||||
"alias": "CPU-IDLE",
|
||||
"refId": "B",
|
||||
"sql": "select last_row(value) from telegraf.cpu where field=\"usage_idle\""
|
||||
},
|
||||
{
|
||||
"alias": "CPU-USER",
|
||||
"refId": "C",
|
||||
"sql": "select last_row(value) from telegraf.cpu where field=\"usage_user\""
|
||||
}
|
||||
],
|
||||
"timeFrom": null,
|
||||
"timeShift": null,
|
||||
"title": "CPU-USED",
|
||||
"type": "bargauge"
|
||||
},
|
||||
{
|
||||
"aliasColors": {},
|
||||
"bars": false,
|
||||
"dashLength": 10,
|
||||
"dashes": false,
|
||||
"datasource": "TDengine",
|
||||
"description": "General CPU monitor",
|
||||
"fill": 1,
|
||||
"fillGradient": 0,
|
||||
"gridPos": {
|
||||
"h": 9,
|
||||
"w": 18,
|
||||
"x": 0,
|
||||
"y": 11
|
||||
},
|
||||
"hiddenSeries": false,
|
||||
"id": 2,
|
||||
"legend": {
|
||||
"avg": false,
|
||||
"current": false,
|
||||
"max": false,
|
||||
"min": false,
|
||||
"show": true,
|
||||
"total": false,
|
||||
"values": false
|
||||
},
|
||||
"lines": true,
|
||||
"linewidth": 1,
|
||||
"nullPointMode": "null",
|
||||
"options": {
|
||||
"dataLinks": []
|
||||
},
|
||||
"percentage": false,
|
||||
"pointradius": 2,
|
||||
"points": false,
|
||||
"renderer": "flot",
|
||||
"seriesOverrides": [],
|
||||
"spaceLength": 10,
|
||||
"stack": false,
|
||||
"steppedLine": false,
|
||||
"targets": [
|
||||
{
|
||||
"alias": "CPU-USER",
|
||||
"refId": "A",
|
||||
"sql": "select avg(value) from telegraf.cpu where field=\"usage_user\" and cpu=\"cpu-total\" interval(1m)"
|
||||
},
|
||||
{
|
||||
"alias": "CPU-SYS",
|
||||
"refId": "B",
|
||||
"sql": "select avg(value) from telegraf.cpu where field=\"usage_system\" and cpu=\"cpu-total\" interval(1m)"
|
||||
},
|
||||
{
|
||||
"alias": "CPU-IDLE",
|
||||
"refId": "C",
|
||||
"sql": "select avg(value) from telegraf.cpu where field=\"usage_idle\" and cpu=\"cpu-total\" interval(1m)"
|
||||
}
|
||||
],
|
||||
"thresholds": [],
|
||||
"timeFrom": null,
|
||||
"timeRegions": [],
|
||||
"timeShift": null,
|
||||
"title": "CPU",
|
||||
"tooltip": {
|
||||
"shared": true,
|
||||
"sort": 0,
|
||||
"value_type": "individual"
|
||||
},
|
||||
"type": "graph",
|
||||
"xaxis": {
|
||||
"buckets": null,
|
||||
"mode": "time",
|
||||
"name": null,
|
||||
"show": true,
|
||||
"values": []
|
||||
},
|
||||
"yaxes": [
|
||||
{
|
||||
"format": "short",
|
||||
"label": null,
|
||||
"logBase": 1,
|
||||
"max": null,
|
||||
"min": null,
|
||||
"show": true
|
||||
},
|
||||
{
|
||||
"format": "short",
|
||||
"label": null,
|
||||
"logBase": 1,
|
||||
"max": null,
|
||||
"min": null,
|
||||
"show": true
|
||||
}
|
||||
],
|
||||
"yaxis": {
|
||||
"align": false,
|
||||
"alignLevel": null
|
||||
}
|
||||
}
|
||||
],
|
||||
"refresh": "10s",
|
||||
"schemaVersion": 22,
|
||||
"style": "dark",
|
||||
"tags": [
|
||||
"demo"
|
||||
],
|
||||
"templating": {
|
||||
"list": []
|
||||
},
|
||||
"time": {
|
||||
"from": "now-3h",
|
||||
"to": "now"
|
||||
},
|
||||
"timepicker": {
|
||||
"refresh_intervals": [
|
||||
"5s",
|
||||
"10s",
|
||||
"30s",
|
||||
"1m",
|
||||
"5m",
|
||||
"15m",
|
||||
"30m",
|
||||
"1h",
|
||||
"2h",
|
||||
"1d"
|
||||
]
|
||||
},
|
||||
"timezone": "",
|
||||
"title": "TDengineDashboardDemo",
|
||||
"uid": "2lF1wNUWz",
|
||||
"version": 4
|
||||
}
|
|
@ -0,0 +1,72 @@
|
|||
TDengine Datasource - build by Taosdata Inc. www.taosdata.com
|
||||
|
||||
TDengine backend server implement 2 urls:
|
||||
|
||||
* `/heartbeat` return 200 ok. Used for "Test connection" on the datasource config page.
|
||||
* `/query` return data based on input sqls.
|
||||
|
||||
## Installation
|
||||
|
||||
To install this plugin:
|
||||
Copy the data source you want to /var/lib/grafana/plugins/. Then restart grafana-server. The new data source should now be available in the data source type dropdown in the Add Data Source View.
|
||||
|
||||
```
|
||||
cp -r <tdengine-extrach-dir>/connector/grafana/tdengine /var/lib/grafana/plugins/
|
||||
sudo service grafana-server restart
|
||||
```
|
||||
|
||||
### Query API
|
||||
|
||||
Example request
|
||||
``` javascript
|
||||
[{
|
||||
"refId": "A",
|
||||
"alias": "taosd-memory",
|
||||
"sql": "select avg(mem_taosd) from sys.dn where ts > now-5m and ts < now interval(500a)"
|
||||
},
|
||||
{
|
||||
"refId": "B",
|
||||
"alias": "system-memory",
|
||||
"sql": "select avg(mem_system) from sys.dn where ts > now-5m and ts < now interval(500a)"
|
||||
}]
|
||||
```
|
||||
|
||||
Example response
|
||||
``` javascript
|
||||
[{
|
||||
"datapoints": [
|
||||
[206.488281, 1538137825000],
|
||||
[206.488281, 1538137855000],
|
||||
[206.488281, 1538137885500],
|
||||
[210.609375, 1538137915500],
|
||||
[210.867188, 1538137945500]
|
||||
],
|
||||
"refId": "A",
|
||||
"target": "taosd-memory"
|
||||
},
|
||||
{
|
||||
"datapoints": [
|
||||
[2910.218750, 1538137825000],
|
||||
[2912.265625, 1538137855000],
|
||||
[2912.437500, 1538137885500],
|
||||
[2916.644531, 1538137915500],
|
||||
[2917.066406, 1538137945500]
|
||||
],
|
||||
"refId": "B",
|
||||
"target": "system-memory"
|
||||
}]
|
||||
```
|
||||
|
||||
### Heartbeat API
|
||||
|
||||
Example request
|
||||
``` javascript
|
||||
<null> get request
|
||||
```
|
||||
|
||||
Example response
|
||||
``` javascript
|
||||
{
|
||||
"message": "Grafana server receive a quest from you!"
|
||||
}
|
||||
```
|
|
@ -0,0 +1,3 @@
|
|||
.generic-datasource-query-row .query-keyword {
|
||||
width: 75px;
|
||||
}
|
|
@ -0,0 +1,170 @@
|
|||
'use strict';
|
||||
|
||||
System.register(['lodash'], function (_export, _context) {
|
||||
"use strict";
|
||||
var _, _createClass, GenericDatasource;
|
||||
|
||||
function strTrim(str) {
|
||||
return str.replace(/^\s+|\s+$/gm,'');
|
||||
}
|
||||
|
||||
function _classCallCheck(instance, Constructor) {
|
||||
if (!(instance instanceof Constructor)) {
|
||||
throw new TypeError("Cannot call a class as a function");
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
setters: [function (_lodash) {
|
||||
_ = _lodash.default;
|
||||
}],
|
||||
execute: function () {
|
||||
_createClass = function () {
|
||||
function defineProperties(target, props) {
|
||||
for (var i = 0; i < props.length; i++) {
|
||||
var descriptor = props[i];
|
||||
descriptor.enumerable = descriptor.enumerable || false;
|
||||
descriptor.configurable = true;
|
||||
if ("value" in descriptor) descriptor.writable = true;
|
||||
Object.defineProperty(target, descriptor.key, descriptor);
|
||||
}
|
||||
}
|
||||
|
||||
return function (Constructor, protoProps, staticProps) {
|
||||
if (protoProps) defineProperties(Constructor.prototype, protoProps);
|
||||
if (staticProps) defineProperties(Constructor, staticProps);
|
||||
return Constructor;
|
||||
};
|
||||
}();
|
||||
|
||||
_export('GenericDatasource', GenericDatasource = function () {
|
||||
function GenericDatasource(instanceSettings, $q, backendSrv, templateSrv) {
|
||||
_classCallCheck(this, GenericDatasource);
|
||||
|
||||
this.type = instanceSettings.type;
|
||||
this.url = instanceSettings.url;
|
||||
this.name = instanceSettings.name;
|
||||
this.q = $q;
|
||||
this.backendSrv = backendSrv;
|
||||
this.templateSrv = templateSrv;
|
||||
//this.withCredentials = instanceSettings.withCredentials;
|
||||
this.headers = { 'Content-Type': 'application/json' };
|
||||
var taosuser = instanceSettings.jsonData.user;
|
||||
var taospwd = instanceSettings.jsonData.password;
|
||||
if (taosuser == null || taosuser == undefined || taosuser == "") {
|
||||
taosuser = "root";
|
||||
}
|
||||
if (taospwd == null || taospwd == undefined || taospwd == "") {
|
||||
taospwd = "taosdata";
|
||||
}
|
||||
|
||||
this.headers.Authorization = "Basic " + this.encode(taosuser + ":" + taospwd);
|
||||
}
|
||||
|
||||
_createClass(GenericDatasource, [{
|
||||
key: 'encode',
|
||||
value: function encode(input) {
|
||||
var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
|
||||
var output = "";
|
||||
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
|
||||
var i = 0;
|
||||
while (i < input.length) {
|
||||
chr1 = input.charCodeAt(i++);
|
||||
chr2 = input.charCodeAt(i++);
|
||||
chr3 = input.charCodeAt(i++);
|
||||
enc1 = chr1 >> 2;
|
||||
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
|
||||
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
|
||||
enc4 = chr3 & 63;
|
||||
if (isNaN(chr2)) {
|
||||
enc3 = enc4 = 64;
|
||||
} else if (isNaN(chr3)) {
|
||||
enc4 = 64;
|
||||
}
|
||||
output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
}, {
|
||||
key: 'generateSql',
|
||||
value: function generateSql(sql, queryStart, queryEnd, intervalMs) {
|
||||
if (queryStart == undefined || queryStart == null) {
|
||||
queryStart = "now-1h";
|
||||
}
|
||||
if (queryEnd == undefined || queryEnd == null) {
|
||||
queryEnd = "now";
|
||||
}
|
||||
if (intervalMs == undefined || intervalMs == null) {
|
||||
intervalMs = "20000";
|
||||
}
|
||||
|
||||
intervalMs += "a";
|
||||
sql = sql.replace(/^\s+|\s+$/gm, '');
|
||||
sql = sql.replace("$from", "'" + queryStart + "'");
|
||||
sql = sql.replace("$begin", "'" + queryStart + "'");
|
||||
sql = sql.replace("$to", "'" + queryEnd + "'");
|
||||
sql = sql.replace("$end", "'" + queryEnd + "'");
|
||||
sql = sql.replace("$interval", intervalMs);
|
||||
|
||||
return sql;
|
||||
}
|
||||
}, {
|
||||
key: 'query',
|
||||
value: function query(options) {
|
||||
var querys = new Array;
|
||||
for (var i = 0; i < options.targets.length; ++i) {
|
||||
var query = new Object;
|
||||
|
||||
query.refId = options.targets[i].refId;
|
||||
query.alias = options.targets[i].alias;
|
||||
if (query.alias == null || query.alias == undefined) {
|
||||
query.alias = "";
|
||||
}
|
||||
|
||||
//query.sql = this.generateSql(options.targets[i].sql, options.range.raw.from, options.range.raw.to, options.intervalMs);
|
||||
query.sql = this.generateSql(options.targets[i].sql, options.range.from.toISOString(), options.range.to.toISOString(), options.intervalMs);
|
||||
console.log(query.sql);
|
||||
|
||||
querys.push(query);
|
||||
}
|
||||
|
||||
if (querys.length <= 0) {
|
||||
return this.q.when({ data: [] });
|
||||
}
|
||||
|
||||
return this.doRequest({
|
||||
url: this.url + '/grafana/query',
|
||||
data: querys,
|
||||
method: 'POST'
|
||||
});
|
||||
}
|
||||
}, {
|
||||
key: 'testDatasource',
|
||||
value: function testDatasource() {
|
||||
return this.doRequest({
|
||||
url: this.url + '/grafana/heartbeat',
|
||||
method: 'GET'
|
||||
}).then(function (response) {
|
||||
if (response.status === 200) {
|
||||
return { status: "success", message: "TDengine Data source is working", title: "Success" };
|
||||
}
|
||||
});
|
||||
}
|
||||
}, {
|
||||
key: 'doRequest',
|
||||
value: function doRequest(options) {
|
||||
options.headers = this.headers;
|
||||
//console.log(options);
|
||||
return this.backendSrv.datasourceRequest(options);
|
||||
}
|
||||
}]);
|
||||
|
||||
return GenericDatasource;
|
||||
}());
|
||||
|
||||
_export('GenericDatasource', GenericDatasource);
|
||||
}
|
||||
};
|
||||
});
|
||||
//# sourceMappingURL=datasource.js.map
|
Binary file not shown.
After Width: | Height: | Size: 3.1 KiB |
|
@ -0,0 +1,51 @@
|
|||
'use strict';
|
||||
|
||||
System.register(['./datasource', './query_ctrl'], function (_export, _context) {
|
||||
"use strict";
|
||||
|
||||
var GenericDatasource, GenericDatasourceQueryCtrl, GenericConfigCtrl, GenericQueryOptionsCtrl, GenericAnnotationsQueryCtrl;
|
||||
|
||||
function _classCallCheck(instance, Constructor) {
|
||||
if (!(instance instanceof Constructor)) {
|
||||
throw new TypeError("Cannot call a class as a function");
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
setters: [function (_datasource) {
|
||||
GenericDatasource = _datasource.GenericDatasource;
|
||||
}, function (_query_ctrl) {
|
||||
GenericDatasourceQueryCtrl = _query_ctrl.GenericDatasourceQueryCtrl;
|
||||
}],
|
||||
execute: function () {
|
||||
_export('ConfigCtrl', GenericConfigCtrl = function GenericConfigCtrl() {
|
||||
_classCallCheck(this, GenericConfigCtrl);
|
||||
});
|
||||
|
||||
GenericConfigCtrl.templateUrl = 'partials/config.html';
|
||||
|
||||
_export('QueryOptionsCtrl', GenericQueryOptionsCtrl = function GenericQueryOptionsCtrl() {
|
||||
_classCallCheck(this, GenericQueryOptionsCtrl);
|
||||
});
|
||||
|
||||
GenericQueryOptionsCtrl.templateUrl = 'partials/query.options.html';
|
||||
|
||||
_export('AnnotationsQueryCtrl', GenericAnnotationsQueryCtrl = function GenericAnnotationsQueryCtrl() {
|
||||
_classCallCheck(this, GenericAnnotationsQueryCtrl);
|
||||
});
|
||||
|
||||
GenericAnnotationsQueryCtrl.templateUrl = 'partials/annotations.editor.html';
|
||||
|
||||
_export('Datasource', GenericDatasource);
|
||||
|
||||
_export('QueryCtrl', GenericDatasourceQueryCtrl);
|
||||
|
||||
_export('ConfigCtrl', GenericConfigCtrl);
|
||||
|
||||
_export('QueryOptionsCtrl', GenericQueryOptionsCtrl);
|
||||
|
||||
_export('AnnotationsQueryCtrl', GenericAnnotationsQueryCtrl);
|
||||
}
|
||||
};
|
||||
});
|
||||
//# sourceMappingURL=module.js.map
|
|
@ -0,0 +1,19 @@
|
|||
<h3 class="page-heading">TDengine Connection</h3>
|
||||
|
||||
<div class="gf-form-group">
|
||||
<div class="gf-form max-width-30">
|
||||
<span class="gf-form-label width-7">Host</span>
|
||||
<input type="text" class="gf-form-input" ng-model='ctrl.current.url' placeholder="http://localhost:6020" bs-typeahead="{{['http://localhost:6020']}}" required></input>
|
||||
</div>
|
||||
|
||||
<div class="gf-form-inline">
|
||||
<div class="gf-form max-width-15">
|
||||
<span class="gf-form-label width-7">User</span>
|
||||
<input type="text" class="gf-form-input" ng-model='ctrl.current.jsonData.user' placeholder="root"></input>
|
||||
</div>
|
||||
<div class="gf-form max-width-15">
|
||||
<span class="gf-form-label width-7">Password</span>
|
||||
<input type="password" class="gf-form-input" ng-model='ctrl.current.jsonData.password' placeholder="taosdata"></input>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -0,0 +1,58 @@
|
|||
<query-editor-row query-ctrl="ctrl" can-collapse="true" >
|
||||
|
||||
<div class="gf-form-inline">
|
||||
<div class="gf-form gf-form--grow">
|
||||
<label class="gf-form-label query-keyword width-7">INPUT SQL</label>
|
||||
<input type="text" class="gf-form-input" ng-model="ctrl.target.sql" spellcheck='false' placeholder="select count(*) from sys.cpu where ts >= $from and ts < $to interval($interval)" ng-blur="ctrl.panelCtrl.refresh()" data-mode="sql"></input>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="gf-form-inline">
|
||||
<div class="gf-form-inline" ng-hide="ctrl.target.resultFormat === 'table'">
|
||||
<div class="gf-form max-width-30">
|
||||
<label class="gf-form-label query-keyword width-7">ALIAS BY</label>
|
||||
<input type="text" class="gf-form-input" ng-model="ctrl.target.alias" spellcheck='false' placeholder="Naming pattern" ng-blur="ctrl.panelCtrl.refresh()">
|
||||
</div>
|
||||
</div>
|
||||
<div class="gf-form">
|
||||
<label class="gf-form-label query-keyword" ng-click="ctrl.generateSQL()">
|
||||
GENERATE SQL
|
||||
<i class="fa fa-caret-down" ng-show="ctrl.showGenerateSQL"></i>
|
||||
<i class="fa fa-caret-right" ng-hide="ctrl.showGenerateSQL"></i>
|
||||
</label>
|
||||
</div>
|
||||
<div class="gf-form">
|
||||
<label class="gf-form-label query-keyword" ng-click="ctrl.showHelp = !ctrl.showHelp">
|
||||
SHOW HELP
|
||||
<i class="fa fa-caret-down" ng-show="ctrl.showHelp"></i>
|
||||
<i class="fa fa-caret-right" ng-hide="ctrl.showHelp"></i>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="gf-form" ng-show="ctrl.showGenerateSQL">
|
||||
<pre class="gf-form-pre">{{ctrl.lastGenerateSQL}}</pre>
|
||||
</div>
|
||||
|
||||
<div class="gf-form" ng-show="ctrl.showHelp">
|
||||
<pre class="gf-form-pre alert alert-info">Use any SQL that can return Resultset such as:
|
||||
- [[timestamp1, value1], [timestamp2, value2], ... ]
|
||||
|
||||
Macros:
|
||||
- $from -> start timestamp of panel
|
||||
- $to -> stop timestamp of panel
|
||||
- $interval -> interval of panel
|
||||
|
||||
Example of SQL:
|
||||
SELECT count(*)
|
||||
FROM db.table
|
||||
WHERE ts > $from and ts < $to
|
||||
INTERVAL ($interval)
|
||||
</pre>
|
||||
</div>
|
||||
|
||||
<div class="gf-form" ng-show="ctrl.lastQueryError">
|
||||
<pre class="gf-form-pre alert alert-error">{{ctrl.lastQueryError}}</pre>
|
||||
</div>
|
||||
|
||||
</query-editor-row>
|
|
@ -0,0 +1,32 @@
|
|||
{
|
||||
"name": "TDengine",
|
||||
"id": "tdengine",
|
||||
"type": "datasource",
|
||||
|
||||
"partials": {
|
||||
"config": "partials/config.html"
|
||||
},
|
||||
|
||||
"metrics": true,
|
||||
"annotations": false,
|
||||
"alerting": true,
|
||||
|
||||
"info": {
|
||||
"description": "TDengine datasource",
|
||||
"author": {
|
||||
"name": "Taosdata Inc.",
|
||||
"url": "https://www.taosdata.com"
|
||||
},
|
||||
"logos": {
|
||||
"small": "img/taosdata_logo.png",
|
||||
"large": "img/taosdata_logo.png"
|
||||
},
|
||||
"version": "1.6.0",
|
||||
"updated": "2019-07-01"
|
||||
},
|
||||
|
||||
"dependencies": {
|
||||
"grafanaVersion": "5.2.4",
|
||||
"plugins": [ ]
|
||||
}
|
||||
}
|
|
@ -0,0 +1,91 @@
|
|||
'use strict';
|
||||
|
||||
System.register(['app/plugins/sdk'], function (_export, _context) {
|
||||
"use strict";
|
||||
|
||||
var QueryCtrl, _createClass, GenericDatasourceQueryCtrl;
|
||||
|
||||
function _classCallCheck(instance, Constructor) {
|
||||
if (!(instance instanceof Constructor)) {
|
||||
throw new TypeError("Cannot call a class as a function");
|
||||
}
|
||||
}
|
||||
|
||||
function _possibleConstructorReturn(self, call) {
|
||||
if (!self) {
|
||||
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
|
||||
}
|
||||
|
||||
return call && (typeof call === "object" || typeof call === "function") ? call : self;
|
||||
}
|
||||
|
||||
function _inherits(subClass, superClass) {
|
||||
if (typeof superClass !== "function" && superClass !== null) {
|
||||
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
|
||||
}
|
||||
|
||||
subClass.prototype = Object.create(superClass && superClass.prototype, {
|
||||
constructor: {
|
||||
value: subClass,
|
||||
enumerable: false,
|
||||
writable: true,
|
||||
configurable: true
|
||||
}
|
||||
});
|
||||
if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
|
||||
}
|
||||
|
||||
return {
|
||||
setters: [function (_appPluginsSdk) {
|
||||
QueryCtrl = _appPluginsSdk.QueryCtrl;
|
||||
}, function (_cssQueryEditorCss) {}],
|
||||
execute: function () {
|
||||
_createClass = function () {
|
||||
function defineProperties(target, props) {
|
||||
for (var i = 0; i < props.length; i++) {
|
||||
var descriptor = props[i];
|
||||
descriptor.enumerable = descriptor.enumerable || false;
|
||||
descriptor.configurable = true;
|
||||
if ("value" in descriptor) descriptor.writable = true;
|
||||
Object.defineProperty(target, descriptor.key, descriptor);
|
||||
}
|
||||
}
|
||||
|
||||
return function (Constructor, protoProps, staticProps) {
|
||||
if (protoProps) defineProperties(Constructor.prototype, protoProps);
|
||||
if (staticProps) defineProperties(Constructor, staticProps);
|
||||
return Constructor;
|
||||
};
|
||||
}();
|
||||
|
||||
_export('GenericDatasourceQueryCtrl', GenericDatasourceQueryCtrl = function (_QueryCtrl) {
|
||||
_inherits(GenericDatasourceQueryCtrl, _QueryCtrl);
|
||||
|
||||
function GenericDatasourceQueryCtrl($scope, $injector) {
|
||||
_classCallCheck(this, GenericDatasourceQueryCtrl);
|
||||
|
||||
var _this = _possibleConstructorReturn(this, (GenericDatasourceQueryCtrl.__proto__ || Object.getPrototypeOf(GenericDatasourceQueryCtrl)).call(this, $scope, $injector));
|
||||
|
||||
_this.scope = $scope;
|
||||
return _this;
|
||||
}
|
||||
|
||||
_createClass(GenericDatasourceQueryCtrl, [{
|
||||
key: 'generateSQL',
|
||||
value: function generateSQL(query) {
|
||||
//this.lastGenerateSQL = this.datasource.generateSql(this.target.sql, this.panelCtrl.range.raw.from, this.panelCtrl.range.raw.to, this.panelCtrl.intervalMs);
|
||||
this.lastGenerateSQL = this.datasource.generateSql(this.target.sql, this.panelCtrl.range.from.toISOString(), this.panelCtrl.range.to.toISOString(), this.panelCtrl.intervalMs);
|
||||
this.showGenerateSQL = !this.showGenerateSQL;
|
||||
}
|
||||
}]);
|
||||
|
||||
return GenericDatasourceQueryCtrl;
|
||||
}(QueryCtrl));
|
||||
|
||||
_export('GenericDatasourceQueryCtrl', GenericDatasourceQueryCtrl);
|
||||
|
||||
GenericDatasourceQueryCtrl.templateUrl = 'partials/query.editor.html';
|
||||
}
|
||||
};
|
||||
});
|
||||
//# sourceMappingURL=query_ctrl.js.map
|
|
@ -0,0 +1,36 @@
|
|||
global:
|
||||
scrape_interval: 15s # By default, scrape targets every 15 seconds.
|
||||
|
||||
# Attach these labels to any time series or alerts when communicating with
|
||||
# external systems (federation, remote storage, Alertmanager).
|
||||
external_labels:
|
||||
monitor: 'codelab-monitor'
|
||||
|
||||
remote_write:
|
||||
- url: "http://172.15.1.7:10203/receive"
|
||||
|
||||
# A scrape configuration containing exactly one endpoint to scrape:
|
||||
# Here it's Prometheus itself.
|
||||
scrape_configs:
|
||||
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
|
||||
- job_name: 'prometheus'
|
||||
|
||||
# Override the global default and scrape targets from this job every 5 seconds.
|
||||
scrape_interval: 5s
|
||||
|
||||
static_configs:
|
||||
- targets: ['localhost:9090']
|
||||
|
||||
# - job_name: 'example-random'
|
||||
|
||||
# # Override the global default and scrape targets from this job every 5 seconds.
|
||||
# scrape_interval: 5s
|
||||
|
||||
# static_configs:
|
||||
# - targets: ['172.17.0.6:8080', '172.17.0.6:8081']
|
||||
# labels:
|
||||
# group: 'production'
|
||||
|
||||
# - targets: ['172.17.0.6:8082']
|
||||
# labels:
|
||||
# group: 'canary'
|
|
@ -0,0 +1,36 @@
|
|||
#!/bin/bash
|
||||
|
||||
#set -x
|
||||
LP=`pwd`
|
||||
#echo $LP
|
||||
|
||||
docker rm -f `docker ps -a -q`
|
||||
docker network rm minidevops
|
||||
docker network create --ip-range 172.15.1.255/24 --subnet 172.15.1.1/16 minidevops
|
||||
|
||||
#docker run -d --net="host" --pid="host" -v "/:/host:ro" quay.io/prometheus/node-exporter --path.rootfs=/host
|
||||
|
||||
docker run -d --net minidevops --ip 172.15.1.11 -v $LP/grafana:/var/lib/grafana/plugins -p 3000:3000 grafana/grafana
|
||||
#docker run -d --net minidevops --ip 172.15.1.11 -v /Users/tom/Documents/minidevops/grafana:/var/lib/grafana/plugins -p 3000:3000 grafana/grafana
|
||||
|
||||
TDENGINE=`docker run -d --net minidevops --ip 172.15.1.6 -p 6030:6030 -p 6020:6020 -p 6031:6031 -p 6032:6032 -p 6033:6033 -p 6034:6034 -p 6035:6035 -p 6036:6036 -p 6037:6037 -p 6038:6038 -p 6039:6039 tdengine/tdengine:1.6.4.5`
|
||||
docker cp /etc/localtime $TDENGINE:/etc/localtime
|
||||
|
||||
BLMPROMETHEUS=`docker run -d --net minidevops --ip 172.15.1.7 -p 10203:10203 tdengine/blm_prometheus 172.15.1.6`
|
||||
|
||||
|
||||
BLMPTELEGRAF=`docker run -d --net minidevops --ip 172.15.1.8 -p 10202:10202 tdengine/blm_telegraf 172.15.1.6`
|
||||
|
||||
docker run -d --net minidevops --ip 172.15.1.9 -v $LP/prometheus:/etc/prometheus -p 9090:9090 prom/prometheus
|
||||
#docker run -d --net minidevops --ip 172.15.1.9 -v /Users/tom/Documents/minidevops/prometheus:/etc/prometheus -p 9090:9090 prom/prometheus
|
||||
|
||||
docker run -d --net minidevops --ip 172.15.1.10 -v $LP/telegraf:/etc/telegraf -p 8092:8092 -p 8094:8094 -p 8125:8125 telegraf
|
||||
#docker run -d --net minidevops --ip 172.15.1.10 -v /Users/tom/Documents/minidevops/telegraf:/etc/telegraf -p 8092:8092 -p 8094:8094 -p 8125:8125 telegraf
|
||||
|
||||
|
||||
sleep 10
|
||||
curl -X POST http://localhost:3000/api/datasources --header "Content-Type:application/json" -u admin:admin -d '{"Name": "TDengine","Type": "tdengine","TypeLogoUrl": "public/plugins/tdengine/img/taosdata_logo.png","Access": "proxy","Url": "http://172.15.1.6:6020","BasicAuth": false,"isDefault": true,"jsonData": {},"readOnly": false}'
|
||||
|
||||
curl -X POST http://localhost:3000/api/dashboards/db --header "Content-Type:application/json" -u admin:admin -d '{"dashboard":{"annotations":{"list":[{"builtIn":1,"datasource":"-- Grafana --","enable":true,"hide":true,"iconColor":"rgba(0, 211, 255, 1)","name":"Annotations & Alerts","type":"dashboard"}]},"editable":true,"gnetId":null,"graphTooltip":0,"id":1,"links":[],"panels":[{"datasource":null,"gridPos":{"h":8,"w":6,"x":0,"y":0},"id":6,"options":{"fieldOptions":{"calcs":["mean"],"defaults":{"color":{"mode":"thresholds"},"links":[{"title":"","url":""}],"mappings":[],"max":100,"min":0,"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null},{"color":"red","value":80}]},"unit":"percent"},"overrides":[],"values":false},"orientation":"auto","showThresholdLabels":false,"showThresholdMarkers":true},"pluginVersion":"6.6.0","targets":[{"refId":"A","sql":"select last_row(value) from telegraf.mem where field=\"used_percent\""}],"timeFrom":null,"timeShift":null,"title":"Memory used percent","type":"gauge"},{"aliasColors":{},"bars":false,"dashLength":10,"dashes":false,"datasource":null,"fill":1,"fillGradient":0,"gridPos":{"h":8,"w":12,"x":6,"y":0},"hiddenSeries":false,"id":8,"legend":{"avg":false,"current":false,"max":false,"min":false,"show":true,"total":false,"values":false},"lines":true,"linewidth":1,"nullPointMode":"null","options":{"dataLinks":[]},"percentage":false,"pointradius":2,"points":false,"renderer":"flot","seriesOverrides":[],"spaceLength":10,"stack":false,"steppedLine":false,"targets":[{"alias":"MEMUSED-PERCENT","refId":"A","sql":"select avg(value) from telegraf.mem where field=\"used_percent\" interval(1m)"}],"thresholds":[],"timeFrom":null,"timeRegions":[],"timeShift":null,"title":"MEM","tooltip":{"shared":true,"sort":0,"value_type":"individual"},"type":"graph","xaxis":{"buckets":null,"mode":"time","name":null,"show":true,"values":[]},"yaxes":[{"format":"short","label":null,"logBase":1,"max":null,"min":null,"show":true},{"format":"short","label":null,"logBase":1,"max":null,"min":null,"show":true}],"yaxis":{"align":false,"alignLevel":null}},{"datasource":null,"gridPos":{"h":3,"w":18,"x":0,"y":8},"id":10,"options":{"displayMode":"lcd","fieldOptions":{"calcs":["mean"],"defaults":{"mappings":[],"thresholds":{"mode":"absolute","steps":[{"color":"green","value":null}]},"unit":"percent"},"overrides":[],"values":false},"orientation":"auto","showUnfilled":true},"pluginVersion":"6.6.0","targets":[{"alias":"CPU-SYS","refId":"A","sql":"select last_row(value) from telegraf.cpu where field=\"usage_system\""},{"alias":"CPU-IDLE","refId":"B","sql":"select last_row(value) from telegraf.cpu where field=\"usage_idle\""},{"alias":"CPU-USER","refId":"C","sql":"select last_row(value) from telegraf.cpu where field=\"usage_user\""}],"timeFrom":null,"timeShift":null,"title":"CPU-USED","type":"bargauge"},{"aliasColors":{},"bars":false,"dashLength":10,"dashes":false,"datasource":"TDengine","description":"General CPU monitor","fill":1,"fillGradient":0,"gridPos":{"h":9,"w":18,"x":0,"y":11},"hiddenSeries":false,"id":2,"legend":{"avg":false,"current":false,"max":false,"min":false,"show":true,"total":false,"values":false},"lines":true,"linewidth":1,"nullPointMode":"null","options":{"dataLinks":[]},"percentage":false,"pointradius":2,"points":false,"renderer":"flot","seriesOverrides":[],"spaceLength":10,"stack":false,"steppedLine":false,"targets":[{"alias":"CPU-USER","refId":"A","sql":"select avg(value) from telegraf.cpu where field=\"usage_user\" and cpu=\"cpu-total\" interval(1m)"},{"alias":"CPU-SYS","refId":"B","sql":"select avg(value) from telegraf.cpu where field=\"usage_system\" and cpu=\"cpu-total\" interval(1m)"},{"alias":"CPU-IDLE","refId":"C","sql":"select avg(value) from telegraf.cpu where field=\"usage_idle\" and cpu=\"cpu-total\" interval(1m)"}],"thresholds":[],"timeFrom":null,"timeRegions":[],"timeShift":null,"title":"CPU","tooltip":{"shared":true,"sort":0,"value_type":"individual"},"type":"graph","xaxis":{"buckets":null,"mode":"time","name":null,"show":true,"values":[]},"yaxes":[{"format":"short","label":null,"logBase":1,"max":null,"min":null,"show":true},{"format":"short","label":null,"logBase":1,"max":null,"min":null,"show":true}],"yaxis":{"align":false,"alignLevel":null}}],"refresh":"10s","schemaVersion":22,"style":"dark","tags":["demo"],"templating":{"list":[]},"time":{"from":"now-3h","to":"now"},"timepicker":{"refresh_intervals":["5s","10s","30s","1m","5m","15m","30m","1h","2h","1d"]},"timezone":"","title":"TDengineDashboardDemo","id":null,"uid":null,"version":0}}'
|
||||
|
||||
#curl -X POST http://localhost:3000/api/dashboards/db --header "Content-Type:application/json" -u admin:admin -d '{"dashboard":{"annotations":{"list":[{"builtIn":1,"datasource":"-- Grafana --","enable":true,"hide":true,"iconColor":"rgba(0, 211, 255, 1)","name":"Annotations & Alerts","type":"dashboard"}]},"editable":true,"gnetId":null,"graphTooltip":0,"id":3,"links":[],"panels":[{"aliasColors":{},"bars":false,"dashLength":10,"dashes":false,"datasource":"TDengine","description":"memory used percent","fill":1,"fillGradient":0,"gridPos":{"h":8,"w":12,"x":0,"y":0},"hiddenSeries":false,"id":4,"legend":{"avg":false,"current":false,"max":false,"min":false,"show":true,"total":false,"values":false},"lines":true,"linewidth":1,"nullPointMode":"null","options":{"dataLinks":[]},"percentage":false,"pointradius":2,"points":false,"renderer":"flot","seriesOverrides":[],"spaceLength":10,"stack":false,"steppedLine":false,"targets":[{"alias":"memused-percent","refId":"A","sql":"select avg(value) from telegraf.mem where field=\"used_percent\" interval(1m)"},{"refId":"B","sql":""}],"thresholds":[],"timeFrom":null,"timeRegions":[],"timeShift":null,"title":"MEM","tooltip":{"shared":true,"sort":0,"value_type":"individual"},"type":"graph","xaxis":{"buckets":null,"mode":"time","name":null,"show":true,"values":[]},"yaxes":[{"format":"short","label":null,"logBase":1,"max":null,"min":null,"show":true},{"format":"short","label":null,"logBase":1,"max":null,"min":null,"show":true}],"yaxis":{"align":false,"alignLevel":null}},{"aliasColors":{},"bars":false,"dashLength":10,"dashes":false,"datasource":"TDengine","description":"General CPU monitor","fill":1,"fillGradient":0,"gridPos":{"h":9,"w":12,"x":0,"y":8},"hiddenSeries":false,"id":2,"legend":{"avg":false,"current":false,"max":false,"min":false,"show":true,"total":false,"values":false},"lines":true,"linewidth":1,"nullPointMode":"null","options":{"dataLinks":[]},"percentage":false,"pointradius":2,"points":false,"renderer":"flot","seriesOverrides":[],"spaceLength":10,"stack":false,"steppedLine":false,"targets":[{"alias":"CPU-USER","refId":"A","sql":"select avg(value) from telegraf.cpu where field=\"usage_user\" and cpu=\"cpu-total\" interval(1m)"},{"alias":"CPU-SYS","refId":"B","sql":"select avg(value) from telegraf.cpu where field=\"usage_system\" and cpu=\"cpu-total\" interval(1m)"},{"alias":"CPU-IDLE","refId":"C","sql":"select avg(value) from telegraf.cpu where field=\"usage_idle\" and cpu=\"cpu-total\" interval(1m)"}],"thresholds":[],"timeFrom":null,"timeRegions":[],"timeShift":null,"title":"CPU","tooltip":{"shared":true,"sort":0,"value_type":"individual"},"type":"graph","xaxis":{"buckets":null,"mode":"time","name":null,"show":true,"values":[]},"yaxes":[{"format":"short","label":null,"logBase":1,"max":null,"min":null,"show":true},{"format":"short","label":null,"logBase":1,"max":null,"min":null,"show":true}],"yaxis":{"align":false,"alignLevel":null}}],"refresh":"10s","schemaVersion":21,"style":"dark","tags":["demo"],"templating":{"list":[]},"time":{"from":"now-6h","to":"now"},"timepicker":{"refresh_intervals":["5s","10s","30s","1m","5m","15m","30m","1h","2h","1d"]},"timezone":"","title":"TDengineDashboardDemo","id":null,"uid":null,"version":0}}'
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue