github.com/avenga/couper@v1.12.2/server/http_telemetry_test.go (about)

     1  package server_test
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"net/http"
     7  	"regexp"
     8  	"strings"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/avenga/couper/config"
    13  	"github.com/avenga/couper/internal/test"
    14  )
    15  
    16  func TestServeMetrics(t *testing.T) {
    17  	t.Skip("TODO: stabilize metrics")
    18  	helper := test.New(t)
    19  	shutdown, _ := newCouper("testdata/integration/telemetry/01_couper.hcl", helper)
    20  	defer shutdown()
    21  
    22  	client := test.NewHTTPClient()
    23  	mreq, err := http.NewRequest(http.MethodGet,
    24  		fmt.Sprintf("http://localhost:%d/metrics", config.NewDefaultSettings().TelemetryMetricsPort), nil)
    25  	helper.Must(err)
    26  
    27  	paths := []string{
    28  		"/",
    29  		"/down",
    30  		"/notfound",
    31  	}
    32  	for _, path := range paths {
    33  		go func(p string) {
    34  			clientReq, perr := http.NewRequest(http.MethodGet, "http://localhost:8080"+p, nil)
    35  			helper.Must(perr)
    36  
    37  			res, rerr := client.Do(clientReq)
    38  			helper.Must(rerr)
    39  			helper.Must(res.Body.Close())
    40  		}(path)
    41  
    42  	}
    43  
    44  	time.Sleep(time.Second * 3)
    45  
    46  	res, err := client.Do(mreq)
    47  	if err != nil {
    48  		t.Fatalf("metrics endpoint could not be reached: %v", err)
    49  	}
    50  
    51  	b, err := io.ReadAll(res.Body)
    52  	helper.Must(err)
    53  
    54  	// due to random client remote port
    55  	result := regexp.MustCompile(`127\.0\.0\.1:\d{5}`).ReplaceAll(b, []byte("127.0.0.1"))
    56  
    57  	expMetrics := []string{
    58  		`couper_backend_request_duration_seconds_count{backend_name="anything",code="200",hostname="127.0.0.1",method="GET",origin="127.0.0.1",service_name="my-service",service_version="0"} 1`,
    59  		`couper_backend_request_total{backend_name="anything",code="200",hostname="127.0.0.1",method="GET",origin="127.0.0.1",service_name="my-service",service_version="0"} 1`,
    60  		`couper_backend_up{backend_name="anything",hostname="127.0.0.1",origin="127.0.0.1",service_name="my-service",service_version="0"} 1`,
    61  		`couper_backend_up{backend_name="not_healthy",hostname="1.2.3.4",origin="1.2.3.4:80",service_name="my-service",service_version="0"} 0`,
    62  		`couper_client_request_duration_seconds_count{code="200",host="localhost:8080",method="GET",service_name="my-service",service_version="0"} 1`,
    63  		`couper_client_request_duration_seconds_count{code="404",host="localhost:8080",method="GET",service_name="my-service",service_version="0"} 1`,
    64  		`couper_client_request_total{code="200",host="localhost:8080",method="GET",service_name="my-service",service_version="0"} 1`,
    65  		`couper_client_request_total{code="404",host="localhost:8080",method="GET",service_name="my-service",service_version="0"} 1`,
    66  		`couper_client_request_error_types_total{error="route_not_found_error",service_name="my-service",service_version="0"} 1`,
    67  		`couper_client_connections_total{service_name="my-service",service_version="0"} 3`,
    68  		`go_goroutines{service_name="my-service",service_version="0"}`,
    69  	}
    70  
    71  	for _, expMetric := range expMetrics {
    72  		if !strings.Contains(string(result), expMetric) {
    73  			t.Errorf("missing metric: %s", expMetric)
    74  		}
    75  	}
    76  
    77  	if t.Failed() {
    78  		println(string(result))
    79  	}
    80  }