diff --git a/cmd/cluster-agent/api/v1/languagedetection/handler.go b/cmd/cluster-agent/api/v1/languagedetection/handler.go index d6309e7543760..fab935ed8a7dd 100644 --- a/cmd/cluster-agent/api/v1/languagedetection/handler.go +++ b/cmd/cluster-agent/api/v1/languagedetection/handler.go @@ -112,9 +112,13 @@ func (handler *languageDetectionHandler) leaderHandler(w http.ResponseWriter, r ownersLanguagesFromRequest := getOwnersLanguages(requestData, time.Now().Add(handler.cfg.languageTTL)) - log.Tracef("Owner Languages state pre merge-and-flush: %s", handler.ownersLanguages.String()) + if log.ShouldLog(log.TraceLvl) { // Avoid call to String() if not needed + log.Tracef("Owner Languages state pre merge-and-flush: %s", handler.ownersLanguages.String()) + } err = handler.ownersLanguages.mergeAndFlush(ownersLanguagesFromRequest, handler.wlm) - log.Tracef("Owner Languages state post merge-and-flush: %s", handler.ownersLanguages.String()) + if log.ShouldLog(log.TraceLvl) { // Avoid call to String() if not needed + log.Tracef("Owner Languages state post merge-and-flush: %s", handler.ownersLanguages.String()) + } if err != nil { http.Error(w, fmt.Sprintf("failed to store some (or all) languages in workloadmeta store: %s", err), http.StatusInternalServerError) ProcessedRequests.Inc(statusError) diff --git a/cmd/cluster-agent/api/v1/languagedetection/util.go b/cmd/cluster-agent/api/v1/languagedetection/util.go index eede91f36ce6b..6e6131210d459 100644 --- a/cmd/cluster-agent/api/v1/languagedetection/util.go +++ b/cmd/cluster-agent/api/v1/languagedetection/util.go @@ -77,20 +77,41 @@ func (ownersLanguages *OwnersLanguages) String() string { ownersLanguages.mutex.Lock() defer ownersLanguages.mutex.Unlock() - state := "[" + var sb strings.Builder + sb.WriteString("[") + + firstOwner := true for owner, langs := range ownersLanguages.containersLanguages { - state += fmt.Sprintf("(%s/%s/%s, %v,[", owner.Namespace, owner.Kind, owner.Name, langs.dirty) + if !firstOwner { + sb.WriteString(",") + } + + sb.WriteString(fmt.Sprintf("(%s/%s/%s, %v,[", owner.Namespace, owner.Kind, owner.Name, langs.dirty)) + + firstContainer := true for container, languageSet := range langs.languages { - state += container.Name + ": (" + if !firstContainer { + sb.WriteString(",") + } + sb.WriteString(container.Name + ": (") + + languages := make([]string, 0, len(languageSet)) for languagename := range languageSet { - state += fmt.Sprintf("%s,", languagename) + languages = append(languages, string(languagename)) } - state += ")," + sb.WriteString(strings.Join(languages, ",")) + + sb.WriteString(")") + firstContainer = false } - state += "])," + + sb.WriteString("])") + firstOwner = false } - state += "]" - return state + + sb.WriteString("]") + + return sb.String() } // getOrInitialize returns the containers languages for a specific namespaced owner, initialising it if it doesn't already