Skip to content

Commit 89c20e8

Browse files
Somefiveyue9944882
authored andcommitted
Feat: add ocm proxy request metrics
Signed-off-by: Yin Da <[email protected]>
1 parent 16f8ca2 commit 89c20e8

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed

pkg/apis/cluster/v1alpha1/clustergateway_proxy.go

+18-1
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ func (c *ClusterGatewayProxy) New() runtime.Object {
9292
func (in *ClusterGatewayProxy) Destroy() {}
9393

9494
func (c *ClusterGatewayProxy) Connect(ctx context.Context, id string, options runtime.Object, r registryrest.Responder) (http.Handler, error) {
95+
ts := time.Now()
96+
9597
proxyOpts, ok := options.(*ClusterGatewayProxyOptions)
9698
if !ok {
9799
return nil, fmt.Errorf("invalid options object: %#v", options)
@@ -161,6 +163,7 @@ func (c *ClusterGatewayProxy) Connect(ctx context.Context, id string, options ru
161163
finishFunc: func(code int) {
162164
metrics.RecordProxiedRequestsByResource(proxyReqInfo.Resource, proxyReqInfo.Verb, code)
163165
metrics.RecordProxiedRequestsByCluster(id, code)
166+
metrics.RecordProxiedRequestsDuration(proxyReqInfo.Resource, proxyReqInfo.Verb, id, code, time.Since(ts))
164167
},
165168
}, nil
166169
}
@@ -197,7 +200,21 @@ var (
197200
apiSuffix = "/proxy"
198201
)
199202

200-
func (p *proxyHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
203+
type proxyResponseWriter struct {
204+
http.ResponseWriter
205+
statusCode int
206+
}
207+
208+
func (in *proxyResponseWriter) WriteHeader(statusCode int) {
209+
in.statusCode = statusCode
210+
in.ResponseWriter.WriteHeader(statusCode)
211+
}
212+
213+
func (p *proxyHandler) ServeHTTP(_writer http.ResponseWriter, request *http.Request) {
214+
writer := &proxyResponseWriter{_writer, http.StatusOK}
215+
defer func() {
216+
p.finishFunc(writer.statusCode)
217+
}()
201218
cluster := p.clusterGateway
202219
if cluster.Spec.Access.Credential == nil {
203220
responsewriters.InternalError(writer, request, fmt.Errorf("proxying cluster %s not support due to lacking credentials", cluster.Name))

pkg/metrics/proxy.go

+18
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package metrics
22

33
import (
44
"strconv"
5+
"time"
56

67
compbasemetrics "k8s.io/component-base/metrics"
78
)
@@ -45,6 +46,17 @@ var (
4546
},
4647
[]string{proxiedCluster, code},
4748
)
49+
ocmProxiedRequestsDurationHistogram = compbasemetrics.NewHistogramVec(
50+
&compbasemetrics.HistogramOpts{
51+
Namespace: namespace,
52+
Subsystem: subsystem,
53+
Name: "proxied_request_duration_seconds",
54+
Help: "Cluster proxy request time cost",
55+
Buckets: requestDurationSecondsBuckets,
56+
StabilityLevel: compbasemetrics.ALPHA,
57+
},
58+
[]string{proxiedResource, proxiedVerb, proxiedCluster, code},
59+
)
4860
ocmProxiedClusterEscalationRequestDurationHistogram = compbasemetrics.NewHistogramVec(
4961
&compbasemetrics.HistogramOpts{
5062
Namespace: namespace,
@@ -69,3 +81,9 @@ func RecordProxiedRequestsByCluster(cluster string, code int) {
6981
WithLabelValues(cluster, strconv.Itoa(code)).
7082
Inc()
7183
}
84+
85+
func RecordProxiedRequestsDuration(resource string, verb string, cluster string, code int, ts time.Duration) {
86+
ocmProxiedRequestsDurationHistogram.
87+
WithLabelValues(resource, verb, cluster, strconv.Itoa(code)).
88+
Observe(ts.Seconds())
89+
}

pkg/metrics/register.go

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ var registerMetrics sync.Once
1313
var metrics = []compbasemetrics.Registerable{
1414
ocmProxiedRequestsByResourceTotal,
1515
ocmProxiedRequestsByClusterTotal,
16+
ocmProxiedRequestsDurationHistogram,
1617
ocmProxiedClusterEscalationRequestDurationHistogram,
1718
}
1819

0 commit comments

Comments
 (0)