influxdb/client
derailed 0519d46132 cleaning up 2015-03-27 14:07:49 -06:00
..
README.md cleaning up 2015-03-27 14:07:49 -06:00
example_test.go updated the docs/example based on team feedback + added instructions for auth 2015-03-27 14:01:45 -06:00
influxdb.go Cleanup golint warnings for client code 2015-03-22 01:33:04 -04:00
influxdb_test.go version is a lie for the client library 2015-03-09 09:51:47 -06:00

README.md

InfluxDB Client

Description

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 impatients, 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 "admintrivia" out of the way, let's connect to our database.

NOTE: If you've opt out of creating a user, you can ommit Username/Password out of the configuration below.

package main

import "github.com/influxdb/influxdb/client"

const (
	MyHost        = "localhost"
	MyPort        = 8086
	MyDB          = "square_holes"
	MyMeasurement = "shapes"
)

func main() {
	u, err := url.Parse(fmt.Sprintf("http://%s:%d", MyHost, MyPort))
	if err != nil {
		log.Fatal(err)
	}

	conf := client.Config{
		URL:      *u,
		Username: os.Getenv("INFLUX_USER"),
		Password: os.Getenv("INFLUX_PWD"),
	}

	con, err := client.NewClient(conf)
	if err != nil {
		log.Fatal(err)
	}

	dur, ver, err := con.Ping()
	if err != nil {
		log.Fatal(err)
	}
	log.Printf("Happy as a Hippo! %v, %s", dur, ver)
}

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 1k points. Each point as a timestamp 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: In this example, we are specifically assigning time, tags and precision to each point. Alternately, you can specify a timestamp, tags and precision at the batch point level that could be used as defaults if an associated point does not provide these metrics.

NOTE: You can specify a RetentionPolicy as part of the batch points. If not provided it will use the database default retention policy. If you did not set a retention policy the default is forever (0).

func writePoints(con *client.Client) {
	var (
		shapes     = []string{"circle", "rectangle", "square", "triangle"}
		colors     = []string{"red", "blue", "green"}
		sampleSize = 1000
		pts        = make([]client.Point, sampleSize)
	)

	rand.Seed(42)
	for i := 0; i < sampleSize; i++ {
		pts[i] = client.Point{
			Name: "shapes",
			Tags: map[string]string{
				"color": strconv.Itoa(rand.Intn(len(colors))),
				"shape": strconv.Itoa(rand.Intn(len(shapes))),
			},
			Fields: map[string]interface{}{
				"value": rand.Intn(sampleSize),
			},
			Timestamp: time.Now(),
			Precision: "s",
		}
	}

	bps := client.BatchPoints{
		Points:          pts,
		Database:        MyDB,
		RetentionPolicy: "default",
	}
	_, err := con.Write(bps)
	if err != nil {
		log.Fatal(err)
	}
}

Querying Data

One nice advantage of using InfluxDB is having the ability to query your data using familiar SQL constructs. In this example we are providing a convenience function to query the database as follows:

// queryDB convenience to query the database
func queryDB(con *client.Client, cmd string) (res []client.Result, err error) {
	q := client.Query{
		Command:  cmd,
		Database: MyDB,
	}
	if results, err := con.Query(q); err == nil {
		if results.Error() != nil {
			return res, results.Error()
		}
		res = results.Results
	}
	return
}

Creating A Database

_, err := queryDB(con, 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(con, q)
if err != nil {
	log.Fatal(err)
}
count := res[0].Series[0].Values[0][1]
log.Printf("Found a total of `%v records", count)

Find the last 10 shapes records

q := fmt.Sprintf("select * from %s limit %d", MyMeasurement, 20)
res, err = queryDB(con, 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, err := row[1].(json.Number).Int64()
	log.Printf("[%2d] %s: %03d\n", i, t.Format(time.Stamp), val)
}

Go Docs

Please refer to http://godoc.org/github.com/influxdb/influxdb/client for documentation.

See Also

You can see a use of the client libray in the InfluxDB CLI.