This example demonstrates the full lifecycle: creating a client, writing points using both the full constructor and the fluent style, writing via Line Protocol, and querying data back using Flux.
Key methods used:
influxdb2.NewClient(url, token): Initializes the client.client.WriteAPIBlocking(org, bucket): Provides a synchronous write API.client.QueryAPI(org): Provides the query interface.client.Close(): Ensures background processes finish.
package main
import (
"context"
"fmt"
"time"
"github.com/influxdata/influxdb-client-go/v2"
)
func main() {
client := influxdb2.NewClient("http://localhost:8086", "my-token")
writeAPI := client.WriteAPIBlocking("my-org", "my-bucket")
// Write using full params constructor
p := influxdb2.NewPoint("stat",
map[string]string{"unit": "temperature"},
map[string]interface{}{"avg": 24.5, "max": 45.0},
time.Now())
writeAPI.WritePoint(context.Background(), p)
// Write using fluent style
p = influxdb2.NewPointWithMeasurement("stat").
AddTag("unit", "temperature").
AddField("avg", 23.2).
AddField("max", 45.0).
SetTime(time.Now())
err := writeAPI.WritePoint(context.Background(), p)
if err != nil {
panic(err)
}
// Write directly via Line Protocol
line := fmt.Sprintf("stat,unit=temperature avg=%f,max=%f", 23.5, 45.0)
err = writeAPI.WriteRecord(context.Background(), line)
if err != nil {
panic(err)
}
queryAPI := client.QueryAPI("my-org")
result, err := queryAPI.Query(context.Background(), `from(bucket:"my-bucket")|> range(start: -1h) |> filter(fn: (r) => r._measurement == "stat")`)
if err == nil {
for result.Next() {
if result.TableChanged() {
fmt.Printf("table: %s\n", result.TableMetadata().String())
}
fmt.Printf("row: %s\n", result.Record().String())
}
if result.Err() != nil {
fmt.Printf("Query error: %s\n", result.Err().Error())
}
} else {
panic(err)
}
client.Close()
}