我正在使用golang Influx v2客户端库写入我的Influxdb。我的代码基于客户端文档中的参考示例非常简单:
func SaveMetricsToInflux(id string, rs Resultset, mtype string) {
defer conf.Trace()()
// Create a new HTTPClient
c, err := client.NewHTTPClient(client.HTTPConfig{
Addr: conf.InfluxEP,
Username: conf.InfluxUser,
Password: conf.InfluxPasswd,
})
if err != nil {
log.Println("Error connecting to the Influx server", err)
}
defer c.Close()
bp, err := client.NewBatchPoints(client.BatchPointsConfig{
Database: conf.InfluxDb,
Precision: "s",
})
if err != nil {
log.Println("Error creating a NewBatchPoint", err)
}
for _, v := range rs.Values {
tags := map[string]string{
"id": id,
"mtype": mtype,
}
fields := map[string]interface{}{
avgpcpu: v.MetricValue,
}
pt, err := client.NewPoint(
tablename,
tags,
fields,
time.Unix(v.MetricTime, 0),
)
if err != nil {
log.Println("Error creating NewPoint ", err)
}
bp.AddPoint(pt)
// f, _ := pt.Fields()
// log.Printf("adding point %s >> %v >> %s >> %d >> %v", pt.Name(), pt.Tags(), pt.Time(), pt.UnixNano(), f)
}
if err := c.Write(bp); err != nil {
log.Println("Error writing to Influx", err)
}
}
通常,Resultset将有大约4200行(有时它在100以下),并且每个行都转换为包含两个字符串标记和一个float字段的BatchPoint。该指标从Cloudwatch中检索并推送到Influx中,SaveMetricsToInflux方法在循环中调用,每个EC2实例一次。
我面临的问题是,几乎每次写操作都会返回Partial Write错误。错误的细节因尝试而异。
例如,在我最近的运行期间出现了以下错误(尝试写入196条记录):
写入Influx时出错{"错误":"部分写入:\ n无法解析 ' metrics,id = i-094385fbc09268fd6,mtype = ec2-cpu avg-pcpu = 1.662-cpu avg-pcpu = 1.802 1494277200':无效的数字\ n不能解析' 6 1494244500':无效的字段格式\ n无法解析 ' metrics,id = i-094385fbc09268fd6,mtype = ec':缺少字段"}
如图所示,这看起来像数据损坏。首先我认为这是因为发送了太多记录,但正如上面最后一个例子所示,它也发生在低100条记录中。
接下来,我想,我的代码可能会损坏内存。所以我在添加时注销了每个BatchPoint,并且还注销了HTTP发送的记录的HTTP Query数据(来自Influx golang客户端)。这两个地方的数据都是原始的和正确的,但我收到了错误。
到目前为止,部分写入导致丢失少于100条记录。在Influxdb中,这也是通过创建无效的测量和数据来搞乱我的数据:> show measurements
name: measurements
name
----
metricd01d7a <-- this is invalid
metrics <-- valid
s <-- this is invalid
> select count(*) from metrics group by mtype
name: metrics
tags: mtype= <-- this is invalid
time count_avg-pcpu
---- --------------
0 4
name: metrics
tags: mtype=ec2-cec2-cpu <-- this is invalid
time count_avg-pcpu
---- --------------
0 1
name: metrics <-- valid
tags: mtype=ec2-cpu
time count_avg-pcpu
---- --------------
0 42210
由于我没有看到这个问题被广泛报道,我不得不假设这在我的环境中是独一无二的。在之前的开发中,我曾使用node.js和javascript API写入相同的InfluxDB(大约相同的行),而不会出现此问题。这似乎把责任归咎于我写的golang代码。
我很遗憾还要做些什么来进一步调试这个问题。任何帮助或指导将不胜感激。