func TestSetWriteConsistency(t *testing.T) { t.Parallel() c := cli.New(CLIENT_VERSION) config := client.NewConfig() client, _ := client.NewClient(config) c.Client = client // set valid write consistency consistency := "all" c.SetWriteConsistency("consistency " + consistency) if c.WriteConsistency != consistency { t.Fatalf("WriteConsistency is %s but should be %s", c.WriteConsistency, consistency) } // set different valid write consistency and validate change consistency = "quorum" c.SetWriteConsistency("consistency " + consistency) if c.WriteConsistency != consistency { t.Fatalf("WriteConsistency is %s but should be %s", c.WriteConsistency, consistency) } // set invalid write consistency and verify there was no change invalidConsistency := "invalid_consistency" c.SetWriteConsistency("consistency " + invalidConsistency) if c.WriteConsistency == invalidConsistency { t.Fatalf("WriteConsistency is %s but should be %s", c.WriteConsistency, consistency) } }
func NewClient(c InfluxdbConfig) (InfluxdbClient, error) { url := &url.URL{ Scheme: "http", Host: c.Host, } if c.Secure { url.Scheme = "https" } iConfig := &influxdb.Config{ URL: *url, Username: c.User, Password: c.Password, UserAgent: fmt.Sprintf("%v/%v", "heapster", version.HeapsterVersion), } client, err := influxdb.NewClient(*iConfig) if err != nil { return nil, err } if _, _, err := client.Ping(); err != nil { return nil, fmt.Errorf("failed to ping InfluxDB server at %q - %v", c.Host, err) } return client, nil }
func TestClient_BasicAuth(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { u, p, ok := r.BasicAuth() if !ok { t.Errorf("basic auth error") } if u != "username" { t.Errorf("unexpected username, expected %q, actual %q", "username", u) } if p != "password" { t.Errorf("unexpected password, expected %q, actual %q", "password", p) } w.WriteHeader(http.StatusNoContent) })) defer ts.Close() u, _ := url.Parse(ts.URL) u.User = url.UserPassword("username", "password") config := client.Config{URL: *u, Username: "******", Password: "******"} c, err := client.NewClient(config) if err != nil { t.Fatalf("unexpected error. expected %v, actual %v", nil, err) } _, _, err = c.Ping() if err != nil { t.Fatalf("unexpected error. expected %v, actual %v", nil, err) } }
func TestParseCommand_InsertInto(t *testing.T) { t.Parallel() ts := emptyTestServer() defer ts.Close() u, _ := url.Parse(ts.URL) config := client.Config{URL: *u} c, err := client.NewClient(config) if err != nil { t.Fatalf("unexpected error. expected %v, actual %v", nil, err) } m := cli.CommandLine{Client: c} tests := []struct { cmd, db, rp string }{ { cmd: `INSERT INTO test cpu,host=serverA,region=us-west value=1.0`, db: "", rp: "test", }, { cmd: ` INSERT INTO .test cpu,host=serverA,region=us-west value=1.0`, db: "", rp: "test", }, { cmd: `INSERT INTO "test test" cpu,host=serverA,region=us-west value=1.0`, db: "", rp: "test test", }, { cmd: `Insert iNTO test.test cpu,host=serverA,region=us-west value=1.0`, db: "test", rp: "test", }, { cmd: `insert into "test test" cpu,host=serverA,region=us-west value=1.0`, db: "test", rp: "test test", }, { cmd: `insert into "d b"."test test" cpu,host=serverA,region=us-west value=1.0`, db: "d b", rp: "test test", }, } for _, test := range tests { if err := m.ParseCommand(test.cmd); err != nil { t.Fatalf(`Got error %v for command %q, expected nil.`, err, test.cmd) } if m.Database != test.db { t.Fatalf(`Command "insert into" db parsing failed, expected: %q, actual: %q`, test.db, m.Database) } if m.RetentionPolicy != test.rp { t.Fatalf(`Command "insert into" rp parsing failed, expected: %q, actual: %q`, test.rp, m.RetentionPolicy) } } }
func BenchmarkWrite(b *testing.B) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var data client.Response w.WriteHeader(http.StatusNoContent) _ = json.NewEncoder(w).Encode(data) })) defer ts.Close() u, _ := url.Parse(ts.URL) config := client.Config{URL: *u} c, err := client.NewClient(config) if err != nil { b.Fatalf("unexpected error. expected %v, actual %v", nil, err) } bp := client.BatchPoints{ Points: []client.Point{ {Fields: map[string]interface{}{"value": 101}}}, } for i := 0; i < b.N; i++ { r, err := c.Write(bp) if err != nil { b.Fatalf("unexpected error. expected %v, actual %v", nil, err) } if r != nil { b.Fatalf("unexpected response. expected %v, actual %v", nil, r) } } }
func TestClient_WriteUint64(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var data client.Response w.WriteHeader(http.StatusNoContent) _ = json.NewEncoder(w).Encode(data) })) defer ts.Close() u, _ := url.Parse(ts.URL) config := client.Config{URL: *u} c, err := client.NewClient(config) if err != nil { t.Fatalf("unexpected error. expected %v, actual %v", nil, err) } bp := client.BatchPoints{ Points: []client.Point{ { Fields: map[string]interface{}{"value": uint64(10)}, }, }, } r, err := c.Write(bp) if err == nil { t.Fatalf("unexpected error. expected err, actual %v", err) } if r != nil { t.Fatalf("unexpected response. expected %v, actual %v", nil, r) } }
func TestClient_NoTimeout(t *testing.T) { if testing.Short() { t.Skip("skipping in short mode") } ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { time.Sleep(1 * time.Second) var data client.Response w.WriteHeader(http.StatusOK) _ = json.NewEncoder(w).Encode(data) })) defer ts.Close() u, _ := url.Parse(ts.URL) config := client.Config{URL: *u} c, err := client.NewClient(config) if err != nil { t.Fatalf("unexpected error. expected %v, actual %v", nil, err) } query := client.Query{} _, err = c.Query(query) if err != nil { t.Fatalf("unexpected error. expected %v, actual %v", nil, err) } }
func TestParseCommand_Use(t *testing.T) { t.Parallel() ts := emptyTestServer() defer ts.Close() u, _ := url.Parse(ts.URL) config := client.Config{URL: *u} c, err := client.NewClient(config) if err != nil { t.Fatalf("unexpected error. expected %v, actual %v", nil, err) } tests := []struct { cmd string }{ {cmd: "use db"}, {cmd: " use db"}, {cmd: "use db "}, {cmd: "use db;"}, {cmd: "use db; "}, {cmd: "Use db"}, } for _, test := range tests { m := cli.CommandLine{Client: c} if err := m.ParseCommand(test.cmd); err != nil { t.Fatalf(`Got error %v for command %q, expected nil.`, err, test.cmd) } if m.Database != "db" { t.Fatalf(`Command "use" changed database to %q. Expected db`, m.Database) } } }
func TestParseCommand_Insert(t *testing.T) { t.Parallel() ts := emptyTestServer() defer ts.Close() u, _ := url.Parse(ts.URL) config := client.Config{URL: *u} c, err := client.NewClient(config) if err != nil { t.Fatalf("unexpected error. expected %v, actual %v", nil, err) } m := cli.CommandLine{Client: c} tests := []struct { cmd string }{ {cmd: "INSERT cpu,host=serverA,region=us-west value=1.0"}, {cmd: " INSERT cpu,host=serverA,region=us-west value=1.0"}, {cmd: "INSERT cpu,host=serverA,region=us-west value=1.0"}, {cmd: "insert cpu,host=serverA,region=us-west value=1.0 "}, {cmd: "insert"}, {cmd: "Insert "}, {cmd: "insert c"}, {cmd: "insert int"}, } for _, test := range tests { if err := m.ParseCommand(test.cmd); err != nil { t.Fatalf(`Got error %v for command %q, expected nil.`, err, test.cmd) } } }
func TestNewClient(t *testing.T) { config := client.Config{} _, err := client.NewClient(config) if err != nil { t.Fatalf("unexpected error. expected %v, actual %v", nil, err) } }
func (r *reporter) makeClient() (err error) { r.client, err = client.NewClient(client.Config{ URL: r.url, Username: r.username, Password: r.password, }) return }
func TestParseCommand_UseAuth(t *testing.T) { t.Parallel() ts := emptyTestServer() defer ts.Close() u, _ := url.Parse(ts.URL) tests := []struct { cmd string user string database string }{ { cmd: "use db", user: "******", database: "db", }, { cmd: "use blank", user: "******", database: "", }, { cmd: "use db", user: "******", database: "db", }, { cmd: "use blank", user: "******", database: "blank", }, } for i, tt := range tests { config := client.Config{URL: *u, Username: tt.user} fmt.Println("using auth:", tt.user) c, err := client.NewClient(config) if err != nil { t.Errorf("%d. unexpected error. expected %v, actual %v", i, nil, err) continue } m := cli.CommandLine{Client: c} m.ClientConfig.Username = tt.user if err := m.ParseCommand(tt.cmd); err != nil { t.Fatalf(`%d. Got error %v for command %q, expected nil.`, i, err, tt.cmd) } if m.Database != tt.database { t.Fatalf(`%d. Command "use" changed database to %q. Expected %q`, i, m.Database, tt.database) } } }
// InfluxHandler factory function // reutrn *InfluxHandler and error func NewInfluxHandler(h string, p int, db string, u string, pwd string, max int, delay int) (*InfluxHandler, error) { url, err := client.ParseConnectionString(fmt.Sprintf("%s:%d", h, p), false) if err != nil { return nil, err } cfg := client.NewConfig() cfg.URL = url cfg.Username = u cfg.Password = pwd cfg.Precision = "s" // 秒级别的精度就行 c, e := client.NewClient(cfg) if e != nil { return nil, e } _, _, err = c.Ping() if err != nil { return nil, err } ih := new(InfluxHandler) ih.c = c ih.force = make(chan struct{}, 1) ih.last = time.Now() ih.h = h ih.p = p ih.db = db ih.u = u ih.pwd = pwd if max <= 10 || max > 4096 { ih.max = 4096 } else { ih.max = max } if delay <= 60 || delay > 600 { ih.delay = time.Second * 600 } else { ih.delay = time.Second * delay } ih.ch = make(chan unit, int(ih.max+ih.max/2)) go ih.consume() return ih, nil }
func TestSetFormat(t *testing.T) { t.Parallel() c := cli.New(CLIENT_VERSION) config := client.NewConfig() client, _ := client.NewClient(config) c.Client = client // validate set non-default format f := "json" c.SetFormat("format " + f) if c.Format != f { t.Fatalf("Format is %s but should be %s", c.Format, f) } }
func (this *runner) makeClient() (err error) { this.client, err = client.NewClient(client.Config{ URL: this.cf.url, Username: this.cf.username, Password: this.cf.password, Timeout: time.Second * 4, }) _, _, err = this.client.Ping() if err != nil { this.client = nil // to trigger retry } return }
func ExampleClient_Ping() { host, err := url.Parse(fmt.Sprintf("http://%s:%d", "localhost", 8086)) if err != nil { log.Fatal(err) } con, err := client.NewClient(client.Config{URL: *host}) 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) }
// Connect connects client to a server func (c *CommandLine) Connect(cmd string) error { var cl *client.Client var u url.URL // Remove the "connect" keyword if it exists path := strings.TrimSpace(strings.Replace(cmd, "connect", "", -1)) // If they didn't provide a connection string, use the current settings if path == "" { path = net.JoinHostPort(c.Host, strconv.Itoa(c.Port)) } var e error u, e = client.ParseConnectionString(path, c.Ssl) if e != nil { return e } config := client.NewConfig() config.URL = u config.UnixSocket = c.UnixSocket config.Username = c.Username config.Password = c.Password config.UserAgent = "InfluxDBShell/" + c.ClientVersion config.Precision = c.Precision config.UnsafeSsl = c.UnsafeSsl cl, err := client.NewClient(config) if err != nil { return fmt.Errorf("Could not create client %s", err) } c.Client = cl var v string if _, v, e = c.Client.Ping(); e != nil { return fmt.Errorf("Failed to connect to %s: %s\n", c.Client.Addr(), e.Error()) } c.ServerVersion = v // Update the command with the current connection information if h, p, err := net.SplitHostPort(config.URL.Host); err == nil { c.Host = h if i, err := strconv.Atoi(p); err == nil { c.Port = i } } return nil }
func ExampleClient_Query() { host, err := url.Parse(fmt.Sprintf("http://%s:%d", "localhost", 8086)) if err != nil { log.Fatal(err) } con, err := client.NewClient(client.Config{URL: *host}) if err != nil { log.Fatal(err) } q := client.Query{ Command: "select count(value) from shapes", Database: "square_holes", } if response, err := con.Query(q); err == nil && response.Error() == nil { log.Println(response.Results) } }
func TestSetAuth(t *testing.T) { t.Parallel() c := cli.New(CLIENT_VERSION) config := client.NewConfig() client, _ := client.NewClient(config) c.Client = client u := "userx" p := "pwdy" c.SetAuth("auth " + u + " " + p) // validate CLI configuration if c.Username != u { t.Fatalf("Username is %s but should be %s", c.Username, u) } if c.Password != p { t.Fatalf("Password is %s but should be %s", c.Password, p) } }
//go:generate goannotation $GOFILE // @rest TODO func (this *Gateway) appMetricsHandler(w http.ResponseWriter, r *http.Request, params httprouter.Params) { myAppid := r.Header.Get(HttpHeaderAppid) // TODO auth if myAppid == "" { } u, _ := url.Parse(Options.InfluxServer) conn, err := client.NewClient(client.Config{ URL: *u, }) if err != nil { return } conn.Query(client.Query{ Command: "", Database: Options.InfluxDbName, }) }
func ExampleNewClient() { host, err := url.Parse(fmt.Sprintf("http://%s:%d", "localhost", 8086)) if err != nil { log.Fatal(err) } // NOTE: this assumes you've setup a user and have setup shell env variables, // namely INFLUX_USER/INFLUX_PWD. If not just omit Username/Password below. conf := client.Config{ URL: *host, Username: os.Getenv("INFLUX_USER"), Password: os.Getenv("INFLUX_PWD"), } con, err := client.NewClient(conf) if err != nil { log.Fatal(err) } log.Println("Connection", con) }
func ExampleClient_Write() { host, err := url.Parse(fmt.Sprintf("http://%s:%d", "localhost", 8086)) if err != nil { log.Fatal(err) } con, err := client.NewClient(client.Config{URL: *host}) if err != nil { log.Fatal(err) } 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{ Measurement: "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), }, Time: time.Now(), Precision: "s", } } bps := client.BatchPoints{ Points: pts, Database: "BumbeBeeTuna", RetentionPolicy: "default", } _, err = con.Write(bps) if err != nil { log.Fatal(err) } }
func main() { config.Init("f", "", "benchmark.conf") var wg sync.WaitGroup var conf Config // timer := time.NewTimer(3 * time.Minute) if err := config.Load(&conf); err != nil { qlog.Fatal("config.Load failed:", err) return } qlog.SetOutputLevel(conf.DebugLevel) host, err := url.Parse(conf.URL) if err != nil { return } dbUrl := conf.URL + "/query?q=" + url.QueryEscape(fmt.Sprintf("create database %s", conf.Database)) rpURL := conf.URL + "/query?q=" + url.QueryEscape(fmt.Sprintf("create retention policy %s on %s duration 3d replication 1", conf.URL, conf.Database, conf.Retention)) http.Get(dbUrl) http.Get(rpURL) var gorutineClients []*client.Client gorutineClients = make([]*client.Client, conf.GorutineNum) qlog.Debugf("The gorutineNum is %d", conf.GorutineNum) for i := 0; i < conf.GorutineNum; i++ { gorutineClients[i], err = client.NewClient(client.Config{URL: *host}) if err != nil { return } wg.Add(1) go writePoints(i, gorutineClients[i], &conf, &wg) } wg.Wait() // <-timer.C return }
func TestClient_Ping(t *testing.T) { ts := emptyTestServer() defer ts.Close() u, _ := url.Parse(ts.URL) config := client.Config{URL: *u} c, err := client.NewClient(config) if err != nil { t.Fatalf("unexpected error. expected %v, actual %v", nil, err) } d, version, err := c.Ping() if err != nil { t.Fatalf("unexpected error. expected %v, actual %v", nil, err) } if d == 0 { t.Fatalf("expected a duration greater than zero. actual %v", d) } if version != "x.x" { t.Fatalf("unexpected version. expected %s, actual %v", "x.x", version) } }
func TestClient_Query(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { var data client.Response w.WriteHeader(http.StatusOK) _ = json.NewEncoder(w).Encode(data) })) defer ts.Close() u, _ := url.Parse(ts.URL) config := client.Config{URL: *u} c, err := client.NewClient(config) if err != nil { t.Fatalf("unexpected error. expected %v, actual %v", nil, err) } query := client.Query{} _, err = c.Query(query) if err != nil { t.Fatalf("unexpected error. expected %v, actual %v", nil, err) } }
func TestSetPrecision(t *testing.T) { t.Parallel() c := cli.New(CLIENT_VERSION) config := client.NewConfig() client, _ := client.NewClient(config) c.Client = client // validate set non-default precision p := "ns" c.SetPrecision("precision " + p) if c.Precision != p { t.Fatalf("Precision is %s but should be %s", c.Precision, p) } // validate set default precision which equals empty string p = "rfc3339" c.SetPrecision("precision " + p) if c.Precision != "" { t.Fatalf("Precision is %s but should be empty", c.Precision) } }
// Connect connects client to a server func (c *CommandLine) Connect(cmd string) error { // Remove the "connect" keyword if it exists addr := strings.TrimSpace(strings.Replace(cmd, "connect", "", -1)) if addr == "" { // If they didn't provide a connection string, use the current settings addr = net.JoinHostPort(c.Host, strconv.Itoa(c.Port)) } URL, err := client.ParseConnectionString(addr, c.Ssl) if err != nil { return err } // Create copy of the current client config and create a new client. ClientConfig := c.ClientConfig ClientConfig.UserAgent = "InfluxDBShell/" + c.ClientVersion ClientConfig.URL = URL client, err := client.NewClient(ClientConfig) if err != nil { return fmt.Errorf("Could not create client %s", err) } c.Client = client _, v, err := c.Client.Ping() if err != nil { return fmt.Errorf("Failed to connect to %s: %v\n", c.Client.Addr(), err) } c.ServerVersion = v // Update the command with the current connection information if host, port, err := net.SplitHostPort(ClientConfig.URL.Host); err == nil { c.Host = host if i, err := strconv.Atoi(port); err == nil { c.Port = i } } return nil }
func (in *InfluxDBStore) init(server *influxDBServer.Server) error { in.server = server // TODO: Upgrade to client v2, see: github.com/influxdata/influxdb/blob/master/client/v2/client.go // We're currently using v1. con, err := influxDBClient.NewClient(influxDBClient.Config{ URL: *in.clientTarget, Username: in.config.AdminUser.Username, Password: in.config.AdminUser.Password, }) if err != nil { return err } in.con = con if err := in.createAdminUserIfNotExists(); err != nil { return err } switch in.config.Mode { case testMode: if err := in.setUpTestMode(); err != nil { return err } default: if err := in.setUpReleaseMode(); err != nil { return err } } if err := in.createDBIfNotExists(); err != nil { return err } if err := in.createContinuousQueries(); err != nil { return err } // TODO: let lib users decide `in.tracesPerPage` through InfluxDBConfig. in.tracesPerPage = defaultTracesPerPage go in.flusher() return nil }
func TestClient_Timeout(t *testing.T) { done := make(chan bool) ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { <-done })) defer ts.Close() defer func() { done <- true }() u, _ := url.Parse(ts.URL) config := client.Config{URL: *u, Timeout: 500 * time.Millisecond} c, err := client.NewClient(config) if err != nil { t.Fatalf("unexpected error. expected %v, actual %v", nil, err) } query := client.Query{} _, err = c.Query(query) if err == nil { t.Fatalf("unexpected success. expected timeout error") } else if !strings.Contains(err.Error(), "request canceled") && !strings.Contains(err.Error(), "use of closed network connection") { t.Fatalf("unexpected error. expected 'request canceled' error, got %v", err) } }
func TestClient_Messages(t *testing.T) { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Write([]byte(`{"results":[{"messages":[{"level":"warning","text":"deprecation test"}]}]}`)) })) defer ts.Close() u, _ := url.Parse(ts.URL) config := client.Config{URL: *u} c, err := client.NewClient(config) if err != nil { t.Fatalf("unexpected error. expected %v, actual %v", nil, err) } query := client.Query{} resp, err := c.Query(query) if err != nil { t.Fatalf("unexpected error. expected %v, actual %v", nil, err) } if got, exp := len(resp.Results), 1; got != exp { t.Fatalf("unexpected number of results. expected %v, actual %v", exp, got) } r := resp.Results[0] if got, exp := len(r.Messages), 1; got != exp { t.Fatalf("unexpected number of messages. expected %v, actual %v", exp, got) } m := r.Messages[0] if got, exp := m.Level, "warning"; got != exp { t.Errorf("unexpected message level. expected %v, actual %v", exp, got) } if got, exp := m.Text, "deprecation test"; got != exp { t.Errorf("unexpected message text. expected %v, actual %v", exp, got) } }