112 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Go
		
	
	
	
| package rethinkdb
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"net/url"
 | |
| 	"sync"
 | |
| 
 | |
| 	"github.com/influxdata/telegraf"
 | |
| 	"github.com/influxdata/telegraf/plugins/inputs"
 | |
| 
 | |
| 	"gopkg.in/gorethink/gorethink.v3"
 | |
| )
 | |
| 
 | |
| type RethinkDB struct {
 | |
| 	Servers []string
 | |
| }
 | |
| 
 | |
| var sampleConfig = `
 | |
|   ## An array of URI to gather stats about. Specify an ip or hostname
 | |
|   ## with optional port add password. ie,
 | |
|   ##   rethinkdb://user:auth_key@10.10.3.30:28105,
 | |
|   ##   rethinkdb://10.10.3.33:18832,
 | |
|   ##   10.0.0.1:10000, etc.
 | |
|   servers = ["127.0.0.1:28015"]
 | |
|   ##
 | |
|   ## If you use actual rethinkdb of > 2.3.0 with username/password authorization,
 | |
|   ## protocol have to be named "rethinkdb2" - it will use 1_0 H.
 | |
|   # servers = ["rethinkdb2://username:password@127.0.0.1:28015"]
 | |
|   ##
 | |
|   ## If you use older versions of rethinkdb (<2.2) with auth_key, protocol
 | |
|   ## have to be named "rethinkdb".
 | |
|   # servers = ["rethinkdb://username:auth_key@127.0.0.1:28015"]
 | |
| `
 | |
| 
 | |
| func (r *RethinkDB) SampleConfig() string {
 | |
| 	return sampleConfig
 | |
| }
 | |
| 
 | |
| func (r *RethinkDB) Description() string {
 | |
| 	return "Read metrics from one or many RethinkDB servers"
 | |
| }
 | |
| 
 | |
| var localhost = &Server{Url: &url.URL{Host: "127.0.0.1:28015"}}
 | |
| 
 | |
| // Reads stats from all configured servers accumulates stats.
 | |
| // Returns one of the errors encountered while gather stats (if any).
 | |
| func (r *RethinkDB) Gather(acc telegraf.Accumulator) error {
 | |
| 	if len(r.Servers) == 0 {
 | |
| 		r.gatherServer(localhost, acc)
 | |
| 		return nil
 | |
| 	}
 | |
| 
 | |
| 	var wg sync.WaitGroup
 | |
| 
 | |
| 	for _, serv := range r.Servers {
 | |
| 		u, err := url.Parse(serv)
 | |
| 		if err != nil {
 | |
| 			acc.AddError(fmt.Errorf("Unable to parse to address '%s': %s", serv, err))
 | |
| 			continue
 | |
| 		} else if u.Scheme == "" {
 | |
| 			// fallback to simple string based address (i.e. "10.0.0.1:10000")
 | |
| 			u.Host = serv
 | |
| 		}
 | |
| 		wg.Add(1)
 | |
| 		go func(serv string) {
 | |
| 			defer wg.Done()
 | |
| 			acc.AddError(r.gatherServer(&Server{Url: u}, acc))
 | |
| 		}(serv)
 | |
| 	}
 | |
| 
 | |
| 	wg.Wait()
 | |
| 
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func (r *RethinkDB) gatherServer(server *Server, acc telegraf.Accumulator) error {
 | |
| 	var err error
 | |
| 	connectOpts := gorethink.ConnectOpts{
 | |
| 		Address:       server.Url.Host,
 | |
| 		DiscoverHosts: false,
 | |
| 	}
 | |
| 	if server.Url.User != nil {
 | |
| 		pwd, set := server.Url.User.Password()
 | |
| 		if set && pwd != "" {
 | |
| 			connectOpts.AuthKey = pwd
 | |
| 			connectOpts.HandshakeVersion = gorethink.HandshakeV0_4
 | |
| 		}
 | |
| 	}
 | |
| 	if server.Url.Scheme == "rethinkdb2" && server.Url.User != nil {
 | |
| 		pwd, set := server.Url.User.Password()
 | |
| 		if set && pwd != "" {
 | |
| 			connectOpts.Username = server.Url.User.Username()
 | |
| 			connectOpts.Password = pwd
 | |
| 			connectOpts.HandshakeVersion = gorethink.HandshakeV1_0
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	server.session, err = gorethink.Connect(connectOpts)
 | |
| 	if err != nil {
 | |
| 		return fmt.Errorf("Unable to connect to RethinkDB, %s\n", err.Error())
 | |
| 	}
 | |
| 	defer server.session.Close()
 | |
| 
 | |
| 	return server.gatherData(acc)
 | |
| }
 | |
| 
 | |
| func init() {
 | |
| 	inputs.Add("rethinkdb", func() telegraf.Input {
 | |
| 		return &RethinkDB{}
 | |
| 	})
 | |
| }
 |