From e395080cdc1af959e52c85ce902ed4c9e3bf5dcb Mon Sep 17 00:00:00 2001 From: Madhu Rajanna Date: Wed, 11 Sep 2019 11:34:07 +0530 Subject: [PATCH] Add req-ID to logging with this log format we can easily identify the logs per request Signed-off-by: Madhu Rajanna --- pkg/csi-common/utils.go | 38 +++++++++++++++++++ pkg/csi-common/utils_test.go | 71 ++++++++++++++++++++++++++++++++++++ pkg/util/log.go | 8 ++++ 3 files changed, 117 insertions(+) create mode 100644 pkg/csi-common/utils_test.go diff --git a/pkg/csi-common/utils.go b/pkg/csi-common/utils.go index 8193e6547..b0b8fa6e1 100644 --- a/pkg/csi-common/utils.go +++ b/pkg/csi-common/utils.go @@ -107,11 +107,49 @@ func RunControllerandNodePublishServer(endpoint, hstOption string, d *CSIDriver, s.Wait() } +func getReqID(req interface{}) string { + // if req is nil empty string will be returned + reqID := "" + switch r := req.(type) { + case *csi.CreateVolumeRequest: + reqID = r.Name + + case *csi.DeleteVolumeRequest: + reqID = r.VolumeId + + case *csi.CreateSnapshotRequest: + reqID = r.Name + case *csi.DeleteSnapshotRequest: + reqID = r.SnapshotId + + case *csi.ControllerExpandVolumeRequest: + reqID = r.VolumeId + + case *csi.NodeStageVolumeRequest: + reqID = r.VolumeId + case *csi.NodeUnstageVolumeRequest: + reqID = r.VolumeId + + case *csi.NodePublishVolumeRequest: + reqID = r.VolumeId + case *csi.NodeUnpublishVolumeRequest: + reqID = r.VolumeId + + case *csi.NodeExpandVolumeRequest: + reqID = r.VolumeId + } + return reqID +} + var id uint64 func contextIDInjector(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) { atomic.AddUint64(&id, 1) ctx = context.WithValue(ctx, util.CtxKey, id) + reqID := getReqID(req) + if reqID != "" { + ctx = context.WithValue(ctx, util.ReqID, reqID) + } return handler(ctx, req) } diff --git a/pkg/csi-common/utils_test.go b/pkg/csi-common/utils_test.go new file mode 100644 index 000000000..6c72c011e --- /dev/null +++ b/pkg/csi-common/utils_test.go @@ -0,0 +1,71 @@ +/* +Copyright 2019 ceph-csi authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package csicommon + +import ( + "testing" + + "github.com/container-storage-interface/spec/lib/go/csi" +) + +var fakeID = "fake-id" + +func TestGetReqID(t *testing.T) { + req := []interface{}{ + &csi.CreateVolumeRequest{ + Name: fakeID, + }, + &csi.DeleteVolumeRequest{ + VolumeId: fakeID, + }, + &csi.CreateSnapshotRequest{ + Name: fakeID, + }, + &csi.DeleteSnapshotRequest{ + SnapshotId: fakeID, + }, + + &csi.ControllerExpandVolumeRequest{ + VolumeId: fakeID, + }, + &csi.NodeStageVolumeRequest{ + VolumeId: fakeID, + }, + &csi.NodeUnstageVolumeRequest{ + VolumeId: fakeID, + }, + &csi.NodePublishVolumeRequest{ + VolumeId: fakeID, + }, + &csi.NodeUnpublishVolumeRequest{ + VolumeId: fakeID, + }, + &csi.NodeExpandVolumeRequest{ + VolumeId: fakeID, + }, + } + for _, r := range req { + if got := getReqID(r); got != fakeID { + t.Errorf("getReqID() = %v, want %v", got, fakeID) + } + } + + // test for nil request + if got := getReqID(nil); got != "" { + t.Errorf("getReqID() = %v, want empty string", got) + } +} diff --git a/pkg/util/log.go b/pkg/util/log.go index 65a105cef..ab963fc13 100644 --- a/pkg/util/log.go +++ b/pkg/util/log.go @@ -23,6 +23,9 @@ type contextKey string // CtxKey for context based logging var CtxKey = contextKey("ID") +// ReqID for logging request ID +var ReqID = contextKey("Req-ID") + // Log helps in context based logging func Log(ctx context.Context, format string) string { id := ctx.Value(CtxKey) @@ -30,5 +33,10 @@ func Log(ctx context.Context, format string) string { return format } a := fmt.Sprintf("ID: %v ", id) + reqID := ctx.Value(ReqID) + if reqID == nil { + return a + format + } + a += fmt.Sprintf("Req-ID: %v ", reqID) return a + format }