diff --git a/fixtures.ttar b/fixtures.ttar index f7f84ef36..b75afd70e 100644 --- a/fixtures.ttar +++ b/fixtures.ttar @@ -1107,6 +1107,22 @@ Mode: 644 Directory: fixtures/sys/devices/system Mode: 775 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/clocksource +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Directory: fixtures/sys/devices/system/clocksource/clocksource0 +Mode: 775 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/clocksource/clocksource0/available_clocksource +Lines: 1 +tsc hpet acpi_pm +Mode: 444 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Path: fixtures/sys/devices/system/clocksource/clocksource0/current_clocksource +Lines: 1 +tsc +Mode: 644 +# ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Directory: fixtures/sys/devices/system/cpu Mode: 775 # ttar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sysfs/clocksource.go b/sysfs/clocksource.go new file mode 100644 index 000000000..d96c3892f --- /dev/null +++ b/sysfs/clocksource.go @@ -0,0 +1,76 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !windows + +package sysfs + +import ( + "path/filepath" + "strings" + + "github.com/prometheus/procfs/internal/util" +) + +// ClockSource contains metrics related to the clock source +type ClockSource struct { + Name string + Available []string + Current string +} + +// ClockSources returns clocksource information including current and available clocksources +// read from '/sys/devices/system/clocksource' +func (fs FS) ClockSources() ([]ClockSource, error) { + + clocksourcePaths, err := filepath.Glob(fs.sys.Path("devices/system/clocksource/clocksource[0-9]*")) + if err != nil { + return nil, err + } + + clocksources := make([]ClockSource, len(clocksourcePaths)) + for i, clocksourcePath := range clocksourcePaths { + clocksourceName := strings.TrimPrefix(filepath.Base(clocksourcePath), "clocksource") + + clocksource, err := parseClocksource(clocksourcePath) + if err != nil { + return nil, err + } + clocksource.Name = clocksourceName + clocksources[i] = *clocksource + } + + return clocksources, nil +} + +func parseClocksource(clocksourcePath string) (*ClockSource, error) { + + stringFiles := []string{ + "available_clocksource", + "current_clocksource", + } + stringOut := make([]string, len(stringFiles)) + var err error + + for i, f := range stringFiles { + stringOut[i], err = util.SysReadFile(filepath.Join(clocksourcePath, f)) + if err != nil { + return &ClockSource{}, err + } + } + + return &ClockSource{ + Available: strings.Fields(stringOut[0]), + Current: stringOut[1], + }, nil +} diff --git a/sysfs/clocksource_test.go b/sysfs/clocksource_test.go new file mode 100644 index 000000000..4fb0e9827 --- /dev/null +++ b/sysfs/clocksource_test.go @@ -0,0 +1,45 @@ +// Copyright 2019 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !windows + +package sysfs + +import ( + "reflect" + "testing" +) + +func TestNewClocksource(t *testing.T) { + fs, err := NewFS(sysTestFixtures) + if err != nil { + t.Fatal(err) + } + + c, err := fs.ClockSources() + if err != nil { + t.Fatal(err) + } + + clocksources := []ClockSource{ + { + Name: "0", + Available: []string{"tsc", "hpet", "acpi_pm"}, + Current: "tsc", + }, + } + + if !reflect.DeepEqual(clocksources, c) { + t.Errorf("Result not correct: want %v, have %v", clocksources, c) + } +}