tests/e2e: use prometheus client_golang in e2e tests & add testing for http endpoints
This commit is contained in:
@@ -123,7 +123,7 @@ func TestDroppedMetrics(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
for _, k := range md.Data {
|
for _, k := range md {
|
||||||
// check if the metric' help text contains Deprecated
|
// check if the metric' help text contains Deprecated
|
||||||
if strings.Contains(k.Help, "Deprecated") {
|
if strings.Contains(k.Help, "Deprecated") {
|
||||||
// query prometheus for the Deprecated metric
|
// query prometheus for the Deprecated metric
|
||||||
@@ -138,3 +138,27 @@ func TestDroppedMetrics(t *testing.T) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestTargetsScheme(t *testing.T) {
|
||||||
|
// query targets for all endpoints
|
||||||
|
tgs, err := promClient.targets()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// exclude jobs from checking for http endpoints
|
||||||
|
// TODO(paulfantom): This should be reduced as we secure connections for those components
|
||||||
|
exclude := map[string]bool{
|
||||||
|
"alertmanager-main": true,
|
||||||
|
"prometheus-k8s": true,
|
||||||
|
"kube-dns": true,
|
||||||
|
"grafana": true,
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, k := range tgs.Active {
|
||||||
|
job := k.Labels["job"]
|
||||||
|
if k.DiscoveredLabels["__scheme__"] == "http" && !exclude[string(job)] {
|
||||||
|
log.Fatalf("target exposing metrics over HTTP instead of HTTPS: %+v", k)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import (
|
|||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
|
|
||||||
"github.com/Jeffail/gabs"
|
"github.com/Jeffail/gabs"
|
||||||
|
promv1 "github.com/prometheus/client_golang/api/prometheus/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
type prometheusClient struct {
|
type prometheusClient struct {
|
||||||
@@ -32,6 +33,42 @@ func newPrometheusClient(kubeClient kubernetes.Interface) *prometheusClient {
|
|||||||
return &prometheusClient{kubeClient}
|
return &prometheusClient{kubeClient}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Response hold API response in a form similar to apiResponse struct from prometheus/client_golang
|
||||||
|
// https://github.com/prometheus/client_golang/blob/master/api/prometheus/v1/api.go
|
||||||
|
type Response struct {
|
||||||
|
Status string `json:"status"`
|
||||||
|
Data json.RawMessage `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// apiRequest makes a request against specified Prometheus API endpoint
|
||||||
|
func (c *prometheusClient) apiRequest(endpoint string, selector string, query string) (Response, error) {
|
||||||
|
req := c.kubeClient.CoreV1().RESTClient().Get().
|
||||||
|
Namespace("monitoring").
|
||||||
|
Resource("pods").
|
||||||
|
SubResource("proxy").
|
||||||
|
Name("prometheus-k8s-0:9090").
|
||||||
|
Suffix(endpoint).Param(selector, query)
|
||||||
|
|
||||||
|
var data Response
|
||||||
|
b, err := req.DoRaw()
|
||||||
|
if err != nil {
|
||||||
|
return data, err
|
||||||
|
}
|
||||||
|
|
||||||
|
r := bytes.NewReader(b)
|
||||||
|
decoder := json.NewDecoder(r)
|
||||||
|
err = decoder.Decode(&data)
|
||||||
|
if err != nil {
|
||||||
|
return data, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if data.Status != "success" {
|
||||||
|
return data, fmt.Errorf("status of returned response was not successful; status: %s", data.Status)
|
||||||
|
}
|
||||||
|
|
||||||
|
return data, err
|
||||||
|
}
|
||||||
|
|
||||||
// Query makes a request against the Prometheus /api/v1/query endpoint.
|
// Query makes a request against the Prometheus /api/v1/query endpoint.
|
||||||
func (c *prometheusClient) query(query string) (int, error) {
|
func (c *prometheusClient) query(query string) (int, error) {
|
||||||
req := c.kubeClient.CoreV1().RESTClient().Get().
|
req := c.kubeClient.CoreV1().RESTClient().Get().
|
||||||
@@ -55,40 +92,36 @@ func (c *prometheusClient) query(query string) (int, error) {
|
|||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
|
|
||||||
type Metadata struct {
|
|
||||||
Status string `json:"status,omitempty"`
|
|
||||||
Data []Data `json:"data,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
type Data struct {
|
|
||||||
Metric string `json:"metric,omitempty"`
|
|
||||||
Help string `json:"help,omitempty"`
|
|
||||||
}
|
|
||||||
|
|
||||||
// metadata makes a request against the Prometheus /api/v1/targets/metadata endpoint.
|
// metadata makes a request against the Prometheus /api/v1/targets/metadata endpoint.
|
||||||
// It returns all the metrics and its metadata.
|
// It returns all the metrics and its metadata.
|
||||||
func (c *prometheusClient) metadata(query string) (Metadata, error) {
|
func (c *prometheusClient) metadata(query string) ([]promv1.MetricMetadata, error) {
|
||||||
req := c.kubeClient.CoreV1().RESTClient().Get().
|
var metadata []promv1.MetricMetadata
|
||||||
Namespace("monitoring").
|
rsp, err := c.apiRequest("/api/v1/targets/metadata", "match_target", query)
|
||||||
Resource("pods").
|
|
||||||
SubResource("proxy").
|
|
||||||
Name("prometheus-k8s-0:9090").
|
|
||||||
Suffix("/api/v1/targets/metadata").Param("match_target", query)
|
|
||||||
|
|
||||||
var data Metadata
|
r := bytes.NewReader(rsp.Data)
|
||||||
b, err := req.DoRaw()
|
|
||||||
if err != nil {
|
|
||||||
return data, err
|
|
||||||
}
|
|
||||||
|
|
||||||
r := bytes.NewReader(b)
|
|
||||||
decoder := json.NewDecoder(r)
|
decoder := json.NewDecoder(r)
|
||||||
err = decoder.Decode(&data)
|
err = decoder.Decode(&metadata)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return data, err
|
return metadata, err
|
||||||
}
|
}
|
||||||
if data.Status != "success" {
|
return metadata, err
|
||||||
return data, fmt.Errorf("status of returned response was not successful; status: %s", data.Status)
|
}
|
||||||
}
|
|
||||||
return data, err
|
// targets makes a request against the Prometheus /api/v1/targets endpoint.
|
||||||
|
// It returns all targets registered in prometheus.
|
||||||
|
func (c *prometheusClient) targets() (promv1.TargetsResult, error) {
|
||||||
|
var targets promv1.TargetsResult
|
||||||
|
rsp, err := c.apiRequest("/api/v1/targets", "state", "any")
|
||||||
|
if err != nil {
|
||||||
|
return targets, err
|
||||||
|
}
|
||||||
|
|
||||||
|
r := bytes.NewReader(rsp.Data)
|
||||||
|
decoder := json.NewDecoder(r)
|
||||||
|
err = decoder.Decode(&targets)
|
||||||
|
if err != nil {
|
||||||
|
return targets, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return targets, err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user