如何从CSV将点写入InfluxDB

导航至

自撰写本文以来,本博客已进行了更新。欲查看本文的最新版本,请参阅此新版本

Telegraf是InfluxData的插件驱动服务器代理,用于收集和报告指标。有超过200个输入插件,这意味着有多种方式可以将数据导入InfluxDB。然而,我经常看到新用户在InfluxData社区网站上询问如何从CSV将点写入InfluxDB。使用CSV文件写入点是一种将熟悉的数据插入InfluxDB的简单方法,这可以使其更容易熟悉该平台。

从CSV导入数据到InfluxDB的要求和设置

之前的博客中,我分享了三种简单的方法将数据插入数据库(包括一个Python脚本,用于将CSV数据转换为行协议,即InfluxDB的数据导入格式)。本文是关于如何使用Telegraf文件输入插件从CSV写入点的指南。Telegraf文件输入插件比Python脚本写入点更快,这在执行批量导入时非常有用。希望它能消除新用户可能有的任何困惑。我将假设您是MacOS用户,并且已经使用Homebrew安装了InfluxDB和Telegraf,因为这通常是本地快速启动和运行的最快方式(另外,您也可以从我们的下载页面下载二进制文件或启动沙盒)。

本博客帖子的配套代码库可以在这里找到。为了从CSV写入点,我们将使用带有CSV解析器的文件输入插件。

要求

  • Telegraf 1.8.0或更高版本
  • InfluxDB 1.7.0或更高版本

安装后,请确保通过在终端中输入以下命令来检查InfluxDB正在运行且Telegraf已停止:brew services list

influxdb telegraf

如果您没有看到InfluxDB正在运行,请执行brew services start influxdb。同样,如果Telegraf正在运行,您可以使用brew停止该服务,命令为brew services stop telegraf

首先,我需要下载一个具有适当输入和输出插件的Telegraf配置文件。根据Telegraf入门文档,我将在我选择的目录的终端中使用以下命令。

telegraf -sample-config -input-filter file -output-filter influxdb > file.conf

-sample-config标志将生成telegraf配置文件。-input-filter-output-filter标志分别指定数据的输入和输出来源。紧随其后的文本命名配置文件。我发现将telegraf配置文件命名为我使用的Telegraf插件很有用,这样我可以在将来轻松区分我的配置文件。运行命令后,我打开file.conf。我的telegraf配置总共包含454行,包括文件输入插件和InfluxDB输出插件。

将CSV数据导入InfluxDB的四个步骤

第一步: 我首先对配置文件中的“输出插件”部分进行了修改。我想指定我的CSV数据的目标数据库。我将把第97行的默认值# database = "telegraf"改为database = csv (或者任何我选择的数据库名称,这样我可以很容易地找到csv数据)。

我的csv数据如下

influxdb telegraf agent

第一列和第一行是无关紧要的。我还注释掉了最后一行。我的时间戳是Unix时间,精度到纳秒。在第二步中,我确保在配置文件中添加一些行,以排除这些行和列,不在数据摄取中使用。

第二步: 接下来,我想对配置文件的“输入插件”部分进行修改。首先,我将指定我的csv文件的密码(pwd),在telegraf配置的第455行。由于我的配置文件与我的csv文件在同一目录下,第455行  简单地是我的文件名:files = ["example"](否则请确保包含完整的$pwd)。我还会在配置文件的底部添加以下行,在“输入插件”部分下面,以确保我只摄取我关心的数据

## Data format to consume.
data_format = "csv"

## Indicates how many rows to treat as a header. By default, the parser assumes
## there is no header and will parse the first row as data. If set to anything more
## than 1, column names will be concatenated with the name listed in the next header row.
## If `csv_column_names` is specified, the column names in header will be overridden.
csv_header_row_count = 1

## Indicates the number of rows to skip before looking for header information.
 csv_skip_rows = 1

## Indicates the number of columns to skip before looking for data to parse.
## These columns will be skipped in the header as well.
 csv_skip_columns = 1
 
## The character reserved for marking a row as a comment row
 ## Commented rows are skipped and not parsed
csv_comment = "#"

 ## The column to extract the name of the metric from
 csv_measurement_column = "measurement_name"

 ## Columns listed here will be added as tags. Any other columns
 ## will be added as fields.
csv_tag_columns = ["tag_key"]

 ## The column to extract time information for the metric
 ## `csv_timestamp_format` must be specified if this is used
csv_timestamp_column = "time"

 ## The format of time data extracted from `csv_timestamp_column`
 ## this must be specified if `csv_timestamp_column` is specified
 csv_timestamp_format = "unix_ns"

额外配置选项: 值得看看配置文件中的几个其他变量。

第36行的默认值是metric_batch_size = 1000。它控制Telegraf发送到InfluxDB的写入大小。如果您正在执行大量数据导入,您可能需要增加该值。为了确定适当的metric_batch_size,我建议查看这些硬件规模指南。最后,如果您正在使用OSS版本并且试图导入几十万个点,请查看启用TSI。启用TSI可以帮助提高系列基数性能。查看此链接了解如何在InfluxDB 1.7中启用TSI。

第69行的默认值是debug = false。如果您在将点写入InfluxDB时遇到问题,请将debug变量设置为true以获取调试日志消息。

第三步: 通过在您的终端中复制并粘贴以下行来运行我们刚刚编辑的配置文件

telegraf --config $pwd/file.conf

如果您已将debug = true,您应该看到以下输出

Influxdb Telegraf Plugin - Telegraf Agent

第四步: 现在我们准备好查询我们的数据了。您可以通过在终端中运行influx 来启动influx shell。

运行use csv来选择您的数据库,并使用以下查询验证您的插入是否成功:select * from measurement_name limit 3。使用precision rfc3339 将时间戳转换为可读格式。

Influx CLI InfluxDB Shell

这就是配置文件输入插件并将数据从CSV文件写入InfluxDB的所有内容。请注意,文件输入插件接受许多其他数据格式,包括:json、行协议和collectd等,仅举几例。如果您需要更多使用CLI的帮助,请参阅文档

关于将CSV导入InfluxDB的结论

最后,我强烈建议使用 Telegraf 插件将数据点写入您的 InfluxDB 数据库,因为 Telegraf 是用 Go 编写的。Go 的速度比 Python 快得多,但如果您坚持使用 Python,我推荐您查看这个 csv-to-influxdb 仓库。最后,Telegraf 有 tagpass / tagdrop / fieldpass / fielddrop 配置参数,可以在任何输入上使用,以过滤指定要传递哪些标签和字段。这些配置参数让您可以选择要包含在您的摄取中的数据。此外,Telegraf 完全开源。我鼓励您学习如何 编写自己的 Telegraf 插件 并在需要时贡献新插件!

我希望这篇教程能帮助您开始使用 Influx。如果您有任何问题,请将它们发布在 社区网站 上或在推特上 @InfluxDB 给我们发消息。