首页 文章

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

提问于
浏览
1

我正在使用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 {
数据库:“systemstats”,
精度:“我们”,
})

对于i:= 0;我<sampleSize;一世 {
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”:区域[rand.Intn(len(regions))],
}

idle:= rand.Float64()* 100.0
fields:= map [string] interface {} {
“闲置”:闲置,
“忙”:100.0 - 闲置,
}

bp.AddPoint(client.NewPoint(
“CPU使用率”,
标签,
场,
现在的时间(),
))
}

错误:= 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 回答

  • 1

    使用批处理点和超时的组合(这作为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) .

相关问题