1,influxDb 安装
去官网上下载deb的包,直接安装
influxDb 官网地址: https://docs.influxdata.com/influxdb/v1.2/
安装:
sudo dpkg -i influxdb_1.2.2_amd64.deb
启动:
sudo service influxdb start
influxDB 默认使用 8086和8088端口
在终端中命令行输入 influx 就进入influxdb
例:show databaes;使用
如果想使用influxDb 的web管理界面需要修改一下配置文件
influxdb 在1.2版本 web管理默认是关闭的
配置文件路径 : /etc/influxdb/influxdb.conf
编辑配置文件 将[admin]下的 #enabled = false; 和 #bind-address = ":8083"
前面的#号去掉并将enabled的值改为true
如图
重启influxdb
sudo service influxdb restart
在浏览器中输入 localhost:8083 进入web管理页面
influxdb 具体使用详见官方文档
api地址: https://docs.influxdata.com/influxdb/v1.2/tools/api/
值的一提是 influxdb 的一些名词和语法
名词:
database -> 数据库
measurement -> 数据库中的表
points -> 表里面的一条数据
points 里的数据包含3种属性 time(添加数据记录的时间 ), tags(标签,作为数据分析时的索引字段),fields(数据字段)
语法 来看下例子:
往表里插入一条数据
insert req_time,host=server1,interface=useradd value=0.03
这个语法看上去有点奇怪 req_time,host=server1,interface=useradd value=0.03
req_time : 数据表的名字
host: tag字段 (这条数据来源于server1)
interface: tag字段(这条数据是请求哪个接口生成的)
value:filed字段(存的数据的值)
存入数据表里时会加上一个当前的时间字段
这是influxDB储存数据所采用的是Line Protocol格式
详细文档地址: https://docs.influxdata.com/influxdb/v1.2/write_protocols/line_protocol_tutorial/
如图:
2. grafana的安装
和安装influxDB一样 在官网下安装包使用dpkg命令安装就行以
官网地址: grafana.com
安装后启动
sudo service grafana-server start
grafana使用的3000端口在浏览输入
http://localhost:3000
默认的用户名和密码都是admin
登录后配置influxdb数据库
data source:
其它功能自已摸索
往influxDB中插入一些测试数据
插入数据的例子在下文会提到(go语言)
示例图:
3.go写的一个influxDB添加和查询demo
package main
import (
"fmt"
"github.com/franela/goreq"
"io/ioutil"
"math/rand"
"net/url"
"time"
)
var (
host = "http://localhost:8086" //influxDb 连接
mydb = "testDb" //数据库名
measurement = "req_time" //表名
)
func main() {
//每2秒插入一条数据
for {
addFunc()
time.Sleep(2 * time.Second)
}
//getFunc()
//var c = make(chan bool)
//c <- true
}
//添加数据
func addFunc() {
pn := getRandNum()
var _h string = "server2"
if pn > 75 {
_h = "server1"
}
//插入数据
url := host + "/write?db=" + mydb
//host和interface为Tag value是filed
param := measurement + ",host=" + _h + ",interface=userdel value=" + fmt.Sprintf("%d", pn)
byteParam := []byte(param)
req, rErr := goreq.Request{
Uri: url,
Method: "POST",
Accept: "application/json",
Timeout: 3 * time.Second,
Body: byteParam,
}.Do()
if rErr != nil {
fmt.Println(rErr.Error())
}
defer req.Body.Close()
resBody, rsErr := ioutil.ReadAll(req.Body)
if rsErr != nil {
fmt.Println("--222----", rsErr.Error())
}
fmt.Println(resBody, req.Status)
fmt.Println(url)
fmt.Println(param)
}
//获取数据
func getFunc() {
ql := "q=select * from " + measurement
encodeQl, _ := url.Parse(ql)
requrl := host + "/query?db=" + mydb + "&" + encodeQl.String()
gReq, gErr := goreq.Request{
Uri: requrl,
Method: "GET",
Timeout: 3 * time.Second,
}.Do()
if gErr != nil {
fmt.Println(gErr.Error())
}
defer gReq.Body.Close()
reqBoby, reqErr := ioutil.ReadAll(gReq.Body)
if reqErr != nil {
fmt.Println(reqErr.Error())
}
fmt.Println(gReq.Status)
fmt.Println(string(reqBoby))
fmt.Println(encodeQl)
}
//取一个随机数
func getRandNum() int {
RGET:
s2 := rand.NewSource(time.Now().UnixNano())
r2 := rand.New(s2)
t := r2.Intn(100)
if t < 60 {
goto RGET
}
return t
}
运行结果: