Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions comp/core/tagger/impl/tagger.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ const (
type datadogConfig struct {
checksCardinality types.TagCardinality // Cardinality for checks
dogstatsdCardinality types.TagCardinality // Cardinality for DogStatsD Custom Metrics.
logsCardinality types.TagCardinality // Cardinality for logs
dogstatsdEntityIDPrecedenceEnabled bool // Disable Origin Detection for DogStatsD metrics when EntityID is set.
dogstatsdOptOutEnabled bool // Disable Origin Detection if enabled and cardinality is none.
originDetectionUnifiedEnabled bool // Unifies Origin Detection mechanisms to use the same logic.
Expand Down Expand Up @@ -158,16 +159,21 @@ func newLocalTagger(cfg config.Component, wmeta workloadmeta.Component, log log.

checksTagCardinalityRawConfig := cfg.GetString("checks_tag_cardinality")
dogstatsdTagCardinalityRawConfig := cfg.GetString("dogstatsd_tag_cardinality")
logsTagCardinalityRawConfig := cfg.GetString("logs_tag_cardinality")

var err error
dc.checksCardinality, err = types.StringToTagCardinality(checksTagCardinalityRawConfig)
dc.checksCardinality, err = types.StringToTagCardinalityWithDefault(checksTagCardinalityRawConfig, types.LowCardinality)
if err != nil {
log.Warnf("failed to parse check tag cardinality, defaulting to low. Error: %s", err)
}
dc.dogstatsdCardinality, err = types.StringToTagCardinality(dogstatsdTagCardinalityRawConfig)
dc.dogstatsdCardinality, err = types.StringToTagCardinalityWithDefault(dogstatsdTagCardinalityRawConfig, types.LowCardinality)
if err != nil {
log.Warnf("failed to parse dogstatsd tag cardinality, defaulting to low. Error: %s", err)
}
dc.logsCardinality, err = types.StringToTagCardinalityWithDefault(logsTagCardinalityRawConfig, types.HighCardinality)
if err != nil {
log.Warnf("failed to parse logs tag cardinality, defaulting to high. Error: %s", err)
}
telemetryStore := telemetry.NewStore(telemetryComp)
if tagStore == nil {
tagStore = tagstore.NewTagStore(telemetryStore)
Expand Down Expand Up @@ -195,6 +201,9 @@ func (t *localTagger) getTags(entityID types.EntityID, cardinality types.TagCard
if cardinality == types.ChecksConfigCardinality {
cardinality = t.datadogConfig.checksCardinality
}
if cardinality == types.LogsConfigCardinality {
cardinality = t.datadogConfig.logsCardinality
}
if entityID.Empty() {
t.telemetryStore.QueriesByCardinality(cardinality).EmptyEntityID.Inc()
return tagset.HashedTags{}, fmt.Errorf("empty entity ID")
Expand Down
35 changes: 27 additions & 8 deletions comp/core/tagger/impl/tagger_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -377,23 +377,42 @@ func TestGenerateContainerIDFromInode(t *testing.T) {

func TestDefaultCardinality(t *testing.T) {
for _, tt := range []struct {
name string
wantChecksCardinality types.TagCardinality
setup func(cfg config.Component)
name string
expectedCardinality types.TagCardinality
setup func(cfg config.Component)
realCardinality func(tagger *localTagger) types.TagCardinality
}{
{
name: "successful parse config values, use config",
wantChecksCardinality: types.HighCardinality,
name: "Checks: successful parse config values, use config",
expectedCardinality: types.HighCardinality,
setup: func(cfg config.Component) {
cfg.SetWithoutSource("checks_tag_cardinality", types.HighCardinalityString)
},
realCardinality: func(tagger *localTagger) types.TagCardinality { return tagger.datadogConfig.checksCardinality },
},
{
name: "fail parse config values, use default",
wantChecksCardinality: types.LowCardinality,
name: "Checks: fail parse config values, use default",
expectedCardinality: types.LowCardinality,
setup: func(cfg config.Component) {
cfg.SetWithoutSource("checks_tag_cardinality", "foo")
},
realCardinality: func(tagger *localTagger) types.TagCardinality { return tagger.datadogConfig.checksCardinality },
},
{
name: "Logs: successful parse config values, use config",
expectedCardinality: types.OrchestratorCardinality,
setup: func(cfg config.Component) {
cfg.SetWithoutSource("logs_tag_cardinality", "orchestrator")
},
realCardinality: func(tagger *localTagger) types.TagCardinality { return tagger.datadogConfig.logsCardinality },
},
{
name: "Logs: fail parse config values, use default",
expectedCardinality: types.HighCardinality,
setup: func(cfg config.Component) {
cfg.SetWithoutSource("logs_tag_cardinality", "foo")
},
realCardinality: func(tagger *localTagger) types.TagCardinality { return tagger.datadogConfig.logsCardinality },
},
} {
t.Run(tt.name, func(t *testing.T) {
Expand All @@ -410,7 +429,7 @@ func TestDefaultCardinality(t *testing.T) {
tagger, err := newLocalTagger(cfg, wmeta, logComponent, noopTelemetry.GetCompatComponent(), nil)
assert.NoError(t, err)

assert.Equal(t, tt.wantChecksCardinality, tagger.datadogConfig.checksCardinality)
assert.Equal(t, tt.expectedCardinality, tt.realCardinality(tagger))
})
}
}
Expand Down
9 changes: 8 additions & 1 deletion comp/core/tagger/types/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ const (
NoneCardinality
// ChecksConfigCardinality is an internal cardinality that represents the checks_tag_cardinality setting.
ChecksConfigCardinality
// LogsConfigCardinality is an internal cardinality that represents the logs_tag_cardinality setting.
LogsConfigCardinality
)

// Entity is an entity ID + tags.
Expand Down Expand Up @@ -152,6 +154,11 @@ const (
// StringToTagCardinality extracts a TagCardinality from a string.
// In case of failure to parse, returns an error and defaults to Low.
func StringToTagCardinality(c string) (TagCardinality, error) {
return StringToTagCardinalityWithDefault(c, LowCardinality)
}

// StringToTagCardinalityWithDefault extracts a TagCardinality from a string.
func StringToTagCardinalityWithDefault(c string, defaultCardinality TagCardinality) (TagCardinality, error) {
switch strings.ToLower(c) {
case HighCardinalityString:
return HighCardinality, nil
Expand All @@ -162,7 +169,7 @@ func StringToTagCardinality(c string) (TagCardinality, error) {
case NoneCardinalityString:
return NoneCardinality, nil
default:
return LowCardinality, fmt.Errorf("unsupported value %s received for tag cardinality", c)
return defaultCardinality, fmt.Errorf("unsupported value %s received for tag cardinality", c)
}
}

Expand Down
12 changes: 12 additions & 0 deletions pkg/config/config_template.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,18 @@ api_key:
#
# dogstatsd_tag_cardinality: low

## @param logs_tag_cardinality - string - optional - default: high
## @env DD_LOGS_TAG_CARDINALITY - string - optional - default: high
## Configure the level of granularity of tags to send for logs. Choices are:
## * low: add tags about low-cardinality objects (clusters, hosts, deployments, container images, ...)
## * orchestrator: add tags about pod (in Kubernetes), or task (in ECS or Mesos) level of cardinality
## * high: add tags about high-cardinality objects (individual containers, user IDs in requests, ...)
##
## WARNING: sending container tags for logs may create larger payloads.
## This may impact your logs ingestion billing.
#
# logs_tag_cardinality: high

## @param histogram_aggregates - list of strings - optional - default: ["max", "median", "avg", "count"]
## @env DD_HISTOGRAM_AGGREGATES - space separated list of strings - optional - default: max median avg count
## Configure which aggregated value to compute.
Expand Down
1 change: 1 addition & 0 deletions pkg/config/setup/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -705,6 +705,7 @@ func InitConfig(config pkgconfigmodel.Setup) {
// Changing this setting may impact your custom metrics billing.
config.BindEnvAndSetDefault("checks_tag_cardinality", "low")
config.BindEnvAndSetDefault("dogstatsd_tag_cardinality", "low")
config.BindEnvAndSetDefault("logs_tag_cardinality", "high")

config.BindEnvAndSetDefault("hpa_watcher_polling_freq", 10)
config.BindEnvAndSetDefault("hpa_watcher_gc_period", 60*5) // 5 minutes
Expand Down
2 changes: 1 addition & 1 deletion pkg/logs/internal/tag/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ func (p *provider) GetTags() []string {
p.clock.Sleep(p.taggerWarmupDuration)
})

tags, err := p.tagAdder.Tag(p.entityID, types.HighCardinality)
tags, err := p.tagAdder.Tag(p.entityID, types.LogsConfigCardinality)
if err != nil {
log.Warnf("Cannot tag container %s: %v", p.entityID, err)
return []string{}
Expand Down
2 changes: 1 addition & 1 deletion pkg/logs/tailers/journald/docker.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ func (t *Tailer) getContainerID(entry *sdjournal.JournalEntry) string {

// getContainerTags returns all the tags of a given container.
func (t *Tailer) getContainerTags(containerID string) []string {
tags, err := t.tagger.Tag(types.NewEntityID(types.ContainerID, containerID), types.HighCardinality)
tags, err := t.tagger.Tag(types.NewEntityID(types.ContainerID, containerID), types.LogsConfigCardinality)
if err != nil {
log.Warn(err)
}
Expand Down
11 changes: 11 additions & 0 deletions releasenotes/notes/kube-cardinality-for-logs-8f6b1a20aaf31f56.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Each section from every release note are combined when the
# CHANGELOG.rst is rendered. So the text needs to be worded so that
# it does not depend on any information only available in another
# section. This may mean repeating some details, but each section
# must be readable independently of the other.
#
# Each section note must be formatted as reStructuredText.
---
enhancements:
- |
Allow Kubernetes tag cardinality to be configurable for the Logs Agent.