Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add file and crontab collector for node exporter #784

Merged
merged 2 commits into from
Feb 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions inputs/node_exporter/collector/collector_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,6 @@ func paramsInit(params map[string]string) {
runitCollectorInit(params)
supervisordCollectorInit(params)
textFileCollectorInit(params)
fileCollectorInit(params)
crontabCollectorInit(params)
}
3 changes: 2 additions & 1 deletion inputs/node_exporter/collector/collector_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,6 @@ func paramsInit(params map[string]string) {
textFileCollectorInit(params)
vmStatCollectorInit(params)
wifiCollectorInit(params)

fileCollectorInit(params)
crontabCollectorInit(params)
}
2 changes: 2 additions & 0 deletions inputs/node_exporter/collector/collector_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,6 @@ func paramsInit(params map[string]string) {
runitCollectorInit(params)
supervisordCollectorInit(params)
textFileCollectorInit(params)
fileCollectorInit(params)
crontabCollectorInit(params)
}
98 changes: 98 additions & 0 deletions inputs/node_exporter/collector/crontab.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package collector

import (
"crypto/md5"
"fmt"
"io/ioutil"
"os"
"path"

"github.com/prometheus/client_golang/prometheus"
)

var (
crontabDir = new(string)
// kingpin.Flag("collector.crontab.dir", "crontab监听目录").Default("/var/spool/cron/crontabs/").String()
crontabMap = make(map[string]string)
)

type crontabCollector struct {
cronNotify *prometheus.Desc
}

func init() {
registerCollector("crontab", defaultDisabled, NewCrontabCollector)
}

func NewCrontabCollector() (Collector, error) {
c := &crontabCollector{
cronNotify: prometheus.NewDesc(
prometheus.BuildFQName(namespace, "", "crontab"),
"禁停crontab变化",
[]string{"user"}, nil,
),
}
fileList, _ := ioutil.ReadDir(*crontabDir)

for _, file := range fileList {
if file.IsDir() {
continue
}
if data, err := c.readFile(path.Join(*crontabDir, file.Name())); err != nil {
panic(err.Error())
} else {
crontabMap[file.Name()] = fmt.Sprintf("%x", md5.Sum(data))
}

}
return c, nil
}

func (c *crontabCollector) readFile(fileName string) ([]byte, error) {
file, err := os.Open(fileName)
if err != nil {
return nil, err
}
defer file.Close()

fd, _ := ioutil.ReadAll(file)
return fd, nil
}

func crontabCollectorInit(params map[string]string) {
dir, ok := params["collector.crontab.dir"]
if !ok {
*crontabDir = "/var/spool/cron/crontabs/"
} else {
*crontabDir = dir
}
}

func (c *crontabCollector) Update(ch chan<- prometheus.Metric) error {
fileList, _ := ioutil.ReadDir(*crontabDir)
for _, file := range fileList {
if file.IsDir() {
continue
}
fileName := file.Name()
var v float64 = 0
if data, ok := crontabMap[fileName]; !ok {
v = 1
filedata, _ := c.readFile(path.Join(*crontabDir, fileName))
crontabMap[fileName] = fmt.Sprintf("%x", md5.Sum(filedata))

} else {
data1, err := c.readFile(path.Join(*crontabDir, fileName))
if err != nil {
v = 1
}
newMd5 := fmt.Sprintf("%x", md5.Sum(data1))
if data != newMd5 {
v = 1
crontabMap[fileName] = newMd5
}
}
ch <- prometheus.MustNewConstMetric(c.cronNotify, prometheus.GaugeValue, v, fileName)
}
return nil
}
82 changes: 82 additions & 0 deletions inputs/node_exporter/collector/file.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package collector

import (
"crypto/md5"
"fmt"
"io/ioutil"
"os"
"strings"

"github.com/prometheus/client_golang/prometheus"
)

var (
fileList = new(string)
// kingpin.Flag("collector.file.notifylist", "监听文件列表,多个文件以 , 隔开").Default("/etc/passwd,/etc/shadow").String()
fileMap = make(map[string]string)
)

type fileListCollector struct {
fileNotify *prometheus.Desc
}

func init() {
registerCollector("filenotify", defaultEnabled, NewFileNotifyCollector)
}

func NewFileNotifyCollector() (Collector, error) {
f := &fileListCollector{
fileNotify: prometheus.NewDesc(
prometheus.BuildFQName(namespace, "", "filenotify"),
"监听对应文件变化",
[]string{"file_name"}, nil,
),
}
for _, fileName := range strings.Split(*fileList, ",") {
if data, err := f.readFile(fileName); err != nil {
panic(err.Error())
} else {
fileMap[fileName] = fmt.Sprintf("%x", md5.Sum(data))
}

}
return f, nil
}

func (f *fileListCollector) readFile(fileName string) ([]byte, error) {
file, err := os.Open(fileName)
if err != nil {
return nil, err
}
defer file.Close()

fd, _ := ioutil.ReadAll(file)
return fd, nil
}

func fileCollectorInit(params map[string]string) {
files, ok := params["collector.file.notifylist"]
if !ok {
*fileList = "/etc/passwd,/etc/shadow"
} else {
*fileList = files
}
}

func (f *fileListCollector) Update(ch chan<- prometheus.Metric) error {
for fileName := range fileMap {
var v float64 = 0
data, err := f.readFile(fileName)
if err != nil {
v = 1
}
newMd5 := fmt.Sprintf("%x", md5.Sum(data))
if fileMap[fileName] != newMd5 {
v = 1
fileMap[fileName] = newMd5
}
ch <- prometheus.MustNewConstMetric(f.fileNotify, prometheus.GaugeValue, v, fileName)
}

return nil
}
Loading