今天我们要聊的是NodeExporter,一款可扩展的系统监控组件。NodeExporter是Prometheus生态系统中的一员,作为Prometheus的一个客户端,NodeExporter主要负责收集服务器的各种指标,诸如CPU使用率、内存使用率、磁盘使用情况、网络流量等。
一、NodeExporter源码
NodeExporter是开源软件,其源码托管在GitHub上,感兴趣的读者可以前往查看。
二、NodeExporter指标
作为Prometheus客户端,NodeExporter的最主要的职责就是提供系统各种指标,以下是一些NodeExporter支持的指标:
node_boot_time_seconds:系统启动时间
node_cpu_seconds_total:CPU使用时间、CPU使用率
node_filesystem_avail_bytes:文件系统的可用空间大小
node_filesystem_size_bytes:文件系统的总空间大小
node_load1:1分钟平均负载
node_memory_MemAvailable_bytes:系统内存可用空间大小
node_vmstat_pgfault:发生缺页错误的次数
以上指标只是冰山一角,NodeExporter提供的指标非常多,完整列表可以在Prometheus的官方网站上查看。
三、NodeExporter采集原理
NodeExporter实现了Prometheus的/(metrics)API,提供了最基础的metric输出方式。当Prometheus Server查询NodeExporter的metric API时,NodeExporter返回系统信息。这样Prometheus就可以通过拉取的方式获得数据。
当然,NodeExporter也支持通过PushGateway的方式,将数据主动推送到Prometheus Server上,PushGateway在我们后面的文章中会介绍。
四、NodeExporter源码解读
下面我们来看一下NodeExporter源码的分层设计:
│ prometheus.go
│ README.md
│ main.go
│
├─collectors
│ │ collectors.go
│ │ cpu.go
│ │ cpufreq_linux.go
│ │ diskstats_linux.go
│ │ exports.go
│ │ filesystem_linux.go
│ │ ioctl_linux.go
│ │ loadavg_linux.go
│ │ meminfo_linux.go
│ │ netdev_linux.go
│ │ netstat_linux.go
│ │ processes_linux.go
│ │ procstat_linux.go
│ │ stat_linux.go
│ │ textfile.go
│ │ textfile_linux.go
│ │
│ ├─collector_structs
│ │ cpufreq_linux.go
│ │ diskstat.go
│ │ filesystem_linux.go
│ │ interrupts.go
│ │ meminfo.go
│ │ netstat.go
│ │ stat_linux.go
│ │ tcpstat.go
│ │ uptime.go
│ │
│ └─systemd
│ networkd_linux.go
│ systemd_linux.go
│ systemd_units.go
│ timedate_linux.go
│ udev_linux.go
│ units.go
│
├─collector/check_test_data
│ test-linux-proc-diskstats
│ test2-linux-proc-diskstats
│ test2-linux-proc-net-dev_snmp6
│ test-linux-device-mapper_multipath
│ test2-linux-device-mapper_multipath
│ test-linux-proc-stat
│ test2-linux-proc-stat
│ test2-textfile-time
│ test-textfile-go
│
├─config
│ config.go
│
├─exporter
│ node_exporter.go
│
├─textfile
│ textfile.go
│
├─util
│ helpers.go
│ md5sum.go
│ version_info.go
│
└─vendor
NodeExporter的源码分以collectors、config、exporter、textfile、util等为主要模块。
其中collectors是最核心的模块,其中包括collectors.go、cpu.go、filesystem_linux.go等 Collected部分指标。
NodeExporter的代码非常清晰、模块化并且易于理解,这也为其提供了较好的可扩展性。如果有兴趣深入了解NodeExporter的源码实现,建议阅读源码。
五、Node-export选取
Node-export选取是NodeExporter中的一个子系统,该子系统负责自动发现节点的机制和配置。
下面是一个简单的Node-export选取配置的例子:
bearer_token_file: /path/to/token/file
disable_exporter_metrics: true
disable_collectors:
- netdev
- sockstat
以上的配置文件意味着NodeExporter会读取/path/to/token/file中的token,同时禁用netdev和sockstat的Collector。
六、总结
综上所述,NodeExporter可以让我们轻松地收集各种系统指标,以便我们更好地监控我们的系统。NodeExporter源码清晰、模块化,易于理解,而Node-export选取则为NodeExporter提供了自动化的配置机制。
使用NodeExporter和Prometheus可以非常方便地搭建起一个优秀的监控系统,同时,我们也可以通过深入了解其源码实现,进一步扩展其功能。