Redis Exporter
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。对于 Redis 监控官方并没有推出对应的 Exporter ,但是官方推荐使用 oliver006 开源的 Redis Exporter,这个 Exporter 官方仓库地址是 https://github.com/oliver006/redis_exporter ,支持 Redis 2.x, 3.x, 4.x, 5.x, 和 6.x ,最新版本是 1.33.0 ,发布于 2021 年 12 月 20 日。
安装运行
Redis Exporter 的二进制运行文件可以从 https://github.com/oliver006/redis_exporter/releases 下载,下载后直接启动即可
./redis_exporter
也支持 Docker 容器运行,镜像在 Docker Hub 和 quary.io 都有上传,可以根据需要拉取
docker run -d --name redis_exporter -p 9121:9121 oliver006/redis_exporter
启动后的 Redis Exporter 有一些选项可以通过命令行或者环境变量来控制,共计有 34 个控制参数。
比较常用的几个是
- redis.addr REDIS_ADDR Address of the Redis instance, defaults to redis://localhost:6379.
- redis.user REDIS_USER User name to use for authentication (Redis ACL for Redis 6.0 and newer).
- redis.password REDIS_PASSWORD Password of the Redis instance, defaults to "" (no password).
- script REDIS_EXPORTER_SCRIPT Path to Redis Lua script for gathering extra metrics.
- debug REDIS_EXPORTER_DEBUG Verbose debug output
- log-format REDIS_EXPORTER_LOG_FORMAT Log format, valid options are txt (default) and json.
- namespace REDIS_EXPORTER_NAMESPACE Namespace for the metrics, defaults to redis.
- connection-timeout REDIS_EXPORTER_CONNECTION_TIMEOUT Timeout for connection to Redis instance, defaults to "15s" (in Golang duration format)
- web.listen-address REDIS_EXPORTER_WEB_LISTEN_ADDRESS Address to listen on for web interface and telemetry, defaults to 0.0.0.0:9121.
- web.telemetry-path REDIS_EXPORTER_WEB_TELEMETRY_PATH Path under which to expose metrics, defaults to /metrics.
详细的可以参考 https://github.com/oliver006/redis_exporter#command-line-flags
Redis 实例通过 TCP 地址: redis://localhost:6379, redis.example.com:6379 或者 unix sockets: unix:///tmp/redis.sock 来提供访问
SSL 支持使用 rediss:// schema,比如 rediss://azure-ssl-enabled-host.redis.cache.windows.net:6380 ,请注意,当连接到非标准的6379端口时,该端口是必需的,例如使用 Azure Redis 实例的时候。
命令行参数设置的值优先于环境变量提供的配置。
Redis 认证
如果你的 Redis 实例需要认证,那么有几种方式你可以提供一个用户名和密码。在新的 Redis 6.x 版本中是使用了 ACL 。
你可以在连接的时候中提供用户名和密码作为地址的一部分,当使用 /scrape
接口使用密码文件的时候可以通过
-redis.password-file=sample-pwd-file.json
设置 ,它只在 redis.password == ""
的时候生效。
一个包含密码的 URI 实例 :redis://<<username (optional)>>:<<PASSWORD>>@<<HOSTNAME>>:<<PORT>>
。
可以通过命令行参数直接提供给账号密码给 Redis Exporter --redis.user
和 --redis.password
如果你使用了一个专有的 Redis 用户给 Redis Exporter 作为监控使用,那么你需要给这个用户一个可以使用的命令列表。可以使用 Redis 命令来进行设置,将 <<
ACL SETUSER <<<USERNAME>>> +client +ping +info +config|get +cluster|info +slowlog +latency +memory +select +get +scan +xinfo +type +pfcount +strlen +llen +scard +zcard +hlen +xlen +eval allkeys on > <<<PASSWORD>>>
Prometheus 配置采集
只采集一个 Redis 实例的监控可以在 Prometheus 的配置文件中添加一个 scrape_configs
配置块就可以。
scrape_configs:
- job_name: redis_exporter
static_configs:
- targets: ['<<REDIS-EXPORTER-HOSTNAME>>:9121']
对于 Kubernetes 的服务发现配置,为了在下拉菜单中让实例作为人类可读的名称而不是ip,建议对实例进行 relabel 操作,如果指标是通过 pod 角色抓取的,可以添加:
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: instance
regex: (.*redis.*)
作为一个重新标签配置到相应的刮擦配置。按照regex值,只有 pod 与“redis”在他们的名字将被重新标签为这样。
配置采集多个 Redis 主机
使用命令行 --redis.addr=
运行 Exporter 。这样它就不会在每次 /metrics
端点被刮取时尝试访问本地实例。
scrape_configs:
## config for the multiple Redis targets that the exporter will scrape
- job_name: 'redis_exporter_targets'
static_configs:
- targets:
- redis://first-redis-host:6379
- redis://second-redis-host:6379
- redis://second-redis-host:6380
- redis://second-redis-host:6381
metrics_path: /scrape
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: <<REDIS-EXPORTER-HOSTNAME>>:9121
## config for scraping the exporter itself
- job_name: 'redis_exporter'
static_configs:
- targets:
- <<REDIS-EXPORTER-HOSTNAME>>:9121
Redis 实例被列在 targets 下面,Redis Exporter 主机名是通过最后的 relabel_config
规则配置的。
如果 Redis 实例需要认证,那么你可以通过 --redis.password
参数指定 Redis Exporter 访问 Redis 的密码。
如果是这样的话,多个 Redis 实例之鞥呢使用多个 Redis Exporter 来进行监控。
也可以使用一个 JSON file 通过 文件发现来配置多个实例,
scrape_configs:
- job_name: 'redis_exporter_targets'
file_sd_configs:
- files:
- targets-redis-instances.json
metrics_path: /scrape
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: <<REDIS-EXPORTER-HOSTNAME>>:9121
## config for scraping the exporter itself
- job_name: 'redis_exporter'
static_configs:
- targets:
- <<REDIS-EXPORTER-HOSTNAME>>:9121
这个 targets-redis-instances.json
内容如下进行排列
[
{
"targets": [ "redis://redis-host-01:6379", "redis://redis-host-02:6379"],
"labels": { }
}
]
Prometheus 使用文件监视,所有对 json 文件的更改都会使 Prometheus 立即生效。
指标
INFO 命令中的大部分信息都是可以导出的,详细信息参阅 Redis 文档即可。
此外,对于每个数据库,都有关于total keys, expiring keys 和数据库中键的平均生存时间的指标。
如果 key 是数字格式的,还可以使用 -check-keys
参数导出键值。Redis Exporter 还将导出键的大小(或者根据数据类型导出键的长度)。这可以用来导出或者排序集合、散列、列表、流等中的元素数量。
如果你需要自定义指标集合,你可以使用 -script
参数提供一个Redis Lua 脚本来使用。
redis_memory_max_bytes
指标会展示Redis 可以使用的最大字节数。
如果你正在抓取的 Redis 实例没有设置内存限制,它是零(这是Redis的默认设置)。
你可以通过检查指标redis_config_maxmemory
是否为零或者通过 redis-cli
连接到 Redis 实例并运行命令CONFIG GET MAXMEMORY
来确认这种情况。
小结
在使用 Prometheus 监控 Redis 的场景下 ,Redis Exporter 是最推荐的一个组件。