Skip to content

Commit 19f2a53

Browse files
authored
[processor/resourcedetection] Fix system detector not setting attributes (#24670)
1 parent 79513ba commit 19f2a53

File tree

3 files changed

+66
-31
lines changed

3 files changed

+66
-31
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Use this changelog template to create an entry for release notes.
2+
# If your change doesn't affect end users, such as a test fix or a tooling change,
3+
# you should instead start your pull request title with [chore] or use the "Skip Changelog" label.
4+
5+
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
6+
change_type: bug_fix
7+
8+
# The name of the component, or a single word describing the area of concern, (e.g. filelogreceiver)
9+
component: processor/resourcedetection
10+
11+
# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
12+
note: Do not drop all system attributes if `host.id` cannot be fetched.
13+
14+
# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists.
15+
issues: [24669]

processor/resourcedetectionprocessor/internal/system/system.go

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ var _ internal.Detector = (*Detector)(nil)
3434

3535
// Detector is a system metadata detector
3636
type Detector struct {
37-
provider system.Provider
38-
logger *zap.Logger
39-
hostnameSources []string
40-
rb *metadata.ResourceBuilder
37+
provider system.Provider
38+
logger *zap.Logger
39+
cfg Config
40+
rb *metadata.ResourceBuilder
4141
}
4242

4343
// NewDetector creates a new system metadata detector
@@ -48,10 +48,10 @@ func NewDetector(p processor.CreateSettings, dcfg internal.DetectorConfig) (inte
4848
}
4949

5050
return &Detector{
51-
provider: system.NewProvider(),
52-
logger: p.Logger,
53-
hostnameSources: cfg.HostnameSources,
54-
rb: metadata.NewResourceBuilder(cfg.ResourceAttributes),
51+
provider: system.NewProvider(),
52+
logger: p.Logger,
53+
cfg: cfg,
54+
rb: metadata.NewResourceBuilder(cfg.ResourceAttributes),
5555
}, nil
5656
}
5757

@@ -64,23 +64,24 @@ func (d *Detector) Detect(ctx context.Context) (resource pcommon.Resource, schem
6464
return pcommon.NewResource(), "", fmt.Errorf("failed getting OS type: %w", err)
6565
}
6666

67-
hostID, err := d.provider.HostID(ctx)
68-
if err != nil {
69-
return pcommon.NewResource(), "", fmt.Errorf("failed getting host ID: %w", err)
70-
}
71-
7267
hostArch, err := d.provider.HostArch()
7368
if err != nil {
7469
return pcommon.NewResource(), "", fmt.Errorf("failed getting host architecture: %w", err)
7570
}
7671

