node_exporter/collector/ksmd_linux.go

83 lines
2.1 KiB
Go
Raw Permalink Normal View History

// Copyright 2015 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 !noksmd
package collector
import (
"fmt"
"path"
"github.com/prometheus/client_golang/prometheus"
)
var (
ksmdFiles = []string{"full_scans", "merge_across_nodes", "pages_shared", "pages_sharing",
"pages_to_scan", "pages_unshared", "pages_volatile", "run", "sleep_millisecs"}
)
type ksmdCollector struct {
metricDescs map[string]*prometheus.Desc
}
func init() {
registerCollector("ksmd", defaultDisabled, NewKsmdCollector)
}
func getCanonicalMetricName(filename string) string {
switch filename {
case "full_scans":
return filename + "_total"
case "sleep_millisecs":
return "sleep_seconds"
default:
return filename
}
}
2017-02-28 16:44:53 +00:00
// NewKsmdCollector returns a new Collector exposing kernel/system statistics.
func NewKsmdCollector() (Collector, error) {
subsystem := "ksmd"
descs := make(map[string]*prometheus.Desc)
for _, n := range ksmdFiles {
descs[n] = prometheus.NewDesc(
prometheus.BuildFQName(namespace, subsystem, getCanonicalMetricName(n)),
fmt.Sprintf("ksmd '%s' file.", n), nil, nil)
}
return &ksmdCollector{descs}, nil
}
2017-02-28 16:44:53 +00:00
// Update implements Collector and exposes kernel and system statistics.
func (c *ksmdCollector) Update(ch chan<- prometheus.Metric) error {
for _, n := range ksmdFiles {
val, err := readUintFromFile(sysFilePath(path.Join("kernel/mm/ksm", n)))
if err != nil {
return err
}
t := prometheus.GaugeValue
v := float64(val)
switch n {
case "full_scans":
t = prometheus.CounterValue
case "sleep_millisecs":
v /= 1000
}
ch <- prometheus.MustNewConstMetric(c.metricDescs[n], t, v)
}
return nil
}