telegraf/plugins/inputs/nginx_plus/nginx_plus_test.go

414 lines
11 KiB
Go

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
},
"connections": {
"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{}{
"accepted": int(1234567890000),
"dropped": int(2345678900000),
"active": int(345),
"idle": int(567),
},
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",
})
}