grafana+TDengine实现物联网采集数据图表显示

先来两个官方文档:
https://www.taosdata.com/cn/documentation/connections-with-other-tools/#Grafana
https://grafana.com/docs/grafana/latest/

grafana安装

有很多种安装方式,这里采用比较省事的方式,要尝试其他方式请参考官网

  1. 下载
wget https://dl.grafana.com/oss/release/grafana-7.3.5.linux-amd64.tar.gz
  1. 解压
tar -xzvf grafana-7.3.5.linux-amd64.tar.gz
  1. 运行
cd grafana-7.3.5/
cd bin
./grafana-server 

至此已经成功的跑起来一个grafana,打开浏览器,访问http端口3000,http://192.168.137.164:3000
默认用户名:admin,密码也是:admin
在这里插入图片描述
嗯,界面还是感觉很酷的。

TDengine安装

  1. 下载
    https://www.taosdata.com/download/download.php?key=$2y 10 10 10lTACLBcR68nBkt5.Ki90nuWS9/e3HAHJ0MlpU6XVp0RCN2Tc9G3Hi&[email protected]&pkg=tdengine_tar&pkgIndex=-
    2.解压
tar -zxvf TDengine-server-2.0.9.0-Linux-x64.tar.gz

3.安装

执行解压出来的目录里面的install.sh脚本

sudo ./install.sh

顺便提下,卸载的时候执行:rmtaos 这个命令就可以了

至此TDengine已经安装好了,我们可以用taos命令进入数据库进行操作了(服务端安装时默认安装了客户端的)

在grafana中安装TDengine插件

  1. 将TDengine安装包目录里面的grafana插件目录整个拷贝到grafana的插件目录中去
cd /opt/grafana/grafana-7.3.5/data/plugins
cp -r /opt/taos/TDengine-server-2.0.9.0/connector/grafanaplugin/ ./TDengine

这里重名了以下,以方便以后安装其他插件的话,好区分
具体插件拷贝到什么位置,可以看配置文件(默认:conf/default.ini)中指定。
或者启动参数中指定,例如:
./grafana-server --homepath=/usr/share/grafana --config=/etc/grafana/grafana.ini --packaging=docker cfg:default.log.mode=console cfg:default.paths.data=/var/lib/grafana 这里指定了data目录是/var/lib/grafana,那么插件就应该拷贝到/var/lib/grafana/plugins这个目录下

  1. 重启grafana服务
    Ctrl + c停止(或者杀掉grafana进程),然后使用./grafana-server 这个命令启动

  2. 配置grafana的数据源为TDengine

在这里插入图片描述
在grafana的网页界面中点击设置按钮选择 Data Sources

在这里插入图片描述
点击Add data source添加数据源

在这里插入图片描述
找到TDengine,点击select

在这里插入图片描述
输入host:http://localhost:6041,这里需要注意的是:端口是6041而不是客户端连接使用的6030
user和password默认就好了
点击 Save & Test保存就Ok了

至此grafana TDengine数据源就配置好了

在TDengine中创建表并写入几条数据

  1. 用客户端连上TDengine
  2. 创建数据库
CREATE DATABASE power KEEP 365 DAYS 10 BLOCKS 4 UPDATE 1;

创建一个名为power的库,这个库的数据将保留365天(超过365天将被自动删除),每10天一个数据文件,内存块数为4,允许更新数据

  1. 切换到刚创建的库
USE power;  
  1. 创建超级表
CREATE TABLE sensor (ts timestamp, temp float, humi float) TAGS (location binary(64), groupdId int);

第一列必须为时间戳(示例中为ts),其他列为采集的物理量(示例中为temp, humi),数据类型可以为整型、浮点型、字符串等。
超级表定义了一类终端采集的物理量,这里我们采集温度temp和湿度humi

  1. 创建表
CREATE TABLE d1001 USING sensor TAGS ("Beijing.Chaoyang", 2);

