Skip to content

Commit 059955e

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 5224ba3 commit 059955e

File tree

6 files changed

+134
-18
lines changed

6 files changed

+134
-18
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
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
1111
- [#1598](https://github.com/openshift/cluster-monitoring-operator/pull/1598) Expose Authorization settings for remote write in the CMO configuration
12+
- [#1633](https://github.com/openshift/cluster-monitoring-operator/pull/1633) Expose the /federate endpoint of UWM Prometheus as a route
1213
- [#1638](https://github.com/openshift/cluster-monitoring-operator/pull/1638) Expose sigv4 setting to Prometheus remoteWrite
1314

1415
## 4.10
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: 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

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: '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

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
}

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
}

test/e2e/user_workload_monitoring_test.go

+41-17
Original file line numberDiff line numberDiff line change
@@ -897,6 +897,7 @@ func assertTenancyForRules(t *testing.T) {
897897
}
898898

899899
func assertUWMFederateEndpoint(t *testing.T) {
900+
ctx := context.Background()
900901
const testAccount = "test-uwm-federate"
901902

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

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

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)
969+
err = federate(host)
948970
if err != nil {
949971
return err
950972
}
951-
defer resp.Body.Close()
952973

953-
b, err := ioutil.ReadAll(resp.Body)
974+
r, err := f.OpenShiftRouteClient.Routes(f.UserWorkloadMonitoringNs).Get(ctx, "prometheus-user-workload-federate", metav1.GetOptions{})
954975
if err != nil {
955976
return err
956977
}
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))
978+
route, err := f.OperatorClient.GetRouteURL(ctx, r)
979+
if err != nil {
980+
return err
959981
}
960-
961-
if !strings.Contains(string(b), "up") {
962-
return fmt.Errorf("'up' metric is missing, got (%s)", framework.ClampMax(b))
982+
// Test the same through OpenShift Route.
983+
federateHost := fmt.Sprintf("%s:%s", route.Hostname(), route.Port())
984+
err = federate(federateHost)
985+
if err != nil {
986+
return err
963987
}
964988

965989
return nil

0 commit comments

Comments
 (0)