influxdb v1.8 和 v2.x 均将运行指标写入 _internal(v1 为 database,v2 为 bucket),可通过 influxql 或 flux 查询 write 测量中的 pointreq 字段获取每秒写入点数,并结合 /metrics 端点监控 go 运行时指标与写入性能。

查 _internal 数据库看实时写入吞吐
InfluxDB v1.8 和 v2.x 都会把自身运行指标写进 _internal 这个内置 bucket(v1 叫 database),不用额外配置就能查。它包含 write measurement,里面就有每秒请求数、点数、延迟等关键数据。
Flux 查询示例(v2.x):
from(bucket: "_internal") |> range(start: -5m) |> filter(fn: (r) => r._measurement == "write" and r._field == "pointReq") |> derivative(unit: 1s, nonNegative: true)
注意:pointReq 是每秒写入点数,不是请求数;v1.8 里对应的是 write measurement 下的 pointReq 字段,但要用 InfluxQL:SELECT derivative(pointReq, 1s) FROM "write" WHERE time > now() - 5m
- v2.x 的
_internal默认在org="default"+bucket="_internal",得确认你用的 token 对这个 bucket 有读权限 - v1.8 的
_internaldatabase 不支持直接用influxdb1-client查 Flux,只能走 InfluxQL;v2.x 必须用 Flux,QueryAPI.Query()才能正确解析 table 结构 - 如果查不到数据,先执行
curl http://localhost:8086/debug/vars看是否启用了 internal 监控(v1.8)或检查 UI 中Settings → Configurations是否启用monitor服务(v2.x)
用 /metrics 端点暴露 Go runtime 指标
InfluxDB 自身提供 /metrics HTTP 接口(默认 http://localhost:8086/metrics),返回 Prometheus 格式文本,含 Go runtime 指标如 goroutines 数、GC 耗时、内存分配——这些能间接反映写入压力是否导致服务卡顿。
常见有用指标:
-
go_goroutines:持续上涨不回落,说明写入协程堆积或 WriteAPI 缓冲区满没 flush -
influxdb_http_request_duration_seconds_count{handler="/api/v2/write"}(v2.x)或http_request_duration_microseconds_count{handler="/write"}(v1.8):突增说明写入请求变慢 -
go_memstats_alloc_bytes:配合go_memstats_heap_objects看是否有内存泄漏迹象
注意:/metrics 端点默认只监听 localhost,Docker 启动时需加 --net=host 或显式绑定 -bind-address :8086,否则外部采集器(如 Prometheus)连不上。
在 Go 客户端里埋点统计写入耗时与失败率
SDK 本身不暴露内部耗时,但你可以用 WriteAPI.WritePoint() 或 WriteAPI.WriteRecord() 的返回 error + time.Since() 手动打点。重点监控两类失败:
-
WriteError: timeout:说明 batch 太大或网络抖动,要调小WriteOptions.BatchSize和FlushInterval -
400 Bad Request:大概率是 Line Protocol 解析失败,比如 tag 值含空格没转义、时间戳为 0、field 类型混用(先写temp=23.5再写temp="N/A") -
403 Forbidden:token 权限不足,缺对应 bucket 的 write 权限
建议在生产中用 WriteAPI(非 blocking)+ 单独 goroutine 每 10 秒上报一次统计:
stats := struct{ Success, Failed, Timeout int64 }{}
// 每次 WriteRecord 后原子更新 stats.Success 或 stats.Timeout
// 定期发到另一个监控 bucket,比如 measurement="client_write_stats"
别用 WriteAPIBlocking 埋点——它同步阻塞,统计值会包含网络 RTT,掩盖真实客户端瓶颈。
避免误把 client 级指标当 DB 性能指标
很多人一上来就盯着 client.WriteAPI().WritePoint() 是否报错,但这只是“请求发出去没”,不代表数据真正落盘。InfluxDB 写入路径是:HTTP 接收 → 内存 buffer → WAL 日志 → TSM 文件,中间任何环节出问题都可能静默丢点。
- 查
_internal里的write数据,看pointReq和你程序预期写入量是否匹配 - 查
_internal里的walmeasurement,看wal_writes是否持续增长但tsm_fullness不升,说明 WAL 没刷到磁盘 - Grafana 里对比 “应用侧计数器” 和 “InfluxDB 实际查到的点数”,差值超过 1% 就该排查缓冲区、重试策略或 token 权限
最常被忽略的一点:InfluxDB v2.x 的 _internal 数据默认每 10 秒采样一次,如果你 flush interval 设成 50ms,实际看到的吞吐是平滑后的均值,看不出瞬时毛刺。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











