最稳妥方式是使用 influxdb-client-go/v2 官方 SDK 连接 InfluxDB 2.x,需传 URL、token 和 org 初始化 client,bucket 在写入时指定;务必批量 Flush 并检查错误,时间戳用 time.Now().UTC() 保证纳秒精度,避免 tag 高基数和字段类型错配。

Go 里直接用 influxdb-client-go 写时序数据最稳妥,别碰老版 influxdb 官方库(v1.x)或自己拼 HTTP 请求——容易丢点、没重试、时间精度错乱。
用 influxdb-client-go 连 InfluxDB 2.x 写数据
这是当前唯一推荐的 Go 客户端,原生支持 token 认证、批量写入、自动重试和纳秒级时间戳。注意它不兼容 InfluxDB 1.x 的 HTTP API,必须用 2.x 或 Cloud。
- 安装:
go get github.com/influxdata/influxdb-client-go/v2 - 初始化 client 时传入 URL、token 和 org,
bucket不是初始化参数,而是写入时指定 - 写入前必须先创建
bucket和org(CLI 或 UI 操作,SDK 不提供创建接口) - 避免每条数据都调
WriteAPI.WritePoint():攒够 100–1000 点再Flush(),否则网络开销大、服务端压力高
Point 构造时字段类型和时间精度要对齐
InfluxDB 存储时按 nanosecond 级时间索引,但 Go 的 time.Time 默认可能带微秒或毫秒,如果手动截断或误用 .UnixMilli(),会导致多点落在同一时间戳被覆盖(最后写入生效)。
- 始终用
time.Now().UTC()或明确纳秒精度的时间,例如t.Add(time.Nanosecond * 123) - 写入整数字段用
point.AddField("value", int64(42)),别传int(32 位平台可能溢出) - 字符串 tag 值不能含逗号、等号、空格,否则解析失败;可提前用
strings.ReplaceAll(v, " ", "_")清洗 - 不要在 tag 里塞高基数字段(如用户 ID),会撑爆 series cardinality
处理写入失败:别只靠 err != nil
WriteAPI 的 WritePoint() 默认不立即报错,错误藏在后台 goroutine 的 buffer flush 阶段。只检查函数返回值会漏掉大部分失败。
- 启用失败回调:
client.WriteAPIWithOptions(org, bucket, influxdb2.WriteOptions{BatchSize: 1000, FlushInterval: 1000, RetryInterval: 1000, ErrorCallback: func(err error){ log.Printf("write err: %v", err) }}) - 定期调
WriteAPI.Flush()并检查返回 error,尤其在程序退出前 - 遇到
429 Too Many Requests说明写入超限,得降频或升配 bucket 的 write limit - 网络断连时,client 会自动重试(默认 3 次),但重试间隔固定,长故障下 buffer 可能溢出,需监控
WriteAPI.Errors()通道
真正麻烦的是 schema 设计和 cardinality 控制——tag 组合爆炸、field 类型混用、timestamp 重复,这些问题在写入时看不出异常,查起来却要翻半天日志。宁可前期多花半小时想清楚 tag 结构,也别后期改 bucket 或 backfill 数据。











