建構 Grafana + Influxdb v2.0 + Telegraf 監控系統(docker版)

經驗談

使用過許多 Dashboard 的軟件,而 Grafana 則是非常適合用來做監控,簡單易設又能結合多種來源與告警,但在公司時,都是使用同事架好的 Grafana,初步知道是使用 Influxdb 與 Telegraf 來儲存與收集資料,所以接下來我也來架看看嘍!

作業環境

  • Ubuntu 20.04.3 LTS
  • Windows 10 專業版
  • Docker version 20.10.9
  • Grafana v8.2.1
  • Influxdb v2.0.9
  • Telegraf v1.20.2

安裝 Grafana + Influxdb v2.0 + Telegraf

安裝 Grafana v8.2.1

首先查詢官方提供的 docker image,指令為

$ docker search grafana

一般第一個就是官方提供的 Image 檔,結果如下。

$ docker search grafana
NAME                  DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
grafana/grafana       The official Grafana docker container           1999

所以我們要下載的 image 檔名是 grafana/grafana,那就來建立 Grafana 的 container 嘍!為了預防 Grafana 的資料因重建 Container 而遺失,所以我們先建立 docker volume ,指令如下

# create a persistent volume for your data in /var/lib/grafana (database and plugins)
$ docker volume create grafana-storage

# start grafana
$ docker run -d --name=grafana -v grafana-storage:/var/lib/grafana -p 3030:3000 grafana/grafana

如果沒有下載過,就會執行下載,狀態是 Status: Downloaded newer image for grafana/grafana:latest。如果已下載,則狀態是 Status: Image is up to date for grafana/grafana:latest

Note: 這裡為什麼我的本機會用 3030 port,而不是用 3000 port,是因為 BI 工具的 metabase 預設也是 3000,所以 Grafana 就另外指定 port 嘍!

檢查一下剛建的 container 是否有成功啟動,檢查語法如下。

$ docker ps -a

這時我們可以看到結果如下。

$ docker ps -a
CONTAINER ID   IMAGE                    COMMAND        CREATED         STATUS         PORTS                                                                                  NAMES
69f2cc7919a8   grafana/grafana          "/run.sh"      9 minutes ago   Up 9 minutes   0.0.0.0:3030->3000/tcp, :::3030->3000/tcp                                              grafana

狀態是 Up 的,即可開啟瀏覽器連進 Grafana 的入口頁面了,連結為 http://IP:3030,例如我剛才安裝的主機 IP 是 192.168.1.105,所以輸入 http://192.168.1.105:3030 即可。

第一次登入的預設帳密是 admin / admin,登入後會要求重新設定密碼,重設之後就可以進入如下圖的畫面了。

安裝 Influxdb v2.0.9

Influxdb 是一個開源的時序型資料庫,用來存放 Telegraf 收集的資料,用 Grafana 來做圖表的呈現。這時取得 Influxdb 的 docker image 已是 2.0.9 版了,跟 1.x 版有了一些參數的不同,接下來安裝 Influxdb 吧。

首先建立 volumn,避免 Container 重做時的資料與設定遺失,指令如下。

$ docker volume create influxdb-storage
$ docker volume create influxdb-config

如欲知道其它可參考Influxdb Official Image (Docker Hub)

另外,我打算讓 influxdb 與 telegraf 在同一個網段,所以建立一個 network 就命名為 influxdb,指令如下。

$ docker network create influxdb

安裝 influxdb 的指令如下。

$ docker run -d --name=influxdb2 -p 8086:8086 \
      --net=influxdb \
      --hostname=influxdb \
      -v influxdb-storage:/var/lib/influxdb2 \
      -v influxdb-config:/etc/influxdb2 \
      -e DOCKER_INFLUXDB_INIT_MODE=setup \
      -e DOCKER_INFLUXDB_INIT_USERNAME=dsaadmin \
      -e DOCKER_INFLUXDB_INIT_PASSWORD=dsaadmin \
      -e DOCKER_INFLUXDB_INIT_ORG=dsalearning \
      -e DOCKER_INFLUXDB_INIT_BUCKET=dsa-bucket \
      influxdb:latest

上述指令中的 USERNAME、PASSWORD、ORG、BUCKET 可以改成你自訂的, container 只要有建立成功,都會得到像下方的結果。

