本页内容

  • 准备工作
  • 第 1 步 - 配置防火墙
  • 第 2 步 - 安装 InfluxDB
  • 第 3 步 - 创建 InfluxDB 数据库和用户凭证
  • 第 4 步 - 安装 Telegraf
  • 第 5 步 - 验证 Telegraf 统计数据是否已存储到 InfluxDB
  • 第 6 步 - 安装 Grafana
  • 第 7 步 - 配置 Grafana 数据源
  • 第 8 步 - 配置 Grafana 仪表盘
  • 第 9 步 - 配置告警与通知 规则 条件 无数据与错误处理 通知
  • 结语
  • 规则
  • 条件
  • 无数据与错误处理
  • 通知

TIG(Telegraf、InfluxDB 和 Grafana)栈是一组开源工具平台的缩写,用于简化系统 metrics 的收集、存储、绘图和告警。你可以从一处监控和可视化诸如内存、磁盘空间、登录用户、系统负载、swap 使用率、uptime、运行中的进程等 metrics。该栈中使用的工具如下:

  • Telegraf - 是一个开源的 metrics 收集代理,用于从数据库、系统和 IoT 传感器收集和发送数据及事件。它支持各种 output 插件,如 InfluxDB、Graphite、Kafka 等,可将收集到的数据发送到这些目标。
  • InfluxDB - 是一个用 Go 语言编写的开源 time-series 数据库。它针对快速、高可用的存储进行了优化,适用于任何涉及大量带时间戳数据的场景,包括 metrics、事件和实时分析。
  • Grafana - 是一个开源的数据可视化和监控套件。它支持各种 input 插件,如 Graphite、ElasticSearch、InfluxDB 等。它提供美观的 dashboard 和 metric 分析功能,让你可以可视化和监控任何类型的系统 metrics 和性能数据。

在本教程中,你将学习如何在单台基于 Rocky Linux 8 的服务器上安装和配置 TIG 栈。

准备工作

  • 一台运行 Rocky Linux 8 的服务器。
  • 一个具有 root 权限的非 sudo 用户。
  • 已禁用 SELinux。
  • 确保所有内容都已更新。 $ sudo dnf update

一台运行 Rocky Linux 8 的服务器。

一个具有 root 权限的非 sudo 用户。

已禁用 SELinux。

确保所有内容都已更新。

$ sudo dnf update

第 1 步 - 配置防火墙

第一步是配置防火墙。Rocky Linux 自带 Firewalld 防火墙。

检查防火墙是否正在运行。

$ sudo firewall-cmd --state

你应该会看到如下输出。

running

检查当前允许的服务/端口。

$ sudo firewall-cmd --permanent --list-services

它应显示如下输出。

cockpit dhcpv6-client ssh

允许 8086 端口用于运行 InfluxDB,以及 3000 端口用于运行 Grafana Server。

$ sudo firewall-cmd --permanent --add-port=8086/tcp
$ sudo firewall-cmd --permanent --add-port=3000/tcp

重新加载防火墙。

$ sudo systemctl reload firewalld

第 2 步 - 安装 InfluxDB

要安装 InfluxDB,首先需要为它创建一个 repo 文件。

创建并打开 influxdb.repo 文件进行编辑。

$ sudo nano /etc/yum.repos.d/influxdb.repo

将以下代码粘贴到其中。

[influxdb]
name = InfluxDB Repository - RHEL $releasever
baseurl = https://repos.influxdata.com/rhel/$releasever/$basearch/stable
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdb.key

按 Ctrl + X 并在提示时输入 Y 来保存文件。

你可以选择安装 InfluxDB 1.8.x 或 2.0.x。不过,最好使用最新版本。安装 InfluxDB。

$ sudo dnf install influxdb2

启动并启用 InfluxDB 服务。

$ sudo systemctl enable influxdb
$ sudo systemctl start influxdb

第 3 步 - 创建 InfluxDB 数据库和用户凭证

要存储来自 Telegraf 的数据,你需要设置 Influx 数据库和用户。

InfluxDB 自带一个名为 influx 的命令行工具,用于与 InfluxDB 服务器交互。可以把 influx 看作是 mysql 命令行工具。

运行以下命令来执行 Influx 的初始配置。

$ influx setup
> Welcome to InfluxDB 2.0!
? Please type your primary username navjot
? Please type your password ***************
? Please type your password again ***************
? Please type your primary organization name howtoforge
? Please type your primary bucket name tigstack
? Please type your retention period in hours, or 0 for infinite 360
? Setup with these parameters?
  Username:          navjot
  Organization:      howtoforge
  Bucket:            tigstack
  Retention Period:  360h0m0s
 Yes
