Prometheus Exporter 监控 Redis

释放双眼,带上耳机,听听看~!
Redis应用没有自带的/metrics接口,我们就需要利用exporter服务来为prometheus提供指标数据了。Prometheus官方为许多应用提供了exporter应用
🤖 由 ChatGPT 生成的文章摘要

Prometheus Exporter 监控 Redis

Prometheus

2019年06月18日


Exporter简介

Prometheus已经成为云原生应用监控行业的标准,在很多流行的监控系统中都已经实现了Prometheus的监控接口,例如etcd、Kubernetes、CoreDNS等,他们可以直接被Prometheus监控,但是大多数监控对象都没办法直接提供监控接口,主要原因有

(1) 很多系统在Prometheus诞生前很多年就已经发布,例如MySQL、Redis等

(2) 它们本身不支持HTTP接口,例如对于硬件性能指标,操作系统并没有原生的HTTP接口可以获取;

(3) 考虑到安全性、稳定性及代码耦合等因素的影响

在这个背景之下,exporter诞生,exporter是一个采集监控数据并通过Prometheus监控规范对外提供数据的组件。除了官方实现的exporter如Node exporter、HAProxy exporter、Mysql exporter,还有很多第三方的如Redis exporter和Rabbitmq exporter

Prometheus Exporter 监控 Redis

这些exporter主要通过被监控对象提供的监控相关的接口获取监控数据,这些接口主要通过以下方式对外提供服务。

(1) HTTP/HTTPS方式。例如Rabbitmq exporter通过Rabbitmq的HTTPS接口获取监控数据

(2) TCP方式。例如Redis exporter通过Redis提供的系统监控相关命令获取监控指标,MySQL server exporter 通过MySQL开放的监控相关的表获取监控指标

(3) 本地文件方式。 例如Node exporter通过读取proc文件系统下的文件,计算得出整个操作系统状态

(4) 标准协议方式。例如IPMI exporter通过IPMI协议获取硬件相关信息。这些exporter将不同规范和格式的监控指标进行转化,输出prometheus能够识别的监控数据格式,从而极大扩展prometheus采集数据的能力

使用exporter 监控Redis

Redis应用没有自带的/metrics接口,我们就需要利用exporter服务来为prometheus提供指标数据了。Prometheus官方为许多应用提供了exporter应用

我们这次使用Reedis exporter进行演示,对于这类应用,我们一般会以 sidecar 的形式和主应用部署在同一个 Pod 中,比如我们这里来部署一个 redis 应用,并用 redis-exporter 的方式来采集监控数据供 Prometheus 使用

创建一个Redis项目,包含2个pod

cat >>prometheus-redis-exporter.yaml <<EOF
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: redis
  namespace: abcdocker
spec:
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:4
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort: 6379
      - name: redis-exporter
        image: oliver006/redis_exporter:latest
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
        ports:
        - containerPort: 9121
---
kind: Service
apiVersion: v1
metadata:
  name: redis
  namespace: abcdocker
spec:
  selector:
    app: redis
  ports:
  - name: redis
    port: 6379
    targetPort: 6379
  - name: prom
    port: 9121
    targetPort: 9121
EOF

在命名空间中,我们将命名空间指定到abcdocker

#创建命名空间
[root@abcdocker prometheus]# kubectl create namespace abcdocker
namespace/abcdocker created

#创建redis项目
[root@abcdocker prometheus]# kubectl create -f prometheus-redis-exporter.yaml
deployment.extensions/redis created
service/redis created

#查看redis pod是否正常
[root@abcdocker prometheus]# kubectl get pod -n abcdocker
NAME                     READY   STATUS    RESTARTS   AGE
redis-58c6c94968-8tsxg   2/2     Running   0          84s

#查看svc是否正常
[root@abcdocker prometheus]# kubectl get svc -n abcdocker
NAME    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
redis   ClusterIP   10.96.199.222           6379/TCP,9121/TCP   2m18s

#镜像拉的比较慢,都是可以拉到的镜像,我这里就不提供压缩包了

创建完毕之后,在redis-exporter里面已经包含了metrics,我们访问一下service的metrics接口即可

#ip为service IP (出现以下内容为服务正常)

