@@ -24,13 +24,15 @@ import (
24
24
"io"
25
25
"io/ioutil"
26
26
"net/http"
27
+ "time"
27
28
28
29
"k8s.io/api/admission/v1beta1"
29
30
admissionv1beta1 "k8s.io/api/admission/v1beta1"
30
31
"k8s.io/apimachinery/pkg/runtime"
31
32
"k8s.io/apimachinery/pkg/runtime/serializer"
32
33
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
33
34
"sigs.k8s.io/controller-runtime/pkg/webhook/admission/types"
35
+ "sigs.k8s.io/controller-runtime/pkg/webhook/internal/metrics"
34
36
)
35
37
36
38
var admissionv1beta1scheme = runtime .NewScheme ()
@@ -47,6 +49,9 @@ func addToScheme(scheme *runtime.Scheme) {
47
49
var _ http.Handler = & Webhook {}
48
50
49
51
func (wh * Webhook ) ServeHTTP (w http.ResponseWriter , r * http.Request ) {
52
+ startTS := time .Now ()
53
+ defer metrics .RequestLatency .WithLabelValues (wh .Name ).Observe (time .Now ().Sub (startTS ).Seconds ())
54
+
50
55
var body []byte
51
56
var err error
52
57
@@ -55,14 +60,14 @@ func (wh *Webhook) ServeHTTP(w http.ResponseWriter, r *http.Request) {
55
60
if body , err = ioutil .ReadAll (r .Body ); err != nil {
56
61
log .Error (err , "unable to read the body from the incoming request" )
57
62
reviewResponse = ErrorResponse (http .StatusBadRequest , err )
58
- writeResponse (w , reviewResponse )
63
+ wh . writeResponse (w , reviewResponse )
59
64
return
60
65
}
61
66
} else {
62
67
err = errors .New ("request body is empty" )
63
68
log .Error (err , "bad request" )
64
69
reviewResponse = ErrorResponse (http .StatusBadRequest , err )
65
- writeResponse (w , reviewResponse )
70
+ wh . writeResponse (w , reviewResponse )
66
71
return
67
72
}
68
73
@@ -72,31 +77,39 @@ func (wh *Webhook) ServeHTTP(w http.ResponseWriter, r *http.Request) {
72
77
err = fmt .Errorf ("contentType=%s, expect application/json" , contentType )
73
78
log .Error (err , "unable to process a request with an unknown content type" , "content type" , contentType )
74
79
reviewResponse = ErrorResponse (http .StatusBadRequest , err )
75
- writeResponse (w , reviewResponse )
80
+ wh . writeResponse (w , reviewResponse )
76
81
return
77
82
}
78
83
79
84
ar := v1beta1.AdmissionReview {}
80
85
if _ , _ , err := admissionv1beta1schemecodecs .UniversalDeserializer ().Decode (body , nil , & ar ); err != nil {
81
86
log .Error (err , "unable to decode the request" )
82
87
reviewResponse = ErrorResponse (http .StatusBadRequest , err )
83
- writeResponse (w , reviewResponse )
88
+ wh . writeResponse (w , reviewResponse )
84
89
return
85
90
}
86
91
87
92
// TODO: add panic-recovery for Handle
88
93
reviewResponse = wh .Handle (context .Background (), types.Request {AdmissionRequest : ar .Request })
89
- writeResponse (w , reviewResponse )
94
+ wh . writeResponse (w , reviewResponse )
90
95
}
91
96
92
- func writeResponse (w io.Writer , response types.Response ) {
97
+ func (wh * Webhook ) writeResponse (w io.Writer , response types.Response ) {
98
+ if response .Response .Result .Code != 0 {
99
+ if response .Response .Result .Code == http .StatusOK {
100
+ metrics .TotalRequests .WithLabelValues (wh .Name , "true" ).Inc ()
101
+ } else {
102
+ metrics .TotalRequests .WithLabelValues (wh .Name , "false" ).Inc ()
103
+ }
104
+ }
105
+
93
106
encoder := json .NewEncoder (w )
94
107
responseAdmissionReview := v1beta1.AdmissionReview {
95
108
Response : response .Response ,
96
109
}
97
110
err := encoder .Encode (responseAdmissionReview )
98
111
if err != nil {
99
112
log .Error (err , "unable to encode the response" )
100
- writeResponse (w , ErrorResponse (http .StatusInternalServerError , err ))
113
+ wh . writeResponse (w , ErrorResponse (http .StatusInternalServerError , err ))
101
114
}
102
115
}
0 commit comments