更新时间:2024-06-28 GMT+08:00

PostgreSQL Exporter接入

操作场景

使用PostgreSQL过程中需要对PostgreSQL运行状态进行监控,以便了解PostgreSQL服务是否运行正常,及时排查PostgreSQL故障问题原因。Prometheus监控服务提供了CCE容器场景下基于Exporter的方式来监控PostgreSQL运行状态。本文介绍如何部署Exporter以及实现PostgreSQL Exporter告警接入等操作。

前提条件

PostgreSQL Exporter 部署

  1. 登录CCE控制台。
  2. 单击已接入的集群名称,进入该集群的管理页面。
  3. 执行以下操作完成Exporter部署。

    1. 使用Secret管理PostgreSQL密码。

      在左侧导航栏中选择“工作负载”,在右上角单击“YAML创建”完成YAML配置。YAML配置说明:使用Kubernetes的Secret来管理密码并对密码进行加密处理,在启动PostgreSQL Exporter的时候直接使用Secret Key,需要调整对应的password。

      YAML 配置示例如下:

      apiVersion: v1
      kind: Secret
      metadata:
          name: postgres-test
      type: Opaque
      stringData:
          username: postgres
          password: you-guess #对应 PostgreSQL 密码
    2. 部署PostgreSQL Exporter。

      在左侧导航栏中选择“工作负载”,在右上角单击“YAML创建”,以YAML的方式部署Exporter。

      YAML配置示例如下(请直接复制下面的内容,根据实际业务调整相应的参数):

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: postgres-test # 根据业务需要调整成对应的名称,建议加上 PG 实例的信息
        namespace: default #需要和 postgres 的 service 在同一命名空间
        labels:
          app: postgres
          app.kubernetes.io/name: postgresql
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: postgres
            app.kubernetes.io/name: postgresql
        template:
          metadata:
            labels:
              app: postgres
              app.kubernetes.io/name: postgresql
          spec:
            containers:
            - name: postgres-exporter
              image: swr.cn-north-4.myhuaweicloud.com/aom-exporter/postgres-exporter:v0.8.0 # 上传至 SWR 的 postgres-exporter 镜像
              args:
                - "--web.listen-address=:9187" # Exporter 开启的端口
                - "--log.level=debug" # 日志级别
              env:
                - name: DATA_SOURCE_USER
                  valueFrom:
                    secretKeyRef:
                      name: postgres-test # 对应上一步中的 Secret 的名称
                      key: username  # 对应上一步中的 Secret Key
                - name: DATA_SOURCE_PASS 
                  valueFrom:
                    secretKeyRef:
                      name: postgres-test # 对应上一步中的 Secret 的名称
                      key: password  # 对应上一步中的 Secret Key
                - name: DATA_SOURCE_URI
                  value: "x.x.x.x:5432/postgres?sslmode=disable"  # 对应的连接信息
              ports:
              - name: http-metrics
                containerPort: 9187
    3. 获取指标。
      通过“curl http://exporter:9187/metrics”无法获取Postgres实例运行时间,可以通过自定义一个queries.yaml来获取该指标。
      1. 创建一个包含queries.yaml的配置。
      2. 将配置作为Volume挂载到Exporter某个目录下。
      3. 通过extend.query-path来使用配置,将上述的Secret以及Deployment进行汇总,汇总后的YAML如下所示:
        # 以下 document 创建一个包含自定义指标的 queries.yaml
        ---
        apiVersion: v1
        kind: ConfigMap
        metadata:
          name: postgres-test-configmap
          namespace: default
        data:
          queries.yaml: |
            pg_postmaster:
              query: "SELECT pg_postmaster_start_time as start_time_seconds from pg_postmaster_start_time()"
              master: true
              metrics:
                - start_time_seconds:
                    usage: "GAUGE"
                    description: "Time at which postmaster started"
        
        # 以下 document 挂载了 Secret 和 ConfigMap ,定义了部署 Exporter 相关的镜像等参数
        ---
        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: postgres-test
          namespace: default
          labels:
            app: postgres
            app.kubernetes.io/name: postgresql
        spec:
          replicas: 1
          selector:
            matchLabels:
              app: postgres
              app.kubernetes.io/name: postgresql
          template:
            metadata:
              labels:
                app: postgres
                app.kubernetes.io/name: postgresql
            spec:
              containers:
                - name: postgres-exporter
                  image: wrouesnel/postgres_exporter:latest
                  args:
                    - "--web.listen-address=:9187"
                    - "--extend.query-path=/etc/config/queries.yaml"
                    - "--log.level=debug"
                  env:
                    - name: DATA_SOURCE_USER
                      valueFrom:
                        secretKeyRef:
                          name: postgres-test-secret
                          key: username
                    - name: DATA_SOURCE_PASS
                      valueFrom:
                        secretKeyRef:
                          name: postgres-test-secret
                          key: password
                    - name: DATA_SOURCE_URI
                      value: "x.x.x.x:5432/postgres?sslmode=disable"
                  ports:
                    - name: http-metrics
                      containerPort: 9187
                  volumeMounts:
                    - name: config-volume
                      mountPath: /etc/config
              volumes:
                - name: config-volume
                  configMap:
                    name: postgres-test-configmap
        ---
        apiVersion: v1
        kind: Service
        metadata:
          name: postgres
        spec:
          type: NodePort
          selector:
            app: postgres
            app.kubernetes.io/name: postgresql
          ports:
            - protocol: TCP
              nodePort: 30433
              port: 9187
              targetPort: 9187
      4. 访问地址:
        http://{集群任意节点的公网IP}:30433/metrics,即可通过自定义的queries.yaml查询到Postgres实例启动时间指标。
        图1 访问地址

添加采集任务

通过新增PodMonitor方式为应用配置可观测监控Prometheus版的采集规则,监控部署在CCE集群内的应用的业务数据。

如下指标采集的周期是30秒,所以等待大概30秒后才能在AOM的界面上查看到上报的指标。

apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: postgres-exporter
  namespace: default
spec:
  namespaceSelector:
    matchNames:
      - default # exporter 所在的命名空间
  podMetricsEndpoints:
  - interval: 30s
    path: /metrics
    port: http-metrics
  selector:
    matchLabels:
      app: postgres

验证指标上报到AOM

  1. 登录AOM 2.0控制台。
  2. 在左侧菜单栏中选择“Prometheus监控 > 实例列表”。
  3. 单击接入了该CCE集群的“prometheus for CCE”实例名称,进入实例详情页面。
  4. 在“指标管理”页面的“指标”页签下,选择对应集群。
  5. 选择Job:{namespace}/postgres-exporter,可以查询到pg开头的postgresql指标。

在AOM上配置仪表盘和告警

通过仪表盘功能可视化监控CCE集群数据,通过告警规则功能,在集群发生故障时能够及时发现并预警。

  • 配置仪表盘图表
    1. 登录AOM 2.0控制台。
    2. 在左侧菜单栏中选择“仪表盘”,单击“创建仪表盘”新建一个仪表盘,详情可参见创建仪表盘
    3. 在仪表盘页面选择实例类型为“Prometheus for CCE”的实例并单击“添加图表”,详情请参见添加图表至仪表盘
  • 配置告警
    1. 登录AOM 2.0控制台。
    2. 在左侧菜单栏中选择“告警管理 > 告警规则”。
    3. 在“指标或事件”页签下单击“创建”配置告警,详情请参见创建指标告警规则