> Config default has been stored in /home/username/.influxdbv2/configs.
User    Organization    Bucket
navjot  howtoforge      tigstack

你需要设置初始用户名、密码、组织名称、用于存储数据的主 bucket 名称,以及该数据的保留期限(以小时计)。

你也可以通过浏览器访问 URL http://:8086/ 来完成此设置。完成初始设置后,你就可以登录该 URL。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

你应该会看到如下 dashboard。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

初始设置过程会创建一个默认 token,它对数据库中所有组织拥有完全的读写权限。出于安全目的,你需要一个新的 token,它仅连接到我们想要连接的组织和 bucket。

要创建新 token,请点击左侧边栏中的 Data 选项。接着,点击 Tokens 部分。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

在此,你将看到我们在初始配置时创建的默认 token。点击 Generate Token 按钮并选择 Read/Write Token 选项,以弹出一个新的浮层窗口。

为 Token 命名,并在 Read 和 Write 部分下都选择我们创建的默认 bucket。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

点击 Save 完成 token 的创建。点击新创建 token 的名称,会弹出一个显示 token 值的窗口。先将其保存下来,因为我们稍后会用到它。

至此完成了 InfluxDB 的安装和配置。接下来,我们需要安装 Telegraf。

第 4 步 - 安装 Telegraf

Telegraf 和 InfluxDB 共享同一个 repository。这意味着你可以直接安装 Telegraf。

$ sudo dnf install telegraf

启用并启动 Telegraf 服务。

$ sudo systemctl enable telegraf
$ sudo systemctl start telegraf

Telegraf 是一个由插件驱动的代理,拥有 4 种类型的插件:

  • Input 插件收集 metrics。
  • Processor 插件转换、修饰和过滤 metrics。
  • Aggregator 插件创建并聚合 metrics。
  • Output 插件定义 metrics 发送的目标位置,包括 InfluxDB。

Telegraf 将所有这些插件的配置存储在文件 /etc/telegraf/telegraf.conf 中。第一步是通过启用 influxdb_v2 output 插件将 Telegraf 连接到 InfluxDB。打开文件 /etc/telegraf/telegraf.conf 进行编辑。

$ sudo nano /etc/telegraf/telegraf.conf

找到 [[outputs.influxdb_v2]] 这一行,去掉其前面的 # 以取消注释。按如下方式修改其下方的代码。

[[outputs.influxdb_v2]]
  urls = ["http://localhost:8086"]
  token = "$INFLUX_TOKEN"
  organization = "howtoforge"
  bucket = "tigstack"

将之前保存的 InfluxDB token 值替换到上面代码中的 $INFLUX_TOKEN 变量处。

搜索 INPUT PLUGINS 这一行,你将看到默认启用的以下 input 插件。

