Skip to content

Commit 1c6f480

Browse files
committed
Add config to enable the host.ip enrichment
1 parent d2f5449 commit 1c6f480

File tree

4 files changed

+116
-22
lines changed

4 files changed

+116
-22
lines changed

processor/elasticapmprocessor/config.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,9 @@ type Config struct {
2727
// the x-elastic-mapping-mode metadata is set to "ecs". Traces are always enriched regardless
2828
// of this setting. Defaults to false for backwards compatibility (always enrich).
2929
SkipEnrichment bool `mapstructure:"skip_enrichment"`
30+
31+
// HostIPEnabled controls whether the `host.ip` resource attribute should be set using client info address.
32+
// When true, the processor will set the `host.ip` attribute from the client address when
33+
// the mapping mode is "ecs". Defaults to true.
34+
HostIPEnabled bool `mapstructure:"host_ip_enabled"`
3035
}

processor/elasticapmprocessor/factory.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ func NewFactory() processor.Factory {
4343

4444
func createDefaultConfig() component.Config {
4545
return &Config{
46-
Config: config.Enabled(),
46+
Config: config.Enabled(),
47+
SkipEnrichment: false,
48+
HostIPEnabled: true,
4749
}
4850
}
4951

processor/elasticapmprocessor/processor.go

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,15 @@ type TraceProcessor struct {
4545
next consumer.Traces
4646
enricher *enrichments.Enricher
4747
logger *zap.Logger
48+
cfg *Config
4849
}
4950

5051
func NewTraceProcessor(cfg *Config, next consumer.Traces, logger *zap.Logger) *TraceProcessor {
5152
return &TraceProcessor{
5253
next: next,
5354
logger: logger,
5455
enricher: enrichments.NewEnricher(cfg.Config),
56+
cfg: cfg,
5557
}
5658
}
5759

@@ -66,7 +68,9 @@ func (p *TraceProcessor) ConsumeTraces(ctx context.Context, td ptrace.Traces) er
6668
resourceSpan := resourceSpans.At(i)
6769
resource := resourceSpan.Resource()
6870
ecs.TranslateResourceMetadata(resource)
69-
ecs.SetHostIP(ctx, resource.Attributes())
71+
if p.cfg.HostIPEnabled {
72+
ecs.SetHostIP(ctx, resource.Attributes())
73+
}
7074
routing.EncodeDataStream(resource, "traces")
7175
p.enricher.Config.Resource.DeploymentEnvironment.Enabled = false
7276
}
@@ -94,18 +98,18 @@ type LogProcessor struct {
9498
component.StartFunc
9599
component.ShutdownFunc
96100

97-
next consumer.Logs
98-
enricher *enrichments.Enricher
99-
logger *zap.Logger
100-
skipEnrichment bool
101+
next consumer.Logs
102+
enricher *enrichments.Enricher
103+
logger *zap.Logger
104+
cfg *Config
101105
}
102106

103107
func newLogProcessor(cfg *Config, next consumer.Logs, logger *zap.Logger) *LogProcessor {
104108
return &LogProcessor{
105-
next: next,
106-
logger: logger,
107-
enricher: enrichments.NewEnricher(cfg.Config),
108-
skipEnrichment: cfg.SkipEnrichment,
109+
next: next,
110+
logger: logger,
111+
enricher: enrichments.NewEnricher(cfg.Config),
112+
cfg: cfg,
109113
}
110114
}
111115

@@ -117,18 +121,18 @@ type MetricProcessor struct {
117121
component.StartFunc
118122
component.ShutdownFunc
119123

120-
next consumer.Metrics
121-
enricher *enrichments.Enricher
122-
logger *zap.Logger
123-
skipEnrichment bool
124+
next consumer.Metrics
125+
enricher *enrichments.Enricher
126+
logger *zap.Logger
127+
cfg *Config
124128
}
125129

126130
func newMetricProcessor(cfg *Config, next consumer.Metrics, logger *zap.Logger) *MetricProcessor {
127131
return &MetricProcessor{
128-
next: next,
129-
logger: logger,
130-
enricher: enrichments.NewEnricher(cfg.Config),
131-
skipEnrichment: cfg.SkipEnrichment,
132+
next: next,
133+
logger: logger,
134+
enricher: enrichments.NewEnricher(cfg.Config),
135+
cfg: cfg,
132136
}
133137
}
134138

