diff --git a/metrics_test.go b/metrics_test.go new file mode 100644 index 000000000..f1eba364f --- /dev/null +++ b/metrics_test.go @@ -0,0 +1,77 @@ +package toxiproxy + +import ( + "bufio" + "bytes" + "net/http" + "net/http/httptest" + "reflect" + "strings" + "testing" + + "github.com/Shopify/toxiproxy/v2/collectors" + "github.com/Shopify/toxiproxy/v2/stream" + "github.com/prometheus/client_golang/prometheus" +) + +func TestProxyMetricsReceivedSentBytes(t *testing.T) { + expectedMetrics := []string{ + `toxiproxy_proxy_received_bytes_total{direction="upstream",listener="localhost:0",proxy="test",upstream="upstream"} 5`, + `toxiproxy_proxy_sent_bytes_total{direction="upstream",listener="localhost:0",proxy="test",upstream="upstream"} 5`, + } + srv := NewServer(NewMetricsContainer(prometheus.NewRegistry())) + srv.Metrics.ProxyMetrics = collectors.NewProxyMetricCollectors() + proxy := NewProxy(srv) + proxy.Name = "test" + proxy.Listen = "localhost:0" + proxy.Upstream = "upstream" + r := bufio.NewReader(bytes.NewBufferString("hello")) + w := &testWriteCloser{ + bufio.NewWriter(bytes.NewBuffer([]byte{})), + } + proxy.Toxics.StartLink(srv, "testupstream", r, w, stream.Upstream) + gotMetrics := prometheusOutput(t, srv, "toxiproxy") + if !reflect.DeepEqual(gotMetrics, expectedMetrics) { + t.Fatalf("expected: %v got: %v", expectedMetrics, gotMetrics) + } +} +func TestRuntimeMetricsBuildInfo(t *testing.T) { + expectedMetrics := []string{ + `go_build_info{checksum="unknown",path="unknown",version="unknown"} 1`, + } + srv := NewServer(NewMetricsContainer(prometheus.NewRegistry())) + srv.Metrics.RuntimeMetrics = collectors.NewRuntimeMetricCollectors() + + gotMetrics := prometheusOutput(t, srv, "go_build_info") + if !reflect.DeepEqual(gotMetrics, expectedMetrics) { + t.Fatalf("expected: %v got: %v", expectedMetrics, gotMetrics) + } +} + +type testWriteCloser struct { + *bufio.Writer +} + +func (t *testWriteCloser) Close() error { + return t.Flush() +} + +//prometheusOutput was originally copied from https://github.com/peterbourgon/fastly-exporter - thanks Peter +func prometheusOutput(t *testing.T, apiServer *ApiServer, prefix string) []string { + t.Helper() + + testServer := httptest.NewServer(apiServer.Metrics.handler()) + defer testServer.Close() + resp, err := http.Get(testServer.URL) + if err != nil { + t.Fatal(err) + } + var selected []string + s := bufio.NewScanner(resp.Body) + for s.Scan() { + if strings.HasPrefix(s.Text(), prefix) { + selected = append(selected, s.Text()) + } + } + return selected +} diff --git a/toxics/toxic_test.go b/toxics/toxic_test.go index 426c91a93..78070cbde 100644 --- a/toxics/toxic_test.go +++ b/toxics/toxic_test.go @@ -25,7 +25,6 @@ func init() { func NewTestProxy(name, upstream string) *toxiproxy.Proxy { srv := toxiproxy.NewServer(toxiproxy.NewMetricsContainer(prometheus.NewRegistry())) srv.Metrics.ProxyMetrics = collectors.NewProxyMetricCollectors() - srv.Metrics.RuntimeMetrics = collectors.NewRuntimeMetricCollectors() proxy := toxiproxy.NewProxy(srv) proxy.Name = name diff --git a/toxiproxy_test.go b/toxiproxy_test.go index 867bcd09c..16a1f03f7 100644 --- a/toxiproxy_test.go +++ b/toxiproxy_test.go @@ -13,7 +13,6 @@ import ( func NewTestProxy(name, upstream string) *toxiproxy.Proxy { srv := toxiproxy.NewServer(toxiproxy.NewMetricsContainer(prometheus.NewRegistry())) srv.Metrics.ProxyMetrics = collectors.NewProxyMetricCollectors() - srv.Metrics.RuntimeMetrics = collectors.NewRuntimeMetricCollectors() proxy := toxiproxy.NewProxy(srv) proxy.Name = name