Skip to content

Commit

Permalink
chore: improve IPAM logging (#3049)
Browse files Browse the repository at this point in the history
Signed-off-by: Evan Baker <rbtr@users.noreply.github.com>
  • Loading branch information
rbtr authored Oct 7, 2024
1 parent 391dc3a commit f7f98d4
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 35 deletions.
1 change: 1 addition & 0 deletions cns/ipampool/v2/monitor.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ func (pm *Monitor) reconcile(ctx context.Context) error {
pm.z.Info("calculated new request", zap.Int64("demand", pm.demand), zap.Int64("batch", s.batch), zap.Int64("max", s.max), zap.Float64("buffer", s.buffer), zap.Int64("target", target))
delta := target - pm.request
if delta == 0 {
pm.z.Info("NNC already at target IPs, no scaling required")
return nil
}
pm.z.Info("scaling pool", zap.Int64("delta", delta))
Expand Down
4 changes: 2 additions & 2 deletions cns/kubecontroller/pod/reconciler.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,11 @@ type limiter interface {
// any events.
// listeners are called with the new Pod list.
func (p *watcher) NewNotifierFunc(listOpts *client.ListOptions, limiter limiter, listeners ...func([]v1.Pod)) reconcile.Func {
p.z.Debug("adding notified for listeners", zap.Int("listeners", len(listeners)))
p.z.Info("adding notifier for listeners", zap.Int("listeners", len(listeners)))
return func(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
if !limiter.Allow() {
// rate limit exceeded, requeue
p.z.Debug("rate limit exceeded")
p.z.Info("rate limit exceeded")
return ctrl.Result{Requeue: true}, nil
}
podList := &v1.PodList{}
Expand Down
1 change: 0 additions & 1 deletion cns/restserver/internalapi.go
Original file line number Diff line number Diff line change
Expand Up @@ -563,7 +563,6 @@ func (service *HTTPRestService) CreateOrUpdateNetworkContainerInternal(req *cns.
// If the NC was created successfully, log NC snapshot.
if returnCode == 0 {
logNCSnapshot(*req)

publishIPStateMetrics(service.buildIPState())
} else {
logger.Errorf(returnMessage)
Expand Down
70 changes: 39 additions & 31 deletions cns/restserver/ipam.go
Original file line number Diff line number Diff line change
Expand Up @@ -196,10 +196,10 @@ func (service *HTTPRestService) updatePodInfoWithInterfaces(ctx context.Context,

// RequestIPConfigHandler requests an IPConfig from the CNS state
func (service *HTTPRestService) RequestIPConfigHandler(w http.ResponseWriter, r *http.Request) {
opName := "requestIPConfigHandler"
var ipconfigRequest cns.IPConfigRequest
err := common.Decode(w, r, &ipconfigRequest)
operationName := "requestIPConfigHandler"
logger.Request(service.Name+operationName, ipconfigRequest, err)
logger.Request(opName, ipconfigRequest, err)
if err != nil {
return
}
Expand All @@ -215,7 +215,7 @@ func (service *HTTPRestService) RequestIPConfigHandler(w http.ResponseWriter, r
}
w.Header().Set(cnsReturnCode, reserveResp.Response.ReturnCode.String())
err = common.Encode(w, &reserveResp)
logger.ResponseEx(service.Name+operationName, ipconfigRequest, reserveResp, reserveResp.Response.ReturnCode, err)
logger.ResponseEx(opName, ipconfigRequest, reserveResp, reserveResp.Response.ReturnCode, err)
return
}

Expand All @@ -240,7 +240,7 @@ func (service *HTTPRestService) RequestIPConfigHandler(w http.ResponseWriter, r
}
w.Header().Set(cnsReturnCode, reserveResp.Response.ReturnCode.String())
err = common.Encode(w, &reserveResp)
logger.ResponseEx(service.Name+operationName, ipconfigsRequest, reserveResp, reserveResp.Response.ReturnCode, err)
logger.ResponseEx(opName, ipconfigsRequest, reserveResp, reserveResp.Response.ReturnCode, err)
return
}

Expand All @@ -256,7 +256,7 @@ func (service *HTTPRestService) RequestIPConfigHandler(w http.ResponseWriter, r
}
w.Header().Set(cnsReturnCode, reserveResp.Response.ReturnCode.String())
err = common.Encode(w, &reserveResp)
logger.ResponseEx(service.Name+operationName, ipconfigRequest, reserveResp, reserveResp.Response.ReturnCode, err)
logger.ResponseEx(opName, ipconfigRequest, reserveResp, reserveResp.Response.ReturnCode, err)
return
}
// As this API is expected to return IPConfigResponse, generate it from the IPConfigsResponse returned above.
Expand All @@ -266,15 +266,15 @@ func (service *HTTPRestService) RequestIPConfigHandler(w http.ResponseWriter, r
}
w.Header().Set(cnsReturnCode, reserveResp.Response.ReturnCode.String())
err = common.Encode(w, &reserveResp)
logger.ResponseEx(service.Name+operationName, ipconfigsRequest, reserveResp, reserveResp.Response.ReturnCode, err)
logger.ResponseEx(opName, ipconfigsRequest, reserveResp, reserveResp.Response.ReturnCode, err)
}

// RequestIPConfigsHandler requests multiple IPConfigs from the CNS state
func (service *HTTPRestService) RequestIPConfigsHandler(w http.ResponseWriter, r *http.Request) {
opName := "requestIPConfigsHandler"
var ipconfigsRequest cns.IPConfigsRequest
err := common.Decode(w, r, &ipconfigsRequest)
operationName := "requestIPConfigsHandler"
logger.Request(service.Name+operationName, ipconfigsRequest, err)
logger.Request(opName, ipconfigsRequest, err)
if err != nil {
return
}
Expand All @@ -300,13 +300,13 @@ func (service *HTTPRestService) RequestIPConfigsHandler(w http.ResponseWriter, r
if err != nil {
w.Header().Set(cnsReturnCode, ipConfigsResp.Response.ReturnCode.String())
err = common.Encode(w, &ipConfigsResp)
logger.ResponseEx(service.Name+operationName, ipconfigsRequest, ipConfigsResp, ipConfigsResp.Response.ReturnCode, err)
logger.ResponseEx(opName, ipconfigsRequest, ipConfigsResp, ipConfigsResp.Response.ReturnCode, err)
return
}

w.Header().Set(cnsReturnCode, ipConfigsResp.Response.ReturnCode.String())
err = common.Encode(w, &ipConfigsResp)
logger.ResponseEx(service.Name+operationName, ipconfigsRequest, ipConfigsResp, ipConfigsResp.Response.ReturnCode, err)
logger.ResponseEx(opName, ipconfigsRequest, ipConfigsResp, ipConfigsResp.Response.ReturnCode, err)
}

func (service *HTTPRestService) updateEndpointState(ipconfigsRequest cns.IPConfigsRequest, podInfo cns.PodInfo, podIPInfo []cns.PodIpInfo) error {
Expand Down Expand Up @@ -414,9 +414,10 @@ func (service *HTTPRestService) ReleaseIPConfigHandlerHelper(ctx context.Context

// ReleaseIPConfigHandler frees the IP assigned to a pod from CNS
func (service *HTTPRestService) ReleaseIPConfigHandler(w http.ResponseWriter, r *http.Request) {
opName := "releaseIPConfigHandler"
var ipconfigRequest cns.IPConfigRequest
err := common.Decode(w, r, &ipconfigRequest)
logger.Request(service.Name+"releaseIPConfigHandler", ipconfigRequest, err)
logger.Request(opName, ipconfigRequest, err)
if err != nil {
resp := cns.Response{
ReturnCode: types.UnexpectedError,
Expand All @@ -425,7 +426,7 @@ func (service *HTTPRestService) ReleaseIPConfigHandler(w http.ResponseWriter, r
logger.Errorf("releaseIPConfigHandler decode failed becase %v, release IP config info %s", resp.Message, ipconfigRequest)
w.Header().Set(cnsReturnCode, resp.ReturnCode.String())
err = common.Encode(w, &resp)
logger.ResponseEx(service.Name, ipconfigRequest, resp, resp.ReturnCode, err)
logger.ResponseEx(opName, ipconfigRequest, resp, resp.ReturnCode, err)
return
}

Expand All @@ -439,7 +440,7 @@ func (service *HTTPRestService) ReleaseIPConfigHandler(w http.ResponseWriter, r
}
w.Header().Set(cnsReturnCode, reserveResp.Response.ReturnCode.String())
err = common.Encode(w, &reserveResp)
logger.ResponseEx(service.Name, ipconfigRequest, reserveResp, reserveResp.Response.ReturnCode, err)
logger.ResponseEx(opName, ipconfigRequest, reserveResp, reserveResp.Response.ReturnCode, err)
return
}

Expand All @@ -457,19 +458,20 @@ func (service *HTTPRestService) ReleaseIPConfigHandler(w http.ResponseWriter, r
if err != nil {
w.Header().Set(cnsReturnCode, resp.Response.ReturnCode.String())
err = common.Encode(w, &resp)
logger.ResponseEx(service.Name, ipconfigRequest, resp, resp.Response.ReturnCode, err)
logger.ResponseEx(opName, ipconfigRequest, resp, resp.Response.ReturnCode, err)
}

w.Header().Set(cnsReturnCode, resp.Response.ReturnCode.String())
err = common.Encode(w, &resp)
logger.ResponseEx(service.Name, ipconfigRequest, resp, resp.Response.ReturnCode, err)
logger.ResponseEx(opName, ipconfigRequest, resp, resp.Response.ReturnCode, err)
}

// ReleaseIPConfigsHandler frees multiple IPConfigs from the CNS state
func (service *HTTPRestService) ReleaseIPConfigsHandler(w http.ResponseWriter, r *http.Request) {
opName := "releaseIPConfigsHandler"
var ipconfigsRequest cns.IPConfigsRequest
err := common.Decode(w, r, &ipconfigsRequest)
logger.Request(service.Name+"releaseIPConfigsHandler", ipconfigsRequest, err)
logger.Request("releaseIPConfigsHandler", ipconfigsRequest, err)
if err != nil {
resp := cns.Response{
ReturnCode: types.UnexpectedError,
Expand All @@ -478,20 +480,20 @@ func (service *HTTPRestService) ReleaseIPConfigsHandler(w http.ResponseWriter, r
logger.Errorf("releaseIPConfigsHandler decode failed because %v, release IP config info %+v", resp.Message, ipconfigsRequest)
w.Header().Set(cnsReturnCode, resp.ReturnCode.String())
err = common.Encode(w, &resp)
logger.ResponseEx(service.Name, ipconfigsRequest, resp, resp.ReturnCode, err)
logger.ResponseEx(opName, ipconfigsRequest, resp, resp.ReturnCode, err)
return
}

resp, err := service.ReleaseIPConfigHandlerHelper(r.Context(), ipconfigsRequest)
if err != nil {
w.Header().Set(cnsReturnCode, resp.Response.ReturnCode.String())
err = common.Encode(w, &resp)
logger.ResponseEx(service.Name, ipconfigsRequest, resp, resp.Response.ReturnCode, err)
logger.ResponseEx(opName, ipconfigsRequest, resp, resp.Response.ReturnCode, err)
}

w.Header().Set(cnsReturnCode, resp.Response.ReturnCode.String())
err = common.Encode(w, &resp)
logger.ResponseEx(service.Name, ipconfigsRequest, resp, resp.Response.ReturnCode, err)
logger.ResponseEx(opName, ipconfigsRequest, resp, resp.Response.ReturnCode, err)
}

func (service *HTTPRestService) removeEndpointState(podInfo cns.PodInfo) error {
Expand Down Expand Up @@ -672,16 +674,18 @@ func (service *HTTPRestService) GetPodIPConfigState() map[string]cns.IPConfigura
}

func (service *HTTPRestService) HandleDebugPodContext(w http.ResponseWriter, r *http.Request) { //nolint
opName := "handleDebugPodContext"
service.RLock()
defer service.RUnlock()
resp := cns.GetPodContextResponse{
PodContext: service.PodIPIDByPodInterfaceKey,
}
err := common.Encode(w, &resp)
logger.Response(service.Name, resp, resp.Response.ReturnCode, err)
logger.Response(opName, resp, resp.Response.ReturnCode, err)
}

func (service *HTTPRestService) HandleDebugRestData(w http.ResponseWriter, r *http.Request) { //nolint
opName := "handleDebugRestData"
service.RLock()
defer service.RUnlock()
resp := GetHTTPServiceDataResponse{
Expand All @@ -691,10 +695,11 @@ func (service *HTTPRestService) HandleDebugRestData(w http.ResponseWriter, r *ht
},
}
err := common.Encode(w, &resp)
logger.Response(service.Name, resp, resp.Response.ReturnCode, err)
logger.Response(opName, resp, resp.Response.ReturnCode, err)
}

func (service *HTTPRestService) HandleDebugIPAddresses(w http.ResponseWriter, r *http.Request) {
opName := "handleDebugIPAddresses"
var req cns.GetIPAddressesRequest
if err := common.Decode(w, r, &req); err != nil {
resp := cns.GetIPAddressStatusResponse{
Expand All @@ -704,15 +709,15 @@ func (service *HTTPRestService) HandleDebugIPAddresses(w http.ResponseWriter, r
},
}
err = common.Encode(w, &resp)
logger.ResponseEx(service.Name, req, resp, resp.Response.ReturnCode, err)
logger.ResponseEx(opName, req, resp, resp.Response.ReturnCode, err)
return
}
// Get all IPConfigs matching a state and return in the response
resp := cns.GetIPAddressStatusResponse{
IPConfigurationStatus: filter.MatchAnyIPConfigState(service.PodIPConfigState, filter.PredicatesForStates(req.IPConfigStateFilter...)...),
}
err := common.Encode(w, &resp)
logger.ResponseEx(service.Name, req, resp, resp.Response.ReturnCode, err)
logger.ResponseEx(opName, req, resp, resp.Response.ReturnCode, err)
}

// GetAssignedIPConfigs returns a filtered list of IPs which are in
Expand Down Expand Up @@ -1093,6 +1098,7 @@ func validateDesiredIPAddresses(desiredIPs []string) error {

// EndpointHandlerAPI forwards the endpoint related APIs to GetEndpointHandler or UpdateEndpointHandler based on the http method
func (service *HTTPRestService) EndpointHandlerAPI(w http.ResponseWriter, r *http.Request) {
opName := "endpointHandler"
logger.Printf("[EndpointHandlerAPI] EndpointHandlerAPI received request with http Method %s", r.Method)
service.Lock()
defer service.Unlock()
Expand All @@ -1103,7 +1109,7 @@ func (service *HTTPRestService) EndpointHandlerAPI(w http.ResponseWriter, r *htt
Message: fmt.Sprintf("[EndpointHandlerAPI] EndpointHandlerAPI failed with error: %s", ErrOptManageEndpointState),
}
err := common.Encode(w, &response)
logger.Response(service.Name, response, response.ReturnCode, err)
logger.Response(opName, response, response.ReturnCode, err)
return
}
switch r.Method {
Expand All @@ -1118,6 +1124,7 @@ func (service *HTTPRestService) EndpointHandlerAPI(w http.ResponseWriter, r *htt

// GetEndpointHandler handles the incoming GetEndpoint requests with http Get method
func (service *HTTPRestService) GetEndpointHandler(w http.ResponseWriter, r *http.Request) {
opName := "getEndpointState"
logger.Printf("[GetEndpointState] GetEndpoint for %s", r.URL.Path)
endpointID := strings.TrimPrefix(r.URL.Path, cns.EndpointPath)
endpointInfo, err := service.GetEndpointHelper(endpointID)
Expand All @@ -1139,7 +1146,7 @@ func (service *HTTPRestService) GetEndpointHandler(w http.ResponseWriter, r *htt
}
w.Header().Set(cnsReturnCode, response.Response.ReturnCode.String())
err = common.Encode(w, &response)
logger.Response(service.Name, response, response.Response.ReturnCode, err)
logger.Response(opName, response, response.Response.ReturnCode, err)
return
}
response := GetEndpointResponse{
Expand All @@ -1151,7 +1158,7 @@ func (service *HTTPRestService) GetEndpointHandler(w http.ResponseWriter, r *htt
}
w.Header().Set(cnsReturnCode, response.Response.ReturnCode.String())
err = common.Encode(w, &response)
logger.Response(service.Name, response, response.Response.ReturnCode, err)
logger.Response(opName, response, response.Response.ReturnCode, err)
}

// GetEndpointHelper returns the state of the given endpointId
Expand Down Expand Up @@ -1192,12 +1199,13 @@ func (service *HTTPRestService) GetEndpointHelper(endpointID string) (*EndpointI

// UpdateEndpointHandler handles the incoming UpdateEndpoint requests with http Patch method
func (service *HTTPRestService) UpdateEndpointHandler(w http.ResponseWriter, r *http.Request) {
opName := "UpdateEndpointHandler"
logger.Printf("[updateEndpoint] updateEndpoint for %s", r.URL.Path)

var req map[string]*IPInfo
err := common.Decode(w, r, &req)
endpointID := strings.TrimPrefix(r.URL.Path, cns.EndpointPath)
logger.Request(service.Name, &req, err)
logger.Request(opName, &req, err)
// Check if the request is valid
if err != nil {
response := cns.Response{
Expand All @@ -1206,7 +1214,7 @@ func (service *HTTPRestService) UpdateEndpointHandler(w http.ResponseWriter, r *
}
w.Header().Set(cnsReturnCode, response.ReturnCode.String())
err = common.Encode(w, &response)
logger.Response(service.Name, response, response.ReturnCode, err)
logger.Response(opName, response, response.ReturnCode, err)
return
}
if err = verifyUpdateEndpointStateRequest(req); err != nil {
Expand All @@ -1216,7 +1224,7 @@ func (service *HTTPRestService) UpdateEndpointHandler(w http.ResponseWriter, r *
}
w.Header().Set(cnsReturnCode, response.ReturnCode.String())
err = common.Encode(w, &response)
logger.Response(service.Name, response, response.ReturnCode, err)
logger.Response(opName, response, response.ReturnCode, err)
return
}
// Update the endpoint state
Expand All @@ -1228,7 +1236,7 @@ func (service *HTTPRestService) UpdateEndpointHandler(w http.ResponseWriter, r *
}
w.Header().Set(cnsReturnCode, response.ReturnCode.String())
err = common.Encode(w, &response)
logger.Response(service.Name, response, response.ReturnCode, err)
logger.Response(opName, response, response.ReturnCode, err)
return
}
response := cns.Response{
Expand All @@ -1237,7 +1245,7 @@ func (service *HTTPRestService) UpdateEndpointHandler(w http.ResponseWriter, r *
}
w.Header().Set(cnsReturnCode, response.ReturnCode.String())
err = common.Encode(w, &response)
logger.Response(service.Name, response, response.ReturnCode, err)
logger.Response(opName, response, response.ReturnCode, err)
}

// UpdateEndpointHelper updates the state of the given endpointId with HNSId, VethName or other InterfaceInfo fields
Expand Down
2 changes: 1 addition & 1 deletion cns/restserver/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ func stateTransitionMiddleware(i *cns.IPConfigurationStatus, s types.IPState) {
}

func publishIPStateMetrics(state *ipState) {
labels := []string{} // TODO. ragasthya Add dimensions to the IP Usage metrics.
labels := []string{}
allocatedIPCount.WithLabelValues(labels...).Set(float64(state.allocatedIPs))
assignedIPCount.WithLabelValues(labels...).Set(float64(state.assignedIPs))
availableIPCount.WithLabelValues(labels...).Set(float64(state.availableIPs))
Expand Down

0 comments on commit f7f98d4

Please sign in to comment.