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
5 changes: 3 additions & 2 deletions cli_flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (

"github.com/peterbourgon/ff/v3"

"go.opentelemetry.io/ebpf-profiler/collector/config"
"go.opentelemetry.io/ebpf-profiler/internal/controller"
"go.opentelemetry.io/ebpf-profiler/tracer"
)
Expand Down Expand Up @@ -42,7 +43,7 @@ var (
mapScaleFactorHelp = fmt.Sprintf("Scaling factor for eBPF map sizes. "+
"Every increase by 1 doubles the map size. Increase if you see eBPF map size errors. "+
"Default is %d corresponding to 4GB of executable address space, max is %d.",
defaultArgMapScaleFactor, controller.MaxArgMapScaleFactor)
defaultArgMapScaleFactor, config.MaxArgMapScaleFactor)
disableTLSHelp = "Disable encryption for data in transit."
bpfVerifierLogLevelHelp = "Log level of the eBPF verifier output (0,1,2). Default is 0."
versionHelp = "Show version."
Expand Down Expand Up @@ -84,7 +85,7 @@ func parseArgs() (*controller.Config, error) {
fs := flag.NewFlagSet("ebpf-profiler", flag.ExitOnError)

// Please keep the parameters ordered alphabetically in the source-code.
fs.UintVar(&args.BpfVerifierLogLevel, "bpf-log-level", 0, bpfVerifierLogLevelHelp)
fs.UintVar(&args.BPFVerifierLogLevel, "bpf-log-level", 0, bpfVerifierLogLevelHelp)

fs.StringVar(&args.CollAgentAddr, "collection-agent", "", collAgentAddrHelp)
fs.BoolVar(&args.Copyright, "copyright", false, copyrightHelp)
Expand Down
28 changes: 0 additions & 28 deletions collector/config.go

This file was deleted.

114 changes: 114 additions & 0 deletions collector/config/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

package config // import "go.opentelemetry.io/ebpf-profiler/collector/config"

import (
"errors"
"fmt"
"runtime"
"time"

"go.opentelemetry.io/collector/confmap/xconfmap"
"go.opentelemetry.io/ebpf-profiler/tracer"
)

const (
// 1TB of executable address space
MaxArgMapScaleFactor = 8
)

// Config is the configuration for the collector.
type Config struct {
ReporterInterval time.Duration `mapstructure:"reporter_interval"`
MonitorInterval time.Duration `mapstructure:"monitor_interval"`
SamplesPerSecond int `mapstructure:"samples_per_second"`
ProbabilisticInterval time.Duration `mapstructure:"probabilistic_interval"`
ProbabilisticThreshold uint `mapstructure:"probabilistic_threshold"`
Tracers string `mapstructure:"tracers"`
ClockSyncInterval time.Duration `mapstructure:"clock_sync_interval"`
SendErrorFrames bool `mapstructure:"send_error_frames"`
VerboseMode bool `mapstructure:"verbose_mode"`
OffCPUThreshold float64 `mapstructure:"off_cpu_threshold"`
IncludeEnvVars string `mapstructure:"include_env_vars"`
UProbeLinks []string `mapstructure:"u_probe_links"`
LoadProbe bool `mapstructure:"load_probe"`
MapScaleFactor uint `mapstructure:"map_scale_factor"`
BPFVerifierLogLevel uint `mapstructure:"bpf_verifier_log_level"`
NoKernelVersionCheck bool `mapstructure:"no_kernel_version_check"`
MaxGRPCRetries uint32 `mapstructure:"max_grpc_retries"`
MaxRPCMsgSize int `mapstructure:"max_rpc_msg_size"`
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should there be a check on MaxRPCMsgSize? As it is of type int, it could also be negative.

}

var _ xconfmap.Validator = (*Config)(nil)

// Validate validates the config.
// This is automatically called by the config parser as it implements the xconfmap.Validator interface.
func (cfg *Config) Validate() error {
if cfg.SamplesPerSecond < 1 {
return fmt.Errorf("invalid sampling frequency: %d", cfg.SamplesPerSecond)
}

if cfg.MapScaleFactor > 8 {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if cfg.MapScaleFactor > 8 {
if cfg.MapScaleFactor > MaxArgMapScaleFactor {

return fmt.Errorf(
"eBPF map scaling factor %d exceeds limit (max: %d)",
cfg.MapScaleFactor, MaxArgMapScaleFactor,
)
}

if cfg.BPFVerifierLogLevel > 2 {
return fmt.Errorf("invalid eBPF verifier log level: %d", cfg.BPFVerifierLogLevel)
}

if cfg.ProbabilisticInterval < 1*time.Minute || cfg.ProbabilisticInterval > 5*time.Minute {
return errors.New(
"invalid argument for probabilistic-interval: use " +
"a duration between 1 and 5 minutes",
)
}

if cfg.ProbabilisticThreshold < 1 ||
cfg.ProbabilisticThreshold > tracer.ProbabilisticThresholdMax {
return fmt.Errorf(
"invalid argument for probabilistic-threshold. Value "+
"should be between 1 and %d",
tracer.ProbabilisticThresholdMax,
)
}

if cfg.OffCPUThreshold < 0.0 || cfg.OffCPUThreshold > 1.0 {
return errors.New(
"invalid argument for off-cpu-threshold. The value " +
"should be in the range [0..1]. 0 disables off-cpu profiling")
}

if !cfg.NoKernelVersionCheck {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The following part is mixing configuration validation with system validation. This should be avoided.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have just moved the existing code.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe it's time to separate it.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

System checks should maybe stay in internal/controller while configuration checks should be close to collector/config.

major, minor, patch, err := tracer.GetCurrentKernelVersion()
if err != nil {
return fmt.Errorf("failed to get kernel version: %v", err)
}

var minMajor, minMinor uint32
switch runtime.GOARCH {
case "amd64":
if cfg.VerboseMode {
minMajor, minMinor = 5, 2
} else {
minMajor, minMinor = 4, 19
Comment on lines +94 to +97
Copy link
Copy Markdown
Member

@florianl florianl Oct 8, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This check is incorrect. 4.19 is no longer supported, as the project moved on and the instruction limit (4096) is no longer enforced on eBPF programs. As an example - unwind_native currently uses 7014 instructions on amd64.
The bump of the kernel version is therefore not related to the changes around cfg.VerboseMode, but it enabled the changes around cfg.VerboseMode.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The minimal supported kernel version (for x86) should align with https://github.com/open-telemetry/opentelemetry-ebpf-profiler?tab=readme-ov-file#supported-linux-kernel-version and not make a difference based on cfg.VerboseMode.

}
case "arm64":
// Older ARM64 kernel versions have broken bpf_probe_read.
// https://github.com/torvalds/linux/commit/6ae08ae3dea2cfa03dd3665a3c8475c2d429ef47
minMajor, minMinor = 5, 5
default:
return fmt.Errorf("unsupported architecture: %s", runtime.GOARCH)
}

if major < minMajor || (major == minMajor && minor < minMinor) {
return fmt.Errorf("host Agent requires kernel version "+
"%d.%d or newer but got %d.%d.%d", minMajor, minMinor, major, minor, patch)
}
}

return nil
}
20 changes: 20 additions & 0 deletions collector/config/config_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0

package config // import "go.opentelemetry.io/ebpf-profiler/collector/config"

import (
"testing"

"github.com/stretchr/testify/require"
"go.opentelemetry.io/collector/confmap/xconfmap"
)

func TestValidate(t *testing.T) {
cfg := &Config{
SamplesPerSecond: 0,
}
err := xconfmap.Validate(cfg)
require.Error(t, err)
require.Equal(t, "invalid sampling frequency: 0", err.Error())
}
30 changes: 7 additions & 23 deletions collector/factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"go.opentelemetry.io/collector/receiver"
"go.opentelemetry.io/collector/receiver/xreceiver"

"go.opentelemetry.io/ebpf-profiler/collector/config"
"go.opentelemetry.io/ebpf-profiler/collector/internal"
"go.opentelemetry.io/ebpf-profiler/internal/controller"
)
Expand All @@ -37,7 +38,7 @@ func BuildProfilesReceiver(options ...Option) xreceiver.CreateProfilesFunc {
baseCfg component.Config,
nextConsumer xconsumer.Profiles,
) (xreceiver.Profiles, error) {
cfg, ok := baseCfg.(*Config)
cfg, ok := baseCfg.(*config.Config)
if !ok {
return nil, errInvalidConfig
}
Expand All @@ -48,35 +49,18 @@ func BuildProfilesReceiver(options ...Option) xreceiver.CreateProfilesFunc {
}

controlerCfg := &controller.Config{
ReporterInterval: cfg.ReporterInterval,
MonitorInterval: cfg.MonitorInterval,
SamplesPerSecond: cfg.SamplesPerSecond,
ProbabilisticInterval: cfg.ProbabilisticInterval,
ProbabilisticThreshold: cfg.ProbabilisticThreshold,
Tracers: cfg.Tracers,
ClockSyncInterval: cfg.ClockSyncInterval,
SendErrorFrames: cfg.SendErrorFrames,
VerboseMode: cfg.VerboseMode,
OffCPUThreshold: cfg.OffCPUThreshold,
IncludeEnvVars: cfg.IncludeEnvVars,
UProbeLinks: cfg.UProbeLinks,
LoadProbe: cfg.LoadProbe,
MapScaleFactor: cfg.MapScaleFactor,
BpfVerifierLogLevel: cfg.BPFVerifierLogLevel,
NoKernelVersionCheck: cfg.NoKernelVersionCheck,
MaxGRPCRetries: cfg.MaxGRPCRetries,
MaxRPCMsgSize: cfg.MaxRPCMsgSize,
ExecutableReporter: controllerOption.executableReporter,
ReporterFactory: controllerOption.reporterFactory,
OnShutdown: controllerOption.onShutdown,
Config: *cfg,
ExecutableReporter: controllerOption.executableReporter,
ReporterFactory: controllerOption.reporterFactory,
OnShutdown: controllerOption.onShutdown,
}

return internal.NewController(controlerCfg, rs, nextConsumer)
}
}

func defaultConfig() component.Config {
return &Config{
return &config.Config{
ReporterInterval: 5 * time.Second,
MonitorInterval: 5 * time.Second,
SamplesPerSecond: 20,
Expand Down
10 changes: 10 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -62,20 +62,29 @@ require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
github.com/gobwas/glob v0.2.3 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/hashicorp/go-version v1.7.0 // indirect
github.com/josharian/native v1.1.0 // indirect
github.com/jsimonetti/rtnetlink/v2 v2.0.3 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.2.8 // indirect
github.com/knadh/koanf/maps v0.1.2 // indirect
github.com/knadh/koanf/providers/confmap v1.0.0 // indirect
github.com/knadh/koanf/v2 v2.3.0 // indirect
github.com/mdlayher/netlink v1.7.2 // indirect
github.com/mdlayher/socket v0.4.1 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/collector/component/componenttest v0.137.0 // indirect
go.opentelemetry.io/collector/confmap v1.43.0 // indirect
go.opentelemetry.io/collector/confmap/xconfmap v0.137.0 // indirect
go.opentelemetry.io/collector/consumer v1.43.0 // indirect
go.opentelemetry.io/collector/consumer/consumererror v0.137.0 // indirect
go.opentelemetry.io/collector/featuregate v1.43.0 // indirect
Expand All @@ -88,6 +97,7 @@ require (
go.opentelemetry.io/otel/trace v1.38.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/net v0.42.0 // indirect
golang.org/x/text v0.27.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b // indirect
Expand Down
20 changes: 20 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-quicktest/qt v1.101.1-0.20240301121107-c6c8733fa1e6 h1:teYtXy9B7y5lHTp8V9KPxpYRAVA7dozigQcMiBust1s=
github.com/go-quicktest/qt v1.101.1-0.20240301121107-c6c8733fa1e6/go.mod h1:p4lGIVX+8Wa6ZPNDvqcxq36XpUDLh42FLetFU7odllI=
github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
Expand Down Expand Up @@ -79,6 +83,12 @@ github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zt
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM=
github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
github.com/knadh/koanf/maps v0.1.2 h1:RBfmAW5CnZT+PJ1CVc1QSJKf4Xu9kxfQgYVQSu8hpbo=
github.com/knadh/koanf/maps v0.1.2/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI=
github.com/knadh/koanf/providers/confmap v1.0.0 h1:mHKLJTE7iXEys6deO5p6olAiZdG5zwp8Aebir+/EaRE=
github.com/knadh/koanf/providers/confmap v1.0.0/go.mod h1:txHYHiI2hAtF0/0sCmcuol4IDcuQbKTybiB1nOcUo1A=
github.com/knadh/koanf/v2 v2.3.0 h1:Qg076dDRFHvqnKG97ZEsi9TAg2/nFTa9hCdcSa1lvlM=
github.com/knadh/koanf/v2 v2.3.0/go.mod h1:gRb40VRAbd4iJMYYD5IxZ6hfuopFcXBpc9bbQpZwo28=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
Expand All @@ -94,6 +104,10 @@ github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U
github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
Expand Down Expand Up @@ -125,6 +139,10 @@ go.opentelemetry.io/collector/component v1.43.0 h1:9dyOmV0UuIhrNSASMeDH125jhfv7+
go.opentelemetry.io/collector/component v1.43.0/go.mod h1:Pw3qM5HhgnSMpebNRUiiJuEiXxZyHq83vl7wXqxD8hU=
go.opentelemetry.io/collector/component/componenttest v0.137.0 h1:QC9MZsYyzQqN9qMlleJb78wf7FeCjbr4jLeCuNlKHLU=
go.opentelemetry.io/collector/component/componenttest v0.137.0/go.mod h1:JuiX9pv7qE5G8keihhjM66LeidryEnziPND0sXuK9PQ=
go.opentelemetry.io/collector/confmap v1.43.0 h1:QVAnbS7A+2Ra61xsuG355vhlW6uOMaKWysrwLQzDUz4=
go.opentelemetry.io/collector/confmap v1.43.0/go.mod h1:N5GZpFCmwD1GynDu3IWaZW5Ycfc/7YxSU0q1/E3vLdg=
go.opentelemetry.io/collector/confmap/xconfmap v0.137.0 h1:IKzD6w4YuvBi6GvxZfhz7SJR6GR1UpSQRuxtx20/+9U=
go.opentelemetry.io/collector/confmap/xconfmap v0.137.0/go.mod h1:psXdQr13pVrCqNPdoER2QZZorvONAR5ZUEHURe4POh4=
go.opentelemetry.io/collector/consumer v1.43.0 h1:51pfN5h6PLlaBwGPtyHn6BdK0DgtVGRV0UYRPbbscbs=
go.opentelemetry.io/collector/consumer v1.43.0/go.mod h1:v3J2g+6IwOPbLsnzL9cQfvgpmmsZt1YS7aXSNDFmJfk=
go.opentelemetry.io/collector/consumer/consumererror v0.137.0 h1:4HgYX6vVmaF17RRRtJDpR8EuWmLAv6JdKYG8slDDa+g=
Expand Down Expand Up @@ -179,6 +197,8 @@ go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
golang.org/x/arch v0.21.0 h1:iTC9o7+wP6cPWpDWkivCvQFGAHDQ59SrSxsLPcnkArw=
golang.org/x/arch v0.21.0/go.mod h1:dNHoOeKiyja7GTvF9NJS1l3Z2yntpQNzgrjh1cU103A=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
Expand Down
Loading
Loading