github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/topgun/k8s/prometheus_test.go (about)

     1  package k8s_test
     2  
     3  import (
     4  	"encoding/json"
     5  	"net/http"
     6  	"path"
     7  	"time"
     8  
     9  	. "github.com/pf-qiu/concourse/v6/topgun"
    10  	. "github.com/onsi/ginkgo"
    11  	. "github.com/onsi/gomega"
    12  )
    13  
    14  var _ = Describe("Prometheus integration", func() {
    15  
    16  	var prometheusReleaseName string
    17  
    18  	BeforeEach(func() {
    19  		setReleaseNameAndNamespace("pi")
    20  		prometheusReleaseName = releaseName + "-prom"
    21  
    22  		deployConcourseChart(releaseName,
    23  			"--set=worker.enabled=false",
    24  			"--set=concourse.web.prometheus.enabled=true")
    25  
    26  		Run(nil,
    27  			"helm", "dependency", "update",
    28  			path.Join(Environment.HelmChartsDir, "stable/prometheus"),
    29  		)
    30  
    31  		helmDeploy(prometheusReleaseName,
    32  			namespace,
    33  			path.Join(Environment.HelmChartsDir, "stable/prometheus"),
    34  			"--set=nodeExporter.enabled=false",
    35  			"--set=kubeStateMetrics.enabled=false",
    36  			"--set=pushgateway.enabled=false",
    37  			"--set=alertmanager.enabled=false",
    38  			"--set=server.persistentVolume.enabled=false")
    39  
    40  		waitAllPodsInNamespaceToBeReady(namespace)
    41  	})
    42  
    43  	AfterEach(func() {
    44  		cleanupReleases()
    45  	})
    46  
    47  	It("Is able to retrieve concourse metrics", func() {
    48  		prometheus := endpointFactory.NewServiceEndpoint(
    49  			namespace,
    50  			prometheusReleaseName+"-prometheus-server",
    51  			"80",
    52  		)
    53  		defer prometheus.Close()
    54  
    55  		Eventually(func() bool {
    56  			metrics, err := getPrometheusMetrics("http://"+prometheus.Address(), releaseName)
    57  			if err != nil {
    58  				return false
    59  			}
    60  
    61  			if metrics.Status != "success" {
    62  				return false
    63  			}
    64  
    65  			return true
    66  		}, 2*time.Minute, 10*time.Second).Should(BeTrue(), "be able to retrieve metrics")
    67  	})
    68  })
    69  
    70  type prometheusMetrics struct {
    71  	Status string `json:"status"`
    72  	Data   struct {
    73  		ResultType string `json:"result_type"`
    74  	} `json:"data"`
    75  }
    76  
    77  func getPrometheusMetrics(endpoint, releaseName string) (*prometheusMetrics, error) {
    78  	req, err := http.NewRequest("GET", endpoint+"/api/v1/query", nil)
    79  	if err != nil {
    80  		return nil, err
    81  	}
    82  
    83  	req.URL.RawQuery = `query=concourse_db_connections%7Bapp%3D%22` +
    84  		releaseName + `%22%7D`
    85  
    86  	resp, err := http.DefaultClient.Do(req)
    87  	if err != nil {
    88  		return nil, err
    89  	}
    90  
    91  	defer resp.Body.Close()
    92  
    93  	metrics := new(prometheusMetrics)
    94  	err = json.NewDecoder(resp.Body).Decode(metrics)
    95  	if err != nil {
    96  		return nil, err
    97  	}
    98  
    99  	return metrics, nil
   100  }