@@ -144,14 +148,16 @@ func (p *MetricProcessor) ConsumeMetrics(ctx context.Context, md pmetric.Metrics
144148
resourceMetric := resourceMetrics.At(i)
145149
resource := resourceMetric.Resource()
146150
ecs.TranslateResourceMetadata(resource)
147-
ecs.SetHostIP(ctx, resource.Attributes())
151+
if p.cfg.HostIPEnabled {
152+
ecs.SetHostIP(ctx, resource.Attributes())
153+
}
148154
routing.EncodeDataStream(resource, "metrics")
149155
p.enricher.Config.Resource.DeploymentEnvironment.Enabled = false
150156
}
151157
}
152158
// When skipEnrichment is true, only enrich when mapping mode is ecs
153159
// When skipEnrichment is false (default), always enrich (backwards compatible)
154-
if !p.skipEnrichment || ecsMode {
160+
if !p.cfg.SkipEnrichment || ecsMode {
155161
p.enricher.EnrichMetrics(md)
156162
}
157163
return p.next.ConsumeMetrics(ctx, md)
@@ -165,15 +171,17 @@ func (p *LogProcessor) ConsumeLogs(ctx context.Context, ld plog.Logs) error {
165171
resourceLog := resourceLogs.At(i)
166172
resource := resourceLog.Resource()
167173
ecs.TranslateResourceMetadata(resource)
168-
ecs.SetHostIP(ctx, resource.Attributes())
174+
if p.cfg.HostIPEnabled {
175+
ecs.SetHostIP(ctx, resource.Attributes())
176+
}
169177
routing.EncodeDataStream(resource, "logs")
170178
p.enricher.Config.Resource.AgentVersion.Enabled = false
171179
p.enricher.Config.Resource.DeploymentEnvironment.Enabled = false
172180
}
173181
}
174182
// When skipEnrichment is true, only enrich when mapping mode is ecs
175183
// When skipEnrichment is false (default), always enrich (backwards compatible)
176-
if !p.skipEnrichment || ecsMode {
184+
if !p.cfg.SkipEnrichment || ecsMode {
177185
p.enricher.EnrichLogs(ld)
178186
}
179187
return p.next.ConsumeLogs(ctx, ld)
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
SemConv Package Versions:
2+
• go.opentelemetry.io/otel/semconv/v1.22.0 (imported as semconv22)
3+
• go.opentelemetry.io/otel/semconv/v1.27.0 (imported as semconv)
4+
5+
6+
| OTEL | APM | Level |
7+
|------|-----|-------|
8+
| semconv.ServiceNameKey | event.Service.Name | resource |
9+
| semconv.ServiceVersionKey | event.Service.Version | resource |
10+
| semconv.TelemetrySDKLanguageKey | event.Service.Language.Name (translated) | resource |
11+
| semconv.TelemetrySDKNameKey | "ElasticAPM" (hardcoded) | resource |
12+
| semconv22.DeploymentEnvironmentKey | event.Service.Environment | resource |
13+
| semconv.DeploymentEnvironmentNameKey | event.Service.Environment | resource |
14+
| semconv.ServiceInstanceIDKey | event.Service.Node.Name | resource |
15+
| semconv.HostNameKey | event.Host.Name | resource |
16+
| semconv.HostIDKey | event.Host.Id | resource |
17+
| semconv.HostArchKey | event.Host.Architecture | resource |
18+
| semconv.OSNameKey | event.Host.Os.Name | resource |
19+
| semconv.OSVersionKey | event.Host.Os.Version | resource |
20+
| semconv.UserAgentOriginalKey | event.UserAgent.Original | resource |
21+
| semconv.CloudProviderKey | event.Cloud.Provider | resource |
22+
| semconv.CloudRegionKey | event.Cloud.Region | resource |
23+
| semconv.CloudAvailabilityZoneKey | event.Cloud.AvailabilityZone | resource |
24+
| semconv.CloudAccountIDKey | event.Cloud.AccountId | resource |
25+
| semconv.CloudPlatformKey | event.Cloud.ServiceName | resource |
26+
| semconv.ContainerIDKey | event.Container.Id | resource |
27+
| semconv.ContainerNameKey | event.Container.Name | resource |
28+
| semconv.ContainerRuntimeKey | event.Container.Runtime | resource |
29+
| semconv.ContainerImageNameKey | event.Container.ImageName | resource |
30+
| semconv.ContainerImageTagsKey | event.Container.ImageTag | resource |
31+
| semconv.K8SNamespaceNameKey | event.Kubernetes.Namespace | resource |
32+
| semconv.K8SNodeNameKey | event.Kubernetes.NodeName | resource |
33+
| semconv.K8SPodNameKey | event.Kubernetes.PodName | resource |
34+
| semconv.K8SPodUIDKey | event.Kubernetes.PodUid | resource |
35+
| semconv.ProcessPIDKey | event.Process.Pid | resource |
36+
| semconv.ProcessParentPIDKey | event.Process.Ppid | resource |
37+
| semconv.ProcessExecutableNameKey | event.Process.Title | resource |
38+
| semconv.ProcessCommandLineKey | event.Process.Argv (joined) | resource |
39+
| semconv.ProcessExecutablePathKey | event.Process.Executable | resource |
40+
| semconv.UserIDKey | event.User.Id | resource |
41+
| semconv.UserEmailKey | event.User.Email | resource |
42+
| semconv.UserNameKey | event.User.Name | resource |
43+
| semconv.NetworkConnectionTypeKey | event.Network.Connection.Type | resource |
44+
| semconv.NetworkConnectionSubtypeKey | event.Network.Connection.Subtype | resource |
45+
| semconv.NetworkCarrierNameKey | event.Network.Carrier.Name | resource |
46+
| semconv.NetworkCarrierMccKey | event.Network.Carrier.Mcc | resource |
47+
| semconv.NetworkCarrierMncKey | event.Network.Carrier.Mnc | resource |
48+
| semconv.NetworkCarrierIccKey | event.Network.Carrier.Icc | resource |
49+
| semconv.ClientAddressKey | event.Client.Ip (converted to string) | resource |
50+
| semconv.ClientPortKey | event.Client.Port | resource |
51+
| semconv.SourceAddressKey | event.Source.Ip (converted to string) | resource |
52+
| semconv.SourcePortKey | event.Source.Port | resource |
53+
| semconv.FaaSInstanceKey | event.Faas.Id | resource |
54+
| semconv.FaaSNameKey | event.Faas.Name | resource |
55+
| semconv.FaaSVersionKey | event.Faas.Version | resource |
56+
| semconv.FaaSTriggerKey | event.Faas.TriggerType | resource |
57+
| semconv.FaaSColdstartKey | event.Faas.ColdStart | resource |
58+
| semconv.HTTPRequestMethodKey | event.Http.Request.Method | span,log |
59+
| semconv.HTTPResponseStatusCodeKey | event.Http.Response.StatusCode | span,log |
60+
| semconv.HTTPResponseSizeKey | event.Http.Response.EncodedBodySize | span,log |
61+
| semconv.URLOriginalKey | event.Url.Original | span,log |
62+
| semconv.URLSchemeKey | event.Url.Scheme | span,log |
63+
| semconv.URLFullKey | event.Url.Full | span,log |
64+
| semconv.URLDomainKey | event.Url.Domain | span,log |
65+
| semconv.URLPathKey | event.Url.Path | span,log |
66+
| semconv.URLQueryKey | event.Url.Query | span,log |
67+
| semconv.URLFragmentKey | event.Url.Fragment | span,log |
68+
| semconv.URLPortKey | event.Url.Port | span,log |
69+
| semconv.MessagingDestinationNameKey | event.Transaction.Message.QueueName | span |
70+
| semconv.MessagingRabbitmqDestinationRoutingKeyKey | event.Transaction.Message.RoutingKey | span |
71+
| semconv.MessagingDestinationNameKey | event.Span.Message.QueueName | span |
72+
| semconv.MessagingRabbitmqDestinationRoutingKeyKey | event.Span.Message.RoutingKey | span |
73+
| semconv.MessagingSystemKey | event.Span.Subtype | span |
74+
| semconv.MessagingOperationNameKey | event.Span.Action | span |
75+
| semconv.DBSystemKey | event.Span.Db.Type | span |
76+
| semconv.DBNamespaceKey | event.Span.Db.Instance | span |
77+
| semconv.DBQueryTextKey | event.Span.Db.Statement | span |
78+
| semconv.DestinationAddressKey | event.Destination.Address | span |
79+
| semconv.DestinationPortKey | event.Destination.Port | span |

0 commit comments

Comments
 (0)