
# PostgreSQL Exporter接入AOM实现指标监控
#### 应用场景
使用PostgreSQL过程中需要对PostgreSQL运行状态进行监控，以便了解PostgreSQL服务是否运行正常，及时排查PostgreSQL故障问题原因。Prometheus监控服务提供了CCE容器场景下基于Exporter的方式来监控PostgreSQL运行状态。本文介绍如何部署Exporter以及实现PostgreSQL Exporter告警接入等操作。
#### 前提条件
- CCE服务已拥有CCE集群并已安装PostgreSQL。
- 服务已接入可观测Prometheus监控并接入CCE集群，具体请参见[Prometheus实例 for CCE](https://support.huaweicloud.com/usermanual-aom2/mon_01_0073.html)。
- 已将[postgres_exporter](https://github.com/prometheus-community/postgres_exporter)镜像上传到SWR，具体操作请参见[使用容器引擎客户端上传镜像](https://support.huaweicloud.com/qs-swr/index.html)。
 
#### 在CCE集群部署PostgreSQL Exporter
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0#/cce/betaTest)。
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 # 对应 PostgreSQL 用户名
          password: *********** # 对应 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访问地址   
         ![](https://support.huaweicloud.com/bestpractice-aom2/zh-cn_image_0000001869864110.png "点击放大") 
        
   
   
   
   
 
#### 配置CCE集群指标采集规则
通过"新增PodMonitor"方式为应用配置可观测监控Prometheus版的采集规则，监控部署在CCE集群内的应用的业务数据。
1. 登录[AOM 2.0控制台](https://console.huaweicloud.com/aom2#/aom2/betaTest)。
2. 在左侧导航栏选择"Prometheus监控 \> 实例列表"。
3. 在Prometheus实例列表中，单击CCE类型的Prometheus实例名称，进入该实例的详情界面。
4. 在左侧导航栏单击"指标管理"，在"配置"页签下单击"PodMonitor"。
5. 单击"新增PodMonitor"，在弹出的对话框中输入PodMonitor的相关参数信息，然后单击"确定"。 
   采集规则YAML配置样例如下，样例的指标采集的周期是30秒，所以等待大概30秒后才能在AOM的界面上查看到上报的指标：
   ```
   apiVersion: monitoring.coreos.com/v1
   kind: PodMonitor
   metadata:
     name: postgres-exporter
     namespace: default
   spec:
     namespaceSelector: # 选择要监控 Exporter Pod 所在的namespace
       matchNames:
         - default # exporter 所在的命名空间
     podMetricsEndpoints:
     - interval: 30s # 设置指标采集周期
       path: /metrics # 填写Prometheus Exporter对应的Path的值，默认/metrics
       port: http-metrics
     selector: # 填写要监控Exporter Pod的Label标签，以定位目标Exporter
       matchLabels:
         app: postgres
   ```
   
   
 
#### 验证CCE集群指标上报到AOM
1. 登录[AOM 2.0控制台](https://console.huaweicloud.com/aom2#/aom2/betaTest)。
2. 在左侧菜单栏中选择"Prometheus监控 \> 实例列表"。
3. 单击接入了该CCE集群的"prometheus for CCE"实例名称，进入实例详情页面。
4. 在"指标管理"页面的"指标"页签下，选择对应集群。
5. 选择Job：{namespace}/postgres-exporter，可以查询到pg开头的postgresql指标。
 
#### 在AOM上配置仪表盘和告警
通过仪表盘功能可视化监控CCE集群数据，通过告警规则功能，在集群发生故障时能够及时发现并预警。
- 配置仪表盘图表
  1. 登录[AOM 2.0控制台](https://console.huaweicloud.com/aom2#/aom2/betaTest)。
  
  2. 在左侧菜单栏中选择"仪表盘 \> 仪表盘"，单击"创建仪表盘"新建一个仪表盘，详情可参见[创建仪表盘](https://support.huaweicloud.com/usermanual-aom2/mon_01_0003.html)。
  
  3. 在仪表盘页面选择实例类型为"Prometheus for CCE"的实例并单击"添加图表"，详情请参见[添加图表至仪表盘](https://support.huaweicloud.com/usermanual-aom2/mon_01_0003.html#section2)。
   
- 配置告警
  1. 登录[AOM 2.0控制台](https://console.huaweicloud.com/aom2#/aom2/betaTest)。
  
  2. 在左侧菜单栏中选择"告警中心 \> 告警规则"。
  
  3. 在"Prometheus监控"页签下单击"创建告警规则"配置告警，详情请参见[创建指标告警规则](https://support.huaweicloud.com/usermanual-aom2/mon_01_0008.html)。
   
 