cdf59b175f58a3cfb904a5f7aa2cf5a652a7af8f6691759eb1f325fbd823e82b

本人在這重建了幾次,主要是 Influxdb 1.x 與 Influxdb 2.0 有不小的差異,在 telegraf.conf 的設定有些不同,所以 container id 會跟下述的範例不同。

查看 Container 是否有成功啟動

$ docker ps -a
CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS          PORTS                                                                                  NAMES
57f802619081   influxdb:latest          "/entrypoint.sh infl…"   38 minutes ago   Up 38 minutes   0.0.0.0:8086->8086/tcp, :::8086->8086/tcp                                              influxdb2
736014d092d0   grafana/grafana          "/run.sh"                24 hours ago     Up 24 hours     0.0.0.0:3030->3000/tcp, :::3030->3000/tcp                                              grafana

上述建立的 Grafana 與 Influxdb 這二個 Container 都有正常啟動,開啟瀏覽器連進 Influxdb 的入口頁面了,連結為 http://IP:8086,例如我剛才安裝的主機 IP 是 192.168.1.105,所以輸入 http://192.168.1.105:8086 即可。

在建立 Container 時,就有設定 admin 的帳密,輸入後就可以看到下列畫面。

如果沒有設定 DOCKER_INFLUXDB_INIT 的這些參數也沒關係,進到入口頁面時,也可以依指示設定的。

安裝 Telegraf v1.20.2

Telegraf 是用來收集資料並傳送給 Influxdb,主要有兩個檔,分別是 telegraf.exetelegraf.conf,下載可至官方,留意各平台的執行檔與設定檔是不同的,筆者試了下列二個平台都能正常的收集。

Linux

由於安裝的是 Influxdb v2.0 ,所以從官方下載下來的 telegraf.conf 需要再手動修改,可以參考Manually configure Telegraf

如果不是用 docker 方式,可以參考官方的 Install Telegraf,下面筆者用 docker 建立出 telegraf 的 container,指令如下。

下載 telegraf.conf,這個檔案最好放在指定的路徑,因為建立 container 時,會 volumn 這個檔案,這樣只要在本機修改 config 檔即可。

$ docker run --rm telegraf telegraf config > telegraf.conf

下載後,編輯這個檔案,指令如下。

$ nano telegraf.conf

如果你熟悉其它編輯工具也可以,如 vi

找到 [[outputs.influxdb]],修改為 [[outputs.influxdb_v2]],並維護下列四個變數,例如:

[[outputs.influxdb_v2]]
  urls = ["http://influxdb:8086"]
  token = "$INFLUX_TOKEN"
  organization = "dsalearning"
  bucket = "dsa-bucket"

這些變數都是我們在建立 influxdb 這個 container 時,都有設定了,除了 token。筆者是直接到 Influxdb 入口取得,如上述的 http://192.168.1.105:8086,在 Load Data –> Tokens –> dsaadmin's Token

圖 dsaadmin's Token(一)
圖 dsaadmin's Token(二)

不過後來筆者發現,telegraf.conf 這個設定檔也可以直接在 Influxdb 入口取得,在 Load Data –> Telegraf –> Create Configuration,這之後筆者再另篇分享,筆者完整的 telegraf.conf內容如下。

# Configuration for telegraf agent
[agent]
  ## Default data collection interval for all inputs
  interval = "10s"
  ## Rounds collection interval to 'interval'
  ## ie, if interval="10s" then always collect on :00, :10, :20, etc.
  round_interval = true

  ## Telegraf will send metrics to outputs in batches of at most
  ## metric_batch_size metrics.
  ## This controls the size of writes that Telegraf sends to output plugins.
  metric_batch_size = 1000

  ## For failed writes, telegraf will cache metric_buffer_limit metrics for each
  ## output, and will flush this buffer on a successful write. Oldest metrics
  ## are dropped first when this buffer fills.
  ## This buffer only fills when writes fail to output plugin(s).
  metric_buffer_limit = 10000

  ## Collection jitter is used to jitter the collection by a random amount.
  ## Each plugin will sleep for a random time within jitter before collecting.
  ## This can be used to avoid many plugins querying things like sysfs at the
  ## same time, which can have a measurable effect on the system.
  collection_jitter = "0s"

  ## Default flushing interval for all outputs. Maximum flush_interval will be
  ## flush_interval + flush_jitter
  flush_interval = "10s"
  ## Jitter the flush interval by a random amount. This is primarily to avoid
  ## large write spikes for users running a large number of telegraf instances.
  ## ie, a jitter of 5s and interval 10s means flushes will happen every 10-15s
  flush_jitter = "0s"

  ## By default or when set to "0s", precision will be set to the same
  ## timestamp order as the collection interval, with the maximum being 1s.
  ##   ie, when interval = "10s", precision will be "1s"
  ##       when interval = "250ms", precision will be "1ms"
  ## Precision will NOT be used for service inputs. It is up to each individual
  ## service input to set the timestamp at the appropriate precision.
  ## Valid time units are "ns", "us" (or "µs"), "ms", "s".
  precision = ""

  ## Logging configuration:
  ## Run telegraf with debug log messages.
  debug = false
  ## Run telegraf in quiet mode (error log messages only).
  quiet = false
  ## Specify the log file name. The empty string means to log to stderr.
  logfile = ""

  ## Override default hostname, if empty use os.Hostname()
  hostname = ""
  ## If set to true, do no set the "host" tag in the telegraf agent.
  omit_hostname = false
