Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
f664852
fix: log warning instead of failing on unsupported OSes for #14307
EdgeN8v Dec 22, 2025
f6955c8
Add changelog
EdgeN8v Dec 24, 2025
917dc50
fix: skip process metrics registration on AIX only
EdgeN8v Jan 6, 2026
44d206f
style: go fmt
EdgeN8v Jan 6, 2026
ec71fb4
fix: move constant to global scope and fix changelog formatting
EdgeN8v Jan 6, 2026
11dac2e
Merge branch 'main' into fix/14307-aix-crash
EdgeN8v Jan 6, 2026
9377655
Update .chloggen/fix-aix-crash.yaml
EdgeN8v Jan 6, 2026
2dc9a25
Update .chloggen/fix-aix-crash.yaml
EdgeN8v Jan 7, 2026
685edfd
refactor: use allowlist for process metrics OS support
EdgeN8v Jan 7, 2026
8303cfa
refactor: use build tags for process metrics support
EdgeN8v Jan 7, 2026
0f7ee83
fix: wrap error context for process metrics registration
EdgeN8v Jan 7, 2026
0ece2b3
chore: add missing license headers
EdgeN8v Jan 8, 2026
51d5b0a
Merge branch 'main' into fix/14307-aix-crash
EdgeN8v Jan 8, 2026
2f47f4a
style: apply go fmt fixes
EdgeN8v Jan 8, 2026
9830093
Merge branch 'fix/14307-aix-crash' of https://github.com/EdgeN8v/open…
EdgeN8v Jan 8, 2026
890b8a5
chore: add porto import comments
EdgeN8v Jan 8, 2026
01df302
test: add unit test coverage for process metrics
EdgeN8v Jan 9, 2026
7b129ae
Merge branch 'main' into fix/14307-aix-crash
EdgeN8v Jan 9, 2026
47a3a20
test: add unit test coverage for process metrics on unsupported OSes
EdgeN8v Jan 9, 2026
fb6f933
Merge branch 'main' into fix/14307-aix-crash
EdgeN8v Jan 9, 2026
d7bc9fe
chore: generate chloggen components and update tests
EdgeN8v Jan 9, 2026
acff13b
Merge branch 'fix/14307-aix-crash' of https://github.com/EdgeN8v/open…
EdgeN8v Jan 9, 2026
24ba878
Merge branch 'main' into fix/14307-aix-crash
EdgeN8v Jan 12, 2026
e0c7d20
Merge branch 'main' into fix/14307-aix-crash
EdgeN8v Jan 15, 2026
9319b20
test: refactor registerProcessMetrics to var for testability
EdgeN8v Jan 15, 2026
1bf5b56
revert: remove test refactoring based on review feedback
EdgeN8v Jan 15, 2026
30d4877
test: add poison meter factory to fix codecov failure in New
EdgeN8v Jan 16, 2026
8b9aeca
Merge branch 'main' into fix/14307-aix-crash
EdgeN8v Jan 17, 2026
b1cca13
service: make process metrics registration failure test deterministic
EdgeN8v Jan 17, 2026
9f7c331
Merge branch 'main' into fix/14307-aix-crash
EdgeN8v Jan 19, 2026
b74324a
service: restore ready-to-merge state
EdgeN8v Jan 19, 2026
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
4 changes: 4 additions & 0 deletions .chloggen/fix-aix-crash.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
change_type: bug_fix
component: pkg/service
note: "Don't error on startup when process metrics are enabled on unsupported OSes (e.g. AIX)"
issues: [14307]
33 changes: 31 additions & 2 deletions service/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -223,9 +223,11 @@ func New(ctx context.Context, set Settings, cfg Config) (_ *Service, resultErr e
return nil, err
}

