
# 如何配置监控
#### 使用前提
对接监控，需要在csd.yaml文件中配置能力插件依赖功能声明，具体参考[服务包扩展目录](https://support.huaweicloud.com/devg-osc/osc_ss_0037.html) capabilityRequirements示例
#### 对接原理
开源的[Prometheus](https://github.com/prometheus)是目前业界广泛应用的监控指标采集系统，其服务端可作为时间序列数据库，采集客户端应用不同时间周期上报的监控指标数据并存储，还可用来查询数据和图形化展示数据趋势。其针对不同的应用，提供了多种客户端exporter实现，用来上报监控指标，如：[https://github.com/prometheus/jmx_exporter](https://github.com/prometheus/jmx_exporter )。
华为云容器洞察引擎CIE服务兼容[Prometheus](https://github.com/prometheus)提供应用指标采集和监控服务，开发者只需要配置映射规则，OSC平台使用内置的ops-operator插件来匹配工作负载（包括Deployment、StatefulSet或DaemonSet）资源的标签，自动发现需要上报监控指标数据的应用，并通过sidecar方式，为应用监控指标数据注入instance_id字段，用以区分不同实例的指标，并分层分级生成监控仪表盘，图形化展示监控数据。
#### 对接流程
1. 获取OSC规范开发的服务包，如果只有原生的helm或OperatorFramework包，可以参考章节[服务包转换](https://support.huaweicloud.com/devg-osc/osc_ss_0051.html#osc_ss_0051__section10383132654620)进行转换。
2. 在目录manifests/vendor下新增配置文件monitor_config.yaml 
   配置具体样例如下：
   ```
   apiVersion: osc.io/v1
   kind: MonitorConfig
   metadata:
     name: helm-release-1ughua-uxkrcb
   spec:
     monitorConfigItems:
       - labelSelector:
           monit-test: monit-test
         prometheus:
           exporterPort: 9404
           displayOptions:
               levels:
                 - name: "Pod"
                   localeID: "ops.monitor.kafka.level.pod-slave"
                   groupLabel: pod
                   selectedMetrics:
                     - "kafka_server_ReplicaManager_Value"
                   metrics:
                     - title: "Leader Count"
                       localeID: "ops.monitor.kafka.memory.usage"
                       expr: 'kafka_server_ReplicaManager_Value{name="LeaderCount",kubernetes_pod="$",}'
                       unitType: ""
   ```
   斜体字的部分则需要根据服务的实际情况进行适配更改。具体配置参数可见下面表格说明。
   
   | 参数名             | 含义       | 类型       | 是否必填 | 备注                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   |:---|:---|:---|:---|:---|
   | apiVersion      | 配置版本     | string   | 是    | 固定为osc.io/v1                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
   | kind            | 配置种类     | string   | 是    | 固定为MonitorConfig                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
   | metadata.name   | 配置名      | string   | 否    | 监控配置默认名称 须知： 目前对于monitor_config.yaml文件，一个服务包内有且仅有一个，目前该名字没有实际业务意义。在服务包下发时会根据服务包名称等，由OSC自动生成一个在Kubernetes集群该Namespace下面唯一的名字。                                                                                                                                                                                                                                                                                             |
   | labelSelector   | 匹配实例的标签  | string数组 | 是    | 同一operator CRD下也可能存在多个工作负载资源，需要通过label selector与应用实例label相关联，从而才可过滤出准确应用的数据并在界面展示。                                                                                                                                                                                                                                                                                                                                                                                                    |
   | exporterPort    | 普罗接口     | integer  | 是    | 服务已实现的prometheus指标采集端口，此接口为容器运行时内部监听的端口。 说明： 需要使用metrics形式进行相关指标的上报，即通过URL http://{Pod IP}:{exportPort}/metrics的形式对相关监控指标上报。具体指标书写请参考如下链接或步骤4中内容： https://prometheus.io/docs/concepts/metric_types/ https://prometheus.io/docs/concepts/data_model/ https://prometheus.io/docs/prometheus/latest/configuration/configuration/ |
   | levels.name     | 监控维度名    | string   | 否    | 显示为不同层级的页签名称，如：Instance、Pod等。                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   | localeID        | 指标国际化展示  | string   | 否    | 暂未启用，后续支持国际化展示。                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | groupLabel      | 该层级的聚合参数 | string   | 否    | 如果填写，则自动在expr中注入根据该labelkey+占位符的筛选条件。 说明： 对于聚合条件为pod的，需要设置为pod。                                                                                                                                                                                                                                                                                                                                                            |
   | selectedMetrics | 指标数组     | string数组 | 否    | 与groupLabel配套，用于确认groupLabel指定的key值可以通过哪些指标获取全部value。                                                                                                                                                                                                                                                                                                                                                                                                                                 |
   | title           | 监控名      | string   | 否    | 监控图显示名称，长度不超过64字节                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   | expr            | 监控语句     | string   | 否    | 原生普罗监控语句promsql                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | unitType        | 监控数据单位   | string   | 否    | unitType可以是""（默认无单位，按原数据展示），byte（根据数量展示b，kb，mb，tb），time（us，ms，s，min，hour，day，month），条，个，percentage（%）等等，长度不超过10字节。                                                                                                                                                                                                                                                                                                                                                                    |
      
   
   
3. 在manifests/xxx_csd.yaml文件中增加引用监控能力的配置。 
   ```
   apiVersion: osc.io/v1beta1
   kind: CustomServiceDefinition
   metadata:
     name: helmrelease-csd
   spec:
     CRDRef:
       apiVersion: apiextensions.k8s.io/v1
       kind: CustomResourceDefinition
     capabilityRequirements:
       - apiVersion: osc.io/v1
         kind: MonitorConfig
         defaultPath: vendor/monitor_config.yaml
   ```
   
   
4. 下面以一个实际监控指标为样例进行展示 
   ```
   apiVersion: osc.io/v1
   kind: MonitorConfig
   metadata:
     name: hwfka-monitor
   spec:
     monitorConfigItems:
       - labelSelector:
           # ops operator 根据 label 决定 Deployment、StatefulSet或DaemonSet 是否注入 sidecar
           osctest.huawei.com/service_provider: hwfka
           osctest.huawei.com/component: broker
         crd: hwfkas.osctest.huawei.com
         prometheus:
           exporterPort: 9404
           displayOptions:
             levels:
                 - name: "实例"
                   localeID: "ops.monitor.redis.level.instance"
                   metrics:
                     - title: "Topic 总数"
                       # 实例中的 topic 总数
                       localeID: "ops.monitor.redis.memory.usage"
                       expr: 'sum(kafka_controller_KafkaController_Value{name="GlobalTopicCount"})'
                       unitType: ""
                     - title: "分区总数"
                       # 实例中的分区总数（创建 topic 时设置的分区数，即仅 leader 数）
                       localeID: "ops.monitor.redis.memory.usage"
                       expr: 'sum(kafka_controller_KafkaController_Value{name="GlobalPartitionCount"})'
                       unitType: ""
                     - title: "副本总数"
                       # 实例中的副本总数（含 leader）
                       localeID: "ops.monitor.redis.memory.usage"
                       expr: 'sum(kafka_server_ReplicaManager_Value{name="PartitionCount"})'
                       unitType: ""
                 - name: "Topic"
                   localeID: "ops.monitor.redis.level.pod-slave"
                   # console 通过查询语句 group(kafka_server_BrokerTopicMetrics_Count{topic!=""}) by (topic) 获取所有 Topic 列表
                   groupLabel: topic
                   selectedMetrics:
                     - 'kafka_server_BrokerTopicMetrics_Count{topic!=""}'
                   metrics:
                     - title: "生产消息数量（条）"
                       # 每个 topic 的生产消息数量
                       localeID: "ops.monitor.redis.memory.usage"
                       expr: 'sum(kafka_server_BrokerTopicMetrics_Count{name="MessagesInPerSec"}) by (topic)'
                       unitType: ""
                     - title: "生产消息速率（条/秒）"
                       # 每个 topic 的生产速率消息数量（每秒）
                       localeID: "ops.monitor.redis.memory.usage"
                       expr: 'sum(kafka_server_BrokerTopicMetrics_OneMinuteRate{name="MessagesInPerSec"}) by (topic)'
                       unitType: ""
   ```
   
   
![](https://support.huaweicloud.com/devg-osc/public_sys-resources/note_3.0-zh-cn.png)
服务需要对接监控能力，必须确保服务对外提供/metrics接口，并遵循prometheus规范将指标数据通过此接口对外提供。
