116 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
| package nginx_plus_api
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"net/http"
 | |
| 	"net/url"
 | |
| 	"sync"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/influxdata/telegraf"
 | |
| 	"github.com/influxdata/telegraf/internal"
 | |
| 	"github.com/influxdata/telegraf/plugins/inputs"
 | |
| )
 | |
| 
 | |
| type NginxPlusApi struct {
 | |
| 	Urls []string
 | |
| 
 | |
| 	ApiVersion int64
 | |
| 
 | |
| 	client *http.Client
 | |
| 
 | |
| 	ResponseTimeout internal.Duration
 | |
| }
 | |
| 
 | |
| const (
 | |
| 	// Default settings
 | |
| 	defaultApiVersion = 3
 | |
| 
 | |
| 	// Paths
 | |
| 	processesPath   = "processes"
 | |
| 	connectionsPath = "connections"
 | |
| 	sslPath         = "ssl"
 | |
| 
 | |
| 	httpRequestsPath    = "http/requests"
 | |
| 	httpServerZonesPath = "http/server_zones"
 | |
| 	httpUpstreamsPath   = "http/upstreams"
 | |
| 	httpCachesPath      = "http/caches"
 | |
| 
 | |
| 	streamServerZonesPath = "stream/server_zones"
 | |
| 	streamUpstreamsPath   = "stream/upstreams"
 | |
| )
 | |
| 
 | |
| var sampleConfig = `
 | |
|   ## An array of API URI to gather stats.
 | |
|   urls = ["http://localhost/api"]
 | |
| 
 | |
|   # Nginx API version, default: 3
 | |
|   # api_version = 3
 | |
| 
 | |
|   # HTTP response timeout (default: 5s)
 | |
|   response_timeout = "5s"
 | |
| `
 | |
| 
 | |
| func (n *NginxPlusApi) SampleConfig() string {
 | |
| 	return sampleConfig
 | |
| }
 | |
| 
 | |
| func (n *NginxPlusApi) Description() string {
 | |
| 	return "Read Nginx Plus Api documentation"
 | |
| }
 | |
| 
 | |
| func (n *NginxPlusApi) Gather(acc telegraf.Accumulator) error {
 | |
| 	var wg sync.WaitGroup
 | |
| 
 | |
| 	// Create an HTTP client that is re-used for each
 | |
| 	// collection interval
 | |
| 
 | |
| 	if n.ApiVersion == 0 {
 | |
| 		n.ApiVersion = defaultApiVersion
 | |
| 	}
 | |
| 
 | |
| 	if n.client == nil {
 | |
| 		client, err := n.createHttpClient()
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 		n.client = client
 | |
| 	}
 | |
| 
 | |
| 	for _, u := range n.Urls {
 | |
| 		addr, err := url.Parse(u)
 | |
| 		if err != nil {
 | |
| 			acc.AddError(fmt.Errorf("Unable to parse address '%s': %s", u, err))
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		wg.Add(1)
 | |
| 		go func(addr *url.URL) {
 | |
| 			defer wg.Done()
 | |
| 			n.gatherMetrics(addr, acc)
 | |
| 		}(addr)
 | |
| 	}
 | |
| 
 | |
| 	wg.Wait()
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func (n *NginxPlusApi) createHttpClient() (*http.Client, error) {
 | |
| 	if n.ResponseTimeout.Duration < time.Second {
 | |
| 		n.ResponseTimeout.Duration = time.Second * 5
 | |
| 	}
 | |
| 
 | |
| 	client := &http.Client{
 | |
| 		Transport: &http.Transport{},
 | |
| 		Timeout:   n.ResponseTimeout.Duration,
 | |
| 	}
 | |
| 
 | |
| 	return client, nil
 | |
| }
 | |
| 
 | |
| func init() {
 | |
| 	inputs.Add("nginx_plus_api", func() telegraf.Input {
 | |
| 		return &NginxPlusApi{}
 | |
| 	})
 | |
| }
 |