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 是最推荐的一个组件。

results matching ""

    No results matching ""