使用Go客户端写入InfluxDB会导致随机错误

时间:2017-05-09 03:55:14

标签: go influxdb

我正在使用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代码。

我很遗憾还要做些什么来进一步调试这个问题。任何帮助或指导将不胜感激。

0 个答案:

没有答案