Skip to content

Commit af90c18

Browse files
mx-psipmatyjasek-sumo
authored andcommitted
[system detector] Fallback to os.Hostname when FQDN is not available (open-telemetry#3099)
- Fall back to `os.Hostname` when FQDN is not available. **Link to tracking Issue:** Fixes open-telemetry#3092
1 parent b0e9d78 commit af90c18

File tree

3 files changed

+55
-13
lines changed

3 files changed

+55
-13
lines changed

processor/resourcedetectionprocessor/internal/system/metadata.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,17 @@
1515
package system
1616

1717
import (
18+
"os"
1819
"runtime"
1920
"strings"
2021

2122
"github.com/Showmax/go-fqdn"
2223
)
2324

2425
type systemMetadata interface {
26+
// Hostname returns the OS hostname
27+
Hostname() (string, error)
28+
2529
// FQDN returns the fully qualified domain name
2630
FQDN() (string, error)
2731

@@ -47,3 +51,7 @@ func (*systemMetadataImpl) OSType() (string, error) {
4751
func (*systemMetadataImpl) FQDN() (string, error) {
4852
return fqdn.FqdnHostname()
4953
}
54+
55+
func (*systemMetadataImpl) Hostname() (string, error) {
56+
return os.Hostname()
57+
}

processor/resourcedetectionprocessor/internal/system/system.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"go.opentelemetry.io/collector/component"
2222
"go.opentelemetry.io/collector/consumer/pdata"
2323
"go.opentelemetry.io/collector/translator/conventions"
24+
"go.uber.org/zap"
2425

2526
"github.com/open-telemetry/opentelemetry-collector-contrib/processor/resourcedetectionprocessor/internal"
2627
)
@@ -35,11 +36,12 @@ var _ internal.Detector = (*Detector)(nil)
3536
// Detector is a system metadata detector
3637
type Detector struct {
3738
provider systemMetadata
39+
logger *zap.Logger
3840
}
3941

4042
// NewDetector creates a new system metadata detector
41-
func NewDetector(component.ProcessorCreateParams, internal.DetectorConfig) (internal.Detector, error) {
42-
return &Detector{provider: &systemMetadataImpl{}}, nil
43+
func NewDetector(p component.ProcessorCreateParams, _ internal.DetectorConfig) (internal.Detector, error) {
44+
return &Detector{provider: &systemMetadataImpl{}, logger: p.Logger}, nil
4345
}
4446

4547
// Detect detects system metadata and returns a resource with the available ones
@@ -52,12 +54,17 @@ func (d *Detector) Detect(_ context.Context) (pdata.Resource, error) {
5254
return res, fmt.Errorf("failed getting OS type: %w", err)
5355
}
5456

55-
fqdn, err := d.provider.FQDN()
57+
hostname, err := d.provider.FQDN()
5658
if err != nil {
57-
return res, fmt.Errorf("failed getting FQDN: %w", err)
59+
// Fallback to OS hostname
60+
d.logger.Debug("FQDN query failed, falling back to OS hostname", zap.Error(err))
61+
hostname, err = d.provider.Hostname()
62+
if err != nil {
63+
return res, fmt.Errorf("failed getting OS hostname: %w", err)
64+
}
5865
}
5966

60-
attrs.InsertString(conventions.AttributeHostName, fqdn)
67+
attrs.InsertString(conventions.AttributeHostName, hostname)
6168
attrs.InsertString(conventions.AttributeOSType, osType)
6269

6370
return res, nil

processor/resourcedetectionprocessor/internal/system/system_test.go

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ type mockMetadata struct {
3333
mock.Mock
3434
}
3535

36+
func (m *mockMetadata) Hostname() (string, error) {
37+
args := m.MethodCalled("Hostname")
38+
return args.String(0), args.Error(1)
39+
}
40+
3641
func (m *mockMetadata) FQDN() (string, error) {
3742
args := m.MethodCalled("FQDN")
3843
return args.String(0), args.Error(1)
@@ -54,7 +59,7 @@ func TestDetectFQDNAvailable(t *testing.T) {
5459
md.On("FQDN").Return("fqdn", nil)
5560
md.On("OSType").Return("DARWIN", nil)
5661

57-
detector := &Detector{provider: md}
62+
detector := &Detector{provider: md, logger: zap.NewNop()}
5863
res, err := detector.Detect(context.Background())
5964
require.NoError(t, err)
6065
md.AssertExpectations(t)
@@ -70,23 +75,45 @@ func TestDetectFQDNAvailable(t *testing.T) {
7075

7176
}
7277

78+
func TestFallbackHostname(t *testing.T) {
79+
mdHostname := &mockMetadata{}
80+
mdHostname.On("Hostname").Return("hostname", nil)
81+
mdHostname.On("FQDN").Return("", errors.New("err"))
82+
mdHostname.On("OSType").Return("DARWIN", nil)
83+
84+
detector := &Detector{provider: mdHostname, logger: zap.NewNop()}
85+
res, err := detector.Detect(context.Background())
86+
require.NoError(t, err)
87+
mdHostname.AssertExpectations(t)
88+
res.Attributes().Sort()
89+
90+
expected := internal.NewResource(map[string]interface{}{
91+
conventions.AttributeHostName: "hostname",
92+
conventions.AttributeOSType: "DARWIN",
93+
})
94+
expected.Attributes().Sort()
95+
96+
assert.Equal(t, expected, res)
97+
}
98+
7399
func TestDetectError(t *testing.T) {
74-
// FQDN fails
100+
// FQDN and hostname fail
75101
mdFQDN := &mockMetadata{}
76102
mdFQDN.On("OSType").Return("WINDOWS", nil)
77103
mdFQDN.On("FQDN").Return("", errors.New("err"))
104+
mdFQDN.On("Hostname").Return("", errors.New("err"))
78105

79-
detector := &Detector{provider: mdFQDN}
106+
detector := &Detector{provider: mdFQDN, logger: zap.NewNop()}
80107
res, err := detector.Detect(context.Background())
81108
assert.Error(t, err)
82109
assert.True(t, internal.IsEmptyResource(res))
83110

84-
// Hostname fails
85-
mdHostname := &mockMetadata{}
86-
mdHostname.On("FQDN").Return("fqdn", nil)
87-
mdHostname.On("OSType").Return("", errors.New("err"))
111+
// OS type fails
112+
mdOSType := &mockMetadata{}
113+
mdOSType.On("FQDN").Return("fqdn", nil)
114+
mdOSType.On("OSType").Return("", errors.New("err"))
88115

89-
detector = &Detector{provider: mdHostname}
116+
detector = &Detector{provider: mdOSType, logger: zap.NewNop()}
90117
res, err = detector.Detect(context.Background())
91118
assert.Error(t, err)
92119
assert.True(t, internal.IsEmptyResource(res))

0 commit comments

Comments
 (0)