[[outputs.influxdb_v2]]	
  ## The URLs of the InfluxDB cluster nodes.
  ##
  ## Multiple URLs can be specified for a single cluster, only ONE of the
  ## urls will be written to each interval.
  ## urls exp: http://127.0.0.1:8086
  urls = ["http://192.168.1.105:8086"]

  ## Token for authentication.
  token = "$INFLUX_TOKEN"

  ## Organization is the name of the organization you wish to write to; must exist.
  organization = "dsalearning"

  ## Destination bucket to write into.
  bucket = "dsa-bucket"
[[inputs.cpu]]
  ## Whether to report per-cpu stats or not
  percpu = true
  ## Whether to report total system cpu stats or not
  totalcpu = true
  ## If true, collect raw CPU time metrics.
  collect_cpu_time = false
  ## If true, compute and report the sum of all non-idle CPU states.
  report_active = false
[[inputs.disk]]
  ## By default stats will be gathered for all mount points.
  ## Set mount_points will restrict the stats to only the specified mount points.
  # mount_points = ["/"]
  ## Ignore mount points by filesystem type.
  ignore_fs = ["tmpfs", "devtmpfs", "devfs", "overlay", "aufs", "squashfs"]
[[inputs.diskio]]
[[inputs.mem]]
[[inputs.net]]
[[inputs.processes]]
[[inputs.swap]]
[[inputs.system]]
[[inputs.docker]]	
  ## Docker Endpoint
  ##   To use TCP, set endpoint = "tcp://[ip]:[port]"
  ##   To use environment variables (ie, docker-machine), set endpoint = "ENV"
  ##   exp: unix:///var/run/docker.sock
  endpoint = "unix:///var/run/docker.sock"

  ## Set to true to collect Swarm metrics(desired_replicas, running_replicas)
  gather_services = false

  ## Only collect metrics for these containers, collect all if empty
  container_names = []

  ## Containers to include and exclude. Globs accepted.
  ## Note that an empty array for both will include all containers
  container_name_include = []
  container_name_exclude = []

  ## Container states to include and exclude. Globs accepted.
  ## When empty only containers in the "running" state will be captured.
  # container_state_include = []
  # container_state_exclude = []

  ## Timeout for docker list, info, and stats commands
  timeout = "5s"

  ## Whether to report for each container per-device blkio (8:0, 8:1...) and
  ## network (eth0, eth1, ...) stats or not
  perdevice = true

  ## Whether to report for each container total blkio and network stats or not
  total = false
  
  ## Which environment variables should we use as a tag
  ##tag_env = ["JAVA_HOME", "HEAP_SIZE"]
  ## docker labels to include and exclude as tags.  Globs accepted.
  ## Note that an empty array for both will include all labels as tags
  docker_label_include = []
  docker_label_exclude = []

telegraf.conf 編輯好後, export INFLUX_TOKEN 值,參考圖 dsaadmin’s token(一)與(二),不要直接複製下文範例。

建立 telegraf 指令如下。

