Skip to content

Commit 980f4eb

Browse files
authored
chore: log requests upon retrieval (#1140)
1 parent 3520b10 commit 980f4eb

File tree

8 files changed

+201
-59
lines changed

8 files changed

+201
-59
lines changed

api/grpc/grpc.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,8 @@ func WithDefaultInterceptors() ConfigOpts {
145145
return func(cfg *Config) {
146146
// Interceptors are executed in order.
147147
cfg.UnaryInterceptors = []grpc.UnaryServerInterceptor{
148-
// Ensure the user is authorized before doing anything else.
148+
loggingUnaryServerInterceptor(),
149+
// Ensure the user is authorized before doing anything other than logging.
149150
verifyPeerCertsUnaryServerInterceptor(),
150151
slimModeUnaryServerInterceptor(),
151152
grpcprometheus.UnaryServerInterceptor,

api/grpc/logging_interceptor.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package grpc
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"time"
7+
8+
"github.com/sirupsen/logrus"
9+
"google.golang.org/grpc"
10+
)
11+
12+
func loggingUnaryServerInterceptor() grpc.UnaryServerInterceptor {
13+
return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
14+
logrus.WithFields(map[string]interface{}{
15+
"URI": info.FullMethod,
16+
}).Infof("Received gRPC request")
17+
18+
start := time.Now()
19+
resp, err := handler(ctx, req)
20+
duration := fmt.Sprintf("%f seconds", time.Since(start).Seconds())
21+
22+
logrus.WithFields(map[string]interface{}{
23+
"URI": info.FullMethod,
24+
"Duration": duration,
25+
}).Infof("Finished gRPC request")
26+
27+
return resp, err
28+
}
29+
}

api/v1/imagescan/service.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,11 +203,19 @@ func (s *serviceImpl) getImageComponents(_ context.Context, req *v1.GetImageComp
203203
}
204204

205205
func (s *serviceImpl) GetImageVulnerabilities(_ context.Context, req *v1.GetImageVulnerabilitiesRequest) (*v1.GetImageVulnerabilitiesResponse, error) {
206+
imageName := "unknown"
207+
if req.GetImage() != "" {
208+
imageName = req.GetImage()
209+
}
210+
logrus.Infof("Fetching vulnerabilities for %s", imageName)
211+
206212
layer, err := apiV1.GetVulnerabilitiesForComponents(s.db, req.GetComponents(), common.HasUncertifiedRHEL(req.GetNotes()))
207213
if err != nil {
208214
return nil, status.Error(codes.Internal, err.Error())
209215
}
210216

217+
logrus.Infof("Done fetching vulnerabilities for %s", imageName)
218+
211219
return &v1.GetImageVulnerabilitiesResponse{
212220
ScannerVersion: s.version,
213221
Status: v1.ScanStatus_SUCCEEDED,

e2etests/grpc_full_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ func TestGRPCGetImageVulnerabilities(t *testing.T) {
184184
// This test assumes TestGRPCGetImageComponents passes, so there is no need to check the component response.
185185

186186
vulnsResp, err := client.GetImageVulnerabilities(context.Background(), &v1.GetImageVulnerabilitiesRequest{
187+
Image: testCase.image,
187188
Components: imgComponentsResp.GetComponents(),
188189
Notes: imgComponentsResp.GetNotes(),
189190
})

generated/scanner/api/v1/image_scan_service.pb.go

Lines changed: 110 additions & 57 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/clairify/server/middleware/log.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Note: there is no gRPC equivalent to this, as this is, instead,
2+
// captured upon calling ServeHTTP in api/grpc/grpc.go.
3+
4+
package middleware
5+
6+
import (
7+
"fmt"
8+
"net/http"
9+
"time"
10+
11+
"github.com/gorilla/mux"
12+
"github.com/sirupsen/logrus"
13+
"github.com/stackrox/rox/pkg/httputil"
14+
)
15+
16+
// Log returns middleware which logs basic information about the incoming HTTP request.
17+
func Log() mux.MiddlewareFunc {
18+
return func(next http.Handler) http.Handler {
19+
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
20+
logrus.WithFields(map[string]interface{}{
21+
"Method": r.Method,
22+
"URI": r.URL.String(),
23+
}).Infof("Received HTTP request from %s", r.RemoteAddr)
24+
25+
stw := httputil.NewStatusTrackingWriter(w)
26+
27+
start := time.Now()
28+
next.ServeHTTP(stw, r)
29+
duration := fmt.Sprintf("%f seconds", time.Since(start).Seconds())
30+
31+
var statusCode int
32+
if code := stw.GetStatusCode(); code != nil {
33+
statusCode = *code
34+
}
35+
36+
logrus.WithFields(map[string]interface{}{
37+
"Method": r.Method,
38+
"URI": r.URL.String(),
39+
"Duration": duration,
40+
"Status": statusCode,
41+
}).Infof("Finished HTTP request from %s", r.RemoteAddr)
42+
})
43+
}
44+
}

pkg/clairify/server/server.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,11 +213,14 @@ func (s *Server) ScanImage(w http.ResponseWriter, r *http.Request) {
213213
return
214214
}
215215

216+
logrus.Infof("Start processing image %v", image)
216217
_, err = server.ProcessImage(s.storage, image, imageRequest.Registry, username, password, imageRequest.Insecure, imageRequest.UncertifiedRHELScan)
217218
if err != nil {
219+
logrus.Infof("End processing image %v: failure", image)
218220
clairErrorString(w, http.StatusInternalServerError, "error processing image %q: %v", imageRequest.Image, err)
219221
return
220222
}
223+
logrus.Infof("End processing image %v: success", image)
221224
imageEnvelope := types.ImageEnvelope{
222225
ScannerVersion: s.version,
223226
Image: image,
@@ -277,7 +280,8 @@ func (s *Server) Start() error {
277280
r := mux.NewRouter()
278281
// Middlewares are executed in order.
279282
r.Use(
280-
// Ensure the user is authorized before doing anything else.
283+
middleware.Log(),
284+
// Ensure the user is authorized before doing anything other than logging.
281285
middleware.VerifyPeerCerts(),
282286
middleware.SlimMode(),
283287
)

proto/scanner/api/v1/image_scan_service.proto

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ message GetImageComponentsResponse {
5656
repeated Note notes = 3;
5757
}
5858

59+
// Next tag: 4
5960
message GetImageVulnerabilitiesRequest {
61+
string image = 3;
6062
Components components = 1;
6163
repeated Note notes = 2;
6264
}

0 commit comments

Comments
 (0)