
# CCE Autopilot使用云原生监控插件监控自定义指标
CCE Autopilot提供了云原生监控插件，支持使用Prometheus监控自定义指标。
本文将通过一个Nginx应用的示例演示如何使用Prometheus监控自定义指标，步骤如下：
1. [安装云原生监控插件](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0406.html)
   CCE提供了集成Prometheus功能的插件，支持一键安装。
   使用云原生监控插件监控自定义指标，需开启插件"自定义指标采集"开关。
   
2. [准备应用]
   您需要准备一个应用镜像，该应用需要提供监控指标接口供Prometheus采集，且监控数据需要[满足Prometheus的规范]。
   
3. 监控自定义指标 在集群中使用该应用镜像部署工作负载，将自动上报自定义监控指标至Prometheus。
   自定义指标监控支持以下配置方式，其中方法一和方法二需要开启插件的"自动服务发现"开关：
   - [方法一：配置Pod Annotations监控自定义指标]
   
   - [方法二：配置Service Annotations监控自定义指标]
   
   - [方法三：配置Pod Monitor监控自定义指标]
   
   - [方法四：配置Service Monitor监控自定义指标]
   
   - [方法五：使用AdditionalScrapeConfigs监控自定义指标]
    
#### 自定义指标计费说明
当云原生监控插件对接AOM后，指标会上报到您选择的AOM实例，其中容器[基础指标](https://support.huaweicloud.com/productdesc-aom2/aom_01_0023.html)免费，自定义指标将由AOM服务进行收费，详情请参见[价格详情](https://www.huaweicloud.com/pricing.html#/aom)。
若需使用Prometheus监控自定义指标，需购买AOM的VPCEP。VPC终端节点服务收费详情请参见[VPC终端节点计费项和付费方说明](https://support.huaweicloud.com/price-vpcep/vpcep_price_3000.html)。
云原生监控插件完全兼容Prometheus社区的指标采集配置方式。若您不想采集计费自定义指标，请确保插件的"自动服务发现"开关关闭，并且除插件自带的采集配置之外，不额外创建任何ServiceMonitor、PodMonitor、AdditionalScrapeConfig等采集任务。
 #### Prometheus监控数据采集说明
Prometheus通过周期性的调用应用程序的监控指标接口（默认为"/metrics"）获取监控数据，应用程序需要提供监控指标接口供Prometheus调用，且监控数据需要满足Prometheus的规范，如下所示。
```
# TYPE nginx_connections_active gauge
nginx_connections_active 2
# TYPE nginx_connections_reading gauge
nginx_connections_reading 0
```
Prometheus提供了各种语言的客户端，客户端具体请参见[Prometheus CLIENT LIBRARIES](https://prometheus.io/docs/instrumenting/clientlibs/)，开发Exporter具体方法请参见[WRITING EXPORTERS](https://prometheus.io/docs/instrumenting/writing_exporters/)。Prometheus社区提供丰富的第三方exporter可以直接使用，具体请参见[EXPORTERS AND INTEGRATIONS](https://prometheus.io/docs/instrumenting/exporters/)。
#### 约束与限制
- 若需使用Prometheus监控自定义指标，需购买AOM的VPCEP。请参考[如何创建AOM终端节点](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0002.html)。
- 使用Prometheus监控自定义指标时，应用程序需要提供监控指标接口，详情请参见[Prometheus监控数据采集说明]。
- 使用Pod/Service Annotations的方式暂不支持采集kube-system与monitoring命名空间下的指标，如需采集这两个命名空间下的指标，请通过Pod Monitor与Service Monitor的方式配置。
- 本文使用Nginx应用示例会拉取nginx/nginx-prometheus-exporter:0.9.0镜像，需要为应用部署的节点添加EIP或先将此镜像上传到SWR，以免部署应用失败。
 
 #### 准备应用
自行开发的应用程序需要提供监控指标接口供采集，且监控数据需要满足Prometheus的规范，详情请参见[Prometheus监控数据采集说明]。
本文以Nginx为例采集监控数据，Nginx本身有个名叫ngx_http_stub_status_module的模块，这个模块提供了基本的监控功能，通过在nginx.conf的配置可以提供一个对外访问Nginx监控数据的接口。
1. 登录一台可连接公网的Linux虚拟机，且要求可执行Docker命令。
2. 创建一个nginx.conf文件，如下所示，在http下添加server配置即可让nginx提供对外访问的监控数据的接口。 
   ```
   user  nginx;
   worker_processes  auto;
   error_log  /var/log/nginx/error.log warn;
   pid        /var/run/nginx.pid;
   events {
       worker_connections  1024;
   }
   http {
       include       /etc/nginx/mime.types;
       default_type  application/octet-stream;
       log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                         '$status $body_bytes_sent "$http_referer" '
                         '"$http_user_agent" "$http_x_forwarded_for"';
       access_log  /var/log/nginx/access.log  main;
       sendfile        on;
       #tcp_nopush     on;
       keepalive_timeout  65;
       #gzip  on;
       include /etc/nginx/conf.d/*.conf;
       server {
         listen 8080;
         server_name  localhost;
         location /stub_status {
            stub_status on;
            access_log off;
         }
       }
   }
   ```
   
   
3. 使用该配置制作一个镜像，创建Dockerfile文件。 
   ```
   vi Dockerfile
   ```
   Dockerfile文件内容如下所示：
   ```
   FROM nginx:1.21.5-alpine
   ADD nginx.conf /etc/nginx/nginx.conf
   EXPOSE 80
   CMD ["nginx", "-g", "daemon off;"]
   ```
   
   
4. 使用上面Dockerfile构建镜像并上传到SWR镜像仓库，镜像名称为nginx:exporter。上传镜像的具体方法请参见[客户端上传镜像](https://support.huaweicloud.com/usermanual-swr/swr_01_0011.html)。
   
   1. 在左侧导航栏选择"我的镜像"，单击右侧"客户端上传"，在弹出的页面中单击"生成登录指令 \> 临时登录指令"，单击![](https://support.huaweicloud.com/usermanual-cce-autopilot/zh-cn_image_0000002556043919.png)复制登录指令。
   
   2. 在集群节点上执行上一步复制的登录指令，登录成功会显示"Login Succeeded"。
   
   3. 执行如下命令构建镜像，镜像名称为nginx，版本为exporter。
      ```
      docker build -t nginx:exporter .
      ```
      
   
   4. 为镜像打标签并上传至镜像仓库，其中镜像仓库地址和组织名称请根据实际情况修改。
      ```
      docker tag nginx:exporter swr.cn-east-3.myhuaweicloud.com/dev-container/nginx:exporter
      docker push swr.cn-east-3.myhuaweicloud.com/dev-container/nginx:exporter
      ```
      
   
   
   
   
5. 查看应用指标。 
   1. 使用nginx:exporter创建工作负载。
   
   2. [登录到容器中](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_00356.html)，并通过http://\<ip_address\>:8080/stub_status获取到nginx的监控数据，其中\<ip_address\>为容器的IP地址。
      ```
      curl http://127.0.0.1:8080/stub_status
      ```
      回显如下：
      ```
      Active connections: 3 
      server accepts handled requests
       146269 146269 212 
      Reading: 0 Writing: 1 Waiting: 2
      ```
      
   
   
   
   
 
 #### 方法一：配置Pod Annotations监控自定义指标
当Pod的Annotations配置符合Prometheus采集规范的规则后，Prometheus会自动采集这些Pod暴露的指标。
如上所述的nginx:exporter提供的监控数据，其数据格式并不满足Prometheus的要求，需要将其转换成Prometheus需要的格式，可以使用[nginx-prometheus-exporter](https://github.com/nginxinc/nginx-prometheus-exporter)来转换Nginx的指标，将nginx:exporter和nginx-prometheus-exporter部署到同一个Pod，并在部署时添加如下Annotations就可以自动被Prometheus采集监控指标。
```
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nginx-exporter
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-exporter
  template:
    metadata:
      labels:
        app: nginx-exporter
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9113"
        prometheus.io/path: "/metrics"
        prometheus.io/scheme: "http"
    spec:
      containers:
        - name: container-0
          image: 'nginx:exporter'      # 替换为您上传到SWR的镜像地址
          resources:
            limits:
              cpu: 250m
              memory: 512Mi
            requests:
              cpu: 250m
              memory: 512Mi
        - name: container-1
          image: 'nginx/nginx-prometheus-exporter:0.9.0'
          command:
            - nginx-prometheus-exporter
          args:
            - '-nginx.scrape-uri=http://127.0.0.1:8080/stub_status'
      imagePullSecrets:
        - name: default-secret
```
其中
- prometheus.io/scrape：表示是否需要prometheus采集Pod的监控数据，取值为true。
- prometheus.io/port：表示采集监控数据接口的端口，由需要采集的应用决定。本示例中采集端口为9113。
- prometheus.io/path：表示采集监控数据接口的URL，如不配置则默认为"/metrics"。
- prometheus.io/scheme：表示采集的协议，值可以填写http或https。
应用部署成功后，在AOM控制台\>实例列表，选择安装插件时配置的指标上报的AOM实例，查看自定义监控指标。
 #### 方法二：配置Service Annotations监控自定义指标
当Service的Annotations配置符合Prometheus采集规范的规则后，Prometheus会自动采集这些Service暴露的指标。
Service Annotations使用方法和Pod Annotations基本相同，主要是采集的指标的适用场景不同，Pod Annotations更关注Pod的资源使用情况，Service Annotations侧重于对该业务的请求等指标。
部署示例应用如下：
```
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nginx-test
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-test
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      containers:
        - name: container-0
          image: 'nginx:exporter'      # 替换为您上传到SWR的镜像地址
          resources:
            limits:
              cpu: 250m
              memory: 512Mi
            requests:
              cpu: 250m
              memory: 512Mi
        - name: container-1
          image: 'nginx/nginx-prometheus-exporter:0.9.0'
          command:
            - nginx-prometheus-exporter
          args:
            - '-nginx.scrape-uri=http://127.0.0.1:8080/stub_status'
      imagePullSecrets:
        - name: default-secret
```
部署示例Service如下：
```
apiVersion: v1
kind: Service
metadata:
  name: nginx-test
  labels:
    app: nginx-test
  namespace: default
  annotations: 
    prometheus.io/scrape: "true"  # 配置为 true 表示开启服务发现
    prometheus.io/port: "9113"  # 配置为采集指标暴露的端口号
    prometheus.io/path: "/metrics" # 填写指标暴露的 URI 路径，一般是 /metrics
spec:
  selector:
    app: nginx-test
  externalTrafficPolicy: Cluster
  ports:
    - name: cce-service-0
      targetPort: 80
      nodePort: 0
      port: 8080
      protocol: TCP
    - name: cce-service-1
      protocol: TCP
      port: 9113
      targetPort: 9113
  type: ClusterIP
```
应用部署成功后，在AOM控制台\>实例列表，选择安装插件时配置的指标上报的AOM实例，查看自定义监控指标。
 #### 方法三：配置Pod Monitor监控自定义指标
云原生监控插件提供了基于PodMonitor与ServiceMonitor配置指标采集任务的能力。Prometheus Operator将watch的PodMonitor的变化，通过Prometheus的reload机制，将Prometheus的采集任务热更新至Prometheus的实例中。
Prometheus Operator定义的CRD资源github地址：<https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/charts/crds/crds>。
部署示例应用如下：
```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test2
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-test2
  template:
    metadata:
      labels:
        app: nginx-test2
    spec:
      containers:
      - image: nginx:exporter     # 替换为您上传到SWR的镜像地址
        name: container-0
        ports:
        - containerPort: 9113      # 指标暴露的端口号
          name: nginx-test2        # 该名称是后续配置PodMonitor时相匹配的名称
          protocol: TCP
        resources:
          limits:
            cpu: 250m
            memory: 300Mi
          requests:
            cpu: 100m
            memory: 100Mi
      - name: container-1
        image: 'nginx/nginx-prometheus-exporter:0.9.0'
        command:
          - nginx-prometheus-exporter
        args:
          - '-nginx.scrape-uri=http://127.0.0.1:8080/stub_status'
      imagePullSecrets:
        - name: default-secret
```
配置Pod Monitor示例如下：
```
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: podmonitor-nginx   # PodMonitor的名称
  namespace: monitoring    # 所属命名空间，建议使用monitoring  
spec:
  namespaceSelector:       # 匹配工作负载所在的命名空间
    matchNames:
    - default              # 工作负载所属的命名空间
  jobLabel: podmonitor-nginx
  podMetricsEndpoints:
  - interval: 15s 
    path: /metrics            # 工作负载暴露指标的路径
    port: nginx-test2         # 工作负载暴露指标的port名称
    tlsConfig:
      insecureSkipVerify: true
  selector:  
    matchLabels:
      app: nginx-test2   # Pod携带的标签，能被选择器选中
```
应用部署成功后，在AOM控制台\>实例列表，选择安装插件时配置的指标上报的AOM实例，查看自定义监控指标。
 #### 方法四：配置Service Monitor监控自定义指标
云原生监控插件提供了基于PodMonitor与ServiceMonitor配置指标采集任务的能力。Prometheus Operator将watch的ServiceMonitor的变化，通过Prometheus的reload机制，将Prometheus的采集任务热更新至Prometheus的实例中。
Prometheus Operator定义的CRD资源github地址：<https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack/charts/crds/crds>。
部署示例应用如下：
```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test3
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-test3
  template:
    metadata:
      labels:
        app: nginx-test3
    spec:
      containers:
      - image: nginx:exporter        # 替换为您上传到SWR的镜像地址
        name: container-0
        resources:
          limits:
            cpu: 250m
            memory: 300Mi
          requests:
            cpu: 100m
            memory: 100Mi
      - name: container-1
        image: 'nginx/nginx-prometheus-exporter:0.9.0'
        command:
          - nginx-prometheus-exporter
        args:
          - '-nginx.scrape-uri=http://127.0.0.1:8080/stub_status'
      imagePullSecrets:
        - name: default-secret
```
部署示例Service如下：
```
apiVersion: v1
kind: Service
metadata:
  name: nginx-test3
  labels:
    app: nginx-test3
  namespace: default
spec:
  selector:
    app: nginx-test3
  externalTrafficPolicy: Cluster
  ports:
    - name: cce-service-0
      targetPort: 80
      nodePort: 0
      port: 8080
      protocol: TCP
    - name: servicemonitor-ports
      protocol: TCP
      port: 9113
      targetPort: 9113
  type: ClusterIP
```
配置Service Monitor示例如下：
```
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: servicemonitor-nginx
  namespace: monitoring
spec:
  # 配置service中的暴露指标的port的名称
  endpoints:
  - path: /metrics
    port: servicemonitor-ports
  jobLabel: servicemonitor-nginx
  # 采集任务的作用范围，如果不配置，默认为default
  namespaceSelector:
    matchNames:
    - default
  selector:
    matchLabels:
      app: nginx-test3
```
应用部署成功后，在AOM控制台\>实例列表，选择安装插件时配置的指标上报的AOM实例，查看自定义监控指标。
 #### 方法五：使用AdditionalScrapeConfigs监控自定义指标
![](https://support.huaweicloud.com/usermanual-cce-autopilot/public_sys-resources/notice_3.0-zh-cn.png)
集群中需要已安装3.12.10及以上版本的云原生监控插件。
AdditionalScrapeConfigs允许您指定一个Secret的key，将您额外的Prometheus抓取配置附加至云原生监控插件。
由于使用该机制会绕过常规的抓取配置生成逻辑，而是直接将您指定的配置内容传递给Prometheus，因此需要您保证配置的正确性。建议您参考[scrape_config官方文档](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config)进行配置。
1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0107.html)，使用kubectl连接集群。
2. 使用YAML创建如下Secret。 
   ```
   kind: Secret
   apiVersion: v1
   type: Opaque
   metadata:
     name: additional-scrape-configs
     namespace: monitoring  # 命名空间仅为示例，命名空间需要与云原生监控插件相同
   stringData:
     # 以下为云原生监控插件未开启本地存储时的采集配置示例，您需要替换为您需要的采集配置
     prometheus-additional.yaml: |-
       - job_name: custom-job-test
         metrics_path: /metrics
         relabel_configs:
         - action: keep
           source_labels:
           - __meta_kubernetes_pod_label_app
           - __meta_kubernetes_pod_labelpresent_app
           regex: (prometheus-lightweight);true
         - action: keep
           source_labels:
           - __meta_kubernetes_pod_container_port_name
           regex: web
         kubernetes_sd_configs:
         - role: pod
           namespaces:
             names:
             - monitoring
   ```
   
   
3. 编辑persistent-user-config配置项，开启AdditionalScrapeConfigs能力。 
   ```
   kubectl edit configmap persistent-user-config -n monitoring
   ```
   在其中operatorConfigOverride字段下新增一行*--common.prom.default-additional-scrape-configs-key=prometheus-additional.yaml*，开启AdditionalScrapeConfigs能力，示例如下：
   ```
   ...
   data:
     lightweight-user-config.yaml: |
       customSettings:
         additionalScrapeConfigs: []
         agentExtraArgs: []
         metricsDeprecated:
           globalDeprecateMetrics: []
         nodeExporterConfigOverride: []
         operatorConfigOverride: 
         - --common.prom.default-additional-scrape-configs-key=prometheus-additional.yaml
   ...
   ```
   
   
4. 在AOM控制台\>实例列表，选择安装插件时配置的指标上报的AOM实例，查看自定义监控指标。
 
