如何使用golang客户端写连续写入Influxdb

时间:2016-06-28 05:05:12

标签: logging go influxdb

我使用InfluxDB来存储我的时间序列数据。

我写了一个简单的golang应用程序来读取名为time.log的文件中的行。

https://github.com/influxdata/influxdb/blob/master/client/README.md#inserting-data处的文档说:

  

插入数据

     

使用批量插入将时间序列数据(即点)写入数据库。该机制是创建一个或多个点,然后创建批处理批处理点并将这些点写入给定的数据库和系列。系列是测量(时间/值)和一组标签的组合。

     

在此示例中,我们将创建一个1,000点的批次。每个点都有一个时间和一个值,以及2个表示形状和颜色的标签。我们使用名为shapes的测量将这些点写入名为square_holes的数据库。

     

注意:您可以将RetentionPolicy指定为批处理点的一部分。如果没有提供,InfluxDB将使用数据库默认保留策略。

func writePoints(clnt client.Client) {
    sampleSize := 1000
    rand.Seed(42)

    bp, _ := client.NewBatchPoints(client.BatchPointsConfig{
        Database:  "systemstats",
        Precision: "us",
    })

    for i := 0; i < sampleSize; i++ {
        regions := []string{"us-west1", "us-west2", "us-west3", "us-east1"}
        tags := map[string]string{
            "cpu":    "cpu-total",
            "host":   fmt.Sprintf("host%d", rand.Intn(1000)),
            "region": regions[rand.Intn(len(regions))],
        }

        idle := rand.Float64() * 100.0
        fields := map[string]interface{}{
            "idle": idle,
            "busy": 100.0 - idle,
        }

        bp.AddPoint(client.NewPoint(
            "cpu_usage",
            tags,
            fields,
            time.Now(),
        ))
    }

    err := clnt.Write(bp)
    if err != nil {
        log.Fatal(err)
    }
}

但是因为我不断从日志中读取数据。我从未读过日志。那么,将点数写入涌入服务器的最佳方法是什么?

这是我目前的代码:

cmdBP := client.NewBatchPoints(...)
for line := range logFile.Lines {
    pt := parseLine(line.Text)
    cmdBP.AddPoint(pt)
}

influxClient.Write(cmdBP)

基本上,范围logFile.Lines永远不会终止,因为它基于通道。

1 个答案:

答案 0 :(得分:2)

使用批处理点和超时的组合(这作为goroutine运行):

func (h *InfluxDBHook) loop() {
    var coll []*client.Point
    tick := time.NewTicker(h._batchInterval)

    for {
        timeout := false

        select {
        case pt := <-h._points:
            coll = append(coll, pt)
        case <-tick.C:
            timeout = true
        }

        if (timeout || len(coll) >= h._batchSize) && len(coll) > 0 {
            bp, err := client.NewBatchPoints(h._batchPointsConfig)
            if err != nil {
                //TODO:
            }
            bp.AddPoints(coll)
            err = h._client.Write(bp)
            if err != nil {
                //TODO:
            } else {
                coll = nil
            }
        }
    }
}

顺便说一句,您可以使用带有 logrus 日志包的挂钩,将日志发送到InfluxDB(示例代码来自 logrus InfluxDB hook)。