其中d1001是表名,sensor是超级表的表名,后面紧跟标签Location的具体标签值”Beijing.Chaoyang",标签groupId的具体标签值2。
一个表对应一个终端,一个表存储一个终端采集的数据,通过tags来标识出不同的终端

  1. 插入几条数据
insert into d1001 values (now,12.01,34);

很简单,和常用的sql基本一致

在grafana中创建dashboard以展示数据

在这里插入图片描述
点击加号和Create

在这里插入图片描述
点击 Add new panel

在这里插入图片描述
选择数据源,这里选择刚刚添加的TDengine数据源

在这里插入图片描述
这里输入数据查询语句
select ts,temp from power.d1001 where ts >= $from and ts < $to
注意这里一定是查询时间和要展示的物理量(即ts,temp),这是展示温度。
from、to 和 interval 为 TDengine插件的内置变量,表示从Grafana插件面板获取的查询范围和时间间隔

在这里插入图片描述
这里设置物理量展示的名称和单位

在这里插入图片描述
这里设置显示数据的时间范围、刷新数据、设置自动刷新的时间间隔

至此,我们已经将TDengine存储的数据用grafana展示出来了。

数据采集存储

TDengine提供了多种SDK,我们可以使用这些SDK将终端采集到的数据存储到TDengine相应的数据表中去,这里我们使用RESTful Connector来存储数据到TDengine。
官方文档:https://www.taosdata.com/cn/documentation/connector/#RESTful-Connector
先看代码:

func InsertToDtEngine(temp interface{
    
    }, humi float32) (string, error) {
    
    
	//http://192.168.137.164:6041/rest/sql
	//insert into power.d1001 values (now,12.4,0);

	sqltr:="insert into power.d1001 values (now,"+fmt.Sprint(temp)+","+fmt.Sprint(humi)+");"

	logrus.Debug(sqltr)
	req, err := http.NewRequest("POST", "http://192.168.137.164:6041/rest/sql", bytes.NewBuffer([]byte(sqltr)))
	if err != nil {
    
    
		logrus.Error(err)
		return "", err
	}
	req.SetBasicAuth("root","taosdata")
	req.Close = true
	cli := createCli()
	resp, er := cli.Do(req)
	if er != nil {
    
    
		logrus.Error(er)
		return "", er
	}
	if resp.StatusCode < 200 || resp.StatusCode >=300  {
    
    
		logrus.Error(fmt.Sprintf("statusCode:%v",resp.StatusCode))
		return "",errors.New(fmt.Sprintf("statusCode:%v",resp.StatusCode))
	}
	defer resp.Body.Close()
	respBytes, errr := ioutil.ReadAll(resp.Body)
	if errr != nil {
    
    
		logrus.Error(errr)
		return "", errr
	}
	str := string(respBytes)
	logrus.Debugf(fmt.Sprintf("Post url[%v] -> req[%v] -> rsp[%v]","http://192.168.137.164:6041/rest/sql", sqltr, str))
	return str, nil

}

这个方法使用go的http包里面相关工具来调用TDengine的restful接口。
sqltr:=“insert into power.d1001 values (now,”+fmt.Sprint(temp)+","+fmt.Sprint(humi)+");" 这是插入数据的sql,需要注意的是表名前加上数据库名
req.SetBasicAuth(“root”,“taosdata”) 这里表示使用Basic认证
http://192.168.137.164:6041/rest/sql 这是提交sql语句的restful接口

最后我们来模拟一下实时采集到数据:

r := rand.New(rand.NewSource(time.Now().UnixNano()))
	for {
    
    
		enthandler.InsertToDtEngine(r.Intn(100),4.5)//测试
		time.Sleep(1 * time.Second)
	}

好了,至此,我们就可以在grafana的网页上看到实时采集到的设备物理量的一个展示了。

总结

1、TDengine提供的grafana插件一定要拷贝到正确的grafana目录里面去。
2、在添加dashboard时,编写sql一定要注意查询出来的结果应该是两列,即时间和要展示的物理量。
3、这里只是做了一个简单的demo,更多的功能特性还需要探索。

猜你喜欢

转载自blog.csdn.net/m0_46455711/article/details/111159429