基于Docker部署基于Telegraf+Influxdb+Grafana的监控示例


一台搬瓦工小机器,用于部署 Grafana 展示监控数据;另一台部署 Influxdb 存储监控数据,Telegraf 也部署在同一台机器,Telegraf 既可以上报当前物理机的数据,也可以作为服务接收数据。

设置时区

需要保证服务器时间的统一,不然数据会查询不到。

# Ubuntu 18.04
root@dc8:~# tzselect
4
9
1
1

root@dc8:~# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 查看时间
root@dc8:~# date
Thu Jun  3 20:02:36 CST 2021

部署 Grafana 监控面板

docker run -d --name grafana -p 3000:3000 -v /etc/localtime:/etc/localtime:ro grafana/grafana:main

默认用户名及密码:admin / admin

部署 InfluxDB 数据库

# 下载镜像
docker pull influxdb:1.8-alpine

# 创建数据目录
mkdir /opt/influxdb-data

# 启动容器
docker run \
    -d \
    --name influxdb \
    -p 8086:8086 \
    -v /opt/influxdb-data:/var/lib/influxdb \
    -v /etc/localtime:/etc/localtime:ro \
    influxdb:1.8-alpine

2.0 版本

mkdir /opt/influxdb-data
mkdir /opt/influxdb
# 获取配置文件
docker run \
  --rm influxdb:2.0.6 \
  influxd print-config > /opt/influxdb/config.yml
# 启动容器
docker run \
    -d \
    --name influxdb \
    -p 8086:8086 \
    -v /opt/influxdb-data:/var/lib/influxdb2 \
    -v /opt/influxdb/config.yml:/etc/influxdb2/config.yml \
    influxdb:2.0.6

#容器创建后,web 页面初始化
http://IP:8086/

创建数据库

# 进入容器
docker exec -it influxdb /bin/bash

# 进入数据库操作终端
influx

> CREATE DATABASE mydb
> CREATE DATABASE telegraf

查看数据库

> SHOW DATABASES
name: databases
---------------
name
_internal
mydb
telegraf

安装 Telegraf

# 创建目录
mkdir /opt/telegraf

# 获取镜像
docker pull telegraf:alpine

# 获取配置
docker run --rm telegraf:alpine telegraf config > /opt/telegraf/telegraf.conf

# 修改配置文件
参考下方 telegraf.conf 配置

# 创建数据库
> CREATE DATABASE telegraf

# 启动容器,监控容器宿主机
docker run -d --name=telegraf \
    -p 8125:8125/udp \
    -v /opt/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro \
    -v /:/hostfs:ro \
    -e HOST_ETC=/hostfs/etc \
    -e HOST_PROC=/hostfs/proc \
    -e HOST_SYS=/hostfs/sys \
    -e HOST_VAR=/hostfs/var \
    -e HOST_RUN=/hostfs/run \
    -e HOST_MOUNT_PREFIX=/hostfs \
    telegraf:alpine

telegraf.conf

设置 influxdb 位置,设置内存与磁盘上报字段(CPU上报是默认开启的)

[[outputs.influxdb]]
  urls = ["http://influxdb:8086"]
  database = "telegraf"
  exclude_database_tag = true
  username = ""
  password = ""

[[inputs.statsd]]
  max_tcp_connections = 250
  tcp_keep_alive = false
  service_address = ":8125"
  delete_gauges = true
  delete_counters = true
  delete_sets = true
  delete_timings = true
  percentiles = [90.0]
  metric_separator = "."
  parse_data_dog_tags = false
  datadog_extensions = false
  allowed_pending_messages = 10000
  percentile_limit = 1000
  tagexclude = ["metric_type"]
  fielddrop = ["count", "stddev", "sum"]

[[inputs.mem]]
  fieldpass = ["used_percent", "total"]

[[inputs.disk]]
  fieldpass = ["used_percent", "total"]

配置 Grafana 面板

1,首先添加数据源,URL:http://IP:8086

2,Query Language 选择 InfluxQL(1.8版本是InfluxQL,2版本支持Flux)

3,填写刚才创建的数据库,例如创建 “telegraf” 用于存储 Telegraf 上报的本机状态信息。

4,默认 Influx 1.8 没有认证,添加后点击“Save & test” 即提示添加成功。

如果为 InfluxQL 2.0 版本的数据库,首先在 http://IP:8086/ 的 Token 页面申请 Token,然后在 Grafana 的数据源处添加数据源。

添加 Grafana Panel

InfluxQL

-- 内存
SELECT mean("used_percent") FROM "mem" WHERE $timeFilter GROUP BY time($__interval) fill(null)

-- 磁盘
SELECT mean("used_percent") FROM "disk" WHERE $timeFilter GROUP BY time($__interval) fill(null)

-- CPU
SELECT mean("usage_user") FROM "cpu" WHERE $timeFilter GROUP BY time(1m) fill(null)

(可选)为 Grafana 绑定域名

创建 Nginx 容器,统一网关及HTTPS

创建配置:/opt/nginx/grafana.conf

server {
    listen       80;
    server_name  grafana.yasking.org;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        proxy_pass http://127.0.0.1:3000;
    }
}

启动服务

sudo docker run -d --name nginx --net host -v /opt/nginx/:/etc/nginx/conf.d/ -v /etc/localtime:/etc/localtime:ro --restart=unless-stopped nginx:alpine

创建域名 A 记录指向服务器就可以通过域名访问 Grafana 查看监控数据了 http://grafana.yasking.org/

一个基本的基于 Grafana + InfluxDB + Telegraf 的示例就搭建完成了。