diff --git a/cmd/agent/common/autodiscovery.go b/cmd/agent/common/autodiscovery.go index 67a220b706750..8d7a8ce17e681 100644 --- a/cmd/agent/common/autodiscovery.go +++ b/cmd/agent/common/autodiscovery.go @@ -10,6 +10,7 @@ import ( "errors" "fmt" "path/filepath" + "slices" "time" "go.uber.org/atomic" @@ -277,12 +278,7 @@ func waitForConfigsFromAD(ctx context.Context, } else { // match configs with names in checkNames match = func(cfg integration.Config) bool { - for _, checkName := range checkNames { - if cfg.Name == checkName { - return true - } - } - return false + return slices.Contains(checkNames, cfg.Name) } } diff --git a/cmd/agent/subcommands/run/internal/clcrunnerapi/v1/clcrunner.go b/cmd/agent/subcommands/run/internal/clcrunnerapi/v1/clcrunner.go index 6b23cc4256ee5..1cf524b4a6bde 100644 --- a/cmd/agent/subcommands/run/internal/clcrunnerapi/v1/clcrunner.go +++ b/cmd/agent/subcommands/run/internal/clcrunnerapi/v1/clcrunner.go @@ -10,6 +10,7 @@ package v1 import ( "encoding/json" + "maps" "net/http" "github.com/gorilla/mux" @@ -67,9 +68,7 @@ func getCLCRunnerStats(w http.ResponseWriter, _ *http.Request, ac autodiscovery. func flattenCLCStats(stats status.CLCChecks) map[string]status.CLCStats { flatened := make(map[string]status.CLCStats) for _, checks := range stats.Checks { - for checkID, checkStats := range checks { - flatened[checkID] = checkStats - } + maps.Copy(flatened, checks) } return flatened diff --git a/cmd/serverless-init/cloudservice/appservice.go b/cmd/serverless-init/cloudservice/appservice.go index df9a35099de52..003bd058874d9 100644 --- a/cmd/serverless-init/cloudservice/appservice.go +++ b/cmd/serverless-init/cloudservice/appservice.go @@ -7,6 +7,7 @@ package cloudservice import ( + "maps" "os" "github.com/DataDog/datadog-agent/pkg/trace/traceutil" @@ -38,9 +39,7 @@ func (a *AppService) GetTags() map[string]string { "_dd.origin": a.GetOrigin(), } - for key, value := range traceutil.GetAppServicesTags() { - tags[key] = value - } + maps.Copy(tags, traceutil.GetAppServicesTags()) return tags } diff --git a/cmd/serverless-init/tag/tag.go b/cmd/serverless-init/tag/tag.go index 538e0b5dfb8b6..cd668f9a6d960 100644 --- a/cmd/serverless-init/tag/tag.go +++ b/cmd/serverless-init/tag/tag.go @@ -7,6 +7,7 @@ package tag import ( + "maps" "os" "strings" @@ -52,9 +53,7 @@ func GetBaseTagsMapWithMetadata(metadata map[string]string, versionMode string) } } - for key, value := range metadata { - tagsMap[key] = value - } + maps.Copy(tagsMap, metadata) tagsMap[versionMode] = tags.GetExtensionVersion() tagsMap[tags.ComputeStatsKey] = tags.ComputeStatsValue diff --git a/cmd/trace-agent/test/testsuite/traces_test.go b/cmd/trace-agent/test/testsuite/traces_test.go index 93790de58b6ef..c0feb469bad89 100644 --- a/cmd/trace-agent/test/testsuite/traces_test.go +++ b/cmd/trace-agent/test/testsuite/traces_test.go @@ -6,6 +6,7 @@ package testsuite import ( + "slices" "strings" "testing" "time" @@ -97,7 +98,7 @@ func TestTraces(t *testing.T) { t.Fatal(err) } waitForTrace(t, &r, func(v *pb.AgentPayload) { - payloadsEqual(t, append(p[:2], p[3:]...), v) + payloadsEqual(t, slices.Delete(p, 2, 3), v) }) }) diff --git a/comp/core/autodiscovery/autodiscoveryimpl/stats.go b/comp/core/autodiscovery/autodiscoveryimpl/stats.go index d8b31175ece2c..8833859ae6650 100644 --- a/comp/core/autodiscovery/autodiscoveryimpl/stats.go +++ b/comp/core/autodiscovery/autodiscoveryimpl/stats.go @@ -7,6 +7,7 @@ package autodiscoveryimpl import ( "expvar" + "maps" "sync" "github.com/mohae/deepcopy" @@ -63,9 +64,7 @@ func (es *acErrorStats) getConfigErrors() map[string]string { defer es.m.RUnlock() configCopy := make(map[string]string) - for k, v := range es.config { - configCopy[k] = v - } + maps.Copy(configCopy, es.config) return configCopy } diff --git a/comp/core/autodiscovery/autodiscoveryimpl/store.go b/comp/core/autodiscovery/autodiscoveryimpl/store.go index 96e2b4f8ec3f1..878ded23c3c6f 100644 --- a/comp/core/autodiscovery/autodiscoveryimpl/store.go +++ b/comp/core/autodiscovery/autodiscoveryimpl/store.go @@ -6,6 +6,7 @@ package autodiscoveryimpl import ( + "maps" "sync" "github.com/DataDog/datadog-agent/comp/core/autodiscovery/integration" @@ -157,9 +158,7 @@ func (s *store) setIDsOfChecksWithSecrets(checkIDs map[checkid.ID]checkid.ID) { s.m.Lock() defer s.m.Unlock() - for idWithResolvedSecrets, idWithEncryptedSecrets := range checkIDs { - s.idsOfChecksWithSecrets[idWithResolvedSecrets] = idWithEncryptedSecrets - } + maps.Copy(s.idsOfChecksWithSecrets, checkIDs) } func (s *store) getIDOfCheckWithEncryptedSecrets(idCheckWithResolvedSecrets checkid.ID) checkid.ID { diff --git a/comp/core/autodiscovery/autodiscoveryimpl/templatecache.go b/comp/core/autodiscovery/autodiscoveryimpl/templatecache.go index 668500fcfea97..23d88d51c171e 100644 --- a/comp/core/autodiscovery/autodiscoveryimpl/templatecache.go +++ b/comp/core/autodiscovery/autodiscoveryimpl/templatecache.go @@ -7,6 +7,7 @@ package autodiscoveryimpl import ( "fmt" + "slices" "strings" "sync" @@ -111,7 +112,7 @@ func (cache *templateCache) del(tpl integration.Config) error { } else { for i, digest := range digests { if digest == d { - cache.adIDToDigests[id] = append(digests[:i], digests[i+1:]...) + cache.adIDToDigests[id] = slices.Delete(digests, i, i+1) break } } diff --git a/comp/core/autodiscovery/listeners/common.go b/comp/core/autodiscovery/listeners/common.go index 6326397f9cf67..23865cbebf8d0 100644 --- a/comp/core/autodiscovery/listeners/common.go +++ b/comp/core/autodiscovery/listeners/common.go @@ -11,6 +11,7 @@ package listeners import ( "fmt" "hash/fnv" + "maps" "strconv" "github.com/DataDog/datadog-agent/comp/core/autodiscovery/common/types" @@ -116,9 +117,7 @@ func getPrometheusIncludeAnnotations() types.PrometheusAnnotations { log.Errorf("Couldn't init check configuration: %v", err) continue } - for k, v := range check.AD.GetIncludeAnnotations() { - annotations[k] = v - } + maps.Copy(annotations, check.AD.GetIncludeAnnotations()) } return annotations } diff --git a/comp/core/autodiscovery/listeners/container.go b/comp/core/autodiscovery/listeners/container.go index 46bb7db2b2d5d..4a571f8820300 100644 --- a/comp/core/autodiscovery/listeners/container.go +++ b/comp/core/autodiscovery/listeners/container.go @@ -9,6 +9,7 @@ package listeners import ( "errors" + "maps" "sort" "strings" "time" @@ -151,9 +152,7 @@ func (l *ContainerListener) createContainerService(entity workloadmeta.Entity) { } hosts := make(map[string]string) - for host, ip := range container.NetworkIPs { - hosts[host] = ip - } + maps.Copy(hosts, container.NetworkIPs) if rancherIP, ok := docker.FindRancherIPInLabels(container.Labels); ok { hosts["rancher"] = rancherIP diff --git a/comp/core/autodiscovery/providers/config_reader.go b/comp/core/autodiscovery/providers/config_reader.go index f048953469884..c7e551bed0956 100644 --- a/comp/core/autodiscovery/providers/config_reader.go +++ b/comp/core/autodiscovery/providers/config_reader.go @@ -10,6 +10,7 @@ import ( "fmt" "os" "path/filepath" + "slices" "strings" "sync" "time" @@ -454,12 +455,7 @@ func GetIntegrationConfigFromFile(name, fpath string) (integration.Config, error } func containsString(slice []string, str string) bool { - for _, s := range slice { - if s == str { - return true - } - } - return false + return slices.Contains(slice, str) } // ResetReader is only for unit tests diff --git a/comp/core/autodiscovery/providers/consul.go b/comp/core/autodiscovery/providers/consul.go index a6b3816f7aba1..fcd68384c0878 100644 --- a/comp/core/autodiscovery/providers/consul.go +++ b/comp/core/autodiscovery/providers/consul.go @@ -12,6 +12,7 @@ import ( "fmt" "math" "net/url" + "slices" "sort" "strings" @@ -287,12 +288,7 @@ func (p *ConsulConfigProvider) getJSONValue(ctx context.Context, key string) ([] func isTemplateField(key string) bool { tplKeys := []string{instancePath, checkNamePath, initConfigPath} - for _, tpl := range tplKeys { - if key == tpl { - return true - } - } - return false + return slices.Contains(tplKeys, key) } // GetConfigErrors is not implemented for the ConsulConfigProvider diff --git a/comp/core/autodiscovery/providers/container.go b/comp/core/autodiscovery/providers/container.go index 846d967682b60..ed8e8efe365dc 100644 --- a/comp/core/autodiscovery/providers/container.go +++ b/comp/core/autodiscovery/providers/container.go @@ -10,6 +10,7 @@ package providers import ( "context" "fmt" + "maps" "strings" "sync" @@ -113,9 +114,7 @@ func (k *ContainerConfigProvider) processEvents(evBundle workloadmeta.EventBundl } configsToUnschedule := make(map[string]integration.Config) - for digest, config := range configCache { - configsToUnschedule[digest] = config - } + maps.Copy(configsToUnschedule, configCache) for _, config := range configs { digest := config.Digest() @@ -282,9 +281,7 @@ func (k *ContainerConfigProvider) GetConfigErrors() map[string]ErrorMsgSet { errors := make(map[string]ErrorMsgSet, len(k.configErrors)) - for entity, errset := range k.configErrors { - errors[entity] = errset - } + maps.Copy(errors, k.configErrors) return errors } diff --git a/comp/core/autodiscovery/providers/remote_config.go b/comp/core/autodiscovery/providers/remote_config.go index 24b00bbd68b33..7ab76d50d4dd4 100644 --- a/comp/core/autodiscovery/providers/remote_config.go +++ b/comp/core/autodiscovery/providers/remote_config.go @@ -9,6 +9,7 @@ import ( "context" "encoding/json" "fmt" + "maps" "regexp" "strings" "sync" @@ -83,9 +84,7 @@ func (rc *RemoteConfigProvider) GetConfigErrors() map[string]ErrorMsgSet { errors := make(map[string]ErrorMsgSet, len(rc.configErrors)) - for entity, errset := range rc.configErrors { - errors[entity] = errset - } + maps.Copy(errors, rc.configErrors) return errors } diff --git a/comp/core/secrets/secretsimpl/secrets.go b/comp/core/secrets/secretsimpl/secrets.go index 0088213ac3d75..3b12be54ade48 100644 --- a/comp/core/secrets/secretsimpl/secrets.go +++ b/comp/core/secrets/secretsimpl/secrets.go @@ -13,6 +13,7 @@ import ( "encoding/json" "fmt" "io" + stdmaps "maps" "net/http" "path/filepath" "regexp" @@ -405,13 +406,7 @@ func (r *secretResolver) matchesAllowlist(handle string) bool { if !allowlistEnabled { return true } - for _, secretCtx := range r.origin[handle] { - if secretMatchesAllowlist(secretCtx) { - return true - } - } - // the handle does not appear for a setting that is in the allowlist - return false + return slices.ContainsFunc(r.origin[handle], secretMatchesAllowlist) } // for all secrets returned by the backend command, notify subscribers (if allowlist lets them), @@ -451,9 +446,7 @@ func (r *secretResolver) processSecretResponse(secretResponse map[string]string, handleInfoList = append(handleInfoList, handleInfo{Name: handle, Places: places}) } // add results to the cache - for handle, secretValue := range secretResponse { - r.cache[handle] = secretValue - } + stdmaps.Copy(r.cache, secretResponse) // return info about the handles sorted by their name sort.Slice(handleInfoList, func(i, j int) bool { return handleInfoList[i].Name < handleInfoList[j].Name diff --git a/comp/core/settings/settingsimpl/settingsimpl.go b/comp/core/settings/settingsimpl/settingsimpl.go index 669e22149a379..a4f1b8126c944 100644 --- a/comp/core/settings/settingsimpl/settingsimpl.go +++ b/comp/core/settings/settingsimpl/settingsimpl.go @@ -8,6 +8,7 @@ package settingsimpl import ( "html" + "maps" "net/http" "sync" @@ -63,9 +64,7 @@ func (s *settingsRegistry) RuntimeSettings() map[string]settings.RuntimeSetting s.rwMutex.RLock() defer s.rwMutex.RUnlock() settingsCopy := map[string]settings.RuntimeSetting{} - for k, v := range s.settings { - settingsCopy[k] = v - } + maps.Copy(settingsCopy, s.settings) return settingsCopy } diff --git a/comp/core/status/statusimpl/common_header_provider.go b/comp/core/status/statusimpl/common_header_provider.go index 4c6a0643f0be3..c38c1f1259b50 100644 --- a/comp/core/status/statusimpl/common_header_provider.go +++ b/comp/core/status/statusimpl/common_header_provider.go @@ -46,9 +46,7 @@ func (h *headerProvider) Name() string { } func (h *headerProvider) JSON(_ bool, stats map[string]interface{}) error { - for k, v := range h.data() { - stats[k] = v - } + maps.Copy(stats, h.data()) return nil } diff --git a/comp/core/status/statusimpl/status_test.go b/comp/core/status/statusimpl/status_test.go index ac1009220e498..569237e942163 100644 --- a/comp/core/status/statusimpl/status_test.go +++ b/comp/core/status/statusimpl/status_test.go @@ -9,6 +9,7 @@ import ( "encoding/json" "fmt" "io" + "maps" "os" "runtime" "strings" @@ -50,9 +51,7 @@ func (m mockProvider) JSON(_ bool, stats map[string]interface{}) error { return fmt.Errorf("JSON error") } - for key, value := range m.data { - stats[key] = value - } + maps.Copy(stats, m.data) return nil } @@ -97,9 +96,7 @@ func (m mockHeaderProvider) JSON(_ bool, stats map[string]interface{}) error { return fmt.Errorf("JSON error") } - for key, value := range m.data { - stats[key] = value - } + maps.Copy(stats, m.data) return nil } diff --git a/comp/core/tagger/api/getlist.go b/comp/core/tagger/api/getlist.go index 36cc6fa6b71af..849b9d10af4c4 100644 --- a/comp/core/tagger/api/getlist.go +++ b/comp/core/tagger/api/getlist.go @@ -10,7 +10,7 @@ import ( "encoding/json" "fmt" "io" - "sort" + "slices" "strings" "github.com/fatih/color" @@ -54,9 +54,7 @@ func printTaggerEntities(w io.Writer, tr *types.TaggerListResponse) { } // sort sources for deterministic output - sort.Slice(sources, func(i, j int) bool { - return sources[i] < sources[j] - }) + slices.Sort(sources) for _, source := range sources { fmt.Fprintf(w, "== Source %s =\n=", source) @@ -65,9 +63,7 @@ func printTaggerEntities(w io.Writer, tr *types.TaggerListResponse) { // sort tags for easy comparison tags := tagItem.Tags[source] - sort.Slice(tags, func(i, j int) bool { - return tags[i] < tags[j] - }) + slices.Sort(tags) for i, tag := range tags { tagInfo := strings.Split(tag, ":") diff --git a/comp/core/tagger/collectors/workloadmeta_extract.go b/comp/core/tagger/collectors/workloadmeta_extract.go index 282089acfa228..9884990cbd83c 100644 --- a/comp/core/tagger/collectors/workloadmeta_extract.go +++ b/comp/core/tagger/collectors/workloadmeta_extract.go @@ -9,6 +9,7 @@ import ( "encoding/json" "errors" "fmt" + "slices" "strconv" "strings" @@ -369,18 +370,9 @@ func (c *WorkloadMetaCollector) extractTagsFromPodEntity(pod *workloadmeta.Kuber tagList.AddLow(tags.KubeAutoscalerKind, "datadogpodautoscaler") } - kubeServiceDisabled := false - for _, disabledTag := range pkgconfigsetup.Datadog().GetStringSlice("kubernetes_ad_tags_disabled") { - if disabledTag == "kube_service" { - kubeServiceDisabled = true - break - } - } - for _, disabledTag := range strings.Split(pod.Annotations["tags.datadoghq.com/disable"], ",") { - if disabledTag == "kube_service" { - kubeServiceDisabled = true - break - } + kubeServiceDisabled := slices.Contains(pkgconfigsetup.Datadog().GetStringSlice("kubernetes_ad_tags_disabled"), "kube_service") + if slices.Contains(strings.Split(pod.Annotations["tags.datadoghq.com/disable"], ","), "kube_service") { + kubeServiceDisabled = true } if !kubeServiceDisabled { for _, svc := range pod.KubeServices { diff --git a/comp/core/tagger/taglist/taglist.go b/comp/core/tagger/taglist/taglist.go index 9a2bf1196e083..72924245ac33e 100644 --- a/comp/core/tagger/taglist/taglist.go +++ b/comp/core/tagger/taglist/taglist.go @@ -8,6 +8,7 @@ package taglist import ( "fmt" + "maps" "strings" pkgconfigsetup "github.com/DataDog/datadog-agent/pkg/config/setup" @@ -117,8 +118,6 @@ func (l *TagList) Copy() *TagList { func deepCopyMap(in map[string]bool) map[string]bool { out := make(map[string]bool, len(in)) - for key, value := range in { - out[key] = value - } + maps.Copy(out, in) return out } diff --git a/comp/core/tagger/tagstore/entity_tags.go b/comp/core/tagger/tagstore/entity_tags.go index ed62d45849109..84edddd8d601e 100644 --- a/comp/core/tagger/tagstore/entity_tags.go +++ b/comp/core/tagger/tagstore/entity_tags.go @@ -7,6 +7,7 @@ package tagstore import ( "maps" + "slices" "sort" "strings" "time" @@ -227,7 +228,7 @@ func (e *EntityTagsWithMultipleSources) tagsBySource() map[string][]string { tagsBySource := make(map[string][]string) for source, tags := range e.sourceTags { - allTags := append([]string{}, tags.lowCardTags...) + allTags := slices.Clone(tags.lowCardTags) allTags = append(allTags, tags.orchestratorCardTags...) allTags = append(allTags, tags.highCardTags...) tagsBySource[source] = allTags diff --git a/comp/core/workloadmeta/collectors/util/kubernetes_resource_parsers/utils_test.go b/comp/core/workloadmeta/collectors/util/kubernetes_resource_parsers/utils_test.go index 6b24f9b7f955a..d336079aa3ac3 100644 --- a/comp/core/workloadmeta/collectors/util/kubernetes_resource_parsers/utils_test.go +++ b/comp/core/workloadmeta/collectors/util/kubernetes_resource_parsers/utils_test.go @@ -8,6 +8,7 @@ package kubernetesresourceparsers import ( + "maps" "reflect" "testing" @@ -75,8 +76,6 @@ func Test_filterMapStringKey(t *testing.T) { func copyMap(in map[string]string) map[string]string { out := make(map[string]string, len(in)) - for key, value := range in { - out[key] = value - } + maps.Copy(out, in) return out } diff --git a/comp/core/workloadmeta/impl/cached_entity.go b/comp/core/workloadmeta/impl/cached_entity.go index 6e27a2cd2844d..61d8bdf51fc06 100644 --- a/comp/core/workloadmeta/impl/cached_entity.go +++ b/comp/core/workloadmeta/impl/cached_entity.go @@ -6,6 +6,7 @@ package workloadmetaimpl import ( + "maps" "reflect" "sort" @@ -105,9 +106,7 @@ func (e *cachedEntity) copy() *cachedEntity { copy(newEntity.sortedSources, e.sortedSources) - for source, entity := range e.sources { - newEntity.sources[source] = entity - } + maps.Copy(newEntity.sources, e.sources) return newEntity } diff --git a/comp/core/workloadmeta/impl/store.go b/comp/core/workloadmeta/impl/store.go index b6288f36f453a..778e1621520f7 100644 --- a/comp/core/workloadmeta/impl/store.go +++ b/comp/core/workloadmeta/impl/store.go @@ -8,6 +8,7 @@ package workloadmetaimpl import ( "context" "fmt" + "slices" "sort" "strconv" "time" @@ -178,7 +179,7 @@ func (w *workloadmeta) Unsubscribe(ch chan wmdef.EventBundle) { for i, sub := range w.subscribers { if sub.ch == ch { - w.subscribers = append(w.subscribers[:i], w.subscribers[i+1:]...) + w.subscribers = slices.Delete(w.subscribers, i, i+1) telemetry.Subscribers.Dec() close(ch) return diff --git a/comp/dogstatsd/listeners/udp_test.go b/comp/dogstatsd/listeners/udp_test.go index 329e1d6c28261..861e009b83adc 100644 --- a/comp/dogstatsd/listeners/udp_test.go +++ b/comp/dogstatsd/listeners/udp_test.go @@ -10,6 +10,7 @@ import ( "errors" "fmt" "net" + "slices" "strconv" "testing" "time" @@ -216,7 +217,7 @@ func getLocalIP() string { } func defaultMConn(addr net.Addr, bs ...[]byte) *udpMock { - return &udpMock{bufferList: append([][]byte{}, bs...), address: addr} + return &udpMock{bufferList: slices.Clone(bs), address: addr} } type udpMock struct { diff --git a/comp/dogstatsd/pidmap/pidmapimpl/state.go b/comp/dogstatsd/pidmap/pidmapimpl/state.go index a67eab737caf7..f7c4dbf1308b2 100644 --- a/comp/dogstatsd/pidmap/pidmapimpl/state.go +++ b/comp/dogstatsd/pidmap/pidmapimpl/state.go @@ -8,6 +8,7 @@ package pidmapimpl import ( "errors" + "maps" "sync" "go.uber.org/fx" @@ -41,9 +42,7 @@ func (s *state) SetPidMap(m map[int32]string) { defer s.mux.Unlock() s.pidMap = pidContainerMap{} - for pid, containerID := range m { - s.pidMap[pid] = containerID - } + maps.Copy(s.pidMap, m) } // ContainerIDForPID returns the matching container id for a pid, or an error if not found. diff --git a/comp/dogstatsd/server/blocklist.go b/comp/dogstatsd/server/blocklist.go index 72340a2a88584..074120d74517b 100644 --- a/comp/dogstatsd/server/blocklist.go +++ b/comp/dogstatsd/server/blocklist.go @@ -6,6 +6,7 @@ package server import ( + "slices" "sort" "strings" ) @@ -16,7 +17,7 @@ type blocklist struct { } func newBlocklist(data []string, matchPrefix bool) blocklist { - data = append([]string{}, data...) + data = slices.Clone(data) sort.Strings(data) if matchPrefix && len(data) > 0 { diff --git a/comp/forwarder/defaultforwarder/internal/retry/on_disk_retry_queue.go b/comp/forwarder/defaultforwarder/internal/retry/on_disk_retry_queue.go index 04c2eb4ee610a..79f819ba91e5c 100644 --- a/comp/forwarder/defaultforwarder/internal/retry/on_disk_retry_queue.go +++ b/comp/forwarder/defaultforwarder/internal/retry/on_disk_retry_queue.go @@ -10,6 +10,7 @@ import ( "os" "path" "path/filepath" + "slices" "sort" "time" @@ -198,7 +199,7 @@ func (s *onDiskRetryQueue) removeFileAt(index int) error { // Remove the file from s.filenames also in case of error to not // fail on the next call. - s.filenames = append(s.filenames[:index], s.filenames[index+1:]...) + s.filenames = slices.Delete(s.filenames, index, index+1) size, err := filesystem.GetFileSize(filename) if err != nil { diff --git a/comp/forwarder/defaultforwarder/resolver/domain_resolver.go b/comp/forwarder/defaultforwarder/resolver/domain_resolver.go index 7966eb23013de..281c1392ab2e1 100644 --- a/comp/forwarder/defaultforwarder/resolver/domain_resolver.go +++ b/comp/forwarder/defaultforwarder/resolver/domain_resolver.go @@ -9,6 +9,7 @@ package resolver import ( + "slices" "sync" "github.com/DataDog/datadog-agent/comp/forwarder/defaultforwarder/endpoints" @@ -197,10 +198,8 @@ func (r *MultiDomainResolver) RegisterAlternateDestination(domain string, forwar dType: dType, } r.overrides[forwarderName] = d - for _, alternateDomain := range r.alternateDomainList { - if alternateDomain == domain { - return - } + if slices.Contains(r.alternateDomainList, domain) { + return } r.alternateDomainList = append(r.alternateDomainList, domain) } diff --git a/comp/metadata/inventoryagent/inventoryagentimpl/inventoryagent.go b/comp/metadata/inventoryagent/inventoryagentimpl/inventoryagent.go index 570caf4e9699b..f9d5f58352cb2 100644 --- a/comp/metadata/inventoryagent/inventoryagentimpl/inventoryagent.go +++ b/comp/metadata/inventoryagent/inventoryagentimpl/inventoryagent.go @@ -10,6 +10,7 @@ import ( "context" "encoding/json" "fmt" + "maps" "net/http" "reflect" "strings" @@ -461,9 +462,7 @@ func (ia *inventoryagent) getPayload() marshaler.JSONMarshaler { // Create a static copy of agentMetadata for the payload data := make(agentMetadata) - for k, v := range ia.data { - data[k] = v - } + maps.Copy(data, ia.data) ia.getConfigs(data) @@ -481,8 +480,6 @@ func (ia *inventoryagent) Get() map[string]interface{} { defer ia.m.Unlock() data := map[string]interface{}{} - for k, v := range ia.data { - data[k] = v - } + maps.Copy(data, ia.data) return data } diff --git a/comp/metadata/inventorychecks/inventorychecksimpl/inventorychecks.go b/comp/metadata/inventorychecks/inventorychecksimpl/inventorychecks.go index e3da9ab20fd74..ceaff39ec6b21 100644 --- a/comp/metadata/inventorychecks/inventorychecksimpl/inventorychecks.go +++ b/comp/metadata/inventorychecks/inventorychecksimpl/inventorychecks.go @@ -11,6 +11,7 @@ import ( "encoding/json" "expvar" "fmt" + "maps" "net/http" "reflect" "sync" @@ -184,9 +185,7 @@ func (ic *inventorychecksImpl) GetInstanceMetadata(instanceID string) map[string res := map[string]interface{}{} if instance, found := ic.data[instanceID]; found { - for name, value := range instance.metadata { - res[name] = value - } + maps.Copy(res, instance.metadata) } return res } @@ -211,9 +210,7 @@ func (ic *inventorychecksImpl) getPayload(withConfigs bool) marshaler.JSONMarsha cm := check.GetMetadata(c, withConfigs) if checkData, found := ic.data[string(c.ID())]; found { - for key, val := range checkData.metadata { - cm[key] = val - } + maps.Copy(cm, checkData.metadata) } checkName := c.String() diff --git a/comp/metadata/inventoryotel/inventoryotelimpl/inventoryotel.go b/comp/metadata/inventoryotel/inventoryotelimpl/inventoryotel.go index 1612697ca8c26..e1ed7e1399f0c 100644 --- a/comp/metadata/inventoryotel/inventoryotelimpl/inventoryotel.go +++ b/comp/metadata/inventoryotel/inventoryotelimpl/inventoryotel.go @@ -12,6 +12,7 @@ import ( "encoding/json" "fmt" "io" + "maps" "net/http" "net/url" "path" @@ -269,8 +270,6 @@ func (i *inventoryotel) Get() otelMetadata { defer i.m.Unlock() data := otelMetadata{} - for k, v := range i.data { - data[k] = v - } + maps.Copy(data, i.data) return data } diff --git a/comp/netflow/goflowlib/metric.go b/comp/netflow/goflowlib/metric.go index 82b53d878639b..6d4eff38b5c0d 100644 --- a/comp/netflow/goflowlib/metric.go +++ b/comp/netflow/goflowlib/metric.go @@ -7,8 +7,11 @@ package goflowlib import ( "fmt" - "github.com/DataDog/datadog-agent/pkg/metrics" + "slices" + promClient "github.com/prometheus/client_model/go" + + "github.com/DataDog/datadog-agent/pkg/metrics" ) type remapperType func(string) string @@ -22,12 +25,7 @@ type mappedMetric struct { } func (m mappedMetric) isAllowedTagKey(tagKey string) bool { - for _, allowedTagKey := range m.allowedTagKeys { - if tagKey == allowedTagKey { - return true - } - } - return false + return slices.Contains(m.allowedTagKeys, tagKey) } var collectorTypeMapper = map[string]string{ diff --git a/comp/netflow/portrollup/portrollup.go b/comp/netflow/portrollup/portrollup.go index 7556594d7b645..50db4e35270db 100644 --- a/comp/netflow/portrollup/portrollup.go +++ b/comp/netflow/portrollup/portrollup.go @@ -10,6 +10,7 @@ package portrollup import ( + "slices" "sync" "github.com/DataDog/datadog-agent/comp/netflow/common" @@ -140,10 +141,7 @@ func (prs *EndpointPairPortRollupStore) IsEphemeralFromKeys(srcToDestKey string, destToSourcePortCount := len(prs.curStore[destToSrcKey]) prs.storeMu.RUnlock() - portCount := sourceToDestPortCount - if destToSourcePortCount > sourceToDestPortCount { - portCount = destToSourcePortCount - } + portCount := max(destToSourcePortCount, sourceToDestPortCount) if portCount < prs.portRollupThreshold { return NoEphemeralPort @@ -209,10 +207,8 @@ func buildStoreKey(sourceAddr []byte, destAddr []byte, endpointT endpointType, p } func appendPort(ports []uint16, newPort uint16) []uint16 { - for _, port := range ports { - if port == newPort { - return ports - } + if slices.Contains(ports, newPort) { + return ports } return append(ports, newPort) } diff --git a/comp/rdnsquerier/impl/rdnsquerier_testutils.go b/comp/rdnsquerier/impl/rdnsquerier_testutils.go index d1b43364ac224..f577febdb9e82 100644 --- a/comp/rdnsquerier/impl/rdnsquerier_testutils.go +++ b/comp/rdnsquerier/impl/rdnsquerier_testutils.go @@ -9,12 +9,14 @@ package rdnsquerierimpl import ( "context" + "maps" "testing" "time" - "github.com/DataDog/datadog-agent/pkg/util/fxutil" "go.uber.org/fx" + "github.com/DataDog/datadog-agent/pkg/util/fxutil" + "github.com/stretchr/testify/assert" "github.com/DataDog/datadog-agent/comp/core/config" @@ -143,9 +145,7 @@ func (ts *testState) makeExpectedTelemetry(checkTelemetry map[string]float64) ma "cache_expired": 0.0, "cache_max_size_exceeded": 0.0, } - for name, value := range checkTelemetry { - et[name] = value - } + maps.Copy(et, checkTelemetry) return et } diff --git a/comp/snmptraps/formatter/formatterimpl/formatter.go b/comp/snmptraps/formatter/formatterimpl/formatter.go index df73ce5881680..58bee7ae5b930 100644 --- a/comp/snmptraps/formatter/formatterimpl/formatter.go +++ b/comp/snmptraps/formatter/formatterimpl/formatter.go @@ -9,6 +9,7 @@ package formatterimpl import ( "encoding/json" "fmt" + "maps" "strings" "github.com/gosnmp/gosnmp" @@ -143,9 +144,7 @@ func (f JSONFormatter) formatV1Trap(packet *packet.SnmpPacket) map[string]interf f.sender.Count(telemetryVarsNotEnriched, float64(enrichmentFailed), "", tags) } data["variables"] = parsedVariables - for key, value := range enrichedValues { - data[key] = value - } + maps.Copy(data, enrichedValues) return data } @@ -194,9 +193,7 @@ func (f JSONFormatter) formatTrap(packet *packet.SnmpPacket) (map[string]interfa f.sender.Count(telemetryVarsNotEnriched, float64(enrichmentFailed), "", tags) } data["variables"] = parsedVariables - for key, value := range enrichedValues { - data[key] = value - } + maps.Copy(data, enrichedValues) return data, nil } diff --git a/comp/trace/agent/impl/agent.go b/comp/trace/agent/impl/agent.go index 8d890896a524f..6b956ab605908 100644 --- a/comp/trace/agent/impl/agent.go +++ b/comp/trace/agent/impl/agent.go @@ -162,10 +162,7 @@ func prepGoRuntime(tracecfg *tracecfg.AgentConfig) { if mp, ok := os.LookupEnv("GOMAXPROCS"); ok { log.Infof("GOMAXPROCS manually set to %v", mp) } else if tracecfg.MaxCPU > 0 { - allowedCores := int(tracecfg.MaxCPU) - if allowedCores < 1 { - allowedCores = 1 - } + allowedCores := max(int(tracecfg.MaxCPU), 1) if allowedCores < runtime.GOMAXPROCS(0) { log.Infof("apm_config.max_cpu is less than current GOMAXPROCS. Setting GOMAXPROCS to (%v) %d\n", allowedCores, allowedCores) runtime.GOMAXPROCS(int(allowedCores)) diff --git a/pkg/aggregator/demultiplexer.go b/pkg/aggregator/demultiplexer.go index 7990ce4973e37..518b2efe5976d 100644 --- a/pkg/aggregator/demultiplexer.go +++ b/pkg/aggregator/demultiplexer.go @@ -177,11 +177,7 @@ func getDogStatsDWorkerAndPipelineCount(vCPUs int) (int, int) { // - one per aggregation pipeline (time sampler) // - the rest for workers // But we want at minimum 2 workers. - dsdWorkerCount = vCPUs - 1 - pipelineCount - - if dsdWorkerCount < 2 { - dsdWorkerCount = 2 - } + dsdWorkerCount = max(vCPUs-1-pipelineCount, 2) } else if autoAdjustStrategy == AutoAdjustStrategyMaxThroughput { // we will auto-adjust the pipeline and workers count to maximize throughput // @@ -197,10 +193,7 @@ func getDogStatsDWorkerAndPipelineCount(vCPUs int) (int, int) { // - half the amount of vCPUS - 1 for the amount of pipeline routines // - this last routine for the listener routine - dsdWorkerCount = vCPUs / 2 - if dsdWorkerCount < 2 { // minimum 2 workers - dsdWorkerCount = 2 - } + dsdWorkerCount = max(vCPUs/2, 2) pipelineCount = dsdWorkerCount - 1 if pipelineCount <= 0 { // minimum 1 pipeline @@ -219,10 +212,7 @@ func getDogStatsDWorkerAndPipelineCount(vCPUs int) (int, int) { // This also has the benefit of increasing compression efficiency by having // similarly tagged metrics flushed together. - dsdWorkerCount = vCPUs / 2 - if dsdWorkerCount < 2 { - dsdWorkerCount = 2 - } + dsdWorkerCount = max(vCPUs/2, 2) pipelineCount = pkgconfigsetup.Datadog().GetInt("dogstatsd_pipeline_count") if pipelineCount <= 0 { // guard against configuration mistakes diff --git a/pkg/aggregator/host_tag_provider.go b/pkg/aggregator/host_tag_provider.go index 4158756977cc9..a1f5b44e36859 100644 --- a/pkg/aggregator/host_tag_provider.go +++ b/pkg/aggregator/host_tag_provider.go @@ -8,6 +8,7 @@ package aggregator import ( "context" + "slices" "sync" hostMetadataUtils "github.com/DataDog/datadog-agent/comp/metadata/host/hostimpl/hosttags" @@ -34,7 +35,7 @@ func newHostTagProviderWithClock(clock clock.Clock) *HostTagProvider { duration := pkgconfigsetup.Datadog().GetDuration("expected_tags_duration") log.Debugf("Adding host tags to metrics for %v", duration) if pkgconfigsetup.Datadog().GetDuration("expected_tags_duration") > 0 { - p.hostTags = append([]string{}, hostMetadataUtils.Get(context.TODO(), false, pkgconfigsetup.Datadog()).System...) + p.hostTags = slices.Clone(hostMetadataUtils.Get(context.TODO(), false, pkgconfigsetup.Datadog()).System) expectedTagsDeadline := pkgconfigsetup.StartTime.Add(duration) clock.AfterFunc(expectedTagsDeadline.Sub(clock.Now()), func() { p.Lock() diff --git a/pkg/aggregator/internal/tags/store.go b/pkg/aggregator/internal/tags/store.go index a99de61d4d4c4..19a844c2fbbe6 100644 --- a/pkg/aggregator/internal/tags/store.go +++ b/pkg/aggregator/internal/tags/store.go @@ -8,6 +8,7 @@ package tags import ( "fmt" + "maps" "math/bits" "go.uber.org/atomic" @@ -131,9 +132,7 @@ func (tc *Store) Shrink() { if len(tc.tagsByKey) < tc.cap/2 { //nolint:revive // TODO(AML) Fix revive linter new := make(map[ckey.TagsKey]*Entry, len(tc.tagsByKey)) - for k, v := range tc.tagsByKey { - new[k] = v - } + maps.Copy(new, tc.tagsByKey) tc.cap = len(new) tc.tagsByKey = new } diff --git a/pkg/aggregator/mocksender/asserts.go b/pkg/aggregator/mocksender/asserts.go index 4405c8cc10e6a..2b1f32a4fb230 100644 --- a/pkg/aggregator/mocksender/asserts.go +++ b/pkg/aggregator/mocksender/asserts.go @@ -9,6 +9,7 @@ package mocksender import ( + "slices" "testing" "time" @@ -157,11 +158,8 @@ func eventLike(expectedEvent, actualEvent event.Event) bool { func expectedInActual(expected, actual []string) bool { expectedCount := 0 for _, e := range expected { - for _, a := range actual { - if e == a { - expectedCount++ - break - } + if slices.Contains(actual, e) { + expectedCount++ } } return len(expected) == expectedCount diff --git a/pkg/clusteragent/autoscaling/custommetrics/provider.go b/pkg/clusteragent/autoscaling/custommetrics/provider.go index 5d50c7960e00d..42999a82280d2 100644 --- a/pkg/clusteragent/autoscaling/custommetrics/provider.go +++ b/pkg/clusteragent/autoscaling/custommetrics/provider.go @@ -116,10 +116,7 @@ func (p *datadogProvider) externalMetricsSetter(ctx context.Context) { if p.isServing { currentBackoff = externalMetricsBaseBackoff } else { - currentBackoff = currentBackoff * 2 - if currentBackoff > externalMetricsMaxBackoff { - currentBackoff = externalMetricsMaxBackoff - } + currentBackoff = min(currentBackoff*2, externalMetricsMaxBackoff) log.Infof("Retrying externalMetricsSetter with backoff %.0f seconds", currentBackoff.Seconds()) } time.Sleep(currentBackoff) diff --git a/pkg/clusteragent/autoscaling/workload/model/pod_autoscaler.go b/pkg/clusteragent/autoscaling/workload/model/pod_autoscaler.go index 551836e8ec56d..c6078f32903ac 100644 --- a/pkg/clusteragent/autoscaling/workload/model/pod_autoscaler.go +++ b/pkg/clusteragent/autoscaling/workload/model/pod_autoscaler.go @@ -480,10 +480,7 @@ func (p *PodAutoscalerInternal) BuildStatus(currentTime metav1.Time, currentStat } if lenActions := len(p.horizontalLastActions); lenActions > 0 { - firstIndex := lenActions - statusRetainedActions - if firstIndex < 0 { - firstIndex = 0 - } + firstIndex := max(lenActions-statusRetainedActions, 0) status.Horizontal.LastActions = slices.Clone(p.horizontalLastActions[firstIndex:lenActions]) } diff --git a/pkg/collector/check/stats/stats.go b/pkg/collector/check/stats/stats.go index fc7ff45b2bd97..eb55214714285 100644 --- a/pkg/collector/check/stats/stats.go +++ b/pkg/collector/check/stats/stats.go @@ -7,6 +7,7 @@ package stats import ( + "maps" "sync" "time" @@ -89,9 +90,7 @@ func NewSenderStats() SenderStats { func (s SenderStats) Copy() (result SenderStats) { result = s result.EventPlatformEvents = make(map[string]int64, len(s.EventPlatformEvents)) - for k, v := range s.EventPlatformEvents { - result.EventPlatformEvents[k] = v - } + maps.Copy(result.EventPlatformEvents, s.EventPlatformEvents) return result } @@ -192,10 +191,7 @@ func (cs *Stats) Add(t time.Duration, err error, warnings []error, metricStats S tlmExecutionTime.Set(float64(tms), cs.CheckName, cs.CheckLoader) } var totalExecutionTime int64 - ringSize := cs.TotalRuns - if ringSize > uint64(len(cs.ExecutionTimes)) { - ringSize = uint64(len(cs.ExecutionTimes)) - } + ringSize := min(cs.TotalRuns, uint64(len(cs.ExecutionTimes))) for i := uint64(0); i < ringSize; i++ { totalExecutionTime += cs.ExecutionTimes[i] } @@ -305,8 +301,6 @@ func TranslateEventPlatformEventTypes(aggregatorStats interface{}) (interface{}, result := make(map[string]interface{}) result["EventPlatformEvents"] = translateEventTypes(aggStats.EventPlatformEvents) result["EventPlatformEventsErrors"] = translateEventTypes(aggStats.EventPlatformEventsErrors) - for k, v := range aggStats.Other { - result[k] = v - } + maps.Copy(result, aggStats.Other) return result, nil } diff --git a/pkg/collector/check/stats/util.go b/pkg/collector/check/stats/util.go index 1939670814697..49f1a86163cca 100644 --- a/pkg/collector/check/stats/util.go +++ b/pkg/collector/check/stats/util.go @@ -15,12 +15,7 @@ func calculateCheckDelay(now time.Time, prevRunStats *Stats, execTime time.Durat previousCheckStartDate := prevRunStats.UpdateTimestamp - (prevRunStats.LastExecutionTime / 1e3) currentCheckStartDate := now.Unix() - int64(execTime.Seconds()) - delay := currentCheckStartDate - previousCheckStartDate - int64(prevRunStats.Interval.Seconds()) - - // delay can be negative if a check recovers from delay - if delay < 0 { - delay = 0 - } + delay := max(currentCheckStartDate-previousCheckStartDate-int64(prevRunStats.Interval.Seconds()), 0) return delay } diff --git a/pkg/collector/corechecks/cluster/ksm/kubernetes_state.go b/pkg/collector/corechecks/cluster/ksm/kubernetes_state.go index 9c57ef54293d0..27aae615056d7 100644 --- a/pkg/collector/corechecks/cluster/ksm/kubernetes_state.go +++ b/pkg/collector/corechecks/cluster/ksm/kubernetes_state.go @@ -13,6 +13,7 @@ import ( "fmt" "maps" "regexp" + "slices" "strings" "time" @@ -257,11 +258,9 @@ func (jc *JoinsConfigWithoutLabelsMapping) setupGetAllLabels() { return } - for _, l := range jc.LabelsToGet { - if l == "*" { - jc.GetAllLabels = true - return - } + if slices.Contains(jc.LabelsToGet, "*") { + jc.GetAllLabels = true + return } } diff --git a/pkg/collector/corechecks/cluster/ksm/kubernetes_state_label_joins.go b/pkg/collector/corechecks/cluster/ksm/kubernetes_state_label_joins.go index 34c5890662c9d..dde9a433e92c2 100644 --- a/pkg/collector/corechecks/cluster/ksm/kubernetes_state_label_joins.go +++ b/pkg/collector/corechecks/cluster/ksm/kubernetes_state_label_joins.go @@ -8,6 +8,8 @@ package ksm import ( + "slices" + ksmstore "github.com/DataDog/datadog-agent/pkg/kubestatemetrics/store" "github.com/DataDog/datadog-agent/pkg/util/log" ) @@ -154,13 +156,7 @@ func (lj *labelJoiner) insertMetric(metric ksmstore.DDMetric, config *joinsConfi } for labelName, labelValue := range metric.Labels { - isALabelToMatch := false - for _, labelToMatch := range config.labelsToMatch { - if labelName == labelToMatch { - isALabelToMatch = true - break - } - } + isALabelToMatch := slices.Contains(config.labelsToMatch, labelName) if !isALabelToMatch { current.labelsToAdd = append(current.labelsToAdd, label{labelName, labelValue}) } diff --git a/pkg/collector/corechecks/cluster/ksm/kubernetes_state_transformers.go b/pkg/collector/corechecks/cluster/ksm/kubernetes_state_transformers.go index 8b8be97d79c5e..c6e63fc8e59ca 100644 --- a/pkg/collector/corechecks/cluster/ksm/kubernetes_state_transformers.go +++ b/pkg/collector/corechecks/cluster/ksm/kubernetes_state_transformers.go @@ -10,6 +10,7 @@ package ksm import ( "fmt" "regexp" + "slices" "strings" "time" @@ -357,7 +358,7 @@ func cronJobLastScheduleTransformer(s sender.Sender, _ string, metric ksmstore.D func jobCompleteTransformer(s sender.Sender, _ string, metric ksmstore.DDMetric, hostname string, tags []string, _ time.Time) { for i, tag := range tags { if tag == "condition:true" { - tags = append(tags[:i], tags[i+1:]...) + tags = slices.Delete(tags, i, i+1) break } } @@ -381,7 +382,7 @@ func jobDurationTransformer(s sender.Sender, _ string, metric ksmstore.DDMetric, func jobFailedTransformer(s sender.Sender, _ string, metric ksmstore.DDMetric, hostname string, tags []string, _ time.Time) { for i, tag := range tags { if tag == "condition:true" { - tags = append(tags[:i], tags[i+1:]...) + tags = slices.Delete(tags, i, i+1) break } } @@ -422,7 +423,7 @@ func validateJob(val float64, tags []string) ([]string, bool) { for i, tag := range tags { if strings.HasPrefix(tag, "reason:") { if v := strings.TrimPrefix(tag, "reason:"); !validJobFailureReason(v) { - tags = append(tags[:i], tags[i+1:]...) + tags = slices.Delete(tags, i, i+1) continue } } diff --git a/pkg/collector/corechecks/cluster/kubernetesapiserver/events_common.go b/pkg/collector/corechecks/cluster/kubernetesapiserver/events_common.go index ac98dd379a60c..59c32851a09ed 100644 --- a/pkg/collector/corechecks/cluster/kubernetesapiserver/events_common.go +++ b/pkg/collector/corechecks/cluster/kubernetesapiserver/events_common.go @@ -10,6 +10,7 @@ package kubernetesapiserver import ( "context" "fmt" + "slices" "strings" "time" @@ -446,10 +447,8 @@ func shouldCollect(ev *v1.Event, collectedTypes []collectedEventType) bool { return true } - for _, r := range f.Reasons { - if ev.Reason == r { - return true - } + if slices.Contains(f.Reasons, ev.Reason) { + return true } } diff --git a/pkg/collector/corechecks/containers/kubelet/provider/prometheus/provider.go b/pkg/collector/corechecks/containers/kubelet/provider/prometheus/provider.go index fbca9eed1c753..29b1c285a8179 100644 --- a/pkg/collector/corechecks/containers/kubelet/provider/prometheus/provider.go +++ b/pkg/collector/corechecks/containers/kubelet/provider/prometheus/provider.go @@ -12,8 +12,10 @@ package prometheus import ( "context" "fmt" + "maps" "math" "regexp" + "slices" "strconv" "strings" @@ -98,9 +100,7 @@ func NewProvider(config *common.KubeletConfig, transformers Transformers, scrape wildcardMetrics = append(wildcardMetrics, val) } case map[string]string: - for k1, v1 := range val { - metricMappings[k1] = v1 - } + maps.Copy(metricMappings, val) case map[interface{}]interface{}: for k1, v1 := range val { if _, ok := k1.(string); !ok { @@ -315,11 +315,8 @@ func (p *Provider) MetricTags(metric *model.Sample) []string { continue } - for i := range p.Config.ExcludeLabels { - if string(lName) == p.Config.ExcludeLabels[i] { - shouldExclude = true - break - } + if slices.Contains(p.Config.ExcludeLabels, string(lName)) { + shouldExclude = true } if shouldExclude { continue diff --git a/pkg/collector/corechecks/network-devices/cisco-sdwan/report/metrics.go b/pkg/collector/corechecks/network-devices/cisco-sdwan/report/metrics.go index 360d0586aa28f..b02baa3819667 100644 --- a/pkg/collector/corechecks/network-devices/cisco-sdwan/report/metrics.go +++ b/pkg/collector/corechecks/network-devices/cisco-sdwan/report/metrics.go @@ -8,6 +8,7 @@ package report import ( "fmt" + "maps" "strconv" "strings" "time" @@ -345,9 +346,7 @@ func setNewSentTimestamp(newTimestamps map[string]float64, key string, ts float6 } func (ms *SDWanSender) updateTimestamps(newTimestamps map[string]float64) { - for key, ts := range newTimestamps { - ms.lastTimeSent[key] = ts - } + maps.Copy(ms.lastTimeSent, newTimestamps) } func (ms *SDWanSender) expireTimeSent() { diff --git a/pkg/collector/corechecks/oracle/statements.go b/pkg/collector/corechecks/oracle/statements.go index 18fb8dd1b79f5..c145850e7d5c9 100644 --- a/pkg/collector/corechecks/oracle/statements.go +++ b/pkg/collector/corechecks/oracle/statements.go @@ -11,6 +11,7 @@ import ( "database/sql" "encoding/json" "fmt" + "maps" "strconv" "strings" "time" @@ -331,9 +332,7 @@ type PlanRows struct { func (c *Check) copyToPreviousMap(newMap map[StatementMetricsKeyDB]StatementMetricsMonotonicCountDB) { c.statementMetricsMonotonicCountsPrevious = make(map[StatementMetricsKeyDB]StatementMetricsMonotonicCountDB) - for k, v := range newMap { - c.statementMetricsMonotonicCountsPrevious[k] = v - } + maps.Copy(c.statementMetricsMonotonicCountsPrevious, newMap) } func handlePredicate(predicateType string, dbValue sql.NullString, payloadValue *string, statement StatementMetricsDB, c *Check, o *obfuscate.Obfuscator) { diff --git a/pkg/collector/corechecks/servicediscovery/language/reader/reader.go b/pkg/collector/corechecks/servicediscovery/language/reader/reader.go index 64919fa6ac254..42641bb8e6a82 100644 --- a/pkg/collector/corechecks/servicediscovery/language/reader/reader.go +++ b/pkg/collector/corechecks/servicediscovery/language/reader/reader.go @@ -19,10 +19,7 @@ const stringReaderBufferSize = 1024 * 10 // It returns -1 if toFind is not present in r. // It returns an error if reading from r other than io.EOF returns an error. func Index(r io.Reader, toFind string) (int, error) { - bufLen := stringReaderBufferSize - if len(toFind) > bufLen { - bufLen = len(toFind) - } + bufLen := max(len(toFind), stringReaderBufferSize) buf := make([]byte, bufLen) bytesToFind := []byte(toFind) total := 0 diff --git a/pkg/collector/corechecks/servicediscovery/usm/service.go b/pkg/collector/corechecks/servicediscovery/usm/service.go index 1a147f801e586..9d98d7e55eea6 100644 --- a/pkg/collector/corechecks/servicediscovery/usm/service.go +++ b/pkg/collector/corechecks/servicediscovery/usm/service.go @@ -247,10 +247,8 @@ var executableDetectors = map[string]detectorCreatorFn{ func serviceNameInjected(envs envs.Variables) bool { if env, ok := envs.Get("DD_INJECTION_ENABLED"); ok { values := strings.Split(env, ",") - for _, v := range values { - if v == "service_name" { - return true - } + if slices.Contains(values, "service_name") { + return true } } return false diff --git a/pkg/collector/corechecks/snmp/internal/common/utils.go b/pkg/collector/corechecks/snmp/internal/common/utils.go index 2d5e2d768fda2..62c243fbdc73c 100644 --- a/pkg/collector/corechecks/snmp/internal/common/utils.go +++ b/pkg/collector/corechecks/snmp/internal/common/utils.go @@ -18,10 +18,7 @@ func CreateStringBatches(elements []string, size int) ([][]string, error) { } for i := 0; i < len(elements); i += size { - j := i + size - if j > len(elements) { - j = len(elements) - } + j := min(i+size, len(elements)) batch := elements[i:j] batches = append(batches, batch) } diff --git a/pkg/collector/corechecks/snmp/internal/fetch/fetch_column.go b/pkg/collector/corechecks/snmp/internal/fetch/fetch_column.go index 92984f14ba331..6d785d79ce141 100644 --- a/pkg/collector/corechecks/snmp/internal/fetch/fetch_column.go +++ b/pkg/collector/corechecks/snmp/internal/fetch/fetch_column.go @@ -7,17 +7,16 @@ package fetch import ( "fmt" + "maps" "sort" "github.com/gosnmp/gosnmp" - "github.com/DataDog/datadog-agent/pkg/util/log" - - "github.com/DataDog/datadog-agent/pkg/snmp/gosnmplib" - "github.com/DataDog/datadog-agent/pkg/collector/corechecks/snmp/internal/common" "github.com/DataDog/datadog-agent/pkg/collector/corechecks/snmp/internal/session" "github.com/DataDog/datadog-agent/pkg/collector/corechecks/snmp/internal/valuestore" + "github.com/DataDog/datadog-agent/pkg/snmp/gosnmplib" + "github.com/DataDog/datadog-agent/pkg/util/log" ) func fetchColumnOidsWithBatching(sess session.Session, oids []string, oidBatchSize int, bulkMaxRepetitions uint32, fetchStrategy columnFetchStrategy) (valuestore.ColumnResultValuesType, error) { @@ -39,9 +38,7 @@ func fetchColumnOidsWithBatching(sess session.Session, oids []string, oidBatchSi retValues[columnOid] = instanceOids continue } - for oid, value := range instanceOids { - retValues[columnOid][oid] = value - } + maps.Copy(retValues[columnOid], instanceOids) } } return retValues, nil diff --git a/pkg/collector/corechecks/snmp/internal/fetch/fetch_scalar.go b/pkg/collector/corechecks/snmp/internal/fetch/fetch_scalar.go index d7b219ad72c53..da3347c63bace 100644 --- a/pkg/collector/corechecks/snmp/internal/fetch/fetch_scalar.go +++ b/pkg/collector/corechecks/snmp/internal/fetch/fetch_scalar.go @@ -7,18 +7,18 @@ package fetch import ( "fmt" + "maps" + "slices" "sort" "strings" "github.com/gosnmp/gosnmp" - "github.com/DataDog/datadog-agent/pkg/util/log" - - "github.com/DataDog/datadog-agent/pkg/snmp/gosnmplib" - "github.com/DataDog/datadog-agent/pkg/collector/corechecks/snmp/internal/common" "github.com/DataDog/datadog-agent/pkg/collector/corechecks/snmp/internal/session" "github.com/DataDog/datadog-agent/pkg/collector/corechecks/snmp/internal/valuestore" + "github.com/DataDog/datadog-agent/pkg/snmp/gosnmplib" + "github.com/DataDog/datadog-agent/pkg/util/log" ) func fetchScalarOidsWithBatching(sess session.Session, oids []string, oidBatchSize int) (valuestore.ScalarResultValuesType, error) { @@ -34,9 +34,7 @@ func fetchScalarOidsWithBatching(sess session.Session, oids []string, oidBatchSi if err != nil { return nil, fmt.Errorf("failed to fetch scalar oids: %s", err.Error()) } - for k, v := range results { - retValues[k] = v - } + maps.Copy(retValues, results) } return retValues, nil } @@ -99,7 +97,7 @@ func doFetchScalarOids(session session.Session, oids []string) (*gosnmp.SnmpPack if (zeroBaseIndex < 0) || (zeroBaseIndex > len(oids)-1) { return nil, fmt.Errorf("invalid ErrorIndex `%d` when fetching oids `%v`", scalarOids.ErrorIndex, oids) } - oids = append(oids[:zeroBaseIndex], oids[zeroBaseIndex+1:]...) + oids = slices.Delete(oids, zeroBaseIndex, zeroBaseIndex+1) if len(oids) == 0 { // If all oids are not found, return an empty packet with no variable and no error return &gosnmp.SnmpPacket{}, nil diff --git a/pkg/collector/corechecks/snmp/internal/profile/profile_resolver.go b/pkg/collector/corechecks/snmp/internal/profile/profile_resolver.go index cbbd980f93bfc..5619cfae17fe1 100644 --- a/pkg/collector/corechecks/snmp/internal/profile/profile_resolver.go +++ b/pkg/collector/corechecks/snmp/internal/profile/profile_resolver.go @@ -8,6 +8,7 @@ package profile import ( "expvar" "fmt" + "slices" "strings" "github.com/DataDog/datadog-agent/pkg/networkdevice/profile/profiledefinition" @@ -81,10 +82,8 @@ func recursivelyExpandBaseProfiles(parentExtend string, definition *profiledefin } baseDefinition = &profile.Definition } - for _, extend := range extendsHistory { - if extend == extendEntry { - return fmt.Errorf("cyclic profile extend detected, `%s` has already been extended, extendsHistory=`%v`", extendEntry, extendsHistory) - } + if slices.Contains(extendsHistory, extendEntry) { + return fmt.Errorf("cyclic profile extend detected, `%s` has already been extended, extendsHistory=`%v`", extendEntry, extendsHistory) } mergeProfileDefinition(definition, baseDefinition) diff --git a/pkg/collector/corechecks/snmp/internal/valuestore/values.go b/pkg/collector/corechecks/snmp/internal/valuestore/values.go index 45dc45df2d8aa..dd82b9e443976 100644 --- a/pkg/collector/corechecks/snmp/internal/valuestore/values.go +++ b/pkg/collector/corechecks/snmp/internal/valuestore/values.go @@ -8,6 +8,7 @@ package valuestore import ( "encoding/json" "fmt" + "maps" "sort" "github.com/DataDog/datadog-agent/pkg/util/log" @@ -51,9 +52,7 @@ func (v *ResultValueStore) GetColumnValues(oid string) (map[string]ResultValue, return nil, fmt.Errorf("value for Column OID `%s` not found in results", oid) } retValues := make(map[string]ResultValue, len(values)) - for index, value := range values { - retValues[index] = value - } + maps.Copy(retValues, values) return retValues, nil } diff --git a/pkg/collector/corechecks/system/disk/disk/disk.go b/pkg/collector/corechecks/system/disk/disk/disk.go index fdbb4eaecea22..b43a7460a011c 100644 --- a/pkg/collector/corechecks/system/disk/disk/disk.go +++ b/pkg/collector/corechecks/system/disk/disk/disk.go @@ -9,6 +9,7 @@ package disk import ( "regexp" + "slices" "strings" yaml "gopkg.in/yaml.v2" @@ -153,12 +154,7 @@ func (c *Check) instanceConfigure(data integration.Data) error { } func stringSliceContain(slice []string, x string) bool { - for _, e := range slice { - if e == x { - return true - } - } - return false + return slices.Contains(slice, x) } func (c *Check) applyDeviceTags(device, mountpoint string, tags []string) []string { diff --git a/pkg/collector/runner/tracker/tracker.go b/pkg/collector/runner/tracker/tracker.go index 7ce5eac14d90a..0c4f5113bae22 100644 --- a/pkg/collector/runner/tracker/tracker.go +++ b/pkg/collector/runner/tracker/tracker.go @@ -7,6 +7,7 @@ package tracker import ( + "maps" "sync" "github.com/DataDog/datadog-agent/pkg/collector/check" @@ -78,9 +79,7 @@ func (t *RunningChecksTracker) RunningChecks() map[checkid.ID]check.Check { defer t.accessLock.RUnlock() clone := make(map[checkid.ID]check.Check) - for key, val := range t.runningChecks { - clone[key] = val - } + maps.Copy(clone, t.runningChecks) return clone } diff --git a/pkg/collector/scheduler.go b/pkg/collector/scheduler.go index d9a38aa3d395a..559dafdce77b2 100644 --- a/pkg/collector/scheduler.go +++ b/pkg/collector/scheduler.go @@ -9,11 +9,13 @@ package collector import ( "expvar" "fmt" + "slices" "strings" "sync" "golang.org/x/text/cases" "golang.org/x/text/language" + yaml "gopkg.in/yaml.v2" "github.com/DataDog/datadog-agent/comp/collector/collector" "github.com/DataDog/datadog-agent/comp/core/autodiscovery/integration" @@ -26,8 +28,6 @@ import ( "github.com/DataDog/datadog-agent/pkg/util/containers" "github.com/DataDog/datadog-agent/pkg/util/log" "github.com/DataDog/datadog-agent/pkg/util/option" - - yaml "gopkg.in/yaml.v2" ) var ( @@ -145,11 +145,9 @@ func (s *CheckScheduler) Stop() {} // addLoader adds a new Loader that AutoConfig can use to load a check. func (s *CheckScheduler) addLoader(loader check.Loader) { - for _, l := range s.loaders { - if l == loader { - log.Warnf("Loader %s was already added, skipping...", loader) - return - } + if slices.Contains(s.loaders, loader) { + log.Warnf("Loader %s was already added, skipping...", loader) + return } s.loaders = append(s.loaders, loader) } diff --git a/pkg/collector/stats.go b/pkg/collector/stats.go index b128a2c18ed3c..d5c93c167f7c3 100644 --- a/pkg/collector/stats.go +++ b/pkg/collector/stats.go @@ -6,6 +6,7 @@ package collector import ( + "maps" "sync" checkid "github.com/DataDog/datadog-agent/pkg/collector/check/id" @@ -50,9 +51,7 @@ func (ce *collectorErrors) getLoaderErrors() map[string]map[string]string { for check, loaderErrors := range ce.loader { errorsCopy[check] = make(map[string]string) - for loader, loaderError := range loaderErrors { - errorsCopy[check][loader] = loaderError - } + maps.Copy(errorsCopy[check], loaderErrors) } return errorsCopy @@ -70,9 +69,7 @@ func (ce *collectorErrors) getRunErrors() map[checkid.ID]string { defer ce.m.RUnlock() runCopy := make(map[checkid.ID]string) - for k, v := range ce.run { - runCopy[k] = v - } + maps.Copy(runCopy, ce.run) return runCopy } diff --git a/pkg/compliance/aptconfig/aptconfig.go b/pkg/compliance/aptconfig/aptconfig.go index 79b6cdeb21041..5ffa4beb95ec2 100644 --- a/pkg/compliance/aptconfig/aptconfig.go +++ b/pkg/compliance/aptconfig/aptconfig.go @@ -11,6 +11,7 @@ import ( "context" "io" "io/fs" + "maps" "os" "path/filepath" "sort" @@ -52,9 +53,7 @@ func LoadConfiguration(_ context.Context, hostroot string) (string, interface{}) data, err := readFileLimit(path) if err == nil { conf := parseAPTConfiguration(data) - for k, v := range conf { - aptConfs[k] = v - } + maps.Copy(aptConfs, conf) } } diff --git a/pkg/compliance/data.go b/pkg/compliance/data.go index 847075ae49e79..c0b2a2e2af3f1 100644 --- a/pkg/compliance/data.go +++ b/pkg/compliance/data.go @@ -11,6 +11,7 @@ import ( "fmt" "os" "path/filepath" + "slices" "sort" "strings" "time" @@ -386,12 +387,7 @@ func (r *Rule) IsXCCDF() bool { // HasScope tests if the rule has the given scope. func (r *Rule) HasScope(scope RuleScope) bool { - for _, s := range r.Scopes { - if s == scope { - return true - } - } - return false + return slices.Contains(r.Scopes, scope) } // Valid is a validation check required for InputSpec to be executed. diff --git a/pkg/compliance/dbconfig/loader.go b/pkg/compliance/dbconfig/loader.go index d70f673a070ee..e6795627a5856 100644 --- a/pkg/compliance/dbconfig/loader.go +++ b/pkg/compliance/dbconfig/loader.go @@ -12,6 +12,7 @@ import ( "bytes" "context" "io" + "maps" "os" "path/filepath" "strings" @@ -338,9 +339,7 @@ func parsePGConfig(hostroot, configPath string, includeDepth int) (map[string]in } included, ok := parsePGConfig(hostroot, includedPath, includeDepth+1) if ok { - for k, v := range included { - config[k] = v - } + maps.Copy(config, included) } } else if key == "include_dir" { includedPath := val @@ -353,9 +352,7 @@ func parsePGConfig(hostroot, configPath string, includeDepth int) (map[string]in includedFile := relPath(hostroot, match) included, ok := parsePGConfig(hostroot, includedFile, includeDepth+1) if ok { - for k, v := range included { - config[k] = v - } + maps.Copy(config, included) } } } else { diff --git a/pkg/compliance/tools/k8s_types_generator/main.go b/pkg/compliance/tools/k8s_types_generator/main.go index 4c4adbde55730..24a746a17c7cf 100644 --- a/pkg/compliance/tools/k8s_types_generator/main.go +++ b/pkg/compliance/tools/k8s_types_generator/main.go @@ -267,7 +267,7 @@ func checkForKnownFlags(allKomponents []*komponent, knownFlags []string) { for _, conf := range komponent.confs { i := slices.Index(knownFlagsClone, "--"+conf.flagName) if i >= 0 { - knownFlagsClone = append(knownFlagsClone[:i], knownFlagsClone[i+1:]...) + knownFlagsClone = slices.Delete(knownFlagsClone, i, i+1) } } } @@ -896,10 +896,5 @@ func download(url, dist string) error { } func isKnownFlag(flag string) bool { - for _, cisFlag := range knownFlags { - if "--"+flag == cisFlag { - return true - } - } - return false + return slices.Contains(knownFlags, "--"+flag) } diff --git a/pkg/config/legacy/converter.go b/pkg/config/legacy/converter.go index f64ca2eb1f19f..59da03d96605d 100644 --- a/pkg/config/legacy/converter.go +++ b/pkg/config/legacy/converter.go @@ -10,6 +10,7 @@ import ( "encoding/csv" "fmt" "net/url" + "slices" "strconv" "strings" @@ -393,12 +394,9 @@ func buildHistogramAggregates(agentConfig Config) []string { for _, res := range result { found := false - for _, val := range validValues { - if res == val { - histogramBuild = append(histogramBuild, res) - found = true - break - } + if slices.Contains(validValues, res) { + histogramBuild = append(histogramBuild, res) + found = true } if !found { // print the value skipped because invalid value diff --git a/pkg/config/model/config_overrides.go b/pkg/config/model/config_overrides.go index 93670a2521c2f..18dbc31b51673 100644 --- a/pkg/config/model/config_overrides.go +++ b/pkg/config/model/config_overrides.go @@ -5,6 +5,8 @@ package model +import "maps" + var ( overrideVars = make(map[string]interface{}) overrideFuncs = make([]func(Config), 0) @@ -31,9 +33,7 @@ func AddOverride(name string, value interface{}) { // overriding config variables. // This method must be called before Load() to be effective. func AddOverrides(vars map[string]interface{}) { - for k, v := range vars { - overrideVars[k] = v - } + maps.Copy(overrideVars, vars) } // ApplyOverrideFuncs calls overrideFuncs diff --git a/pkg/config/nodetreemodel/helpers.go b/pkg/config/nodetreemodel/helpers.go index 9cbb3beb8e2d1..79ec11b61a1d4 100644 --- a/pkg/config/nodetreemodel/helpers.go +++ b/pkg/config/nodetreemodel/helpers.go @@ -63,10 +63,7 @@ func parseSizeInBytes(sizeStr string) uint { } } - size := cast.ToInt(sizeStr) - if size < 0 { - size = 0 - } + size := max(cast.ToInt(sizeStr), 0) return safeMul(uint(size), multiplier) } diff --git a/pkg/config/nodetreemodel/struct_node.go b/pkg/config/nodetreemodel/struct_node.go index 0fc5c6939e6dc..7fb282f12f647 100644 --- a/pkg/config/nodetreemodel/struct_node.go +++ b/pkg/config/nodetreemodel/struct_node.go @@ -8,6 +8,7 @@ package nodetreemodel import ( "fmt" "reflect" + "slices" "strings" "unicode" "unicode/utf8" @@ -38,12 +39,7 @@ func (n *structNodeImpl) GetChild(key string) (Node, error) { func (n *structNodeImpl) HasChild(name string) bool { names := n.ChildrenKeys() - for _, n := range names { - if n == name { - return true - } - } - return false + return slices.Contains(names, name) } func (n *structNodeImpl) Merge(InnerNode) error { diff --git a/pkg/config/remote/api/http.go b/pkg/config/remote/api/http.go index 375ee14ce555b..2510b2ef332ac 100644 --- a/pkg/config/remote/api/http.go +++ b/pkg/config/remote/api/http.go @@ -11,6 +11,7 @@ import ( "context" "fmt" "io" + "maps" "net/http" "net/url" "sync" @@ -240,9 +241,7 @@ func (c *HTTPClient) UpdatePARJWT(jwt string) { func (c *HTTPClient) addHeaders(req *http.Request) { c.headerLock.RLock() - for k, v := range c.header { - req.Header[k] = v - } + maps.Copy(req.Header, c.header) c.headerLock.RUnlock() } diff --git a/pkg/config/remote/client/client.go b/pkg/config/remote/client/client.go index f54229491ef0e..7752d9845ce76 100644 --- a/pkg/config/remote/client/client.go +++ b/pkg/config/remote/client/client.go @@ -12,18 +12,17 @@ import ( "crypto/rand" "encoding/hex" "fmt" + "slices" "sync" "time" + "github.com/pkg/errors" "go.uber.org/atomic" - "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" - "github.com/pkg/errors" - "github.com/DataDog/datadog-agent/pkg/config/remote/meta" pbgo "github.com/DataDog/datadog-agent/pkg/proto/pbgo/core" "github.com/DataDog/datadog-agent/pkg/remoteconfig/state" @@ -331,13 +330,7 @@ func (c *Client) SubscribeAll(product string, listener Listener) { defer c.m.Unlock() // Make sure the product belongs to the list of requested product - knownProduct := false - for _, p := range c.products { - if p == product { - knownProduct = true - break - } - } + knownProduct := slices.Contains(c.products, product) if !knownProduct { c.products = append(c.products, product) } @@ -502,13 +495,7 @@ func (c *Client) update() error { } func containsProduct(products []string, product string) bool { - for _, p := range products { - if product == p { - return true - } - } - - return false + return slices.Contains(products, product) } func (c *Client) applyUpdate(pbUpdate *pbgo.ClientGetConfigsResponse) ([]string, error) { diff --git a/pkg/config/remote/service/service.go b/pkg/config/remote/service/service.go index 33d5cd4b67ee5..ec818b4fba244 100644 --- a/pkg/config/remote/service/service.go +++ b/pkg/config/remote/service/service.go @@ -17,29 +17,28 @@ import ( "errors" "expvar" "fmt" + "maps" "net/url" "path" "strconv" "sync" "time" - "github.com/DataDog/datadog-agent/pkg/remoteconfig/state" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "github.com/DataDog/go-tuf/data" tufutil "github.com/DataDog/go-tuf/util" "github.com/benbjohnson/clock" "github.com/secure-systems-lab/go-securesystemslib/cjson" + "go.etcd.io/bbolt" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" - - "go.etcd.io/bbolt" + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" "github.com/DataDog/datadog-agent/pkg/config/model" "github.com/DataDog/datadog-agent/pkg/config/remote/api" rdata "github.com/DataDog/datadog-agent/pkg/config/remote/data" "github.com/DataDog/datadog-agent/pkg/config/remote/uptane" pbgo "github.com/DataDog/datadog-agent/pkg/proto/pbgo/core" + "github.com/DataDog/datadog-agent/pkg/remoteconfig/state" "github.com/DataDog/datadog-agent/pkg/util/backoff" "github.com/DataDog/datadog-agent/pkg/util/log" ) @@ -903,9 +902,7 @@ func (s *CoreAgentService) ConfigGetState() (*pbgo.GetStateConfigResponse, error response.DirectorState[metaName] = &pbgo.FileMetaState{Version: metaState.Version, Hash: metaState.Hash} } - for targetName, targetHash := range state.TargetFilenames { - response.TargetFilenames[targetName] = targetHash - } + maps.Copy(response.TargetFilenames, state.TargetFilenames) return response, nil } diff --git a/pkg/ebpf/ksyms.go b/pkg/ebpf/ksyms.go index 6b0e0217b6ea8..1829ee6c471b8 100644 --- a/pkg/ebpf/ksyms.go +++ b/pkg/ebpf/ksyms.go @@ -12,6 +12,7 @@ import ( "fmt" "io" "os" + "slices" "sort" "strconv" "sync" @@ -135,7 +136,7 @@ func findKernelFuncs(ksymsReader io.Reader, writeKsym func(string, uint64), chec } writeKsym(string(check[idx]), s) - check = append(check[:idx], check[idx+1:]...) + check = slices.Delete(check, idx, idx+1) } } if err := scanner.Err(); err != nil { diff --git a/pkg/flare/clusteragent/cluster_checks.go b/pkg/flare/clusteragent/cluster_checks.go index 641df23448466..3f9d24732cfde 100644 --- a/pkg/flare/clusteragent/cluster_checks.go +++ b/pkg/flare/clusteragent/cluster_checks.go @@ -9,6 +9,7 @@ import ( "encoding/json" "fmt" "io" + "slices" "sort" "text/tabwriter" @@ -154,10 +155,5 @@ func GetEndpointsChecks(w io.Writer, checkName string) error { } func endpointschecksEnabled() bool { - for _, provider := range pkgconfigsetup.Datadog().GetStringSlice("extra_config_providers") { - if provider == names.KubeEndpointsRegisterName { - return true - } - } - return false + return slices.Contains(pkgconfigsetup.Datadog().GetStringSlice("extra_config_providers"), names.KubeEndpointsRegisterName) } diff --git a/pkg/fleet/installer/setup/common/config.go b/pkg/fleet/installer/setup/common/config.go index 9bd7afc2f449a..273f7ab598021 100644 --- a/pkg/fleet/installer/setup/common/config.go +++ b/pkg/fleet/installer/setup/common/config.go @@ -7,6 +7,7 @@ package common import ( "fmt" + "maps" "os" "path/filepath" @@ -251,9 +252,7 @@ func mergeConfig(base interface{}, override interface{}) (interface{}, error) { func mergeMap(base, override map[string]interface{}) (map[string]interface{}, error) { merged := make(map[string]interface{}) - for k, v := range base { - merged[k] = v - } + maps.Copy(merged, base) for k := range override { v, err := mergeConfig(base[k], override[k]) if err != nil { diff --git a/pkg/logs/internal/decoder/auto_multiline_detection/pattern_table.go b/pkg/logs/internal/decoder/auto_multiline_detection/pattern_table.go index b5056214e2865..ef23f925376f5 100644 --- a/pkg/logs/internal/decoder/auto_multiline_detection/pattern_table.go +++ b/pkg/logs/internal/decoder/auto_multiline_detection/pattern_table.go @@ -8,6 +8,7 @@ package automultilinedetection import ( "fmt" + "slices" "sync" "github.com/DataDog/datadog-agent/pkg/logs/internal/decoder/auto_multiline_detection/tokens" @@ -121,7 +122,7 @@ func (p *PatternTable) evictLRU() { mini = i } } - p.table = append(p.table[:mini], p.table[mini+1:]...) + p.table = slices.Delete(p.table, mini, mini+1) } // DumpTable returns a slice of DiagnosticRow structs that represent the current state of the table. diff --git a/pkg/logs/internal/decoder/auto_multiline_detection/tokenizer.go b/pkg/logs/internal/decoder/auto_multiline_detection/tokenizer.go index 8274e00f8507e..bf740d938a31a 100644 --- a/pkg/logs/internal/decoder/auto_multiline_detection/tokenizer.go +++ b/pkg/logs/internal/decoder/auto_multiline_detection/tokenizer.go @@ -40,10 +40,7 @@ func NewTokenizer(maxEvalBytes int) *Tokenizer { // ProcessAndContinue enriches the message context with tokens. // This implements the Heuristic interface - this heuristic does not stop processing. func (t *Tokenizer) ProcessAndContinue(context *messageContext) bool { - maxBytes := len(context.rawMessage) - if maxBytes > t.maxEvalBytes { - maxBytes = t.maxEvalBytes - } + maxBytes := min(len(context.rawMessage), t.maxEvalBytes) tokens, indicies := t.tokenize(context.rawMessage[:maxBytes]) context.tokens = tokens context.tokenIndicies = indicies @@ -324,10 +321,7 @@ func tokensToString(tokens []tokens.Token) string { // used for comparison. This function is optimized to exit early if the match is impossible // without having to compare all of the tokens. func isMatch(seqA []tokens.Token, seqB []tokens.Token, thresh float64) bool { - count := len(seqA) - if len(seqB) < count { - count = len(seqB) - } + count := min(len(seqB), len(seqA)) if count == 0 { return len(seqA) == len(seqB) diff --git a/pkg/logs/launchers/file/launcher.go b/pkg/logs/launchers/file/launcher.go index 56ff904457150..ffa3b5e9c77d6 100644 --- a/pkg/logs/launchers/file/launcher.go +++ b/pkg/logs/launchers/file/launcher.go @@ -8,6 +8,7 @@ package file import ( "regexp" + "slices" "time" tagger "github.com/DataDog/datadog-agent/comp/core/tagger/def" @@ -258,7 +259,7 @@ func (s *Launcher) removeSource(source *sources.LogSource) { for i, src := range s.activeSources { if src == source { // no need to stop the tailer here, it will be stopped in the next iteration of scan. - s.activeSources = append(s.activeSources[:i], s.activeSources[i+1:]...) + s.activeSources = slices.Delete(s.activeSources, i, i+1) break } } diff --git a/pkg/logs/launchers/listener/tcp.go b/pkg/logs/launchers/listener/tcp.go index 9b7e61dad7c29..2c468b76be034 100644 --- a/pkg/logs/launchers/listener/tcp.go +++ b/pkg/logs/launchers/listener/tcp.go @@ -8,6 +8,7 @@ package listener import ( "fmt" "net" + "slices" "sync" "time" @@ -160,7 +161,7 @@ func (l *TCPListener) stopTailer(tailer *tailer.Tailer) { if t == tailer { // Only stop the tailer if it has not already been stopped tailer.Stop() - l.tailers = append(l.tailers[:i], l.tailers[i+1:]...) + l.tailers = slices.Delete(l.tailers, i, i+1) break } } diff --git a/pkg/logs/service/services.go b/pkg/logs/service/services.go index ae8450c4167ca..c4675dd744028 100644 --- a/pkg/logs/service/services.go +++ b/pkg/logs/service/services.go @@ -6,6 +6,7 @@ package service import ( + "slices" "sync" "github.com/DataDog/datadog-agent/pkg/util/log" @@ -73,7 +74,7 @@ func (s *Services) GetAddedServicesForType(serviceType string) chan *Service { added := make(chan *Service) s.addedPerType[serviceType] = append(s.addedPerType[serviceType], added) - existingServices := append([]*Service{}, s.services...) // clone for goroutine + existingServices := slices.Clone(s.services) // clone for goroutine go func() { for _, svc := range existingServices { if svc.Type == serviceType { @@ -106,7 +107,7 @@ func (s *Services) GetAllAddedServices() chan *Service { added := make(chan *Service) s.allAdded = append(s.allAdded, added) - existingServices := append([]*Service{}, s.services...) // clone for goroutine + existingServices := slices.Clone(s.services) // clone for goroutine go func() { for _, svc := range existingServices { added <- svc diff --git a/pkg/logs/sources/sources.go b/pkg/logs/sources/sources.go index e6f5918c68e5f..5b24cd7297880 100644 --- a/pkg/logs/sources/sources.go +++ b/pkg/logs/sources/sources.go @@ -6,6 +6,7 @@ package sources import ( + "slices" "sync" "github.com/DataDog/datadog-agent/pkg/util/log" @@ -74,7 +75,7 @@ func (s *LogSources) RemoveSource(source *LogSource) { var sourceFound bool for i, src := range s.sources { if src == source { - s.sources = append(s.sources[:i], s.sources[i+1:]...) + s.sources = slices.Delete(s.sources, i, i+1) sourceFound = true break } @@ -108,7 +109,7 @@ func (s *LogSources) SubscribeAll() (added chan *LogSource, removed chan *LogSou s.added = append(s.added, added) s.removed = append(s.removed, removed) - existingSources := append([]*LogSource{}, s.sources...) // clone for goroutine + existingSources := slices.Clone(s.sources) // clone for goroutine go func() { for _, source := range existingSources { added <- source @@ -140,7 +141,7 @@ func (s *LogSources) SubscribeForType(sourceType string) (added chan *LogSource, } s.removedByType[sourceType] = append(s.removedByType[sourceType], removed) - existingSources := append([]*LogSource{}, s.sources...) // clone for goroutine + existingSources := slices.Clone(s.sources) // clone for goroutine go func() { for _, source := range existingSources { if source.Config.Type == sourceType { @@ -168,7 +169,7 @@ func (s *LogSources) GetAddedForType(sourceType string) chan *LogSource { stream := make(chan *LogSource) s.addedByType[sourceType] = append(s.addedByType[sourceType], stream) - existingSources := append([]*LogSource{}, s.sources...) // clone for goroutine + existingSources := slices.Clone(s.sources) // clone for goroutine go func() { for _, source := range existingSources { if source.Config.Type == sourceType { @@ -187,6 +188,6 @@ func (s *LogSources) GetSources() []*LogSource { s.mu.Lock() defer s.mu.Unlock() - clone := append([]*LogSource{}, s.sources...) + clone := slices.Clone(s.sources) return clone } diff --git a/pkg/network/encoding/marshal/format.go b/pkg/network/encoding/marshal/format.go index 3e95a4a2c00b6..1e756cafee9c9 100644 --- a/pkg/network/encoding/marshal/format.go +++ b/pkg/network/encoding/marshal/format.go @@ -6,11 +6,11 @@ package marshal import ( + "maps" "math" - "github.com/twmb/murmur3" - model "github.com/DataDog/agent-payload/v5/process" + "github.com/twmb/murmur3" "github.com/DataDog/datadog-agent/pkg/network" "github.com/DataDog/datadog-agent/pkg/process/util" @@ -42,9 +42,7 @@ func mergeDynamicTags(dynamicTags ...map[string]struct{}) (out map[string]struct out = tags continue } - for k, v := range tags { - out[k] = v - } + maps.Copy(out, tags) } return } diff --git a/pkg/network/go/binversion/buildinfo.go b/pkg/network/go/binversion/buildinfo.go index e95fd862ffec5..b21a48ba1aaeb 100644 --- a/pkg/network/go/binversion/buildinfo.go +++ b/pkg/network/go/binversion/buildinfo.go @@ -182,10 +182,7 @@ type elfExe struct { func (x *elfExe) ReadData(addr, size uint64) ([]byte, error) { for _, prog := range x.f.Progs { if prog.Vaddr <= addr && addr <= prog.Vaddr+prog.Filesz-1 { - n := prog.Vaddr + prog.Filesz - addr - if n > size { - n = size - } + n := min(prog.Vaddr+prog.Filesz-addr, size) data := make([]byte, n) _, err := prog.ReadAt(data, int64(addr-prog.Vaddr)) if err != nil { @@ -202,10 +199,7 @@ func (x *elfExe) ReadData(addr, size uint64) ([]byte, error) { func (x *elfExe) ReadDataWithPool(addr uint64, data []byte) error { for _, prog := range x.f.Progs { if prog.Vaddr <= addr && addr <= prog.Vaddr+prog.Filesz-1 { - expectedSizeToRead := prog.Vaddr + prog.Filesz - addr - if expectedSizeToRead > uint64(len(data)) { - expectedSizeToRead = uint64(len(data)) - } + expectedSizeToRead := min(prog.Vaddr+prog.Filesz-addr, uint64(len(data))) readSize, err := prog.ReadAt(data, int64(addr-prog.Vaddr)) // If there is an error, and the error is not "EOF" caused due to the fact we tried to read too much, // then report an error. diff --git a/pkg/network/netlink/circuit_breaker.go b/pkg/network/netlink/circuit_breaker.go index 8cd62122c25d7..ac771c60f6e48 100644 --- a/pkg/network/netlink/circuit_breaker.go +++ b/pkg/network/netlink/circuit_breaker.go @@ -114,13 +114,7 @@ func (c *CircuitBreaker) update(now time.Time) { } lastUpdate := c.lastUpdate.Load() - deltaInSec := float64(now.UnixNano()-lastUpdate) / float64(time.Second.Nanoseconds()) - - // This is to avoid a divide by 0 panic or a spurious spike due - // to a reset followed immediately by an update call - if deltaInSec < 1.0 { - deltaInSec = 1.0 - } + deltaInSec := max(float64(now.UnixNano()-lastUpdate)/float64(time.Second.Nanoseconds()), 1.0) // Calculate the event rate (EWMA) eventCount := c.eventCount.Swap(0) diff --git a/pkg/process/checks/chunking_test.go b/pkg/process/checks/chunking_test.go index 04b141ac00d82..05d90d95dda8f 100644 --- a/pkg/process/checks/chunking_test.go +++ b/pkg/process/checks/chunking_test.go @@ -310,10 +310,7 @@ func TestWeightProcess(t *testing.T) { expectedWeight := len(serialized) assert.Equal(t, expectedWeight, p.Size()) - allowedDelta := int(float64(actualWeight) * allowedPctDelta / 100.) - if allowedDelta < allowedMinDelta { - allowedDelta = allowedMinDelta - } + allowedDelta := max(int(float64(actualWeight)*allowedPctDelta/100.), allowedMinDelta) withinLimits := expectedWeight-allowedDelta <= actualWeight && actualWeight <= expectedWeight+allowedDelta assert.True( diff --git a/pkg/process/checks/process_discovery_check.go b/pkg/process/checks/process_discovery_check.go index 967d29dc8f62a..533ee389a2a7e 100644 --- a/pkg/process/checks/process_discovery_check.go +++ b/pkg/process/checks/process_discovery_check.go @@ -160,10 +160,7 @@ func chunkProcessDiscoveries(procs []*model.ProcessDiscovery, size int) [][]*mod chunks := make([][]*model.ProcessDiscovery, 0, chunkCount) for i := 0; i < len(procs); i += size { - end := i + size - if end > len(procs) { - end = len(procs) - } + end := min(i+size, len(procs)) chunks = append(chunks, procs[i:end]) } diff --git a/pkg/process/checks/process_nix.go b/pkg/process/checks/process_nix.go index 1fd0bc4d89452..74cca4fe85197 100644 --- a/pkg/process/checks/process_nix.go +++ b/pkg/process/checks/process_nix.go @@ -78,12 +78,7 @@ func calculatePct(deltaProc, deltaTime, numCPU float64) float32 { // Calculates utilization split across all CPUs. A busy-loop process // on a 2-CPU-core system would be reported as 50% instead of 100%. - overalPct := (deltaProc / deltaTime) * 100 - - // Sometimes we get values that don't make sense, so we clamp to 100% - if overalPct > 100 { - overalPct = 100 - } + overalPct := min((deltaProc/deltaTime)*100, 100) // In order to emulate top we multiply utilization by # of CPUs so a busy loop would be 100%. pct := overalPct * numCPU diff --git a/pkg/process/metadata/workloadmeta/extractor.go b/pkg/process/metadata/workloadmeta/extractor.go index 25db230e57263..f32ed0d3887bd 100644 --- a/pkg/process/metadata/workloadmeta/extractor.go +++ b/pkg/process/metadata/workloadmeta/extractor.go @@ -7,6 +7,7 @@ package workloadmeta import ( + "maps" "runtime" "strconv" "sync" @@ -218,9 +219,7 @@ func (w *WorkloadMetaExtractor) GetAllProcessEntities() (map[string]*ProcessEnti // Store pointers in map to avoid duplicating ProcessEntity data snapshot := make(map[string]*ProcessEntity) - for id, proc := range w.cache { - snapshot[id] = proc - } + maps.Copy(snapshot, w.cache) return snapshot, w.cacheVersion } diff --git a/pkg/process/runner/submitter.go b/pkg/process/runner/submitter.go index f4fd31c1cd92c..06974cbcb386b 100644 --- a/pkg/process/runner/submitter.go +++ b/pkg/process/runner/submitter.go @@ -10,13 +10,13 @@ import ( "hash/fnv" "net/http" "os" + "slices" "strconv" "sync" "time" - "github.com/benbjohnson/clock" - model "github.com/DataDog/agent-payload/v5/process" + "github.com/benbjohnson/clock" "github.com/DataDog/datadog-agent/comp/core/config" log "github.com/DataDog/datadog-agent/comp/core/log/def" @@ -27,7 +27,6 @@ import ( "github.com/DataDog/datadog-agent/comp/forwarder/defaultforwarder/transaction" "github.com/DataDog/datadog-agent/comp/process/forwarders" "github.com/DataDog/datadog-agent/comp/process/types" - pkgconfigsetup "github.com/DataDog/datadog-agent/pkg/config/setup" "github.com/DataDog/datadog-agent/pkg/process/checks" "github.com/DataDog/datadog-agent/pkg/process/runner/endpoint" @@ -463,13 +462,7 @@ func (s *CheckSubmitter) getRequestID(start time.Time, chunkIndex int) string { } func (s *CheckSubmitter) shouldDropPayload(check string) bool { - for _, d := range s.dropCheckPayloads { - if d == check { - return true - } - } - - return false + return slices.Contains(s.dropCheckPayloads, check) } func (s *CheckSubmitter) heartbeat(heartbeatTicker *clock.Ticker) { diff --git a/pkg/security/config/config.go b/pkg/security/config/config.go index bc325dc5b865e..b0e5c6f7d9a50 100644 --- a/pkg/security/config/config.go +++ b/pkg/security/config/config.go @@ -11,6 +11,7 @@ import ( "fmt" "math" "net" + "slices" "strings" "time" @@ -392,10 +393,7 @@ func NewRuntimeSecurityConfig() (*RuntimeSecurityConfig, error) { ActivityDumpAutoSuppressionEnabled: pkgconfigsetup.SystemProbe().GetBool("runtime_security_config.activity_dump.auto_suppression.enabled"), // activity dump dynamic fields ActivityDumpMaxDumpSize: func() int { - mds := pkgconfigsetup.SystemProbe().GetInt("runtime_security_config.activity_dump.max_dump_size") - if mds < ADMinMaxDumSize { - mds = ADMinMaxDumSize - } + mds := max(pkgconfigsetup.SystemProbe().GetInt("runtime_security_config.activity_dump.max_dump_size"), ADMinMaxDumSize) return mds * (1 << 10) }, @@ -559,11 +557,8 @@ func (c *RuntimeSecurityConfig) sanitize() error { // sanitizeRuntimeSecurityConfigActivityDump ensures that runtime_security_config.activity_dump is properly configured func (c *RuntimeSecurityConfig) sanitizeRuntimeSecurityConfigActivityDump() error { var execFound bool - for _, evtType := range c.ActivityDumpTracedEventTypes { - if evtType == model.ExecEventType { - execFound = true - break - } + if slices.Contains(c.ActivityDumpTracedEventTypes, model.ExecEventType) { + execFound = true } if !execFound { c.ActivityDumpTracedEventTypes = append(c.ActivityDumpTracedEventTypes, model.ExecEventType) diff --git a/pkg/security/generators/accessors/doc/doc.go b/pkg/security/generators/accessors/doc/doc.go index 74443c799e51a..3e04d5f820f17 100644 --- a/pkg/security/generators/accessors/doc/doc.go +++ b/pkg/security/generators/accessors/doc/doc.go @@ -13,6 +13,7 @@ import ( "os" "path/filepath" "regexp" + "slices" "sort" "strings" @@ -193,9 +194,7 @@ func GenerateDocJSON(module *common.Module, seclModelPath, outputPath string) er property := &properties[i] if propertyDoc, exists := cachedDocumentation[property.PropertyKey]; exists { property.DocLink = propertyDoc.Link - sort.Slice(propertyDoc.Prefixes, func(i, j int) bool { - return propertyDoc.Prefixes[i] < propertyDoc.Prefixes[j] - }) + slices.Sort(propertyDoc.Prefixes) } } diff --git a/pkg/security/generators/syscall_table_generator/syscall_table_generator.go b/pkg/security/generators/syscall_table_generator/syscall_table_generator.go index 4100efa4e3614..d607b9a24914c 100644 --- a/pkg/security/generators/syscall_table_generator/syscall_table_generator.go +++ b/pkg/security/generators/syscall_table_generator/syscall_table_generator.go @@ -17,6 +17,7 @@ import ( "os/exec" "path" "regexp" + "slices" "strconv" "strings" "text/template" @@ -243,10 +244,5 @@ func generateStringer(inputPath, outputPath string) error { } func containsStringSlice(slice []string, value string) bool { - for _, current := range slice { - if current == value { - return true - } - } - return false + return slices.Contains(slice, value) } diff --git a/pkg/security/secl/compiler/eval/operators.go b/pkg/security/secl/compiler/eval/operators.go index 9fd97b9a98177..5830934245644 100644 --- a/pkg/security/secl/compiler/eval/operators.go +++ b/pkg/security/secl/compiler/eval/operators.go @@ -8,6 +8,7 @@ package eval import ( "net" + "slices" "strings" ) @@ -624,12 +625,7 @@ func StringArrayMatches(a *StringArrayEvaluator, b *StringValuesEvaluator, state } arrayOp := func(a []string, b *StringValues) bool { - for _, as := range a { - if b.Matches(as) { - return true - } - } - return false + return slices.ContainsFunc(a, b.Matches) } if a.EvalFnc != nil && b.EvalFnc != nil { @@ -697,10 +693,8 @@ func IntArrayMatches(a *IntArrayEvaluator, b *IntArrayEvaluator, state *State) ( arrayOp := func(a []int, b []int) bool { for _, va := range a { - for _, vb := range b { - if va == vb { - return true - } + if slices.Contains(b, va) { + return true } } return false @@ -776,12 +770,7 @@ func ArrayBoolContains(a *BoolEvaluator, b *BoolArrayEvaluator, state *State) (* } arrayOp := func(a bool, b []bool) bool { - for _, v := range b { - if v == a { - return true - } - } - return false + return slices.Contains(b, a) } if a.EvalFnc != nil && b.EvalFnc != nil { ea, eb := a.EvalFnc, b.EvalFnc diff --git a/pkg/security/secl/compiler/eval/rule.go b/pkg/security/secl/compiler/eval/rule.go index 096eae4c9e021..7a956558377c2 100644 --- a/pkg/security/secl/compiler/eval/rule.go +++ b/pkg/security/secl/compiler/eval/rule.go @@ -244,10 +244,7 @@ func NewRuleEvaluator(rule *ast.Rule, model Model, opts *Opts) (*RuleEvaluator, // eval with each possible value of the registers evalBool.EvalFnc = func(ctx *Context) bool { - size := lenEval.Eval(ctx).(int) - if size > maxRegisterIteration { - size = maxRegisterIteration - } + size := min(lenEval.Eval(ctx).(int), maxRegisterIteration) for i := 0; i != size; i++ { ctx.Registers[regID] = i diff --git a/pkg/security/secl/model/consts_common.go b/pkg/security/secl/model/consts_common.go index 1b3f9f9309bb2..92f8ae335e032 100644 --- a/pkg/security/secl/model/consts_common.go +++ b/pkg/security/secl/model/consts_common.go @@ -9,6 +9,7 @@ package model import ( "crypto/sha256" "fmt" + "maps" "sync" "syscall" @@ -442,9 +443,7 @@ func initExitCauseConstants() { } func initBoolConstants() { - for k, v := range BooleanConstants { - seclConstants[k] = v - } + maps.Copy(seclConstants, BooleanConstants) } func initSSLVersionConstants() { diff --git a/pkg/security/secl/rules/ruleset.go b/pkg/security/secl/rules/ruleset.go index e5f9c5b82e3f7..d30811326eecc 100644 --- a/pkg/security/secl/rules/ruleset.go +++ b/pkg/security/secl/rules/ruleset.go @@ -310,10 +310,8 @@ func (rs *RuleSet) AddRule(parsingContext *ast.ParsingContext, pRule *PolicyRule return "", nil } - for _, id := range rs.opts.ReservedRuleIDs { - if id == pRule.Def.ID { - return "", &ErrRuleLoad{Rule: pRule, Err: ErrInternalIDConflict} - } + if slices.Contains(rs.opts.ReservedRuleIDs, pRule.Def.ID) { + return "", &ErrRuleLoad{Rule: pRule, Err: ErrInternalIDConflict} } if _, exists := rs.rules[pRule.Def.ID]; exists { diff --git a/pkg/security/seclog/logger.go b/pkg/security/seclog/logger.go index c6f2aff1a24f7..a7d22f9e254b1 100644 --- a/pkg/security/seclog/logger.go +++ b/pkg/security/seclog/logger.go @@ -10,6 +10,7 @@ import ( "fmt" "regexp" "runtime" + "slices" "strings" "sync" @@ -72,13 +73,11 @@ func (l *PatternLogger) trace(tag fmt.Stringer, format string, params ...interfa if len(stag) != 0 { l.RLock() - for _, t := range l.tags { - if t == stag { - l.RUnlock() - log.TraceStackDepth(depth, fmt.Sprintf(format, params...)) + if slices.Contains(l.tags, stag) { + l.RUnlock() + log.TraceStackDepth(depth, fmt.Sprintf(format, params...)) - return - } + return } l.RUnlock() } diff --git a/pkg/serverless/invocationlifecycle/lifecycle.go b/pkg/serverless/invocationlifecycle/lifecycle.go index fec26be6d0de1..2457d016ffcc3 100644 --- a/pkg/serverless/invocationlifecycle/lifecycle.go +++ b/pkg/serverless/invocationlifecycle/lifecycle.go @@ -7,6 +7,7 @@ package invocationlifecycle import ( "bytes" + "maps" "os" "strings" "time" @@ -364,9 +365,7 @@ func (lp *LifecycleProcessor) newRequest(lambdaPayloadString []byte, startTime t } func (lp *LifecycleProcessor) addTags(tagSet map[string]string) { - for k, v := range tagSet { - lp.requestHandler.triggerTags[k] = v - } + maps.Copy(lp.requestHandler.triggerTags, tagSet) } func (lp *LifecycleProcessor) addTag(key string, value string) { diff --git a/pkg/serverless/tags/tags.go b/pkg/serverless/tags/tags.go index a8dcd21abe39f..c9d1ec3609e2a 100644 --- a/pkg/serverless/tags/tags.go +++ b/pkg/serverless/tags/tags.go @@ -8,6 +8,7 @@ package tags import ( "fmt" + "maps" "os" "regexp" "strings" @@ -147,12 +148,8 @@ func MapToArray(tagsMap map[string]string) []string { func MergeWithOverwrite(tags map[string]string, overwritingTags map[string]string) map[string]string { merged := make(map[string]string) - for k, v := range tags { - merged[k] = v - } - for k, v := range overwritingTags { - merged[k] = v - } + maps.Copy(merged, tags) + maps.Copy(merged, overwritingTags) return merged } @@ -169,9 +166,7 @@ func BuildTracerTags(tags map[string]string) map[string]string { func buildTags(tags map[string]string, tagsToSkip []string) map[string]string { tagsMap := make(map[string]string) - for k, v := range tags { - tagsMap[k] = v - } + maps.Copy(tagsMap, tags) for _, blackListKey := range tagsToSkip { delete(tagsMap, blackListKey) } diff --git a/pkg/serverless/trace/inferredspan/inferred_span.go b/pkg/serverless/trace/inferredspan/inferred_span.go index 9f4fc89862e76..d9793ac2924c8 100644 --- a/pkg/serverless/trace/inferredspan/inferred_span.go +++ b/pkg/serverless/trace/inferredspan/inferred_span.go @@ -7,6 +7,7 @@ package inferredspan import ( "crypto/rand" + "maps" "math" "math/big" "os" @@ -71,9 +72,7 @@ func FilterFunctionTags(input map[string]string) map[string]string { } output := make(map[string]string) - for k, v := range input { - output[k] = v - } + maps.Copy(output, input) // filter out DD_TAGS & DD_EXTRA_TAGS ddTags := configUtils.GetConfiguredTags(pkgconfigsetup.Datadog(), false) diff --git a/pkg/tagset/composite_tags.go b/pkg/tagset/composite_tags.go index 2254c985e7728..796bcc238b46a 100644 --- a/pkg/tagset/composite_tags.go +++ b/pkg/tagset/composite_tags.go @@ -7,6 +7,7 @@ package tagset import ( "encoding/json" + "slices" "strings" ) @@ -48,7 +49,7 @@ func CombineCompositeTagsAndSlice(compositeTags CompositeTags, tags []string) Co } // Copy tags in case `CombineCompositeTagsAndSlice` is called twice with the same first argument. // For example see TestCompositeTagsCombineCompositeTagsAndSlice. - newTags := append(append([]string{}, compositeTags.tags2...), tags...) + newTags := slices.Concat(compositeTags.tags2, tags) return NewCompositeTags(compositeTags.tags1, newTags) } @@ -90,18 +91,10 @@ func (t CompositeTags) ForEachErr(callback func(tag string) error) error { // Find returns whether `callback` returns true for a tag func (t CompositeTags) Find(callback func(tag string) bool) bool { - for _, t := range t.tags1 { - if callback(t) { - return true - } - } - for _, t := range t.tags2 { - if callback(t) { - return true - } + if slices.ContainsFunc(t.tags1, callback) { + return true } - - return false + return slices.ContainsFunc(t.tags2, callback) } // Len returns the length of the tags @@ -122,7 +115,7 @@ func (t CompositeTags) Join(separator string) string { // MarshalJSON serializes a Payload to JSON func (t CompositeTags) MarshalJSON() ([]byte, error) { - tags := append([]string{}, t.tags1...) + tags := slices.Clone(t.tags1) return json.Marshal(append(tags, t.tags2...)) } @@ -140,5 +133,5 @@ func (t CompositeTags) UnsafeToReadOnlySliceString() []string { if len(t.tags2) == 0 { return t.tags1 } - return append(append([]string{}, t.tags1...), t.tags2...) + return slices.Concat(t.tags1, t.tags2) } diff --git a/pkg/tagset/hash_generator.go b/pkg/tagset/hash_generator.go index 52daef4d2470a..efea317a73a1f 100644 --- a/pkg/tagset/hash_generator.go +++ b/pkg/tagset/hash_generator.go @@ -77,10 +77,7 @@ func (g *HashGenerator) Hash(tb *HashingTagsAccumulator) uint64 { // for smaller tag sets, initialize only a portion of the array. when len(tags) is // close to a power of two, size one up to keep hashset load low. - size := 1 << bits.Len(uint(len(tags)+len(tags)/8)) - if size > hashSetSize { - size = hashSetSize - } + size := min(1< hashSetSize { - size = hashSetSize - } + size := min(1< 1 { - newRate = 1 - } + newRate := min(rate*ratio, 1) s.rates[sig] = newRate } s.muRates.Unlock() diff --git a/pkg/trace/stats/span_concentrator.go b/pkg/trace/stats/span_concentrator.go index 8800b931a926a..a41297981723f 100644 --- a/pkg/trace/stats/span_concentrator.go +++ b/pkg/trace/stats/span_concentrator.go @@ -176,12 +176,7 @@ func (sc *SpanConcentrator) addSpan(s *StatSpan, aggKey PayloadAggregationKey, c sc.mu.Lock() defer sc.mu.Unlock() end := s.start + s.duration - btime := end - end%sc.bsize - - // If too far in the past, count in the oldest-allowed time bucket instead. - if btime < sc.oldestTs { - btime = sc.oldestTs - } + btime := max(end-end%sc.bsize, sc.oldestTs) b, ok := sc.buckets[btime] if !ok { diff --git a/pkg/trace/testutil/generate.go b/pkg/trace/testutil/generate.go index e7f1d575625b8..9003422e0574c 100644 --- a/pkg/trace/testutil/generate.go +++ b/pkg/trace/testutil/generate.go @@ -125,10 +125,7 @@ func GenerateSpan(c *SpanConfig) *pb.Span { if nmetrics > len(spanMetrics) { nmetrics = len(spanMetrics) } - nmeta := ntags - nmetrics - if nmeta > len(metas) { - nmeta = len(metas) - } + nmeta := min(ntags-nmetrics, len(metas)) for i := 0; i < nmeta; i++ { for k := range metas { if _, ok := s.Meta[k]; ok { diff --git a/pkg/trace/writer/sender.go b/pkg/trace/writer/sender.go index 74d81667ce4f0..2a1ea5ae00c91 100644 --- a/pkg/trace/writer/sender.go +++ b/pkg/trace/writer/sender.go @@ -11,6 +11,7 @@ import ( "errors" "fmt" "io" + "maps" "math" "math/rand" "net/http" @@ -458,9 +459,7 @@ func newPayload(headers map[string]string) *payload { func (p *payload) clone() *payload { headers := make(map[string]string, len(p.headers)) - for k, v := range p.headers { - headers[k] = v - } + maps.Copy(headers, p.headers) clone := newPayload(headers) if _, err := clone.body.ReadFrom(bytes.NewBuffer(p.body.Bytes())); err != nil { log.Errorf("Error cloning writer payload: %v", err) diff --git a/pkg/util/cache/basic_cache.go b/pkg/util/cache/basic_cache.go index 3b83954b48f30..e6b5433d5b4fb 100644 --- a/pkg/util/cache/basic_cache.go +++ b/pkg/util/cache/basic_cache.go @@ -6,6 +6,7 @@ package cache import ( + "maps" "sync" "time" ) @@ -75,9 +76,7 @@ func (b *BasicCache) Items() map[string]interface{} { b.m.RLock() defer b.m.RUnlock() - for k, v := range b.cache { - items[k] = v - } + maps.Copy(items, b.cache) return items } diff --git a/pkg/util/cloudproviders/gce/gce_tags.go b/pkg/util/cloudproviders/gce/gce_tags.go index 9440ba6ccc21b..badcb7538a578 100644 --- a/pkg/util/cloudproviders/gce/gce_tags.go +++ b/pkg/util/cloudproviders/gce/gce_tags.go @@ -9,6 +9,7 @@ import ( "context" "encoding/json" "fmt" + "slices" "strings" pkgconfigsetup "github.com/DataDog/datadog-agent/pkg/config/setup" @@ -113,10 +114,5 @@ func GetTags(ctx context.Context) ([]string, error) { func isAttributeExcluded(attr string) bool { excludedAttributes := pkgconfigsetup.Datadog().GetStringSlice("exclude_gce_tags") - for _, excluded := range excludedAttributes { - if attr == excluded { - return true - } - } - return false + return slices.Contains(excludedAttributes, attr) } diff --git a/pkg/util/containers/metadata/metadata.go b/pkg/util/containers/metadata/metadata.go index fd6742280ba89..06953dcc48ef5 100644 --- a/pkg/util/containers/metadata/metadata.go +++ b/pkg/util/containers/metadata/metadata.go @@ -7,6 +7,7 @@ package containers import ( + "maps" "sync" "time" @@ -43,9 +44,7 @@ func Get(timeout time.Duration) map[string]string { return } mutex.Lock() - for k, v := range meta { - containerMeta[k] = v - } + maps.Copy(containerMeta, meta) mutex.Unlock() }(provider, getMeta) } @@ -62,9 +61,7 @@ func Get(timeout time.Duration) map[string]string { // in this case the map might be incomplete so return a copy to avoid race incompleteMeta := make(map[string]string) mutex.Lock() - for k, v := range containerMeta { - incompleteMeta[k] = v - } + maps.Copy(incompleteMeta, containerMeta) mutex.Unlock() return incompleteMeta } diff --git a/pkg/util/ec2/ec2_tags.go b/pkg/util/ec2/ec2_tags.go index ab8c682b0287c..24c1b7dda5318 100644 --- a/pkg/util/ec2/ec2_tags.go +++ b/pkg/util/ec2/ec2_tags.go @@ -11,6 +11,7 @@ import ( "context" "encoding/json" "fmt" + "slices" "strings" "time" @@ -32,10 +33,8 @@ var ( func isTagExcluded(tag string) bool { if excludedTags := pkgconfigsetup.Datadog().GetStringSlice("exclude_ec2_tags"); excludedTags != nil { - for _, excludedTag := range excludedTags { - if tag == excludedTag { - return true - } + if slices.Contains(excludedTags, tag) { + return true } } return false diff --git a/pkg/util/fxutil/test.go b/pkg/util/fxutil/test.go index 4ba94db3faeed..829c5990817a9 100644 --- a/pkg/util/fxutil/test.go +++ b/pkg/util/fxutil/test.go @@ -10,6 +10,7 @@ package fxutil import ( "context" "reflect" + "slices" "testing" "github.com/spf13/cobra" @@ -181,7 +182,7 @@ func TestOneShotSubcommand( for _, c := range subcommands { cmd.AddCommand(c) } - cmd.SetArgs(append([]string{}, commandline...)) + cmd.SetArgs(slices.Clone(commandline)) require.NoError(t, cmd.Execute()) require.True(t, oneShotRan, "fxutil.OneShot wasn't called") diff --git a/pkg/util/hostname/validate/validate.go b/pkg/util/hostname/validate/validate.go index 1e52cdfd12cb6..10e3c7af6949f 100644 --- a/pkg/util/hostname/validate/validate.go +++ b/pkg/util/hostname/validate/validate.go @@ -9,6 +9,7 @@ package validate import ( "fmt" "regexp" + "slices" "strings" "github.com/DataDog/datadog-agent/pkg/util/log" @@ -46,10 +47,5 @@ func ValidHostname(hostname string) error { // check whether the name is in the list of local hostnames func isLocal(name string) bool { name = strings.ToLower(name) - for _, val := range localhostIdentifiers { - if val == name { - return true - } - } - return false + return slices.Contains(localhostIdentifiers, name) } diff --git a/pkg/util/kubernetes/apiserver/apiserver.go b/pkg/util/kubernetes/apiserver/apiserver.go index e967a87735fb2..4192a0f7eb90e 100644 --- a/pkg/util/kubernetes/apiserver/apiserver.go +++ b/pkg/util/kubernetes/apiserver/apiserver.go @@ -12,6 +12,7 @@ import ( "context" "errors" "fmt" + "maps" "net/http" "net/url" "sync" @@ -660,9 +661,7 @@ func convertmetadataMapperBundleToAPI(input *MetadataMapperBundle) *apiv1.Metada if input == nil { return output } - for key, val := range input.Services { - output.Services[key] = val - } + maps.Copy(output.Services, input.Services) return output } diff --git a/pkg/util/kubernetes/apiserver/controllers/hpa_controller.go b/pkg/util/kubernetes/apiserver/controllers/hpa_controller.go index 6a39108ef854f..77a59127e2ee4 100644 --- a/pkg/util/kubernetes/apiserver/controllers/hpa_controller.go +++ b/pkg/util/kubernetes/apiserver/controllers/hpa_controller.go @@ -8,6 +8,7 @@ package controllers import ( + "maps" "sync" "time" @@ -171,10 +172,7 @@ func (h *autoscalersController) syncHPA(key interface{}) error { } newMetrics := h.hpaProc.ProcessEMList(emList) h.toStore.m.Lock() - for metric, value := range newMetrics { - // We should only insert placeholders in the local cache. - h.toStore.data[metric] = value - } + maps.Copy(h.toStore.data, newMetrics) h.toStore.m.Unlock() log.Tracef("Local batch cache of Ref is %v", h.toStore.data) } diff --git a/pkg/util/kubernetes/apiserver/controllers/wpa_controller.go b/pkg/util/kubernetes/apiserver/controllers/wpa_controller.go index 197ca2af7fa09..9b7e7716de229 100644 --- a/pkg/util/kubernetes/apiserver/controllers/wpa_controller.go +++ b/pkg/util/kubernetes/apiserver/controllers/wpa_controller.go @@ -9,6 +9,7 @@ package controllers import ( "context" + "maps" "math" "time" @@ -218,10 +219,7 @@ func (h *autoscalersController) syncWPA(key interface{}) error { } newMetrics := h.hpaProc.ProcessEMList(emList) h.toStore.m.Lock() - for metric, value := range newMetrics { - // We should only insert placeholders in the local cache. - h.toStore.data[metric] = value - } + maps.Copy(h.toStore.data, newMetrics) h.toStore.m.Unlock() log.Tracef("Local batch cache of WPA is %v", h.toStore.data) diff --git a/pkg/util/kubernetes/autoscalers/processor.go b/pkg/util/kubernetes/autoscalers/processor.go index f3e99520f5b25..2cfe2452ea1e6 100644 --- a/pkg/util/kubernetes/autoscalers/processor.go +++ b/pkg/util/kubernetes/autoscalers/processor.go @@ -9,6 +9,7 @@ package autoscalers import ( "fmt" + "maps" "math" "net/url" "sort" @@ -16,9 +17,8 @@ import ( "sync" "time" - "golang.org/x/sync/errgroup" - "github.com/DataDog/watermarkpodautoscaler/apis/datadoghq/v1alpha1" + "golang.org/x/sync/errgroup" datadogclientcomp "github.com/DataDog/datadog-agent/comp/autoscaling/datadogclient/def" "github.com/DataDog/datadog-agent/pkg/clusteragent/autoscaling/custommetrics" @@ -212,9 +212,7 @@ func (p *Processor) QueryExternalMetric(queries []string, timeWindow time.Durati responses[q] = Point{Error: err} } } else { - for k, v := range resp { - responses[k] = v - } + maps.Copy(responses, resp) } return nil }) diff --git a/pkg/util/port/portlist/netstat_darwin.go b/pkg/util/port/portlist/netstat_darwin.go index 7542980776b17..c70dfd21a4e90 100644 --- a/pkg/util/port/portlist/netstat_darwin.go +++ b/pkg/util/port/portlist/netstat_darwin.go @@ -36,10 +36,7 @@ func parsePort(s mem.RO) int { // a.b.c.d.1234 or [a:b:c:d].1234 i2 := mem.LastIndexByte(s, '.') - i := i1 - if i2 > i { - i = i2 - } + i := max(i2, i1) if i < 0 { // no match; weird return -1 diff --git a/test/fakeintake/aggregator/common.go b/test/fakeintake/aggregator/common.go index f0da7db68027e..0038f3ac036df 100644 --- a/test/fakeintake/aggregator/common.go +++ b/test/fakeintake/aggregator/common.go @@ -13,6 +13,7 @@ import ( "flag" "fmt" "io" + "maps" "os" "path/filepath" "reflect" @@ -22,8 +23,9 @@ import ( "sync" "time" - "github.com/DataDog/datadog-agent/test/fakeintake/api" "github.com/DataDog/zstd" + + "github.com/DataDog/datadog-agent/test/fakeintake/api" ) var generateFixture = flag.Bool("generate", false, "generate fixture") @@ -192,9 +194,7 @@ func (agg *Aggregator[P]) replace(payloadsByName map[string][]P) { agg.mutex.Lock() defer agg.mutex.Unlock() agg.unsafeReset() - for name, payloads := range payloadsByName { - agg.payloadsByName[name] = payloads - } + maps.Copy(agg.payloadsByName, payloadsByName) } // FilterByTags return the payloads that match all the tags