2017-09-19 18:46:01 +00:00
|
|
|
package nginx_plus
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"net"
|
|
|
|
"net/http"
|
|
|
|
"net/http/httptest"
|
|
|
|
"net/url"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/influxdata/telegraf/testutil"
|
|
|
|
//"github.com/stretchr/testify/assert"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
)
|
|
|
|
|
|
|
|
const sampleStatusResponse = `
|
|
|
|
{
|
|
|
|
"version": 6,
|
|
|
|
"nginx_version": "1.22.333",
|
|
|
|
"address": "1.2.3.4",
|
|
|
|
"generation": 88,
|
|
|
|
"load_timestamp": 1451606400000,
|
|
|
|
"timestamp": 1451606400000,
|
|
|
|
"pid": 9999,
|
|
|
|
"processes": {
|
|
|
|
"respawned": 9999
|
|
|
|
},
|
2017-09-25 22:48:09 +00:00
|
|
|
"connections": {
|
2017-09-19 18:46:01 +00:00
|
|
|
"accepted": 1234567890000,
|
|
|
|
"dropped": 2345678900000,
|
|
|
|
"active": 345,
|
|
|
|
"idle": 567
|
|
|
|
},
|
|
|
|
"ssl": {
|
|
|
|
"handshakes": 1234567800000,
|
|
|
|
"handshakes_failed": 5432100000000,
|
|
|
|
"session_reuses": 6543210000000
|
|
|
|
},
|
|
|
|
"requests": {
|
|
|
|
"total": 9876543210000,
|
|
|
|
"current": 98
|
|
|
|
},
|
|
|
|
"server_zones": {
|
|
|
|
"zone.a_80": {
|
|
|
|
"processing": 12,
|
|
|
|
"requests": 34,
|
|
|
|
"responses": {
|
|
|
|
"1xx": 111,
|
|
|
|
"2xx": 222,
|
|
|
|
"3xx": 333,
|
|
|
|
"4xx": 444,
|
|
|
|
"5xx": 555,
|
|
|
|
"total": 999
|
|
|
|
},
|
|
|
|
"discarded": 11,
|
|
|
|
"received": 22,
|
|
|
|
"sent": 33
|
|
|
|
},
|
|
|
|
"zone.a_443": {
|
|
|
|
"processing": 45,
|
|
|
|
"requests": 67,
|
|
|
|
"responses": {
|
|
|
|
"1xx": 1111,
|
|
|
|
"2xx": 2222,
|
|
|
|
"3xx": 3333,
|
|
|
|
"4xx": 4444,
|
|
|
|
"5xx": 5555,
|
|
|
|
"total": 999
|
|
|
|
},
|
|
|
|
"discarded": 44,
|
|
|
|
"received": 55,
|
|
|
|
"sent": 66
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"upstreams": {
|
|
|
|
"first_upstream": {
|
|
|
|
"peers": [
|
|
|
|
{
|
|
|
|
"id": 0,
|
|
|
|
"server": "1.2.3.123:80",
|
|
|
|
"backup": false,
|
|
|
|
"weight": 1,
|
|
|
|
"state": "up",
|
|
|
|
"active": 0,
|
|
|
|
"requests": 9876,
|
|
|
|
"responses": {
|
|
|
|
"1xx": 1111,
|
|
|
|
"2xx": 2222,
|
|
|
|
"3xx": 3333,
|
|
|
|
"4xx": 4444,
|
|
|
|
"5xx": 5555,
|
|
|
|
"total": 987654
|
|
|
|
},
|
|
|
|
"sent": 987654321,
|
|
|
|
"received": 87654321,
|
|
|
|
"fails": 98,
|
|
|
|
"unavail": 65,
|
|
|
|
"health_checks": {
|
|
|
|
"checks": 54,
|
|
|
|
"fails": 32,
|
|
|
|
"unhealthy": 21
|
|
|
|
},
|
|
|
|
"downtime": 5432,
|
|
|
|
"downstart": 4321,
|
|
|
|
"selected": 1451606400000
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 1,
|
|
|
|
"server": "1.2.3.123:80",
|
|
|
|
"backup": true,
|
|
|
|
"weight": 1,
|
|
|
|
"state": "up",
|
|
|
|
"active": 0,
|
|
|
|
"requests": 8765,
|
|
|
|
"responses": {
|
|
|
|
"1xx": 1112,
|
|
|
|
"2xx": 2223,
|
|
|
|
"3xx": 3334,
|
|
|
|
"4xx": 4445,
|
|
|
|
"5xx": 5556,
|
|
|
|
"total": 987655
|
|
|
|
},
|
|
|
|
"sent": 987654322,
|
|
|
|
"received": 87654322,
|
|
|
|
"fails": 99,
|
|
|
|
"unavail": 88,
|
|
|
|
"health_checks": {
|
|
|
|
"checks": 77,
|
|
|
|
"fails": 66,
|
|
|
|
"unhealthy": 55
|
|
|
|
},
|
|
|
|
"downtime": 5433,
|
|
|
|
"downstart": 4322,
|
|
|
|
"selected": 1451606400000
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"keepalive": 1,
|
|
|
|
"zombies": 2
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"caches": {
|
|
|
|
"cache_01": {
|
|
|
|
"size": 12,
|
|
|
|
"max_size": 23,
|
|
|
|
"cold": false,
|
|
|
|
"hit": {
|
|
|
|
"responses": 34,
|
|
|
|
"bytes": 45
|
|
|
|
},
|
|
|
|
"stale": {
|
|
|
|
"responses": 56,
|
|
|
|
"bytes": 67
|
|
|
|
},
|
|
|
|
"updating": {
|
|
|
|
"responses": 78,
|
|
|
|
"bytes": 89
|
|
|
|
},
|
|
|
|
"revalidated": {
|
|
|
|
"responses": 90,
|
|
|
|
"bytes": 98
|
|
|
|
},
|
|
|
|
"miss": {
|
|
|
|
"responses": 87,
|
|
|
|
"bytes": 76,
|
|
|
|
"responses_written": 65,
|
|
|
|
"bytes_written": 54
|
|
|
|
},
|
|
|
|
"expired": {
|
|
|
|
"responses": 43,
|
|
|
|
"bytes": 32,
|
|
|
|
"responses_written": 21,
|
|
|
|
"bytes_written": 10
|
|
|
|
},
|
|
|
|
"bypass": {
|
|
|
|
"responses": 13,
|
|
|
|
"bytes": 35,
|
|
|
|
"responses_written": 57,
|
|
|
|
"bytes_written": 79
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"stream": {
|
|
|
|
"server_zones": {
|
|
|
|
"stream.zone.01": {
|
|
|
|
"processing": 24,
|
|
|
|
"connections": 46,
|
|
|
|
"received": 68,
|
|
|
|
"sent": 80
|
|
|
|
},
|
|
|
|
"stream.zone.02": {
|
|
|
|
"processing": 96,
|
|
|
|
"connections": 63,
|
|
|
|
"received": 31,
|
|
|
|
"sent": 25
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"upstreams": {
|
|
|
|
"upstream.01": {
|
|
|
|
"peers": [
|
|
|
|
{
|
|
|
|
"id": 0,
|
|
|
|
"server": "4.3.2.1:2345",
|
|
|
|
"backup": false,
|
|
|
|
"weight": 1,
|
|
|
|
"state": "up",
|
|
|
|
"active": 0,
|
|
|
|
"connections": 0,
|
|
|
|
"sent": 0,
|
|
|
|
"received": 0,
|
|
|
|
"fails": 0,
|
|
|
|
"unavail": 0,
|
|
|
|
"health_checks": {
|
|
|
|
"checks": 40848,
|
|
|
|
"fails": 0,
|
|
|
|
"unhealthy": 0,
|
|
|
|
"last_passed": true
|
|
|
|
},
|
|
|
|
"downtime": 0,
|
|
|
|
"downstart": 0,
|
|
|
|
"selected": 0
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"id": 1,
|
|
|
|
"server": "5.4.3.2:2345",
|
|
|
|
"backup": false,
|
|
|
|
"weight": 1,
|
|
|
|
"state": "up",
|
|
|
|
"active": 0,
|
|
|
|
"connections": 0,
|
|
|
|
"sent": 0,
|
|
|
|
"received": 0,
|
|
|
|
"fails": 0,
|
|
|
|
"unavail": 0,
|
|
|
|
"health_checks": {
|
|
|
|
"checks": 40851,
|
|
|
|
"fails": 0,
|
|
|
|
"unhealthy": 0,
|
|
|
|
"last_passed": true
|
|
|
|
},
|
|
|
|
"downtime": 0,
|
|
|
|
"downstart": 0,
|
|
|
|
"selected": 0
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"zombies": 0
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
func TestNginxPlusGeneratesMetrics(t *testing.T) {
|
|
|
|
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
var rsp string
|
|
|
|
|
|
|
|
if r.URL.Path == "/status" {
|
|
|
|
rsp = sampleStatusResponse
|
|
|
|
w.Header()["Content-Type"] = []string{"application/json"}
|
|
|
|
} else {
|
|
|
|
panic("Cannot handle request")
|
|
|
|
}
|
|
|
|
|
|
|
|
fmt.Fprintln(w, rsp)
|
|
|
|
}))
|
|
|
|
defer ts.Close()
|
|
|
|
|
|
|
|
n := &NginxPlus{
|
|
|
|
Urls: []string{fmt.Sprintf("%s/status", ts.URL)},
|
|
|
|
}
|
|
|
|
|
|
|
|
var acc testutil.Accumulator
|
|
|
|
|
|
|
|
err_nginx := n.Gather(&acc)
|
|
|
|
|
|
|
|
require.NoError(t, err_nginx)
|
|
|
|
|
|
|
|
addr, err := url.Parse(ts.URL)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
host, port, err := net.SplitHostPort(addr.Host)
|
|
|
|
if err != nil {
|
|
|
|
host = addr.Host
|
|
|
|
if addr.Scheme == "http" {
|
|
|
|
port = "80"
|
|
|
|
} else if addr.Scheme == "https" {
|
|
|
|
port = "443"
|
|
|
|
} else {
|
|
|
|
port = ""
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
acc.AssertContainsTaggedFields(
|
|
|
|
t,
|
|
|
|
"nginx_plus_processes",
|
|
|
|
map[string]interface{}{
|
|
|
|
"respawned": int(9999),
|
|
|
|
},
|
|
|
|
map[string]string{
|
|
|
|
"server": host,
|
|
|
|
"port": port,
|
|
|
|
})
|
|
|
|
|
|
|
|
acc.AssertContainsTaggedFields(
|
|
|
|
t,
|
|
|
|
"nginx_plus_connections",
|
|
|
|
map[string]interface{}{
|
2017-09-25 22:48:09 +00:00
|
|
|
"accepted": int64(1234567890000),
|
|
|
|
"dropped": int64(2345678900000),
|
|
|
|
"active": int64(345),
|
|
|
|
"idle": int64(567),
|
2017-09-19 18:46:01 +00:00
|
|
|
},
|
|
|
|
map[string]string{
|
|
|
|
"server": host,
|
|
|
|
"port": port,
|
|
|
|
})
|
|
|
|
|
|
|
|
acc.AssertContainsTaggedFields(
|
|
|
|
t,
|
|
|
|
"nginx_plus_ssl",
|
|
|
|
map[string]interface{}{
|
|
|
|
"handshakes": int64(1234567800000),
|
|
|
|
"handshakes_failed": int64(5432100000000),
|
|
|
|
"session_reuses": int64(6543210000000),
|
|
|
|
},
|
|
|
|
map[string]string{
|
|
|
|
"server": host,
|
|
|
|
"port": port,
|
|
|
|
})
|
|
|
|
|
|
|
|
acc.AssertContainsTaggedFields(
|
|
|
|
t,
|
|
|
|
"nginx_plus_requests",
|
|
|
|
map[string]interface{}{
|
|
|
|
"total": int64(9876543210000),
|
|
|
|
"current": int(98),
|
|
|
|
},
|
|
|
|
map[string]string{
|
|
|
|
"server": host,
|
|
|
|
"port": port,
|
|
|
|
})
|
|
|
|
|
|
|
|
acc.AssertContainsTaggedFields(
|
|
|
|
t,
|
|
|
|
"nginx_plus_zone",
|
|
|
|
map[string]interface{}{
|
|
|
|
"processing": int(12),
|
|
|
|
"requests": int64(34),
|
|
|
|
"responses_1xx": int64(111),
|
|
|
|
"responses_2xx": int64(222),
|
|
|
|
"responses_3xx": int64(333),
|
|
|
|
"responses_4xx": int64(444),
|
|
|
|
"responses_5xx": int64(555),
|
|
|
|
"responses_total": int64(999),
|
|
|
|
"discarded": int64(11),
|
|
|
|
"received": int64(22),
|
|
|
|
"sent": int64(33),
|
|
|
|
},
|
|
|
|
map[string]string{
|
|
|
|
"server": host,
|
|
|
|
"port": port,
|
|
|
|
"zone": "zone.a_80",
|
|
|
|
})
|
|
|
|
|
|
|
|
acc.AssertContainsTaggedFields(
|
|
|
|
t,
|
|
|
|
"nginx_plus_upstream",
|
|
|
|
map[string]interface{}{
|
|
|
|
"keepalive": int(1),
|
|
|
|
"zombies": int(2),
|
|
|
|
},
|
|
|
|
map[string]string{
|
|
|
|
"server": host,
|
|
|
|
"port": port,
|
|
|
|
"upstream": "first_upstream",
|
|
|
|
})
|
|
|
|
|
|
|
|
acc.AssertContainsTaggedFields(
|
|
|
|
t,
|
|
|
|
"nginx_plus_upstream_peer",
|
|
|
|
map[string]interface{}{
|
|
|
|
"backup": false,
|
|
|
|
"weight": int(1),
|
|
|
|
"state": "up",
|
|
|
|
"active": int(0),
|
|
|
|
"requests": int64(9876),
|
|
|
|
"responses_1xx": int64(1111),
|
|
|
|
"responses_2xx": int64(2222),
|
|
|
|
"responses_3xx": int64(3333),
|
|
|
|
"responses_4xx": int64(4444),
|
|
|
|
"responses_5xx": int64(5555),
|
|
|
|
"responses_total": int64(987654),
|
|
|
|
"sent": int64(987654321),
|
|
|
|
"received": int64(87654321),
|
|
|
|
"fails": int64(98),
|
|
|
|
"unavail": int64(65),
|
|
|
|
"healthchecks_checks": int64(54),
|
|
|
|
"healthchecks_fails": int64(32),
|
|
|
|
"healthchecks_unhealthy": int64(21),
|
|
|
|
"downtime": int64(5432),
|
|
|
|
"downstart": int64(4321),
|
|
|
|
"selected": int64(1451606400000),
|
|
|
|
},
|
|
|
|
map[string]string{
|
|
|
|
"server": host,
|
|
|
|
"port": port,
|
|
|
|
"upstream": "first_upstream",
|
|
|
|
"upstream_address": "1.2.3.123:80",
|
|
|
|
"id": "0",
|
|
|
|
})
|
|
|
|
|
|
|
|
}
|