diff --git a/collector/cpu_openbsd.go b/collector/cpu_openbsd.go index f025c08f..15749872 100644 --- a/collector/cpu_openbsd.go +++ b/collector/cpu_openbsd.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Prometheus Authors +// Copyright 2020 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 @@ -11,8 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build openbsd && !amd64 && !nocpu -// +build openbsd,!amd64,!nocpu +//go:build !nocpu +// +build !nocpu package collector @@ -25,11 +25,31 @@ import ( "golang.org/x/sys/unix" ) -/* -#include -#include -*/ -import "C" +type clockinfo struct { + hz int32 + tick int32 + tickadj int32 + stathz int32 + profhz int32 +} + +const ( + CP_USER = iota + CP_NICE + CP_SYS + CP_SPIN + CP_INTR + CP_IDLE + CPUSTATES +) +const ( + CP_USER_O63 = iota + CP_NICE_O63 + CP_SYS_O63 + CP_INTR_O63 + CP_IDLE_O63 + CPUSTATES_O63 +) type cpuCollector struct { cpu typedDesc @@ -52,7 +72,7 @@ func (c *cpuCollector) Update(ch chan<- prometheus.Metric) (err error) { if err != nil { return err } - clock := *(*C.struct_clockinfo)(unsafe.Pointer(&clockb[0])) + clock := *(*clockinfo)(unsafe.Pointer(&clockb[0])) hz := float64(clock.stathz) ncpus, err := unix.SysctlUint32("hw.ncpu") @@ -60,24 +80,33 @@ func (c *cpuCollector) Update(ch chan<- prometheus.Metric) (err error) { return err } - var cpTime [][C.CPUSTATES]C.int64_t + var cpTime [][CPUSTATES]uint64 for i := 0; i < int(ncpus); i++ { cpb, err := unix.SysctlRaw("kern.cp_time2", i) if err != nil && err != unix.ENODEV { return err } if err != unix.ENODEV { - cpTime = append(cpTime, *(*[C.CPUSTATES]C.int64_t)(unsafe.Pointer(&cpb[0]))) + var times [CPUSTATES]uint64 + for n := 0; n < len(cpb); n += 8 { + times[n/8] = *(*uint64)(unsafe.Pointer(&cpb[n])) + } + if len(cpb)/8 == CPUSTATES_O63 { + copy(times[CP_INTR:], times[CP_INTR_O63:]) + times[CP_SPIN] = 0 + } + cpTime = append(cpTime, times) } } for cpu, time := range cpTime { lcpu := strconv.Itoa(cpu) - ch <- c.cpu.mustNewConstMetric(float64(time[C.CP_USER])/hz, lcpu, "user") - ch <- c.cpu.mustNewConstMetric(float64(time[C.CP_NICE])/hz, lcpu, "nice") - ch <- c.cpu.mustNewConstMetric(float64(time[C.CP_SYS])/hz, lcpu, "system") - ch <- c.cpu.mustNewConstMetric(float64(time[C.CP_INTR])/hz, lcpu, "interrupt") - ch <- c.cpu.mustNewConstMetric(float64(time[C.CP_IDLE])/hz, lcpu, "idle") + ch <- c.cpu.mustNewConstMetric(float64(time[CP_USER])/hz, lcpu, "user") + ch <- c.cpu.mustNewConstMetric(float64(time[CP_NICE])/hz, lcpu, "nice") + ch <- c.cpu.mustNewConstMetric(float64(time[CP_SYS])/hz, lcpu, "system") + ch <- c.cpu.mustNewConstMetric(float64(time[CP_SPIN])/hz, lcpu, "spin") + ch <- c.cpu.mustNewConstMetric(float64(time[CP_INTR])/hz, lcpu, "interrupt") + ch <- c.cpu.mustNewConstMetric(float64(time[CP_IDLE])/hz, lcpu, "idle") } return err } diff --git a/collector/cpu_openbsd_amd64.go b/collector/cpu_openbsd_amd64.go deleted file mode 100644 index b07d2ca7..00000000 --- a/collector/cpu_openbsd_amd64.go +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2020 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. - -//go:build !nocpu -// +build !nocpu - -package collector - -import ( - "strconv" - "unsafe" - - "github.com/go-kit/log" - "github.com/prometheus/client_golang/prometheus" - "golang.org/x/sys/unix" -) - -type clockinfo struct { - hz int32 - tick int32 - tickadj int32 - stathz int32 - profhz int32 -} - -const ( - CP_USER = iota - CP_NICE - CP_SYS - CP_SPIN - CP_INTR - CP_IDLE - CPUSTATES -) - -type cpuCollector struct { - cpu typedDesc - logger log.Logger -} - -func init() { - registerCollector("cpu", defaultEnabled, NewCPUCollector) -} - -func NewCPUCollector(logger log.Logger) (Collector, error) { - return &cpuCollector{ - cpu: typedDesc{nodeCPUSecondsDesc, prometheus.CounterValue}, - logger: logger, - }, nil -} - -func (c *cpuCollector) Update(ch chan<- prometheus.Metric) (err error) { - clockb, err := unix.SysctlRaw("kern.clockrate") - if err != nil { - return err - } - clock := *(*clockinfo)(unsafe.Pointer(&clockb[0])) - hz := float64(clock.stathz) - - ncpus, err := unix.SysctlUint32("hw.ncpu") - if err != nil { - return err - } - - var cpTime [][CPUSTATES]int64 - for i := 0; i < int(ncpus); i++ { - cpb, err := unix.SysctlRaw("kern.cp_time2", i) - if err != nil && err != unix.ENODEV { - return err - } - if err != unix.ENODEV { - cpTime = append(cpTime, *(*[CPUSTATES]int64)(unsafe.Pointer(&cpb[0]))) - } - } - - for cpu, time := range cpTime { - lcpu := strconv.Itoa(cpu) - ch <- c.cpu.mustNewConstMetric(float64(time[CP_USER])/hz, lcpu, "user") - ch <- c.cpu.mustNewConstMetric(float64(time[CP_NICE])/hz, lcpu, "nice") - ch <- c.cpu.mustNewConstMetric(float64(time[CP_SYS])/hz, lcpu, "system") - ch <- c.cpu.mustNewConstMetric(float64(time[CP_SPIN])/hz, lcpu, "spin") - ch <- c.cpu.mustNewConstMetric(float64(time[CP_INTR])/hz, lcpu, "interrupt") - ch <- c.cpu.mustNewConstMetric(float64(time[CP_IDLE])/hz, lcpu, "idle") - } - return err -}