77-
for _, source := range d.hostnameSources {
72+
for _, source := range d.cfg.HostnameSources {
7873
getHostFromSource := hostnameSourcesMap[source]
7974
hostname, err = getHostFromSource(d)
8075
if err == nil {
8176
d.rb.SetHostName(hostname)
8277
d.rb.SetOsType(osType)
83-
d.rb.SetHostID(hostID)
78+
if d.cfg.ResourceAttributes.HostID.Enabled {
79+
if hostID, hostIDErr := d.provider.HostID(ctx); hostIDErr == nil {
80+
d.rb.SetHostID(hostID)
81+
} else {
82+
d.logger.Warn("failed to get host ID", zap.Error(hostIDErr))
83+
}
84+
}
8485
d.rb.SetHostArch(hostArch)
8586
return d.rb.Emit(), conventions.SchemaURL, nil
8687
}

processor/resourcedetectionprocessor/internal/system/system_test.go

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,7 @@ func TestDetectFQDNAvailable(t *testing.T) {
102102
md.On("HostID").Return("2", nil)
103103
md.On("HostArch").Return("amd64", nil)
104104

105-
detector := &Detector{provider: md, logger: zap.NewNop(), hostnameSources: []string{"dns"},
106-
rb: metadata.NewResourceBuilder(allEnabledConfig())}
105+
detector := newTestDetector(md, []string{"dns"}, allEnabledConfig())
107106
res, schemaURL, err := detector.Detect(context.Background())
108107
require.NoError(t, err)
109108
assert.Equal(t, conventions.SchemaURL, schemaURL)
@@ -125,15 +124,14 @@ func TestFallbackHostname(t *testing.T) {
125124
mdHostname.On("Hostname").Return("hostname", nil)
126125
mdHostname.On("FQDN").Return("", errors.New("err"))
127126
mdHostname.On("OSType").Return("darwin", nil)
128-
mdHostname.On("HostID").Return("3", nil)
129127
mdHostname.On("HostArch").Return("amd64", nil)
130128

131-
detector := &Detector{provider: mdHostname, logger: zap.NewNop(), hostnameSources: []string{"dns", "os"},
132-
rb: metadata.NewResourceBuilder(metadata.DefaultResourceAttributesConfig())}
129+
detector := newTestDetector(mdHostname, []string{"dns", "os"}, metadata.DefaultResourceAttributesConfig())
133130
res, schemaURL, err := detector.Detect(context.Background())
134131
require.NoError(t, err)
135132
assert.Equal(t, conventions.SchemaURL, schemaURL)
136133
mdHostname.AssertExpectations(t)
134+
mdHostname.AssertNotCalled(t, "HostID")
137135

138136
expected := map[string]any{
139137
conventions.AttributeHostName: "hostname",
@@ -151,8 +149,7 @@ func TestEnableHostID(t *testing.T) {
151149
mdHostname.On("HostID").Return("3", nil)
152150
mdHostname.On("HostArch").Return("amd64", nil)
153151

154-
detector := &Detector{provider: mdHostname, logger: zap.NewNop(), hostnameSources: []string{"dns", "os"},
155-
rb: metadata.NewResourceBuilder(allEnabledConfig())}
152+
detector := newTestDetector(mdHostname, []string{"dns", "os"}, allEnabledConfig())
156153
res, schemaURL, err := detector.Detect(context.Background())
157154
require.NoError(t, err)
158155
assert.Equal(t, conventions.SchemaURL, schemaURL)
@@ -175,8 +172,7 @@ func TestUseHostname(t *testing.T) {
175172
mdHostname.On("HostID").Return("1", nil)
176173
mdHostname.On("HostArch").Return("amd64", nil)
177174

178-
detector := &Detector{provider: mdHostname, logger: zap.NewNop(), hostnameSources: []string{"os"},
179-
rb: metadata.NewResourceBuilder(allEnabledConfig())}
175+
detector := newTestDetector(mdHostname, []string{"os"}, allEnabledConfig())
180176
res, schemaURL, err := detector.Detect(context.Background())
181177
require.NoError(t, err)
182178
assert.Equal(t, conventions.SchemaURL, schemaURL)
@@ -201,8 +197,7 @@ func TestDetectError(t *testing.T) {
201197
mdFQDN.On("HostID").Return("", errors.New("err"))
202198
mdFQDN.On("HostArch").Return("amd64", nil)
203199

204-
detector := &Detector{provider: mdFQDN, logger: zap.NewNop(), hostnameSources: []string{"dns"},
205-
rb: metadata.NewResourceBuilder(allEnabledConfig())}
200+
detector := newTestDetector(mdFQDN, []string{"dns"}, allEnabledConfig())
206201
res, schemaURL, err := detector.Detect(context.Background())
207202
assert.Error(t, err)
208203
assert.Equal(t, "", schemaURL)
@@ -215,8 +210,7 @@ func TestDetectError(t *testing.T) {
215210
mdHostname.On("HostID").Return("", errors.New("err"))
216211
mdHostname.On("HostArch").Return("amd64", nil)
217212

218-
detector = &Detector{provider: mdHostname, logger: zap.NewNop(), hostnameSources: []string{"os"},
219-
rb: metadata.NewResourceBuilder(allEnabledConfig())}
213+
detector = newTestDetector(mdHostname, []string{"os"}, allEnabledConfig())
220214
res, schemaURL, err = detector.Detect(context.Background())
221215
assert.Error(t, err)
222216
assert.Equal(t, "", schemaURL)
@@ -226,13 +220,38 @@ func TestDetectError(t *testing.T) {
226220
mdOSType := &mockMetadata{}
227221
mdOSType.On("FQDN").Return("fqdn", nil)
228222
mdOSType.On("OSType").Return("", errors.New("err"))
229-
mdOSType.On("HostID").Return("", errors.New("err"))
223+
mdOSType.On("HostID").Return("1", nil)
230224
mdOSType.On("HostArch").Return("amd64", nil)
231225

232-
detector = &Detector{provider: mdOSType, logger: zap.NewNop(), hostnameSources: []string{"dns"},
233-
rb: metadata.NewResourceBuilder(allEnabledConfig())}
226+
detector = newTestDetector(mdOSType, []string{"os"}, allEnabledConfig())
234227
res, schemaURL, err = detector.Detect(context.Background())
235228
assert.Error(t, err)
236229
assert.Equal(t, "", schemaURL)
237230
assert.True(t, internal.IsEmptyResource(res))
231+
232+
// Host ID fails. All other attributes should be set.
233+
mdHostID := &mockMetadata{}
234+
mdHostID.On("Hostname").Return("hostname", nil)
235+
mdHostID.On("OSType").Return("linux", nil)
236+
mdHostID.On("HostID").Return("", errors.New("err"))
237+
mdHostID.On("HostArch").Return("arm64", nil)
238+
239+
detector = newTestDetector(mdHostID, []string{"os"}, allEnabledConfig())
240+
res, schemaURL, err = detector.Detect(context.Background())
241+
assert.NoError(t, err)
242+
assert.Equal(t, conventions.SchemaURL, schemaURL)
243+
assert.Equal(t, map[string]any{
244+
conventions.AttributeHostName: "hostname",
245+
conventions.AttributeOSType: "linux",
246+
conventions.AttributeHostArch: conventions.AttributeHostArchARM64,
247+
}, res.Attributes().AsRaw())
248+
}
249+
250+
func newTestDetector(mock *mockMetadata, hostnameSources []string, resCfg metadata.ResourceAttributesConfig) *Detector {
251+
return &Detector{
252+
provider: mock,
253+
logger: zap.NewNop(),
254+
cfg: Config{HostnameSources: hostnameSources, ResourceAttributes: resCfg},
255+
rb: metadata.NewResourceBuilder(resCfg),
256+
}
238257
}

0 commit comments

Comments
 (0)