初学influxdb

前言

influxDB官网:https://www.influxdata.com/

正如官网所介绍,influxDB是一个开源的时序型数据库。使用Go语言编写。主要用来查询和存储时序型数据。和Mysql和Nosql不同的是,influxDB被广泛用于存储系统的监控数据。并且可以配合一些图形化界面例如Grafana进行图形化展示。

与MYSQL的基础概念对比

概念 MYSQL influxDB
数据库 database database
table measurement
column tag

下载安装influxDB

目前官网的influxDB版本是V2版本,我下载的是V1版本。版本号是1.7.11
mac版influxdb下载
下载好之后对文件进行解压

1
tar zxvf influxdb-1.7.11_darwin_amd64.tar.gz

解压之后进入文件夹/usr/bin下启动

1
./influxd

1

启动客户端

1
./influx

2

influxDB操作和mysql相似。通过查询数据表发现里面只存在一个默认数据库_internal

3

gopsutil学习

gopsutil是一个查询系统性能数据的模块,通过go语言实现。通过安装gopsutil模块就可以实现对本机的一些参数进行查询。
小试牛刀

1
go get github.com/shirou/gopsutil

模块导入

1
2
3
4
5
6
7
8
9
import (
"fmt"
"github.com/shirou/gopsutil/cpu"
"github.com/shirou/gopsutil/disk"
"github.com/shirou/gopsutil/host"
"github.com/shirou/gopsutil/load"
"github.com/shirou/gopsutil/mem"
"github.com/shirou/gopsutil/net"
)

查询cpu信息

1
2
3
4
5
6
7
8
func getCpuInfo()  {
cpuInfos,err := cpu.Info()
if err != nil {
fmt.Printf("get cpu info failed,err:%v\n",err)
}
for _,ci := range cpuInfos {
fmt.Println(ci)
}

4

查询cpu负载

1
2
3
4
5
6
7
8
func getLoad()  {
info,err := load.Avg()
if err != nil {
fmt.Printf("load.Avg() failed,err:%v\n",err)
return
}
fmt.Println(info)
}

5

查询内存信息

1
2
3
4
func getHostInfo()  {
info,_ := host.Info()
fmt.Printf("host info:%v uptime:%v boottime:%v\n",info,info.Uptime,info.BootTime)
}

7

查询磁盘信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
func getDiskInfo()  {
//获取所有分区信息
parts,err := disk.Partitions(true)
if err != nil {
fmt.Printf("get disk Partitions failed,err:%v\n",err)
return
}
fmt.Println(parts)
for _,part := range parts {
partInfo,err := disk.Usage(part.Mountpoint)
if err != nil {
fmt.Printf("get part stat failed,err:%v\n",err)
return
}
fmt.Println(partInfo)
}

//磁盘IO
ioStat,_ := disk.IOCounters()
for k,v := range ioStat {
fmt.Printf("%v:%v\n",k,v)
}
}

8

查询网络信息

1
2
3
4
5
6
7
8
9
10
func getNetInfo()  {
netIOs,err := net.IOCounters(true)
if err != nil {
fmt.Printf("get net io counters failed,err:%v\n",err)
return
}
for _,netIO := range netIOs {
fmt.Println(netIO)
}
}

9

Go操作influxDB

安装influxdb V1版本的模块

1
go get github.com/influxdata/influxdb1-client/v2

模块导入

1
2
3
4
5
6
import (
"fmt"
client "github.com/influxdata/influxdb1-client/v2"
"log"
"time"
)

连接influxdb,V1版本端口默认为8086,V2版本端口默认为9999,用户名默认为admin,密码默认为空

1
2
3
4
5
6
7
8
9
10
11
func connInflux() client.Client {
cli,err := client.NewHTTPClient(client.HTTPConfig{
Addr: "http://127.0.0.1:8086",
Username: "admin",
Password: "",
})
if err != nil {
fmt.Println("conn err = ",err)
}
return cli
}

查询操作

这里我们查询的是test数据库。因此我们需要在数据库中手动创建一个test数据库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func queryDB(cli client.Client,cmd string) (res []client.Result,err error) {
q := client.Query{
Command: cmd,
Database: "test",
}
if response,err := cli.Query(q); err==nil {
if response.Error() != nil{
fmt.Println("response error")
}
res = response.Results
} else {
return res,err
}
return res,nil
}

10

写入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
func writesPoints(cli client.Client) {
bp, err := client.NewBatchPoints(client.BatchPointsConfig{
Database: "test",
Precision: "s", //精度,默认ns
})
if err != nil {
log.Fatal(err)
}
tags := map[string]string{"cpu": "ih-cpu"}
fields := map[string]interface{}{
"idle": 201.1,
"system": 43.3,
"user": 86.6,
}

pt, err := client.NewPoint("cpu_usage", tags, fields, time.Now())
if err != nil {
log.Fatal(err)
}
bp.AddPoint(pt)
err = cli.Write(bp)
if err != nil {
log.Fatal(err)
}
log.Println("insert success")
}

写入数据成功

11

influxDB客户端查询

12

Grafana实战

grafna下载地址:https://grafana.com/

macos下载

1
2
brew update
brew install grafana

启动grafana,默认端口是3000,访问127.0.0.1:3000即可,默认用户名和密码为admin

1
brew services start grafana

13

Grafana配置influxDB

14

实时监控cpu状态并存储influxDB中

代码如下

首先在influxdb中创建新的数据库为monitor,之后运行如下代码可以每隔1s获取cpu使用信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package main

import (
"fmt"
client "github.com/influxdata/influxdb1-client/v2"
"github.com/shirou/gopsutil/cpu"
"log"
"time"
)

var (
cli client.Client
)

func initConnInflux() (err error) {
cli,err = client.NewHTTPClient(client.HTTPConfig{
Addr: "http://127.0.0.1:8086",
Username: "admin",
Password: "",
})
return
}

func writesPoints(percent float64) {
bp, err := client.NewBatchPoints(client.BatchPointsConfig{
Database: "monitor",
Precision: "s", //精度,默认ns
})
if err != nil {
log.Fatal(err)
}
tags := map[string]string{"cpu": "cpu0"}
fields := map[string]interface{}{
"cpu_percent": percent ,
}

pt, err := client.NewPoint("cpu_percent", tags, fields, time.Now())
if err != nil {
log.Fatal(err)
}
bp.AddPoint(pt)
err = cli.Write(bp)
if err != nil {
log.Fatal(err)
}
log.Println("insert success")
}

func getCpuInfo() {
//cpu使用率
percent,_ := cpu.Percent(time.Second,false)
fmt.Printf("cpu percent:%v\n",percent)

//写入到influxdb中
writesPoints(percent[0])
//}
}

func main() {
err := initConnInflux()
if err != nil {
fmt.Printf("connect to influxdb failed,err:%v", err)
return
}

for {
getCpuInfo()
time.Sleep(time.Second)
}
}

15

Grafana展示

在dashboard中创建新的panel

16

相关配置选择如下

17

之后可以自定义面板,选择折线图或者柱状图等等,数据就会从influxdb中被展示到面板中。

18