metric/system/numcpu/numcpu.go (17 lines of code) (raw):
// Licensed to Elasticsearch B.V. under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Elasticsearch B.V. licenses this file to you 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.
package numcpu
import (
"runtime"
"github.com/elastic/elastic-agent-libs/logp"
)
// NumCPU is a drop-in replacement for runtime.NumCPU for accurate system config reporting.
// runtime.NumCPU doesn't query any kind of hardware or OS state,
// but merely uses affinity APIs to count what CPUs the given go process is available to run on.
// Most of the time this works okay for reporting metrics, but under certain conditions, such as cases where
// affinity masks are being manually set to manage the go process, or certain job controllers/VMs/etc,
// this number will not reflect the system config.
// Because this is drop-in, it will not return an error.
// if it can't fetch the CPU count the "correct" way, it'll fallback to runtime.NumCPU().
func NumCPU() int {
count, exists, err := getCPU()
if err != nil {
logp.L().Debugf("Error fetching CPU count: %s", err)
return runtime.NumCPU()
}
if !exists {
logp.L().Debugf("Accurate CPU counts not available on platform, falling back to runtime.NumCPU for metrics")
return runtime.NumCPU()
}
return count
}