# Read metrics about cpu usage
[[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

# Read metrics about disk usage by mount point
[[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", "iso9660", "overlay", "aufs", "squashfs"]

[[inputs.diskio]]
....
....

# Get kernel statistics from /proc/stat
[[inputs.kernel]]
  # no configuration


# Read metrics about memory usage
[[inputs.mem]]
  # no configuration
  
# Get the number of processes and group them by status
[[inputs.processes]]
  # no configuration


# Read metrics about swap memory usage
[[inputs.swap]]
  # no configuration


# Read metrics about system load & uptime
[[inputs.system]]
  ## Uncomment to remove deprecated metrics.

你可以根据需要配置额外的 input 插件,包括 Apache Server、Docker 容器、Elasticsearch、iptables 防火墙、Kubernetes、Memcached、MongoDB、MySQL、Nginx、PHP-fpm、Postfix、RabbitMQ、Redis、Varnish、Wireguard、PostgreSQL 等。

完成后,按 Ctrl + X 并在提示时输入 Y 来保存文件。

应用更改完成后,重启 Telegraf 服务。

$ sudo systemctl restart telegraf

第 5 步 - 验证 Telegraf 统计数据是否已存储到 InfluxDB

在继续之前,你需要验证 Telegraf 统计数据的收集是否正确并送入 InfluxDB。在浏览器中打开 InfluxDB UI 并访问 Data >> Buckets >> tigstack。你应该会看到如下页面。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

点击 bucket 名称,然后点击 _measurement 过滤器中的某个值,并随其出现持续点击其他值。完成后,点击 Submit 按钮。你应该会在顶部看到一张图表。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

这应能确认数据正在被正确传递。

第 6 步 - 安装 Grafana

创建并打开文件 /etc/yum.repos.d/grafana.repo 进行编辑。

$ sudo nano /etc/yum.repos.d/grafana.repo

将以下代码粘贴到其中。

[grafana]
name=grafana
baseurl=https://packages.grafana.com/oss/rpm
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://packages.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt

按 Ctrl + X 并在提示时输入 Y 来保存文件。

安装 Grafana。

$ sudo dnf install grafana

启动并启用 Grafana 服务。

$ sudo systemctl start grafana-server
$ sudo systemctl enable grafana-server

第 7 步 - 配置 Grafana 数据源

在浏览器中访问 URL http://:3000,你应该会看到如下 Grafana 登录页面。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

使用默认用户名 admin 和密码 admin 登录。接着,你需要设置一个新的默认密码。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

你将看到如下 Grafana 主页。点击 Add your first data source 按钮。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

点击 InfluxDB 按钮。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

在下一页中,从下拉菜单中选择 Flux 作为查询语言。你也可以使用 InfluxQL 作为查询语言,但配置起来更复杂,因为它默认仅支持 InfluxDB v1.x。Flux 支持 InfluxDB v2.x,并且更容易设置和配置。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

输入以下值。

URL: http://localhost:8086 Access: Server Basic Auth Details User: navjot Password:

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

InfluxDB Details Organization: howtoforge Token: Default Bucket: tigstack

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

点击 Save and test 按钮,你应该会看到一条确认信息,表明设置成功。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

第 8 步 - 配置 Grafana 仪表盘

下一步是配置 Grafana 仪表盘。点击 + 号并选择 Dashboards,以打开仪表盘创建界面。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

在下一页中,点击 Add an empty panel 按钮以打开如下界面。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

将以下代码粘贴到 Query Editor 中。这

from(bucket: "NAMEOFYOUBUCKET")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "cpu")
  |> filter(fn: (r) => r["_field"] == "usage_idle")
  |> filter(fn: (r) => r["cpu"] == "cpu-total")
  |> filter(fn: (r) => r["host"] == "NAMEOFYOURHOST")
  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
  |> map(fn: (r) => ({ r with _value: r._value * -1.0 + 100.0 }))
  |> toFloat()
  |> yield(name: "mean")

使用我们在上面用到的 bucket 名称。以及主机名,你可以从文件 /etc/hostname 中获取。

上述代码将计算 CPU Usage 并为其生成图表。为 Panel 设置一个标题。点击 Query inspector 按钮以验证查询是否成功运行。对结果满意后,点击 Apply 按钮继续。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

你也可以通过右侧 Axis 部分下的 Label 字段为坐标轴命名。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

点击 Apply 按钮以保存该 panel。

完成后,点击 Save Dashboard 按钮。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

为仪表盘命名,然后点击 Save 完成。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

它会打开该仪表盘,然后点击 Add Panel 按钮以创建另一个 panel。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

重复该过程,为 RAM Usage 创建另一个 panel。

from(bucket: "NAMEOFYOUBUCKET")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "mem")
  |> filter(fn: (r) => r["_field"] == "used_percent")
  |> filter(fn: (r) => r["host"] == "NAMEOFYOURHOST")
  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
  |> yield(name: "mean")

并使用以下代码来显示 HDD Usage。

from(bucket: "NAMEOFYOURBUCKET")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "disk")
  |> filter(fn: (r) => r["_field"] == "used")
  |> filter(fn: (r) => r["path"] == "/")
  |> filter(fn: (r) => r["host"] == "NAMEOFYOURHOST")
  |> aggregateWindow(every: v.windowPeriod, fn: mean, createEmpty: false)
  |> map(fn: (r) => ({ r with _value: r._value / 1000000.0 }))
  |> toFloat()  
  |> yield(name: "mean")

你可以创建数量不限的 panel。

上述代码基于 Flux Scripting 语言。所幸,你不需要学习该语言就能编写查询。你可以从 InfluxDB URL 生成查询。'尽管学习该语言有助于优化查询。

你需要回到 InfluxDB dashboard 并打开 Explore 页面以获取查询。

点击 bucket 名称,然后点击 _measurement 过滤器中的某个值,并随其出现持续点击其他值。完成后,点击 Script Editor 按钮,你应该会看到如下页面。图表也应随之更新。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

复制所显示的查询,现在你就可以在 Grafana dashboard 中使用它来构建你的图表。

第 9 步 - 配置告警与通知

设置监控的主要目的是在数值超出某个阈值时及时收到告警。

第一步是设置你希望接收告警的目标位置。你可以通过 Email、Slack、Kafka、Google Hangouts Chat、Microsoft Teams、Telegram 等方式接收通知。

在本教程中,我们将启用邮件通知。要设置 Email 通知,我们需要先配置 SMTP 服务。打开 /etc/grafana/grafana.ini 文件以配置 SMTP。

$ sudo nano /etc/grafana/grafana.ini

在其中找到 [smtp] 这一行。取消以下行的注释,并输入自定义 SMTP 服务器的值。

[smtp]
enabled = true
host = email-smtp.us-west-2.amazonaws.com:587
user = YOURUSERNAME
# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;"""
password = YOURUSERPASSWORD
;cert_file =
;key_file =
;skip_verify = false
from_address = 
[email protected]

from_name = HowtoForge Grafana
# EHLO identity in SMTP dialog (defaults to instance_name)
;ehlo_identity = dashboard.example.com
# SMTP startTLS policy (defaults to 'OpportunisticStartTLS')
;startTLS_policy = NoStartTLS

按 Ctrl + X 并在提示时输入 Y 来保存文件。

重启 Grafana 服务器以应用设置。

$ sudo systemctl restart grafana-server

打开 Grafana 页面,点击 Alert 图标,然后点击 Notification channels。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

点击 Add Channel 按钮。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

输入详细信息以设置 Email 通知渠道。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

点击 Test 以查看邮件设置是否正常工作。完成后点击 Save。

既然我们已经设置好通知渠道,就需要设置何时接收这些邮件的告警。要设置告警,你需要回到仪表盘 panel。

点击 Dashboard >> Manage 以打开 Dashboard 页面。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

点击我们刚创建的仪表盘,你将看到其包含不同 panel 的主页。要编辑 panel,点击 panel 的名称,会弹出一个下拉菜单。点击其中的 Edit 链接继续。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

点击 Alert Panel,然后点击 Create Alert 按钮以设置一个新的告警。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

你现在可以配置 Grafana 发送告警所依据的条件。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

规则

  • Name - 为告警输入一个描述性的名称
  • Evaluate every - 指定 Grafana 应多频繁地评估该告警。它也称为评估间隔(evaluation interval)。你可以在此处设置任意你想要的值。
  • For - 指定查询需要违反阈值多长时间后才会触发告警。根据你的需要更改时间。

条件

Grafana 基于以下格式的查询来决定何时触发告警。

avg() OF query(A, 15m, now) IS BELOW 14
  • avg() 控制如何将每个序列的值缩减为可与阈值比较的值。你可以点击函数名以选择不同的函数,例如 avg()、min()、max()、sum()、count() 等。
  • query(A, 15m, now) 括号中的字母定义了要从 Metrics 选项卡执行哪个查询。接下来的两个参数定义了时间范围。15m, now 表示从 15 分钟前到现在。
  • IS BELOW 14 定义阈值的类型和阈值数值。你可以点击 IS BELOW 以选择不同的阈值类型。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

query(A, 15m, now) 括号中的字母定义了要从 Metrics 选项卡执行哪个查询。接下来的两个参数定义了时间范围。15m, now 表示从 15 分钟前到现在。

IS BELOW 14 定义阈值的类型和阈值数值。你可以点击 IS BELOW 以选择不同的阈值类型。

在 Rocky Linux 8 上搭建 TIG 栈(Telegraf + InfluxDB + Grafana)

你可以通过点击第一个条件下方的 + 按钮在下方添加第二个条件。目前,在多个条件之间只能使用 AND 和 OR 运算符。

无数据与错误处理

你可以通过以下条件配置 Grafana 如何处理返回无数据或仅返回 null 值的查询:

  • No Data - 将规则状态设置为 NoData
  • Alerting - 将规则状态设置为 Alerting
  • Keep Last State - 保持当前的规则状态,无论它是什么
  • Ok - 将告警规则状态设置为 Ok,也就是说即使一切正常你也会收到告警。

你可以告诉 Grafana 如何处理执行或超时错误。

  • Alerting - 将规则状态设置为 Alerting
  • Keep Last State - 保持当前的规则状态,无论它是什么

通知

你可以指定告警规则通知,并附带一条关于该规则的详细信息。你可以在消息中添加任何内容,或包含你想添加的与告警相关的信息。

  • Send to - 选择我们之前配置用于发送告警的通知渠道。
  • Message - 输入一条随告警一起发送的文本消息。
  • Tags - 指定要在通知中包含的标签列表(key/value)。并非所有通知渠道(包括 Email)都支持它们,因此你可以将其留空。它们通常用于在邮件中发送变量及其值。

完成后,点击 Test rule 按钮以查看一切是否正常工作。点击右上角的 Apply 按钮完成告警的添加。

你现在应该开始收到邮件中的告警了。

结语

至此,关于在基于 Rocky Linux 8 的服务器上安装和配置 TIG 栈的教程就结束了。如果你有任何问题,请在下方评论中留言。