Skip to content

Commit 14d6a82

Browse files
committed
MON-2213: Expose the /federate endpoint of UWM Prometheus as a route
Successor of #1601 to expose UWM federate service as a Openshift Route. Signed-off-by: Arunprasad Rajkumar <[email protected]>
1 parent 96a7c1d commit 14d6a82

File tree

6 files changed

+137
-18
lines changed

6 files changed

+137
-18
lines changed

Diff for: CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
- [#1350](https://github.com/openshift/cluster-monitoring-operator/pull/1350) Support label scrape limits in user-workload monitoring
99
- [#1601](https://github.com/openshift/cluster-monitoring-operator/pull/1601) Expose the /federate endpoint of UWM Prometheus as a service
1010
- [#1617](https://github.com/openshift/cluster-monitoring-operator/pull/1617) Add Oauth2 setting to PrometheusK8s remoteWrite config
11+
- [#1633](https://github.com/openshift/cluster-monitoring-operator/pull/1633) Expose the /federate endpoint of UWM Prometheus as a route
1112

1213
## 4.10
1314

Diff for: assets/prometheus-user-workload/federate-route.yaml

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
apiVersion: v1
2+
kind: Route
3+
metadata:
4+
labels:
5+
app.kubernetes.io/part-of: openshift-monitoring
6+
name: prometheus-uwm-federate
7+
namespace: openshift-user-workload-monitoring
8+
spec:
9+
path: /federate
10+
port:
11+
targetPort: federate
12+
tls:
13+
insecureEdgeTerminationPolicy: Redirect
14+
termination: Reencrypt
15+
to:
16+
kind: Service
17+
name: prometheus-user-workload

Diff for: jsonnet/components/prometheus-user-workload.libsonnet

+24
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,30 @@ function(params)
8080
},
8181
},
8282

83+
federateRoute: {
84+
apiVersion: 'v1',
85+
kind: 'Route',
86+
metadata: {
87+
name: 'prometheus-uwm-federate',
88+
namespace: cfg.namespace,
89+
labels: cfg.commonLabels,
90+
},
91+
spec: {
92+
path: '/federate',
93+
to: {
94+
kind: 'Service',
95+
name: $.service.metadata.name,
96+
},
97+
port: {
98+
targetPort: 'federate',
99+
},
100+
tls: {
101+
termination: 'Reencrypt',
102+
insecureEdgeTerminationPolicy: 'Redirect',
103+
},
104+
},
105+
},
106+
83107
servingCertsCaBundle+: generateCertInjection.SCOCaBundleCM(cfg.namespace, 'serving-certs-ca-bundle'),
84108

85109
// As Prometheus is protected by the kube-rbac-proxy it requires the

Diff for: pkg/manifests/manifests.go

+12
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ var (
149149
PrometheusUserWorkloadAlertmanagerRoleBinding = "prometheus-user-workload/alertmanager-role-binding.yaml"
150150
PrometheusUserWorkloadPodDisruptionBudget = "prometheus-user-workload/pod-disruption-budget.yaml"
151151
PrometheusUserWorkloadConfigMap = "prometheus-user-workload/config-map.yaml"
152+
PrometheusUserWorkloadFederateRoute = "prometheus-user-workload/federate-route.yaml"
152153

153154
PrometheusAdapterAPIService = "prometheus-adapter/api-service.yaml"
154155
PrometheusAdapterClusterRole = "prometheus-adapter/cluster-role.yaml"
@@ -1029,6 +1030,17 @@ func (f *Factory) PrometheusUserWorkloadRoleList() (*rbacv1.RoleList, error) {
10291030
return rl, nil
10301031
}
10311032

1033+
func (f *Factory) PrometheusUserWorkloadFederateRoute() (*routev1.Route, error) {
1034+
r, err := f.NewRoute(f.assets.MustNewAssetReader(PrometheusUserWorkloadFederateRoute))
1035+
if err != nil {
1036+
return nil, err
1037+
}
1038+
1039+
r.Namespace = f.namespaceUserWorkload
1040+
1041+
return r, nil
1042+
}
1043+
10321044
func (f *Factory) PrometheusK8sPrometheusRule() (*monv1.PrometheusRule, error) {
10331045
return f.NewPrometheusRule(f.assets.MustNewAssetReader(PrometheusK8sPrometheusRule))
10341046
}

Diff for: pkg/tasks/prometheus_user_workload.go

+39-1
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,21 @@ func (t *PrometheusUserWorkloadTask) create(ctx context.Context) error {
269269
return errors.Wrap(err, "reconciling UserWorkload Thanos sidecar ServiceMonitor failed")
270270
}
271271

272+
r, err := t.factory.PrometheusUserWorkloadFederateRoute()
273+
if err != nil {
274+
return errors.Wrap(err, "initializing UserWorkload Prometheus federate Route failed")
275+
}
276+
277+
err = t.client.CreateRouteIfNotExists(ctx, r)
278+
if err != nil {
279+
return errors.Wrap(err, "reconciling UserWorkload federate Route failed")
280+
}
281+
282+
_, err = t.client.WaitForRouteReady(ctx, r)
283+
if err != nil {
284+
return errors.Wrap(err, "waiting for UserWorkload federate Route to become ready failed")
285+
}
286+
272287
return nil
273288
}
274289

@@ -450,6 +465,16 @@ func (t *PrometheusUserWorkloadTask) destroy(ctx context.Context) error {
450465
return errors.Wrap(err, "deleting or updating UserWorkload Prometheus RBAC proxy Secret failed")
451466
}
452467

468+
fs, err := t.factory.PrometheusUserWorkloadRBACProxyFederateSecret()
469+
if err != nil {
470+
return errors.Wrap(err, "initializing UserWorkload Prometheus RBAC federate endpoint Secret failed")
471+
}
472+
473+
err = t.client.DeleteSecret(ctx, fs)
474+
if err != nil {
475+
return errors.Wrap(err, "deleting or updating UserWorkload Prometheus RBAC federate endpoint Secret failed")
476+
}
477+
453478
amsSecret, err := t.factory.PrometheusUserWorkloadAdditionalAlertManagerConfigsSecret()
454479
if err != nil {
455480
return errors.Wrap(err, "initializing UserWorkload Prometheus additionalAlertmanagerConfigs secret failed")
@@ -460,5 +485,18 @@ func (t *PrometheusUserWorkloadTask) destroy(ctx context.Context) error {
460485
}
461486

462487
err = t.client.DeleteConfigMap(ctx, cacm)
463-
return errors.Wrap(err, "deleting UserWorkload serving certs CA Bundle ConfigMap failed")
488+
if err != nil {
489+
return errors.Wrap(err, "deleting UserWorkload serving certs CA Bundle ConfigMap failed")
490+
}
491+
492+
r, err := t.factory.PrometheusUserWorkloadFederateRoute()
493+
if err != nil {
494+
return errors.Wrap(err, "initializing UserWorkload Prometheus federate Route failed")
495+
}
496+
497+
err = t.client.DeleteRoute(ctx, r)
498+
if err != nil {
499+
return errors.Wrap(err, "deleting UserWorkload federate Route failed")
500+
}
501+
return nil
464502
}

Diff for: test/e2e/user_workload_monitoring_test.go

+44-17
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import (
2626
"time"
2727

2828
"github.com/Jeffail/gabs"
29+
configv1 "github.com/openshift/api/config/v1"
30+
"github.com/openshift/cluster-monitoring-operator/pkg/manifests"
2931
"github.com/openshift/cluster-monitoring-operator/test/e2e/framework"
3032
"github.com/pkg/errors"
3133
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
@@ -897,6 +899,10 @@ func assertTenancyForRules(t *testing.T) {
897899
}
898900

899901
func assertUWMFederateEndpoint(t *testing.T) {
902+
ctx := context.Background()
903+
var (
904+
factory = manifests.NewFactory("openshift-user-workload-monitoring", "", nil, nil, nil, manifests.NewAssets(assetsPath), &manifests.APIServerConfig{}, &configv1.Console{})
905+
)
900906
const testAccount = "test-uwm-federate"
901907

902908
err := framework.Poll(2*time.Second, 10*time.Second, func() error {
@@ -927,6 +933,36 @@ func assertUWMFederateEndpoint(t *testing.T) {
927933

928934
// check /federate endpoint
929935
err = framework.Poll(5*time.Second, time.Minute, func() error {
936+
federate := func(host string) error {
937+
client := framework.NewPrometheusClient(
938+
host,
939+
token,
940+
&framework.QueryParameterInjector{
941+
Name: "match[]",
942+
Value: `up`,
943+
},
944+
)
945+
946+
resp, err := client.Do("GET", "/federate", nil)
947+
if err != nil {
948+
return err
949+
}
950+
defer resp.Body.Close()
951+
952+
b, err := ioutil.ReadAll(resp.Body)
953+
if err != nil {
954+
return err
955+
}
956+
if resp.StatusCode != http.StatusOK {
957+
return fmt.Errorf("unexpected status code response, want %d, got %d (%s)", http.StatusOK, resp.StatusCode, framework.ClampMax(b))
958+
}
959+
960+
if !strings.Contains(string(b), "up") {
961+
return fmt.Errorf("'up' metric is missing, got (%s)", framework.ClampMax(b))
962+
}
963+
964+
return nil
965+
}
930966
// The federate port (9092) is only exposed in-cluster so we need to use
931967
// port forwarding to access kube-rbac-proxy.
932968
host, cleanUp, err := f.ForwardPort(t, f.UserWorkloadMonitoringNs, "prometheus-user-workload", 9092)
@@ -935,31 +971,22 @@ func assertUWMFederateEndpoint(t *testing.T) {
935971
}
936972
defer cleanUp()
937973

938-
client := framework.NewPrometheusClient(
939-
host,
940-
token,
941-
&framework.QueryParameterInjector{
942-
Name: "match[]",
943-
Value: `up`,
944-
},
945-
)
946-
947-
resp, err := client.Do("GET", "/federate", nil)
974+
err = federate(host)
948975
if err != nil {
949976
return err
950977
}
951-
defer resp.Body.Close()
952978

953-
b, err := ioutil.ReadAll(resp.Body)
979+
r, err := factory.PrometheusUserWorkloadFederateRoute()
954980
if err != nil {
955981
return err
956982
}
957-
if resp.StatusCode != http.StatusOK {
958-
return fmt.Errorf("unexpected status code response, want %d, got %d (%s)", http.StatusOK, resp.StatusCode, framework.ClampMax(b))
983+
federateRouteUrl, err := f.OperatorClient.GetRouteURL(ctx, r)
984+
if err != nil {
985+
return err
959986
}
960-
961-
if !strings.Contains(string(b), "up") {
962-
return fmt.Errorf("'up' metric is missing, got (%s)", framework.ClampMax(b))
987+
err = federate(federateRouteUrl.String())
988+
if err != nil {
989+
return err
963990
}
964991

965992
return nil

0 commit comments

Comments
 (0)