README ¶
InfluxDB Client
Description
NOTE: The Go client library now has a "v2" version, with the old version
being deprecated. The new version can be imported at
import "github.com/influxdb/influxdb/client/v2"
. It is not backwards-compatible.
A Go client library written and maintained by the InfluxDB team. This package provides convenience functions to read and write time series data. It uses the HTTP protocol to communicate with your InfluxDB cluster.
Getting Started
Connecting To Your Database
Connecting to an InfluxDB database is straightforward. You will need a host name, a port and the cluster user credentials if applicable. The default port is 8086. You can customize these settings to your specific installation via the InfluxDB configuration file.
Thought not necessary for experimentation, you may want to create a new user and authenticate the connection to your database.
For more information please check out the Cluster Admin Docs.
For the impatient, you can create a new admin user bubba by firing off the InfluxDB CLI.
influx
> create user bubba with password 'bumblebeetuna'
> grant all privileges to bubba
And now for good measure set the credentials in you shell environment. In the example below we will use $INFLUX_USER and $INFLUX_PWD
Now with the administrivia out of the way, let's connect to our database.
NOTE: If you've opted out of creating a user, you can omit Username and Password in the configuration below.
package main
import
import (
"net/url"
"fmt"
"log"
"os"
"github.com/influxdb/influxdb/client/v2"
)
const (
MyDB = "square_holes"
username = "bubba"
password = "bumblebeetuna"
)
func main() {
// Make client
c := client.NewHTTPClient(client.HTTPConfig{
Addr: "http://localhost:8086",
Username: username,
Password: password,
})
// Create a new point batch
bp := client.NewBatchPoints(client.BatchPointsConfig{
Database: MyDB,
Precision: "s",
})
// Create a point and add to batch
tags := map[string]string{"cpu": "cpu-total"}
fields := map[string]interface{}{
"idle": 10.1,
"system": 53.3,
"user": 46.6,
}
pt := client.NewPoint("cpu_usage", tags, fields, time.Now())
bp.AddPoint(pt)
// Write the batch
c.Write(bp)
}
Inserting Data
Time series data aka points are written to the database using batch inserts. The mechanism is to create one or more points and then create a batch aka batch points and write these to a given database and series. A series is a combination of a measurement (time/values) and a set of tags.
In this sample we will create a batch of a 1,000 points. Each point has a time and a single value as well as 2 tags indicating a shape and color. We write these points to a database called square_holes using a measurement named shapes.
NOTE: You can specify a RetentionPolicy as part of the batch points. If not provided InfluxDB will use the database default retention policy.
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)
}
}
Querying Data
One nice advantage of using InfluxDB the ability to query your data using familiar SQL constructs. In this example we can create a convenience function to query the database as follows:
// queryDB convenience function to query the database
func queryDB(clnt client.Client, cmd string) (res []client.Result, err error) {
q := client.Query{
Command: cmd,
Database: MyDB,
}
if response, err := clnt.Query(q); err == nil {
if response.Error() != nil {
return res, response.Error()
}
res = response.Results
}
return res, nil
}
Creating a Database
_, err := queryDB(clnt, fmt.Sprintf("CREATE DATABASE %s", MyDB))
if err != nil {
log.Fatal(err)
}
Count Records
q := fmt.Sprintf("SELECT count(%s) FROM %s", "value", MyMeasurement)
res, err := queryDB(clnt, q)
if err != nil {
log.Fatal(err)
}
count := res[0].Series[0].Values[0][1]
log.Printf("Found a total of %v records\n", count)
Find the last 10 shapes records
q := fmt.Sprintf("SELECT * FROM %s LIMIT %d", MyMeasurement, 20)
res, err = queryDB(clnt, q)
if err != nil {
log.Fatal(err)
}
for i, row := range res[0].Series[0].Values {
t, err := time.Parse(time.RFC3339, row[0].(string))
if err != nil {
log.Fatal(err)
}
val := row[1].(string)
log.Printf("[%2d] %s: %s\n", i, t.Format(time.Stamp), val)
}
Using the UDP Client
The InfluxDB client also supports writing over UDP.
func WriteUDP() {
// Make client
c := client.NewUDPClient("localhost:8089")
// Create a new point batch
bp, _ := client.NewBatchPoints(client.BatchPointsConfig{
Precision: "s",
})
// Create a point and add to batch
tags := map[string]string{"cpu": "cpu-total"}
fields := map[string]interface{}{
"idle": 10.1,
"system": 53.3,
"user": 46.6,
}
pt, err := client.NewPoint("cpu_usage", tags, fields, time.Now())
if err != nil {
panic(err.Error())
}
bp.AddPoint(pt)
// Write the batch
c.Write(bp)
}
Go Docs
Please refer to http://godoc.org/github.com/influxdb/influxdb/client/v2 for documentation.
See Also
You can also examine how the client library is used by the InfluxDB CLI.
Documentation ¶
Index ¶
- Constants
- func EpochToTime(epoch int64, precision string) (time.Time, error)
- func ParseConnectionString(path string, ssl bool) (url.URL, error)
- func SetPrecision(t time.Time, precision string) time.Time
- type BatchPoints
- type Client
- func (c *Client) Addr() string
- func (c *Client) Ping() (time.Duration, string, error)
- func (c *Client) Query(q Query) (*Response, error)
- func (c *Client) SetAuth(u, p string)
- func (c *Client) SetPrecision(precision string)
- func (c *Client) Write(bp BatchPoints) (*Response, error)
- func (c *Client) WriteLineProtocol(data, database, retentionPolicy, precision, writeConsistency string) (*Response, error)
- type Config
- type Point
- type Query
- type Response
- type Result
Examples ¶
Constants ¶
const ( // DefaultHost is the default host used to connect to an InfluxDB instance DefaultHost = "localhost" // DefaultPort is the default port used to connect to an InfluxDB instance DefaultPort = 8086 // DefaultTimeout is the default connection timeout used to connect to an InfluxDB instance DefaultTimeout = 0 )
const ( // ConsistencyOne requires at least one data node acknowledged a write. ConsistencyOne = "one" // ConsistencyAll requires all data nodes to acknowledge a write. ConsistencyAll = "all" // ConsistencyQuorum requires a quorum of data nodes to acknowledge a write. ConsistencyQuorum = "quorum" // ConsistencyAny allows for hinted hand off, potentially no write happened yet. ConsistencyAny = "any" )
Variables ¶
This section is empty.
Functions ¶
func EpochToTime ¶ added in v0.9.0
EpochToTime takes a unix epoch time and uses precision to return back a time.Time
func ParseConnectionString ¶ added in v0.9.3
ParseConnectionString will parse a string to create a valid connection URL
Types ¶
type BatchPoints ¶ added in v0.9.0
type BatchPoints struct { Points []Point `json:"points,omitempty"` Database string `json:"database,omitempty"` RetentionPolicy string `json:"retentionPolicy,omitempty"` Tags map[string]string `json:"tags,omitempty"` Time time.Time `json:"time,omitempty"` Precision string `json:"precision,omitempty"` WriteConsistency string `json:"-"` }
BatchPoints is used to send batched data in a single write. Database and Points are required If no retention policy is specified, it will use the databases default retention policy. If tags are specified, they will be "merged" with all points. If a point already has that tag, it will be ignored. If time is specified, it will be applied to any point with an empty time. Precision can be specified if the time is in epoch format (integer). Valid values for Precision are n, u, ms, s, m, and h
func (*BatchPoints) UnmarshalJSON ¶ added in v0.9.0
func (bp *BatchPoints) UnmarshalJSON(b []byte) error
UnmarshalJSON decodes the data into the BatchPoints struct
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
Client is used to make calls to the server.
func NewClient ¶
NewClient will instantiate and return a connected client to issue commands to the server.
func (*Client) Addr ¶ added in v0.9.0
Addr provides the current url as a string of the server the client is connected to.
func (*Client) Ping ¶
Ping will check to see if the server is up Ping returns how long the request took, the version of the server it connected to, and an error if one occurred.
func (*Client) SetPrecision ¶ added in v0.9.5
SetPrecision will update the precision
func (*Client) Write ¶ added in v0.9.0
func (c *Client) Write(bp BatchPoints) (*Response, error)
Write takes BatchPoints and allows for writing of multiple points with defaults If successful, error is nil and Response is nil If an error occurs, Response may contain additional information if populated.
func (*Client) WriteLineProtocol ¶ added in v0.9.3
func (c *Client) WriteLineProtocol(data, database, retentionPolicy, precision, writeConsistency string) (*Response, error)
WriteLineProtocol takes a string with line returns to delimit each write If successful, error is nil and Response is nil If an error occurs, Response may contain additional information if populated.
type Config ¶ added in v0.9.0
type Config struct { URL url.URL Username string Password string UserAgent string Timeout time.Duration Precision string }
Config is used to specify what server to connect to. URL: The URL of the server connecting to. Username/Password are optional. They will be passed via basic auth if provided. UserAgent: If not provided, will default "InfluxDBClient", Timeout: If not provided, will default to 0 (no timeout)
type Point ¶ added in v0.9.0
type Point struct { Measurement string Tags map[string]string Time time.Time Fields map[string]interface{} Precision string Raw string }
Point defines the fields that will be written to the database Measurement, Time, and Fields are required Precision can be specified if the time is in epoch format (integer). Valid values for Precision are n, u, ms, s, m, and h
func (*Point) MarshalJSON ¶ added in v0.9.0
MarshalJSON will format the time in RFC3339Nano Precision is also ignored as it is only used for writing, not reading Or another way to say it is we always send back in nanosecond precision
func (*Point) MarshalString ¶ added in v0.9.0
MarshalString renders string representation of a Point with specified precision. The default precision is nanoseconds.
func (*Point) UnmarshalJSON ¶ added in v0.9.0
UnmarshalJSON decodes the data into the Point struct
type Query ¶ added in v0.9.0
Query is used to send a command to the server. Both Command and Database are required.
type Response ¶ added in v0.9.0
Response represents a list of statement results.
func (Response) Error ¶ added in v0.9.0
Error returns the first error from any statement. Returns nil if no errors occurred on any statements.
func (*Response) MarshalJSON ¶ added in v0.9.0
MarshalJSON encodes the response into JSON.
func (*Response) UnmarshalJSON ¶ added in v0.9.0
UnmarshalJSON decodes the data into the Response struct
type Result ¶ added in v0.9.0
Result represents a resultset returned from a single statement.
func (*Result) MarshalJSON ¶ added in v0.9.0
MarshalJSON encodes the result into JSON.
func (*Result) UnmarshalJSON ¶ added in v0.9.0
UnmarshalJSON decodes the data into the Result struct