if err := proctelemetry.RegisterProcessMetrics(srv.telemetrySettings); err != nil {
return nil, fmt.Errorf("failed to register process metrics: %w", err)
// Register process metrics on supported OSes.
if err := registerProcessMetrics(srv, runtime.GOOS, proctelemetry.RegisterProcessMetrics); err != nil {
return nil, err
}

return srv, nil
}

Expand Down Expand Up @@ -364,3 +366,30 @@ func Validate(ctx context.Context, set Settings, cfg Config) error {
}
return nil
}

// registerProcessMetrics registers process metrics on supported operating systems.
//
// Historically, attempting to register process metrics on unsupported platforms
// (e.g. AIX) caused the Collector to fail at startup.
// See https://github.com/open-telemetry/opentelemetry-collector/issues/12098
func registerProcessMetrics(
srv *Service,
goos string,
register func(component.TelemetrySettings, ...proctelemetry.RegisterOption) error,
) error {
switch goos {
// Only support the OSes that we explicitly test and build for,
// plus others that are known to have some support in gopsutil.
case "linux", "darwin", "windows", "freebsd", "openbsd", "solaris", "plan9":
if err := register(srv.telemetrySettings); err != nil {
return fmt.Errorf("failed to register process metrics: %w", err)
}
default:
// On unsupported OSes, log a warning and continue startup.
srv.telemetrySettings.Logger.Warn(
"Process metrics are disabled on this operating system",
zap.String("os", goos),
)
}
return nil
}
57 changes: 57 additions & 0 deletions service/service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import (
"go.opentelemetry.io/collector/pipeline/xpipeline"
"go.opentelemetry.io/collector/service/extensions"
"go.opentelemetry.io/collector/service/internal/builders"
"go.opentelemetry.io/collector/service/internal/proctelemetry"
"go.opentelemetry.io/collector/service/pipelines"
"go.opentelemetry.io/collector/service/telemetry"
"go.opentelemetry.io/collector/service/telemetry/otelconftelemetry"
Expand Down Expand Up @@ -825,3 +826,59 @@ func TestValidateGraph(t *testing.T) {
})
}
}

func TestRegisterProcessMetrics_UnsupportedOS_Warns(t *testing.T) {
mockRegister := func(_ component.TelemetrySettings, _ ...proctelemetry.RegisterOption) error {
t.Fatalf("should not be called on unsupported OS")
return nil
}

core, logs := observer.New(zapcore.WarnLevel)
logger := zap.New(core)

srv := &Service{
telemetrySettings: component.TelemetrySettings{Logger: logger},
}

err := registerProcessMetrics(srv, "aix", mockRegister)

require.NoError(t, err)
require.Equal(t, 1, logs.Len(), "Expected exactly one warning log")
entry := logs.All()[0]
require.Equal(t, "Process metrics are disabled on this operating system", entry.Message)
require.Equal(t, "aix", entry.ContextMap()["os"], "Log should contain the OS field")
}

func TestRegisterProcessMetrics_SupportedOS_CallsRegister(t *testing.T) {
called := false
mockRegister := func(_ component.TelemetrySettings, _ ...proctelemetry.RegisterOption) error {
called = true
return nil
}

srv := &Service{
telemetrySettings: component.TelemetrySettings{Logger: zap.NewNop()},
}

err := registerProcessMetrics(srv, "linux", mockRegister)

require.NoError(t, err)
require.True(t, called, "Registration function should be called on supported OS")
}

func TestRegisterProcessMetrics_SupportedOS_RegisterFails_ReturnsError(t *testing.T) {
wantErr := errors.New("boom")
mockRegister := func(_ component.TelemetrySettings, _ ...proctelemetry.RegisterOption) error {
return wantErr
}

srv := &Service{
telemetrySettings: component.TelemetrySettings{Logger: zap.NewNop()},
}

err := registerProcessMetrics(srv, "linux", mockRegister)

require.Error(t, err)
require.ErrorIs(t, err, wantErr)
require.Contains(t, err.Error(), "failed to register process metrics")
}
Loading