exporter 介紹
Exporter是什么
廣義上講所有可以向Prometheus提供監控樣本數據的程序都可以被稱為一個Exporter。而Exporter的一個實例稱為target,如下所示,Prometheus通過輪詢的方式定期從這些target中獲取樣本數據:

Exporter的來源
從Exporter的來源上來講,主要分為兩類:
- 社區提供的
Prometheus社區提供了豐富的Exporter實現,涵蓋了從基礎設施,中間件以及網絡等各個方面的監控功能。這些Exporter可以實現大部分通用的監控需求。下表列舉一些社區中常用的Exporter:
| 范圍 | 常用Exporter |
|---|---|
| 數據庫 | MySQL Exporter, Redis Exporter, MongoDB Exporter, MSSQL Exporter等 |
| 硬件 | Apcupsd Exporter,IoT Edison Exporter, IPMI Exporter, Node Exporter等 |
| 消息隊列 | Beanstalkd Exporter, Kafka Exporter, NSQ Exporter, RabbitMQ Exporter等 |
| 存儲 | Ceph Exporter, Gluster Exporter, HDFS Exporter, ScaleIO Exporter等 |
| HTTP服務 | Apache Exporter, HAProxy Exporter, Nginx Exporter等 |
| API服務 | AWS ECS Exporter, Docker Cloud Exporter, Docker Hub Exporter, GitHub Exporter等 |
| 日志 | Fluentd Exporter, Grok Exporter等 |
| 監控系統 | Collectd Exporter, Graphite Exporter, InfluxDB Exporter, Nagios Exporter, SNMP Exporter等 |
| 其它 | Blockbox Exporter, JIRA Exporter, Jenkins Exporter, Confluence Exporter等 |
- 用戶自定義的
除了直接使用社區提供的Exporter程序以外,用戶還可以基於Prometheus提供的Client Library創建自己的Exporter程序,目前Promthues社區官方提供了對以下編程語言的支持:Go、Java/Scala、Python、Ruby。同時還有第三方實現的如:Bash、C++、Common Lisp、Erlang,、Haskeel、Lua、Node.js、PHP、Rust等。
node exporter
介紹
node_exporter 是使用 Go 語言編寫的 Prometheus exporter, 多用於收集 *NIX 內核公開的硬件或操作系統指標. 監控服務器CPU、內存、磁盤、I/O等信息.
源碼解析
import 的相關包
import (
"fmt"
"net/http"
_ "net/http/pprof"
"os"
"os/user"
"sort"
"github.com/prometheus/common/promlog"
"github.com/prometheus/common/promlog/flag"
"github.com/go-kit/kit/log"
"github.com/go-kit/kit/log/level"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/prometheus/common/version"
"github.com/prometheus/exporter-toolkit/web"
"github.com/prometheus/node_exporter/collector" // 收集器
kingpin "gopkg.in/alecthomas/kingpin.v2" // 格式化參數
)
main函數
- 首先會對參數進行解析
| 參數 | 解釋 |
|---|---|
| listenAddress | node_export啟動時使用的機器&端口,默認:9100; 示例: 0.0.0.0:9101. |
| metricsPath | prometheus server端采集數據的PATH,默認為/metrics. |
| disableExporterMetrics | 是否禁用Exporter, 默認值為false. |
| maxRequests | 最大QPS, 使用0禁用. 默認40 |
| disableDefaultCollectors | 是否禁用默認的收集器, 默認為false |
| configFile | 可以啟用TLS或身份驗證. |
http.Handle(*metricsPath, newHandler(!*disableExporterMetrics, *maxRequests, logger))
將訪問metricsPath的請求注冊到http.handler,當client訪問改PATH時,會執行handler.ServeHTTP 函數.
newHandler(!*disableExporterMetrics, *maxRequests, logger)
func newHandler(includeExporterMetrics bool, maxRequests int, logger log.Logger) *handler {
h := &handler{
exporterMetricsRegistry: prometheus.NewRegistry(),
includeExporterMetrics: includeExporterMetrics,
maxRequests: maxRequests,
logger: logger,
}
if h.includeExporterMetrics {
h.exporterMetricsRegistry.MustRegister(
prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{}),
prometheus.NewGoCollector(),
)
}
if innerHandler, err := h.innerHandler(); err != nil {
panic(fmt.Sprintf("Couldn't create metrics handler: %s", err))
} else {
h.unfilteredHandler = innerHandler
}
return h // 返回一個handler函數,
}
