Skip to content

Commit e868df1

Browse files
authored
Merge branch 'main' into rename-tpbase-libc
2 parents 26e024f + a47b46a commit e868df1

File tree

32 files changed

+370
-247
lines changed

32 files changed

+370
-247
lines changed

.github/workflows/push-docker-image.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
username: ${{ secrets.DOCKER_USERNAME }}
2424
password: ${{ secrets.DOCKER_PASSWORD }}
2525
- name: Set up QEMU
26-
uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0
26+
uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3.7.0
2727
- name: Set up Docker Buildx
2828
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
2929
- name: Set current timestamp tag

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cli_flags.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111

1212
"github.com/peterbourgon/ff/v3"
1313

14+
"go.opentelemetry.io/ebpf-profiler/collector/config"
1415
"go.opentelemetry.io/ebpf-profiler/internal/controller"
1516
"go.opentelemetry.io/ebpf-profiler/tracer"
1617
)
@@ -42,7 +43,7 @@ var (
4243
mapScaleFactorHelp = fmt.Sprintf("Scaling factor for eBPF map sizes. "+
4344
"Every increase by 1 doubles the map size. Increase if you see eBPF map size errors. "+
4445
"Default is %d corresponding to 4GB of executable address space, max is %d.",
45-
defaultArgMapScaleFactor, controller.MaxArgMapScaleFactor)
46+
defaultArgMapScaleFactor, config.MaxArgMapScaleFactor)
4647
disableTLSHelp = "Disable encryption for data in transit."
4748
bpfVerifierLogLevelHelp = "Log level of the eBPF verifier output (0,1,2). Default is 0."
4849
versionHelp = "Show version."
@@ -63,6 +64,7 @@ var (
6364
"If zero, monotonic-realtime clock sync will be performed once, " +
6465
"on agent startup, but not periodically."
6566
sendErrorFramesHelp = "Send error frames (devfiler only, breaks Kibana)"
67+
sendIdleFramesHelp = "Unwind and report idle states of the Linux kernel."
6668
offCPUThresholdHelp = fmt.Sprintf("The probability for an off-cpu event being recorded. "+
6769
"Valid values are in the range [0..1]. 0 disables off-cpu profiling. "+
6870
"Default is %d.",
@@ -118,6 +120,7 @@ func parseArgs() (*controller.Config, error) {
118120

119121
fs.BoolVar(&args.SendErrorFrames, "send-error-frames", defaultArgSendErrorFrames,
120122
sendErrorFramesHelp)
123+
fs.BoolVar(&args.SendIdleFrames, "send-idle-frames", false, sendIdleFramesHelp)
121124

122125
fs.StringVar(&args.Tracers, "t", "all", "Shorthand for -tracers.")
123126
fs.StringVar(&args.Tracers, "tracers", "all", tracersHelp)

collector/config/config.go

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,19 @@
33

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

6-
import "time"
6+
import (
7+
"errors"
8+
"fmt"
9+
"runtime"
10+
"time"
11+
12+
"go.opentelemetry.io/ebpf-profiler/tracer"
13+
)
14+
15+
const (
16+
// 1TB of executable address space
17+
MaxArgMapScaleFactor = 8
18+
)
719

820
// Config is the configuration for the collector.
921
type Config struct {
@@ -15,6 +27,7 @@ type Config struct {
1527
Tracers string `mapstructure:"tracers"`
1628
ClockSyncInterval time.Duration `mapstructure:"clock_sync_interval"`
1729
SendErrorFrames bool `mapstructure:"send_error_frames"`
30+
SendIdleFrames bool `mapstructure:"send_idle_frames"`
1831
VerboseMode bool `mapstructure:"verbose_mode"`
1932
OffCPUThreshold float64 `mapstructure:"off_cpu_threshold"`
2033
IncludeEnvVars string `mapstructure:"include_env_vars"`
@@ -26,3 +39,70 @@ type Config struct {
2639
MaxGRPCRetries uint32 `mapstructure:"max_grpc_retries"`
2740
MaxRPCMsgSize int `mapstructure:"max_rpc_msg_size"`
2841
}
42+
43+
// Validate validates the config.
44+
// This is automatically called by the config parser as it implements the xconfmap.Validator interface.
45+
func (cfg *Config) Validate() error {
46+
if cfg.SamplesPerSecond < 1 {
47+
return fmt.Errorf("invalid sampling frequency: %d", cfg.SamplesPerSecond)
48+
}
49+
50+
if cfg.MapScaleFactor > MaxArgMapScaleFactor {
51+
return fmt.Errorf(
52+
"eBPF map scaling factor %d exceeds limit (max: %d)",
53+
cfg.MapScaleFactor, MaxArgMapScaleFactor,
54+
)
55+
}
56+
57+
if cfg.BPFVerifierLogLevel > 2 {
58+
return fmt.Errorf("invalid eBPF verifier log level: %d", cfg.BPFVerifierLogLevel)
59+
}
60+
61+
if cfg.ProbabilisticInterval < 1*time.Minute || cfg.ProbabilisticInterval > 5*time.Minute {
62+
return errors.New(
63+
"invalid argument for probabilistic-interval: use " +
64+
"a duration between 1 and 5 minutes",
65+
)
66+
}
67+
68+
if cfg.ProbabilisticThreshold < 1 ||
69+
cfg.ProbabilisticThreshold > tracer.ProbabilisticThresholdMax {
70+
return fmt.Errorf(
71+
"invalid argument for probabilistic-threshold. Value "+
72+
"should be between 1 and %d",
73+
tracer.ProbabilisticThresholdMax,
74+
)
75+
}
76+
77+
if cfg.OffCPUThreshold < 0.0 || cfg.OffCPUThreshold > 1.0 {
78+
return errors.New(
79+
"invalid argument for off-cpu-threshold. The value " +
80+
"should be in the range [0..1]. 0 disables off-cpu profiling")
81+
}
82+
83+
if !cfg.NoKernelVersionCheck {
84+
major, minor, patch, err := tracer.GetCurrentKernelVersion()
85+
if err != nil {
86+
return fmt.Errorf("failed to get kernel version: %v", err)
87+
}
88+
89+
var minMajor, minMinor uint32
90+
switch runtime.GOARCH {
91+
case "amd64":
92+
minMajor, minMinor = 5, 2
93+
case "arm64":
94+
// Older ARM64 kernel versions have broken bpf_probe_read.
95+
// https://github.com/torvalds/linux/commit/6ae08ae3dea2cfa03dd3665a3c8475c2d429ef47
96+
minMajor, minMinor = 5, 5
97+
default:
98+
return fmt.Errorf("unsupported architecture: %s", runtime.GOARCH)
99+
}
100+
101+
if major < minMajor || (major == minMajor && minor < minMinor) {
102+
return fmt.Errorf("host Agent requires kernel version "+
103+
"%d.%d or newer but got %d.%d.%d", minMajor, minMinor, major, minor, patch)
104+
}
105+
}
106+
107+
return nil
108+
}

collector/config/config_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package config // import "go.opentelemetry.io/ebpf-profiler/collector/config"
5+
6+
import (
7+
"testing"
8+
9+
"github.com/stretchr/testify/require"
10+
"go.opentelemetry.io/collector/confmap/xconfmap"
11+
)
12+
13+
func TestValidate(t *testing.T) {
14+
cfg := &Config{
15+
SamplesPerSecond: 0,
16+
}
17+
err := xconfmap.Validate(cfg)
18+
require.Error(t, err)
19+
require.Equal(t, "invalid sampling frequency: 0", err.Error())
20+
}

go.mod

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ module go.opentelemetry.io/ebpf-profiler
1111
go 1.24.0
1212

1313
require (
14-
github.com/aws/aws-sdk-go-v2 v1.39.5
15-
github.com/aws/aws-sdk-go-v2/config v1.31.16
16-
github.com/aws/aws-sdk-go-v2/service/s3 v1.89.1
14+
github.com/aws/aws-sdk-go-v2 v1.39.6
15+
github.com/aws/aws-sdk-go-v2/config v1.31.17
16+
github.com/aws/aws-sdk-go-v2/service/s3 v1.90.0
1717
github.com/cilium/ebpf v0.20.0
1818
github.com/elastic/go-freelru v0.16.0
1919
github.com/elastic/go-perf v0.0.0-20241029065020-30bec95324b8
@@ -25,6 +25,7 @@ require (
2525
github.com/stretchr/testify v1.11.1
2626
github.com/zeebo/xxh3 v1.0.2
2727
go.opentelemetry.io/collector/component v1.45.0
28+
go.opentelemetry.io/collector/confmap/xconfmap v0.138.0
2829
go.opentelemetry.io/collector/consumer/consumertest v0.139.0
2930
go.opentelemetry.io/collector/consumer/xconsumer v0.139.0
3031
go.opentelemetry.io/collector/pdata v1.45.0
@@ -44,37 +45,45 @@ require (
4445
)
4546

4647
require (
47-
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.2 // indirect
48-
github.com/aws/aws-sdk-go-v2/credentials v1.18.20 // indirect
49-
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.12 // indirect
50-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.12 // indirect
51-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.12 // indirect
48+
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.3 // indirect
49+
github.com/aws/aws-sdk-go-v2/credentials v1.18.21 // indirect
50+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.13 // indirect
51+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13 // indirect
52+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13 // indirect
5253
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect
53-
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.12 // indirect
54-
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.2 // indirect
55-
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.3 // indirect
56-
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.12 // indirect
57-
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.12 // indirect
58-
github.com/aws/aws-sdk-go-v2/service/sso v1.30.0 // indirect
59-
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.4 // indirect
60-
github.com/aws/aws-sdk-go-v2/service/sts v1.39.0 // indirect
61-
github.com/aws/smithy-go v1.23.1 // indirect
54+
github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.13 // indirect
55+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.3 // indirect
56+
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.4 // indirect
57+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.13 // indirect
58+
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.13 // indirect
59+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.1 // indirect
60+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.5 // indirect
61+
github.com/aws/aws-sdk-go-v2/service/sts v1.39.1 // indirect
62+
github.com/aws/smithy-go v1.23.2 // indirect
6263
github.com/davecgh/go-spew v1.1.1 // indirect
6364
github.com/go-logr/logr v1.4.3 // indirect
6465
github.com/go-logr/stdr v1.2.2 // indirect
66+
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
67+
github.com/gobwas/glob v0.2.3 // indirect
6568
github.com/google/go-cmp v0.7.0 // indirect
6669
github.com/hashicorp/go-version v1.7.0 // indirect
6770
github.com/josharian/native v1.1.0 // indirect
6871
github.com/jsimonetti/rtnetlink/v2 v2.0.3 // indirect
6972
github.com/json-iterator/go v1.1.12 // indirect
7073
github.com/klauspost/cpuid/v2 v2.2.8 // indirect
74+
github.com/knadh/koanf/maps v0.1.2 // indirect
75+
github.com/knadh/koanf/providers/confmap v1.0.0 // indirect
76+
github.com/knadh/koanf/v2 v2.3.0 // indirect
7177
github.com/mdlayher/netlink v1.7.2 // indirect
7278
github.com/mdlayher/socket v0.4.1 // indirect
79+
github.com/mitchellh/copystructure v1.2.0 // indirect
80+
github.com/mitchellh/reflectwalk v1.0.2 // indirect
7381
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
7482
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
7583
github.com/pmezard/go-difflib v1.0.0 // indirect
7684
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
7785
go.opentelemetry.io/collector/component/componenttest v0.139.0 // indirect
86+
go.opentelemetry.io/collector/confmap v1.44.0 // indirect
7887
go.opentelemetry.io/collector/consumer v1.45.0 // indirect
7988
go.opentelemetry.io/collector/consumer/consumererror v0.139.0 // indirect
8089
go.opentelemetry.io/collector/featuregate v1.45.0 // indirect
@@ -84,6 +93,7 @@ require (
8493
go.opentelemetry.io/otel/trace v1.38.0 // indirect
8594
go.uber.org/multierr v1.11.0 // indirect
8695
go.uber.org/zap v1.27.0 // indirect
96+
go.yaml.in/yaml/v3 v3.0.4 // indirect
8797
golang.org/x/net v0.46.0 // indirect
8898
golang.org/x/text v0.30.0 // indirect
8999
google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b // indirect

0 commit comments

Comments
 (0)