#920 Add minimal implementation of uWSGI plugin.
This commit is contained in:
parent
0f16c0f4cf
commit
5f77241a36
|
@ -55,6 +55,7 @@ import (
|
||||||
_ "github.com/influxdata/telegraf/plugins/inputs/trig"
|
_ "github.com/influxdata/telegraf/plugins/inputs/trig"
|
||||||
_ "github.com/influxdata/telegraf/plugins/inputs/twemproxy"
|
_ "github.com/influxdata/telegraf/plugins/inputs/twemproxy"
|
||||||
_ "github.com/influxdata/telegraf/plugins/inputs/udp_listener"
|
_ "github.com/influxdata/telegraf/plugins/inputs/udp_listener"
|
||||||
|
_ "github.com/influxdata/telegraf/plugins/inputs/uwsgi"
|
||||||
_ "github.com/influxdata/telegraf/plugins/inputs/win_perf_counters"
|
_ "github.com/influxdata/telegraf/plugins/inputs/win_perf_counters"
|
||||||
_ "github.com/influxdata/telegraf/plugins/inputs/zfs"
|
_ "github.com/influxdata/telegraf/plugins/inputs/zfs"
|
||||||
_ "github.com/influxdata/telegraf/plugins/inputs/zookeeper"
|
_ "github.com/influxdata/telegraf/plugins/inputs/zookeeper"
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
package uwsgi
|
||||||
|
|
||||||
|
type StatsServer struct {
|
||||||
|
Url string
|
||||||
|
Workers []*Worker `json:"workers"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type Worker struct {
|
||||||
|
Id int `json:"id"` // Tag
|
||||||
|
Pid int `json:"pid"` // Tag
|
||||||
|
Accepting int `json:"accepting"`
|
||||||
|
Requests int `json:"requests"`
|
||||||
|
DeltaRequests int `json:"delta_requests"`
|
||||||
|
HarakiriCount int `json:"harakiri_count"`
|
||||||
|
Signals int `json:"signals"`
|
||||||
|
SignalQueue int `json:"signal_queue"`
|
||||||
|
Status string `json:"status"`
|
||||||
|
RSS int `json:"rss"`
|
||||||
|
VSZ int `json:"vsz"`
|
||||||
|
RunningTime int `json:"running_time"`
|
||||||
|
LastSpawn int `json:"last_spawn"`
|
||||||
|
RespawnCount int `json:"respawn_count"`
|
||||||
|
TX int `json:"tx"`
|
||||||
|
AvgRT int `json:"avg_rt"`
|
||||||
|
}
|
|
@ -0,0 +1,102 @@
|
||||||
|
package uwsgi
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"github.com/influxdata/telegraf"
|
||||||
|
"github.com/influxdata/telegraf/plugins/inputs"
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
var tr = &http.Transport{
|
||||||
|
ResponseHeaderTimeout: time.Duration(3 * time.Second),
|
||||||
|
}
|
||||||
|
|
||||||
|
var client = &http.Client{
|
||||||
|
Transport: tr,
|
||||||
|
Timeout: time.Duration(4 * time.Second),
|
||||||
|
}
|
||||||
|
|
||||||
|
type Uwsgi struct {
|
||||||
|
URLs []string `toml:"urls"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Uwsgi) Description() string {
|
||||||
|
return "Read uWSGI metrics."
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Uwsgi) SampleConfig() string {
|
||||||
|
return `
|
||||||
|
### List with urls of uWSGI Stats servers
|
||||||
|
urls = []
|
||||||
|
`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Uwsgi) Gather(acc telegraf.Accumulator) error {
|
||||||
|
for _, url := range u.URLs {
|
||||||
|
err := u.gatherURL(acc, url)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Uwsgi) gatherURL(acc telegraf.Accumulator, url string) error {
|
||||||
|
resp, err := client.Get(url)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
var s StatsServer
|
||||||
|
s.Url = url
|
||||||
|
|
||||||
|
dec := json.NewDecoder(resp.Body)
|
||||||
|
dec.Decode(&s)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
u.gatherWorkers(acc, &s)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *Uwsgi) gatherWorkers(acc telegraf.Accumulator, s *StatsServer) error {
|
||||||
|
for _, w := range s.Workers {
|
||||||
|
fields := map[string]interface{}{
|
||||||
|
"requests": w.Requests,
|
||||||
|
"accepting": w.Accepting,
|
||||||
|
"delta_request": w.DeltaRequests,
|
||||||
|
"harakiri_count": w.HarakiriCount,
|
||||||
|
"signals": w.Signals,
|
||||||
|
"signal_queue": w.SignalQueue,
|
||||||
|
"status": w.Status,
|
||||||
|
"rss": w.RSS,
|
||||||
|
"vsz": w.VSZ,
|
||||||
|
"running_time": w.RunningTime,
|
||||||
|
"last_spawn": w.LastSpawn,
|
||||||
|
"respawn_count": w.RespawnCount,
|
||||||
|
"tx": w.TX,
|
||||||
|
"avg_rt": w.AvgRT,
|
||||||
|
}
|
||||||
|
tags := map[string]string{
|
||||||
|
"id": strconv.Itoa(w.Id),
|
||||||
|
"url": s.Url,
|
||||||
|
"pid": strconv.Itoa(w.Pid),
|
||||||
|
}
|
||||||
|
|
||||||
|
acc.AddFields("uwsgi_workers", fields, tags)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
inputs.Add("uwsgi", func() telegraf.Input { return &Uwsgi{} })
|
||||||
|
}
|
|
@ -0,0 +1,125 @@
|
||||||
|
package uwsgi_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/influxdata/telegraf/plugins/inputs/uwsgi"
|
||||||
|
"github.com/influxdata/telegraf/testutil"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
"net/http"
|
||||||
|
"net/http/httptest"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestBasic(t *testing.T) {
|
||||||
|
js := `
|
||||||
|
{
|
||||||
|
"version":"2.0.12",
|
||||||
|
"listen_queue":0,
|
||||||
|
"listen_queue_errors":0,
|
||||||
|
"signal_queue":0,
|
||||||
|
"load":0,
|
||||||
|
"pid":28372,
|
||||||
|
"uid":1000,
|
||||||
|
"gid":1000,
|
||||||
|
"cwd":"/opt/uwsgi",
|
||||||
|
"locks":[
|
||||||
|
{
|
||||||
|
"user 0":0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"signal":0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filemon":0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"timer":0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"rbtimer":0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cron":0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"rpc":0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"snmp":0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"sockets":[
|
||||||
|
{
|
||||||
|
"name":"127.0.0.1:47430",
|
||||||
|
"proto":"uwsgi",
|
||||||
|
"queue":0,
|
||||||
|
"max_queue":100,
|
||||||
|
"shared":0,
|
||||||
|
"can_offload":0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"workers":[
|
||||||
|
{
|
||||||
|
"id":1,
|
||||||
|
"pid":28375,
|
||||||
|
"accepting":1,
|
||||||
|
"requests":0,
|
||||||
|
"delta_requests":0,
|
||||||
|
"exceptions":0,
|
||||||
|
"harakiri_count":0,
|
||||||
|
"signals":0,
|
||||||
|
"signal_queue":0,
|
||||||
|
"status":"idle",
|
||||||
|
"rss":0,
|
||||||
|
"vsz":0,
|
||||||
|
"running_time":0,
|
||||||
|
"last_spawn":1459942782,
|
||||||
|
"respawn_count":1,
|
||||||
|
"tx":0,
|
||||||
|
"avg_rt":0,
|
||||||
|
"apps":[
|
||||||
|
{
|
||||||
|
"id":0,
|
||||||
|
"modifier1":0,
|
||||||
|
"mountpoint":"",
|
||||||
|
"startup_time":0,
|
||||||
|
"requests":0,
|
||||||
|
"exceptions":0,
|
||||||
|
"chdir":""
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"cores":[
|
||||||
|
{
|
||||||
|
"id":0,
|
||||||
|
"requests":0,
|
||||||
|
"static_requests":0,
|
||||||
|
"routed_requests":0,
|
||||||
|
"offloaded_requests":0,
|
||||||
|
"write_errors":0,
|
||||||
|
"read_errors":0,
|
||||||
|
"in_request":0,
|
||||||
|
"vars":[
|
||||||
|
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
fakeServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
if r.URL.Path == "/" {
|
||||||
|
_, _ = w.Write([]byte(js))
|
||||||
|
} else {
|
||||||
|
w.WriteHeader(http.StatusNotFound)
|
||||||
|
}
|
||||||
|
}))
|
||||||
|
|
||||||
|
defer fakeServer.Close()
|
||||||
|
|
||||||
|
plugin := &uwsgi.Uwsgi{
|
||||||
|
URLs: []string{fakeServer.URL + "/"},
|
||||||
|
}
|
||||||
|
var acc testutil.Accumulator
|
||||||
|
require.NoError(t, plugin.Gather(&acc))
|
||||||
|
}
|
Loading…
Reference in New Issue