414 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			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": int64(1234567890000),
 | |
| 			"dropped":  int64(2345678900000),
 | |
| 			"active":   int64(345),
 | |
| 			"idle":     int64(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",
 | |
| 		})
 | |
| 
 | |
| }
 |