curl 10.96.199.222:9121/metrics
# HELP exporter_scrape_duration_seconds Duration of scrape by the exporter
# TYPE exporter_scrape_duration_seconds summary
exporter_scrape_duration_seconds{quantile="0.5"} NaN
exporter_scrape_duration_seconds{quantile="0.9"} NaN
exporter_scrape_duration_seconds{quantile="0.99"} NaN
exporter_scrape_duration_seconds_sum 0
exporter_scrape_duration_seconds_count 0
# HELP go_gc_duration_seconds A summary of the GC invocation durations.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 0
....
redis_target_scrape_request_errors_total 0
# HELP redis_up Information about the Redis instance
# TYPE redis_up gauge
redis_up 1
# HELP redis_uptime_in_seconds uptime_in_seconds metric
# TYPE redis_uptime_in_seconds gauge
redis_uptime_in_seconds 184

Redis创建完毕,我们还需要修改prometheus配置文件(ConfigMap)

#添加如下
    - job_name: 'redis'
      static_configs:
      - targets: ['redis.abcdocker.svc.cluster.local:9121']

#job_name 是显示在prometheus监控项的名称
#redis 为service名称
#abcdocker为命名空间(如果和prometheus在一个命名空间下可以不写)
#svc.cluster.local固定格式
#9121为service端口

我们之前有一个configmap需要删除之前的,在从新创建一个

[root@abcdocker prometheus]# kubectl delete -f prometheus.configmap.yaml
configmap "prometheus-config" deleted


[root@abcdocker prometheus]# kubectl create -f prometheus.configmap.yaml
configmap/prometheus-config created

#查看service是否正常
[root@yzsjhl82-138 prometheus]# kubectl get svc -n kube-system |grep prometheus
prometheus             NodePort    10.101.143.162           9090:32331/TCP           3h14m

#我们需要通过curl命令,进行热更新
[root@abcdocker prometheus]# curl -X POST "http://10.101.143.162:9090/-/reload"

更新完毕后,在prometheus Web Ui界面就可以看到展示结果

Prometheus Exporter 监控 Redis

给TA打赏
共{{data.count}}人
人已打赏
prometheus

Prometheus 持久化安装

2019-6-19 12:06:56

prometheus

Prometheus监控Kubernetes 集群节点及应用

2019-6-19 12:09:38

15 条回复 A文章作者 M管理员
  1. […] Prometheus Exporter 监控 Redis […]

  2. 普罗米森森

    感谢分享。
    请问一下我这边redis.abcdocker.svc.cluster.local这个地址无法访问是怎么回事呢?

  3. 普罗米森森

    感谢回复。我没有改名称。我试了一下。直接把这个域名改成services的IP也不能访问,就是这个10.105.175.80
    kubectl get svc -n abcdocker
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    redis ClusterIP 10.105.175.80 6379/TCP,9121/TCP 56m
    在prometheus的web页面中,State一直是DOWN的状态。

    • 普罗米森森

      kubectl get pod -n abcdocker
      NAME READY STATUS RESTARTS AGE
      redis-7fb667b7c6-lrlsr 2/2 Running 0 85m
      pod没毛病啊。
      curl也是对的。
      curl 10.244.1.23:9121/metric

      Redis Exporter v1.6.1

      Redis Exporter v1.6.1
      Metrics

      然而还是这个提示:
      Get “http://10.244.1.23:9121/metrics”: context deadline exceeded
      或者是这个提示:
      Get “http://redis.abcdocker.svc.cluster.local:9121/metrics”: context deadline exceeded

    • 普罗米森森

      匹配上了啊,从node上测试svc的CLUSTERIP,6379和9121端口都是通的
      kubectl get svc -n abcdocker -o wide
      NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
      redis ClusterIP 10.105.175.80 6379/TCP,9121/TCP 108m app=redis

    • 普罗米森森

      我自己解决了,谢谢。
      不过用域名还是不可以。但是用IP可以了。
      方法就是修改prometheus.configmap.yaml里的参数
      把这两个值改大。
      global:
      scrape_interval: 300s
      scrape_timeout: 300s

    • 擱淺沉默

      博主你好,我也遇到了跟他一样的情况,所用k8s环境为1.17版本,使用域名是无法访问的

    • 新闻联播老司机

      了解了,明天我更新一下文章吧~ 先用svc的方式吧。 我改一下,明天我更新一下我的版本

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索