使用 Telegraf 网关
作者:Rick Brown / 用例,产品,开发者
2019 年 11 月 18 日
导航到
如果您在交易会上遇到 InfluxData,或者我们为您提供演示,您可能会看到名为“Rick 的家”的仪表板。我就是那个“Rick”,这就是我将我的数据发送到 InfluxDB Cloud 的方式,目前看起来是这样的
我的家庭网络包含许多服务器(其中许多是 Proxmox 中的 LXC 容器),许多软件组件(Node-Red、MQTT、MariaDB 等),以及各种智能家居传感器(SmartThings、小米、IKEA)。它已经发展了多年,现在我发现在一个地方监控整个系统,因为没有监控,我就无法可视化发生的事情,而没有可视化发生的事情,就难以理解要执行哪些自动化或可能需要进行的维护。这是一个长期的自豪项目,我在旅途中发现了 InfluxDB。部分原因是我发现我实现软件的“变得酷炫”速度非常快,所以我申请加入了 InfluxData!
因此,我想从存储在 InfluxDB 中的数据可视化我的家庭网络。我想一切直接写入我的本地 InfluxDB OSS 实例,但我也想能够写入远程实例,例如 InfluxDB Cloud。我还想让它能够用于比我更大的用例。为此,有一些限制
- InfluxDB Cloud 只能接受 HTTP 导入。任何 UDP 消息(Proxmox 将 UDP 写入 InfluxDB 终端)在通过互联网之前将被丢弃。
- 用户名和密码可能会更改,因此我需要编辑我局域网上的每台机器上的每个 Telegraf 配置文件。
- 访问令牌可能会随时间变化(特别是当我迁移到 InfluxDB Cloud v2 时),因此我需要编辑我局域网上的每台机器上的每个 Telegraf 配置文件。
- 我在企业网络中拥有实例,我必须通过长时间的安全流程从数据中心的主机打开一个出站 TCP 端口。如果我需要为许多主机执行此操作以将 Telegraf 数据发送到远程 InfluxDB,则安全审查所需的时间将相应更长。
- 我想高效地将数据发送到远程 InfluxDB 实例。这意味着我应该考虑批量输出等概念。如果我用 Telegraf 网关写入 InfluxDB,可以在该合并器中配置批量和相关设置,并且这些设置用于所有写入。如果我从客户端库直接写入 InfluxDB,每个库可能都有不同的批量机制,因此我需要在多个地方进行配置。
如果我可以将所有更新汇总到一个地方,上述所有管理都消失了。
因此,实施 Telegraf 中间实例——一个 Telegraf 网关——是这些用例的好解决方案。为此,我需要做一些事情
-
- 安装 Telegraf 容器
- 启用 Telegraf 输入 以 UDP 和 HTTP
- 启用Telegraf输出,以便我将数据写入的位置
因此,我需要为我的Telegraf网关创建一个配置。Telegraf从/etc/telegraf/telegraf.conf
和/etc/telegraf/telegraf.d/.conf
读取默认配置,所以让我们创建这些配置。
首先,这是我的全局设置配置文件 /etc/telegraf/telegraf.conf
[[global_tags]]
[[agent]]
interval = "10s"
round_interval = true
metric_batch_size = 1000
metric_buffer_limit = 10000
collection_jitter = "3s"
flush_interval = "10s"
flush_jitter = "5s"
precision = ""
debug = false
quiet = false
logfile = "/var/log/telegraf/telegraf.log"
logfile_rotation_interval = "0d"
logfile_rotation_max_size = "1MB"
logfile_rotation_max_archives = 5
hostname = ""
现在是一些特定配置文件,为Telegraf提供端点,使其充当InfluxDB服务器
/etc/telegraf/telegraf.d/socket_listener.conf
[[inputs.socket_listener]]
service_address = "udp://:8089"
/etc/telegraf/telegraf.d/influxdb_listener.conf
# Influx HTTP write listener
[[inputs.influxdb_listener]]
service_address = ":8086"
read_timeout = "10s"
write_timeout = "10s"
max_body_size = "500MiB"
max_line_size = "64KiB"
database_tag = "bucket_name"
注意上述配置中使用的database_tag = "bucket_name"
。当我直接使用其URL将数据写入InfluxDB HTTP端点时(我在Node-Red中这样做),我会选择要写入的数据库。我不想丢失这些信息,所以Telegraf将其存储在名为bucket_name的标签中。当然,我不想将其作为标签发送到InfluxDB,因为它会增加我的基数而没有目的,所以输出配置需要移除它。Telegraf通过配置行exclude_database_tag = true
来完成此操作。以下是输出配置
/etc/telegraf/telegraf.d/output_influxdb.conf
# Local InfluxDB
[[outputs.influxdb]]
urls = ["http://ip_address_of_local_InfluxDB_server:8086"]
database_tag = "bucket_name"
exclude_database_tag = true
# SE Cloud
[[outputs.influxdb]]
urls = ["https://FQDN_of_Influx_Cloud:8086"]
database = "database_name_to_write_to"
username = "my_username"
password = "my_password"
timeout = "30s"
# Cloud 2 instance
[[outputs.influxdb_v2]]
urls = ["https://FQDN_of_Influx_Cloud_2"]
token = "The_Token_Generated_within_Influx_Cloud_2"
organization = "my_registered_email_address_on_Influx_Cloud_2"
bucket = "my_bucket_to_write_to"
此时,这给了我一个工作的Telegraf网关。然而,它也给我在LAN上要监控的额外东西,所以捕获内部Telegraf指标似乎是正确的事情。由于这是一个LXC容器,并且我想以相同的方式监控所有容器,我应该添加我常用的操作系统监控配置。我不应该启用SMART监控或温度监控,因为这些应该来自运行容器的底层服务器。此外,如果这是一台Windows机器而不是LXC容器,我想要用“win_processes”和“win_perf_counters”替换“processes”和“system”。这些是我尝试在包含在每个仪表板中的每个服务器上使用的默认值
/etc/telegraf/telegraf.d/cpu.conf
[[inputs.cpu]]
percpu = true
totalcpu = true
collect_cpu_time = false
report_active = false
/etc/telegraf/telegraf.d/disk.conf
[[inputs.disk]]
ignore_fs = ["tmpfs", "devtmpfs", "devfs", "iso9660", "overlay", "aufs", "squashfs"]
[[inputs.diskio]]
/etc/telegraf/telegraf.d/internal.conf
[[inputs.internal]]
collect_memstats = true
/etc/telegraf/telegraf.d/kernel.conf
[[inputs.kernel]]
# no configuration
/etc/telegraf/telegraf.d/mem.conf
[[inputs.mem]]
# no configuration
/etc/telegraf/telegraf.d/net.conf
[[inputs.net]]
/etc/telegraf/telegraf.d/swap.conf
[[inputs.swap]]
# no configuration
最后两个部分用于捕获Linux指标 - 请参见上述提到的Windows指标的等效部分。
/etc/telegraf/telegraf.d/processes.conf
[[inputs.processes]]
# no configuration
/etc/telegraf/telegraf.d/system.conf
[[inputs.system]]
## Uncomment to remove deprecated metrics.
# fielddrop = ["uptime_format"]
因此,现在Telegraf将写入所有三个输出,收集我从三种常用输入类型(Telegraf、HTTP自定义端点、UDP)中获得的数据。
这是我的Telegraf网关的外观,显示了系统视图
我将这样运行我的Telegraf实现一段时间,以查看它是否满足我的需求,或者是否需要额外的配置。如果您以这种方式部署Telegraf,或使用其他方式通过Telegraf将数据传输到InfluxDB,请告诉我 - 我对Telegraf部署模式很感兴趣!