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 }