Skip to content

Commit c1a382a

Browse files
committed
support custom /proc path
1 parent 0b51bba commit c1a382a

File tree

10 files changed

+39
-35
lines changed

10 files changed

+39
-35
lines changed

pkg/systemstatsmonitor/cpu_collector.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,17 @@ type cpuCollector struct {
4646
mSystemInterruptsTotal *metrics.Int64Metric
4747
mSystemCPUStat *metrics.Float64Metric // per-cpu time from /proc/stats
4848

49-
config *ssmtypes.CPUStatsConfig
49+
config *ssmtypes.CPUStatsConfig
50+
procPath string
5051

5152
lastUsageTime map[string]float64
5253
}
5354

54-
func NewCPUCollectorOrDie(cpuConfig *ssmtypes.CPUStatsConfig) *cpuCollector {
55-
cc := cpuCollector{config: cpuConfig}
55+
func NewCPUCollectorOrDie(cpuConfig *ssmtypes.CPUStatsConfig, procPath string) *cpuCollector {
56+
cc := cpuCollector{
57+
config: cpuConfig,
58+
procPath: procPath,
59+
}
5660

5761
var err error
5862
cc.mRunnableTaskCount, err = metrics.NewFloat64Metric(

pkg/systemstatsmonitor/cpu_collector_linux.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func (cc *cpuCollector) recordLoad() {
4343
}
4444

4545
func (cc *cpuCollector) recordSystemStats() {
46-
fs, err := procfs.NewFS("/proc")
46+
fs, err := procfs.NewFS(cc.procPath)
4747
stats, err := fs.Stat()
4848
if err != nil {
4949
glog.Errorf("Failed to retrieve cpu/process stats: %v", err)

pkg/systemstatsmonitor/net_collector.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,14 @@ import (
2828

2929
type netCollector struct {
3030
config *ssmtypes.NetStatsConfig
31+
procPath string
3132
recorder *ifaceStatRecorder
3233
}
3334

34-
func NewNetCollectorOrDie(netConfig *ssmtypes.NetStatsConfig) *netCollector {
35+
func NewNetCollectorOrDie(netConfig *ssmtypes.NetStatsConfig, procPath string) *netCollector {
3536
nc := netCollector{
3637
config: netConfig,
38+
procPath: procPath,
3739
recorder: newIfaceStatRecorder(),
3840
}
3941

@@ -207,7 +209,7 @@ func (nc *netCollector) mustRegisterMetric(metricID metrics.MetricID, descriptio
207209
}
208210

209211
func (nc *netCollector) recordNetDev() {
210-
fs, err := procfs.NewFS("/proc")
212+
fs, err := procfs.NewFS(nc.procPath)
211213
stats, err := fs.NetDev()
212214
if err != nil {
213215
glog.Errorf("Failed to retrieve net dev stat: %v", err)

pkg/systemstatsmonitor/osfeature_collector.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package systemstatsmonitor
1616
import (
1717
"encoding/json"
1818
"io/ioutil"
19+
"path/filepath"
1920
"strconv"
2021
"strings"
2122

@@ -27,11 +28,15 @@ import (
2728

2829
type osFeatureCollector struct {
2930
config *ssmtypes.OSFeatureStatsConfig
31+
procPath string
3032
osFeature *metrics.Int64Metric
3133
}
3234

33-
func NewOsFeatureCollectorOrDie(osFeatureConfig *ssmtypes.OSFeatureStatsConfig) *osFeatureCollector {
34-
oc := osFeatureCollector{config: osFeatureConfig}
35+
func NewOsFeatureCollectorOrDie(osFeatureConfig *ssmtypes.OSFeatureStatsConfig, procPath string) *osFeatureCollector {
36+
oc := osFeatureCollector{
37+
config: osFeatureConfig,
38+
procPath: procPath,
39+
}
3540
var err error
3641
// Use metrics.Last aggregation method to ensure the metric is a guage metric.
3742
if osFeatureConfig.MetricsConfigs["system/os_feature"].DisplayName != "" {
@@ -145,12 +150,12 @@ func (ofc *osFeatureCollector) collect() {
145150
if ofc == nil || ofc.osFeature == nil {
146151
return
147152
}
148-
cmdlineArgs, err := system.CmdlineArgs()
153+
cmdlineArgs, err := system.CmdlineArgs(filepath.Join(ofc.procPath, "/cmdline"))
149154
if err != nil {
150155
glog.Fatalf("Error retrieving cmdline args: %v", err)
151156
}
152157
ofc.recordFeaturesFromCmdline(cmdlineArgs)
153-
modules, err := system.Modules()
158+
modules, err := system.Modules(filepath.Join(ofc.procPath, "/modules"))
154159
if err != nil {
155160
glog.Fatalf("Error retrieving kernel modules: %v", err)
156161
}

pkg/systemstatsmonitor/system_stats_monitor.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func NewSystemStatsMonitorOrDie(configPath string) types.Monitor {
7878
}
7979

8080
if len(ssm.config.CPUConfig.MetricsConfigs) > 0 {
81-
ssm.cpuCollector = NewCPUCollectorOrDie(&ssm.config.CPUConfig)
81+
ssm.cpuCollector = NewCPUCollectorOrDie(&ssm.config.CPUConfig, ssm.config.ProcPath)
8282
}
8383
if len(ssm.config.DiskConfig.MetricsConfigs) > 0 {
8484
ssm.diskCollector = NewDiskCollectorOrDie(&ssm.config.DiskConfig)
@@ -96,10 +96,10 @@ func NewSystemStatsMonitorOrDie(configPath string) types.Monitor {
9696
ssm.config.OsFeatureConfig.KnownModulesConfigPath = filepath.Join(filepath.Dir(configPath),
9797
ssm.config.OsFeatureConfig.KnownModulesConfigPath)
9898
}
99-
ssm.osFeatureCollector = NewOsFeatureCollectorOrDie(&ssm.config.OsFeatureConfig)
99+
ssm.osFeatureCollector = NewOsFeatureCollectorOrDie(&ssm.config.OsFeatureConfig, ssm.config.ProcPath)
100100
}
101101
if len(ssm.config.NetConfig.MetricsConfigs) > 0 {
102-
ssm.netCollector = NewNetCollectorOrDie(&ssm.config.NetConfig)
102+
ssm.netCollector = NewNetCollectorOrDie(&ssm.config.NetConfig, ssm.config.ProcPath)
103103
}
104104
return &ssm
105105
}

pkg/systemstatsmonitor/types/config.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,15 @@ package types
1818

1919
import (
2020
"fmt"
21+
"os"
2122
"time"
2223
)
2324

2425
var (
2526
defaultInvokeIntervalString = (60 * time.Second).String()
2627
defaultlsblkTimeoutString = (5 * time.Second).String()
2728
defaultKnownModulesConfigPath = "guestosconfig/known-modules.json"
29+
defaultProcPath = "/proc"
2830
)
2931

3032
type MetricConfig struct {
@@ -69,13 +71,17 @@ type SystemStatsConfig struct {
6971
NetConfig NetStatsConfig `json:"net"`
7072
InvokeIntervalString string `json:"invokeInterval"`
7173
InvokeInterval time.Duration `json:"-"`
74+
ProcPath string `json:"procPath"`
7275
}
7376

7477
// ApplyConfiguration applies default configurations.
7578
func (ssc *SystemStatsConfig) ApplyConfiguration() error {
7679
if ssc.InvokeIntervalString == "" {
7780
ssc.InvokeIntervalString = defaultInvokeIntervalString
7881
}
82+
if ssc.ProcPath == "" {
83+
ssc.ProcPath = defaultProcPath
84+
}
7985
if ssc.DiskConfig.LsblkTimeoutString == "" {
8086
ssc.DiskConfig.LsblkTimeoutString = defaultlsblkTimeoutString
8187
}
@@ -101,6 +107,9 @@ func (ssc *SystemStatsConfig) Validate() error {
101107
if ssc.InvokeInterval <= time.Duration(0) {
102108
return fmt.Errorf("InvokeInterval %v must be above 0s", ssc.InvokeInterval)
103109
}
110+
if _, err := os.Stat(ssc.ProcPath); err != nil {
111+
return fmt.Errorf("ProcPath %v check failed: %s", err)
112+
}
104113
if ssc.DiskConfig.LsblkTimeout <= time.Duration(0) {
105114
return fmt.Errorf("LsblkTimeout %v must be above 0s", ssc.DiskConfig.LsblkTimeout)
106115
}

pkg/util/metrics/system/cmdline_args.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@ import (
1919
"strings"
2020
)
2121

22-
var cmdlineFilePath = "/proc/cmdline"
23-
2422
type CmdlineArg struct {
2523
Key string `json:"key"`
2624
Value string `json:"value"`
@@ -52,7 +50,7 @@ func splitAfterSpace(inputChar rune) bool {
5250
}
5351

5452
// CmdlineArgs returns all the kernel cmdline. It is read from cat /proc/cmdline.
55-
func CmdlineArgs() ([]CmdlineArg, error) {
53+
func CmdlineArgs(cmdlineFilePath string) ([]CmdlineArg, error) {
5654
lines, err := ReadFileIntoLines(cmdlineFilePath)
5755
if err != nil {
5856
return nil, fmt.Errorf("error reading the file %s, %v", cmdlineFilePath, err)

pkg/util/metrics/system/cmdline_args_test.go

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -69,15 +69,9 @@ func TestCmdlineStats(t *testing.T) {
6969
}
7070
for _, test := range testcases {
7171
t.Run(test.name, func(t *testing.T) {
72-
originalCmdlineFilePath := cmdlineFilePath
73-
defer func() {
74-
cmdlineFilePath = originalCmdlineFilePath
75-
}()
76-
77-
cmdlineFilePath = test.fakeCmdlineFilePath
78-
cmdlineArgs, err := CmdlineArgs()
72+
cmdlineArgs, err := CmdlineArgs(test.fakeCmdlineFilePath)
7973
if err != nil {
80-
t.Errorf("Unexpected error retrieving cmdlineArgs: %v\nCmdlineArgsFilePath: %s\n", err, cmdlineFilePath)
74+
t.Errorf("Unexpected error retrieving cmdlineArgs: %v\nCmdlineArgsFilePath: %s\n", err, test.fakeCmdlineFilePath)
8175
}
8276
for _, expectedCmdlineArg := range test.expectedCmdlineArgs {
8377
assert.Contains(t, cmdlineArgs, expectedCmdlineArg, "Failed to find cmdlineArgs: %v\n", expectedCmdlineArg)

pkg/util/metrics/system/module_stats.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ import (
2020
"strings"
2121
)
2222

23-
var modulesFilePath = "/proc/modules"
24-
2523
type Module struct {
2624
ModuleName string `json:"moduleName"`
2725
Instances uint64 `json:"instances"`
@@ -37,7 +35,7 @@ func (d Module) String() string {
3735

3836
// Module returns all the kernel modules and their
3937
// usage. It is read from cat /proc/modules.
40-
func Modules() ([]Module, error) {
38+
func Modules(modulesFilePath string) ([]Module, error) {
4139
lines, err := ReadFileIntoLines(modulesFilePath)
4240
if err != nil {
4341
return nil, fmt.Errorf("error reading the contents of %s: %s", modulesFilePath, err)

pkg/util/metrics/system/module_stats_test.go

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -97,15 +97,9 @@ func TestModules(t *testing.T) {
9797
}
9898
for _, test := range testcases {
9999
t.Run(test.name, func(t *testing.T) {
100-
originalModuleFilePath := modulesFilePath
101-
defer func() {
102-
modulesFilePath = originalModuleFilePath
103-
}()
104-
105-
modulesFilePath = test.fakeModuleFilePath
106-
modules, err := Modules()
100+
modules, err := Modules(test.fakeModuleFilePath)
107101
if err != nil {
108-
t.Errorf("Unexpected error retrieving modules: %v\nModulesFilePath: %s\n", err, modulesFilePath)
102+
t.Errorf("Unexpected error retrieving modules: %v\nModulesFilePath: %s\n", err, test.fakeModuleFilePath)
109103
}
110104
assert.Equal(t, modules, test.expectedModules, "unpected modules retrieved: %v, expected: %v", modules, test.expectedModules)
111105
})

0 commit comments

Comments
 (0)