Add new collector exposing 'ksmd' stats

Add new collector which exposes the content of /sys/kernel/mm/ksm
directory. This directory contains control and statistics files for
Kernel Samepage Merging daemon.

The collector is not enabled by default.

Signed-off-by: Pavel Borzenkov <pavel.borzenkov@gmail.com>
This commit is contained in:
Pavel Borzenkov 2015-11-11 16:02:41 +03:00
parent c47c011063
commit 0e78ed63a6
12 changed files with 120 additions and 0 deletions

View file

@ -444,6 +444,33 @@ node_forks 26442
# HELP node_intr Total number of interrupts serviced.
# TYPE node_intr counter
node_intr 8.885917e+06
# HELP node_ksmd_full_scans_total ksmd 'full_scans' file.
# TYPE node_ksmd_full_scans_total counter
node_ksmd_full_scans_total 323
# HELP node_ksmd_merge_across_nodes ksmd 'merge_across_nodes' file.
# TYPE node_ksmd_merge_across_nodes gauge
node_ksmd_merge_across_nodes 1
# HELP node_ksmd_pages_shared ksmd 'pages_shared' file.
# TYPE node_ksmd_pages_shared gauge
node_ksmd_pages_shared 1
# HELP node_ksmd_pages_sharing ksmd 'pages_sharing' file.
# TYPE node_ksmd_pages_sharing gauge
node_ksmd_pages_sharing 255
# HELP node_ksmd_pages_to_scan ksmd 'pages_to_scan' file.
# TYPE node_ksmd_pages_to_scan gauge
node_ksmd_pages_to_scan 100
# HELP node_ksmd_pages_unshared ksmd 'pages_unshared' file.
# TYPE node_ksmd_pages_unshared gauge
node_ksmd_pages_unshared 0
# HELP node_ksmd_pages_volatile ksmd 'pages_volatile' file.
# TYPE node_ksmd_pages_volatile gauge
node_ksmd_pages_volatile 0
# HELP node_ksmd_run ksmd 'run' file.
# TYPE node_ksmd_run gauge
node_ksmd_run 1
# HELP node_ksmd_sleep_seconds ksmd 'sleep_millisecs' file.
# TYPE node_ksmd_sleep_seconds gauge
node_ksmd_sleep_seconds 0.02
# HELP node_load1 1m load average.
# TYPE node_load1 gauge
node_load1 0.21

View file

@ -0,0 +1 @@
323

View file

@ -0,0 +1 @@
1

View file

@ -0,0 +1 @@
1

View file

@ -0,0 +1 @@
255

View file

@ -0,0 +1 @@
100

View file

@ -0,0 +1 @@
0

View file

@ -0,0 +1 @@
0

View file

@ -0,0 +1 @@
1

View file

@ -0,0 +1 @@
20

83
collector/ksmd_linux.go Normal file
View file

@ -0,0 +1,83 @@
// 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() {
Factories["ksmd"] = NewKsmdCollector
}
func getCanonicalMetricName(filename string) string {
switch filename {
case "full_scans":
return filename + "_total"
case "sleep_millisecs":
return "sleep_seconds"
default:
return filename
}
}
// Takes a prometheus registry and 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
}
// Expose kernel and system statistics.
func (c *ksmdCollector) Update(ch chan<- prometheus.Metric) (err 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
}

View file

@ -7,6 +7,7 @@ collectors=$(cat << COLLECTORS
diskstats
entropy
filefd
ksmd
loadavg
mdadm
meminfo