使用InfluxDB API写入数据
使用命令行接口、客户端库和用于常见数据格式的插件(如Graphite)将数据写入InfluxDB。
注意: 以下示例使用
curl,一个通过 URLs 传输数据的命令行工具。了解curl的基础知识请参考 HTTP 脚本指南。
使用InfluxDB API创建数据库
要创建一个数据库,向 /query 端点发送一个 POST 请求,并将 URL 参数 q 设置为 CREATE DATABASE 。
下面的示例展示了如何向运行在 localhost 的 InfluxDB 发送请求以创建 mydb 数据库:
curl -i -XPOST http://localhost:8086/query \
--data-urlencode "q=CREATE DATABASE mydb"
使用 InfluxDB API 写入数据
InfluxDB API 是将数据写入 InfluxDB 的主要方式。
要使用InfluxDB API写入数据库,发送一个
POST请求到/write端点,并包含以下内容:db=DATABASE_NAMEquery parameter: Specifies the database to write data to.rp=RETENTION_POLICYquery parameter: Optional. If set, InfluxDB uses the specified retention policy; otherwise, uses the default retention policy.- A request body that contains time series data in InfluxDB line protocol format.
有关可用查询参数的完整列表,请参见InfluxDB API Reference文档。
以下示例展示了如何将单个点写入
mydb数据库:curl -i -XPOST 'http://localhost:8086/write?db=mydb' \ --data-binary 'cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000'以下示例展示了如何将一个点写入
mydb数据库和90d保留策略:curl -i -XPOST 'http://localhost:8086/write?db=mydb&rp=90d' \ --data-binary 'cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000'要使用 InfluxDB 2.0 API(与 InfluxDB 1.8+ 兼容)写入数据库,向
/api/v2/write端点发送POST请求,并包含?bucket=DATABASE_NAME/RETENTION_POLICY查询参数——例如:curl -i -XPOST 'http://localhost:8086/api/v2/write?bucket=db/rp&precision=ns' \ --header 'Authorization: Token username:password' \ --data-raw 'cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000'
前面的例子使用了 curl --data- 选项来包含一个 POST 请求体,该请求体包含您想要存储的时间序列数据的 InfluxDB 行协议。
// Syntax
<measurement>[,<tag_key>=<tag_value>[,<tag_key>=<tag_value>]] <field_key>=<field_value>[,<field_key>=<field_value>] [<timestamp>]
// Example
cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000
行协议元素
每行行协议包含以下元素:
* Required- * measurement: 用于标识存储数据的measurement的字符串。
- tag set: 以逗号分隔的键值对列表,每个代表一个标签。Tag keys 和 tag values 是未加引号的字符串。 空格、逗号和等号字符必须被转义。
- * 字段集: 以逗号分隔的键值对列表,每个表示一个字段。 字段键 是未加引号的字符串。 空格和逗号必须转义。 字段值 可以是字符串(带引号)、 浮点数、 整数、 布尔值。 默认是浮点数。
- timestamp: 与数据相关的Unix时间戳。 InfluxDB支持高达纳秒的精度。 如果数据中的时间戳精度不是纳秒,请在写入数据到InfluxDB时指定 精度。有关更多信息,请参见 line protocol data types。
行协议元素解析
- measurement: 在第一个未转义的逗号之前的第一个空格之前的所有内容。
- 标签集: 在第一个未转义的逗号和第一个未转义的空格之间的键值对。
- 字段集: 在第一个和第二个未转义的空白字符之间的键值对。
- timestamp: 在第二个未转义空格之后的整数值。
- 行通过换行符分隔 (
\n)。行协议对空格敏感。
注意: 避免使用以下保留关键字:
_field,_measurement, 和time。 如果将保留关键字作为标签或字段键包含,相关的点将被丢弃。
配置 gzip 压缩
InfluxDB 支持 gzip 压缩,以减少 API 请求期间消耗的带宽。
要接受来自 InfluxDB 的压缩数据,请在您的 InfluxDB API 请求中包含
Accept-Encoding: gzip头部。当向 InfluxDB 发送 gzip 压缩数据时,在您的 InfluxDB API 请求中包含
Content-Encoding: gzip头部。例如,使用 curl 将压缩数据写入 InfluxDB,请执行以下操作:
使用gzip创建一个包含压缩行协议的文件—例如,在终端中输入以下命令:
echo "mem,host=host1 used_percent=23.43234543 1641024000 mem,host=host2 used_percent=26.81522361 1641027600 mem,host=host1 used_percent=22.52984738 1641031200 mem,host=host2 used_percent=27.18294630 1641034800" | gzip > system.gzip在你的
curl命令中,包含Content-Encoding: gzip头和--data-binary选项——例如:curl "http://localhost:8086/write?db=mydb&rp=90d&precision=s" \ --header "Content-Type: text/plain; charset=utf-8" \ --header "Content-Encoding: gzip" \ --data-binary @system.gzip
有关为客户端库启用gzip的详细信息,请参阅客户端库文档。
在Telegraf InfluxDB输出插件中启用gzip压缩
- 在您的编辑器中,打开
telegraf.confTelegraf 配置文件并找到[[outputs.influxdb]]。 - 在
[[outputs.influxdb]]部分,将content_encoding = "identity"(默认)替换为content_encoding = "gzip"。
注意 写入 InfluxDB 2.x [[outputs.influxdb_v2]] 默认配置为以 gzip 格式压缩内容。
写多个点
通过用换行符分隔每个点,同时将多个点发布到多个系列中。以这种方式批处理点会导致更高的性能。
以下示例将三个点写入数据库 mydb。 第一个点属于测量 cpu_load_short 的系列,标签集为 host=server02,并具有服务器的本地时间戳。 第二个点属于测量 cpu_load_short 的系列,标签集为 host=server02,region=us-west,并具有指定的时间戳 1422568543702900257。 第三个点具有与第二个点相同的指定时间戳,但它被写入测量 cpu_load_short 的系列,标签集为 direction=in,host=server01,region=us-west。
curl -i -XPOST 'http://localhost:8086/write?db=mydb' \
--data-binary 'cpu_load_short,host=server02 value=0.67
cpu_load_short,host=server02,region=us-west value=0.55 1422568543702900257
cpu_load_short,direction=in,host=server01,region=us-west value=2.0 1422568543702900257'
从文件中写入要点
通过将 @filename 传递给 curl 来写入文件中的数据点。文件中的数据应遵循 InfluxDB 行协议语法。
格式正确的文件示例 (cpu_data.txt):
cpu_load_short,host=server02 value=0.67
cpu_load_short,host=server02,region=us-west value=0.55 1422568543702900257
cpu_load_short,direction=in,host=server01,region=us-west value=2.0 1422568543702900257
将数据写入 cpu_data.txt 到 mydb 数据库:
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary @cpu_data.txt
注意: 如果您的数据文件超过5000个点,可能需要将该文件拆分为多个文件,以便将数据分批写入InfluxDB。 默认情况下,HTTP请求在五秒后超时。 InfluxDB仍然尝试在超时后写入点,但服务器不会发送确认,表示它们已成功写入。
无模式设计
InfluxDB 是一个无模式数据库。
您可以随时添加新的测量值、标签和字段。
请注意,如果您尝试写入不同类型的数据(例如,将字符串写入之前接受整数的字段),InfluxDB 将拒绝这些数据点。
关于REST的说明
InfluxDB使用HTTP作为一种方便且广泛支持的数据传输协议。
现代网络API使用REST,因为它满足了一种共同的需求。 随着端点数量的增长,组织系统的需求变得紧迫。 REST是一种组织大量端点和与资源进行交互的模式。 这种模式为设计和使用API的人提供了一致性和可预测性:每个人都知道应该期待什么。
InfluxDB v1 API 的设计简单,实施了 REST 的某些特性,例如标准 HTTP 头和用于执行操作的方法。 然而,v1 API 架构并不旨在完全遵循 REST。
HTTP响应摘要
- 2xx: 数据已成功写入;状态码为
HTTP 204 No Content。 - 4xx:InfluxDB 无法理解请求。
- 5xx: 系统过载或严重受损。
示例
将浮点数写入先前接受布尔值的字段
curl -i -XPOST 'http://localhost:8086/write?db=hamlet' \
--data-binary 'tobeornottobe booleanonly=true'
curl -i -XPOST 'http://localhost:8086/write?db=hamlet' \
--data-binary 'tobeornottobe booleanonly=5'
返回:
HTTP/1.1 400 Bad Request
Content-Type: application/json
Request-Id: [...]
X-Influxdb-Version: 1.11.8
Date: Wed, 01 Mar 2017 19:38:01 GMT
Content-Length: 150
{"error":"field type conflict: input field \"booleanonly\" on measurement \"tobeornottobe\" is type float, already exists as type boolean dropped=1"}
将一个点写入一个不存在的数据库
curl -i -XPOST 'http://localhost:8086/write?db=atlantis' \
--data-binary 'liters value=10'
返回:
HTTP/1.1 404 Not Found
Content-Type: application/json
Request-Id: [...]
X-Influxdb-Version: 1.11.8
Date: Wed, 01 Mar 2017 19:38:35 GMT
Content-Length: 45
{"error":"database not found: \"atlantis\""}
后续步骤
了解如何使用查询数据指南查询存储在InfluxDB中的数据!要了解有关使用InfluxDB API的更多信息,请参见InfluxDB API参考。