$ docker run -d --name=telegraf \
      --net=influxdb \
      -v /var/run/docker.sock:/var/run/docker.sock \
      -v $PWD/telegraf.conf:/etc/telegraf/telegraf.conf:ro \
      -e INFLUX_TOKEN=0dTxnWcnBkMUxhu7ISElbvSmQLwD7-KbYqeHf-SYVrEc8qdb8xaawxc0O-YNU0w6S-0ofH7A_Y0eOtx-9Gd5ZA== \
      telegraf

這步驟很有可能在 token 這地方出錯,可用下列指令檢查。

$ docker logs -f telegraf

如果是 token 錯誤,會得到 401 Unauthorized,結果如下。

$ docker logs telegraf -f
2021-10-23T05:37:52Z I! Starting Telegraf 1.20.2
2021-10-23T05:37:52Z I! Using config file: /etc/telegraf/telegraf.conf
2021-10-23T05:37:52Z I! Loaded inputs: cpu disk diskio docker mem net processes swap system
2021-10-23T05:37:52Z I! Loaded aggregators:
2021-10-23T05:37:52Z I! Loaded processors:
2021-10-23T05:37:52Z I! Loaded outputs: influxdb_v2
2021-10-23T05:37:52Z I! Tags enabled: host=499cfb7b6dd9
2021-10-23T05:37:52Z I! [agent] Config: Interval:10s, Quiet:false, Hostname:"499cfb7b6dd9", Flush Interval:10s
2021-10-23T05:37:52Z W! [inputs.docker] 'perdevice' setting is set to 'true' so 'blkio' and 'network' metrics will be collected. Please set it to 'false' and use 'perdevice_include' instead to control this behaviour as 'perdevice' will be deprecated
2021-10-23T05:38:02Z E! [outputs.influxdb_v2] When writing to [http://influxdb:8086]: failed to write metric (401 Unauthorized): unauthorized: unauthorized access
2021-10-23T05:38:02Z E! [agent] Error writing to outputs.influxdb_v2: failed to write metric (401 Unauthorized): unauthorized: unauthorized access

只要把 Token 填正確, telegraf 就能正常收集資料儲在在 influxdb 了。

Windows

這裡筆者在 Influxdb 建立另一個 bucket 來存放,這個 bucket 命名為 win10-alvin

在 windows 設定 telegraf 請參考Run Telegraf as a Windows service,這裡就依這篇設定。

** 注意 **:開啟 PowerShell 務必以系統管理員身份執行,否則會出現下列錯誤。

首先以系統管理員身份開啟 PowerShell,執行指令如下。

> wget https://dl.influxdata.com/telegraf/releases/telegraf-1.20.2_windows_amd64.zip -UseBasicParsing -OutFile telegraf-_windows_amd64.zip
> Expand-Archive .\telegraf-_windows_amd64.zip -DestinationPath 'C:\Program Files\InfluxData\telegraf\'

這時檔案會被解壓縮到 C:\Program Files\InfluxData\telegraf\telegraf-1.20.2 這個路徑,需要把裡面的檔案複製到 C:\Program Files\InfluxData\telegraf\,指令如下。

> cd "C:\Program Files\InfluxData\telegraf"
> mv .\telegraf-1.20.2\telegraf.* .

這時務必要修改 telegraf.conf,同 Linxu 版一樣,再複習一次吧。

[[outputs.influxdb_v2]]
  urls = ["http://192.168.1.105:8086"]
  token = "直接把 Token 貼進來"
  organization = "dsalearning"
  bucket = "win10-alvin"

這裡使用的 bucket 是剛才建立的,是不同與 Linux 用的 dsa-bucket喔。

telegraf.exe 安裝成 Windows 的服務吧,指令如下。

> .\telegraf.exe --service install --config "C:\Program Files\InfluxData\telegraf\telegraf.conf"

啟動此服務,指令如下。

> .telegraf.exe --service start

Dashboard

下圖是筆者用 influxdb 的 template 建立的 dashboard,再用這個 template 來建立 Grafana 版的 Dashboard。

圖 Influxdb System Dashboard
圖 Grafana System Dashboard

如何做出這樣的 Dashboard ,筆者另篇分享。

參考文章

  1. 使用 Grafana Influxdb Telegraf 監控系統
  2. Run Grafana Docker image
  3. Configure a Grafana Docker image
  4. Influxdb Official Image (Docker Hub)
  5. Install InfluxDB
  6. Get started with Telegraf
  7. Automatically configure Telegraf
  8. telegraf Official Image (Docker Hub)

留言