
# 配置API的Kafka日志推送
ROMA Connect支持通过插件策略的方式，为API提供灵活的扩展能力。Kafka日志推送策略提供了把API的详细调用日志推送到Kafka的能力，方便用户获取API的调用日志信息。
插件策略和API本身相互独立，只有为API绑定插件策略后，插件策略才对API生效。为API绑定插件策略时需指定发布环境，插件策略只对指定环境上的API生效。
#### 约束与限制
- 同一个API在同一个环境中只能绑定一个相同类型的插件策略，已被API绑定的插件策略无法删除。
- 同一个ROMA Connect实例内最多可创建5个Kafka日志推送策略。
- 推送的日志信息中，响应数据暂不支持Transfer Encoding响应头参数。
- 消息中的请求体字段和响应体字段大小受到kafka_log_plugin_options中request_body_size和response_body_size的限制，当超过对应限制值时，对应字段会被截断。
- 推送的日志信息中，请求Body和响应Body信息是按UTF-8编码方式计算字节长度。
 
#### 创建Kafka日志推送策略
1. 登录[ROMA Connect控制台](https://console.huaweicloud.com/roma3)，在左侧导航栏选择"资源管理"，在实例页面单击实例，进入实例控制台。
2. 在左侧的导航栏选择"服务集成 APIC \> API策略"，在"策略管理"页签下单击"创建策略"。
3. 在选择策略类型弹窗中选择"插件策略 \> Kafka日志推送"。
4. 在配置策略弹窗中配置插件策略信息。
   表1策略配置 
   | 参数         | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
   |:---|:---|
   | 策略名称       | 填写策略的名称，根据规划自定义。建议您按照一定的命名规则填写策略名称，方便您快速识别和查找。                                                                                                                                                                                                                                                                                                                                                                                                                                 |
   | 策略类型       | 固定为"Kafka日志推送"。                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   | 可见范围       | 选择策略的可见范围。 - 集成应用：策略归属某个集成应用，仅拥有该集成应用权限的用户可查看和使用该策略。  - 全局：当前实例的所有用户都可查看和使用该策略。                                                                                                                                                                                                 |
   | 集成应用       | **仅当"可见范围"选择"集成应用"时需要配置。** 选择策略所属的集成应用。若没有可用的集成应用，可单击右侧的"新建集成应用"，创建一个集成应用。                                                                                                                                                                                                                                                                                                                                                                       |
   | 描述         | 填写策略的描述信息。                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   | 策略内容：支持表单模式和脚本模式两种方式，脚本模式配置请参见[脚本配置示例]。                                                                                                                                                                                                                                                                                                                                                                                                             ||
   | **策略基本信息**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 ||
   | Broker地址   | 日志要推送的目标Kafka连接地址列表，多个地址间以英文逗号（,）隔开。                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   | Topic主题    | 日志要推送的目标Kafka Topic名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   | Key        | 填写消息的Key值，表示消息存储在Kafka的指定分区，可以当成有序消息队列使用。如果Key为空，则消息分布式存储在不同的消息分区。                                                                                                                                                                                                                                                                                                                                                                                                             |
   | 失败重试分配     | 日志推送到Kafka失败后的重试配置。 - 重试次数：失败后的重试次数，范围为0-5次。  - 重试间隔时间：失败后的重试时间间隔，范围为1-10秒。                                                                                                                                                                                                            |
   | **SASL配置信息**                                                                                                                                                                                                                                                                                                                                                                                                                                                                               ||
   | 安全协议       | 连接目标Kafka所使用的安全协议。 - PLAINTEXT：默认接入点的用户认证协议。  - SASL_PLAINTEXT：SASL用户认证协议。  - SASL_SSL：SSL用户认证协议。                                                                                                                          |
   | 消息收发机制     | 目标Kafka的消息收发机制，默认为PLAIN。                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | SASL用户名    | **仅当"安全协议"选择"SASL_PLAINTEXT"或"SASL_SSL"时需配置。** SASL或SSL认证所使用的用户名。                                                                                                                                                                                                                                                                                                                                                                                 |
   | SASL用户密码   | **仅当"安全协议"选择"SASL_PLAINTEXT"或"SASL_SSL"时需配置。** SASL或SSL认证所使用的用户密码。                                                                                                                                                                                                                                                                                                                                                                              |
   | 确认SASL用户密码 | **仅当"安全协议"选择"SASL_PLAINTEXT"或"SASL_SSL"时需配置。** SASL或SSL认证所使用的用户密码，与"SASL用户密码"保持一致。                                                                                                                                                                                                                                                                                                                                                            |
   | 证书内容       | **仅当"安全协议"选择"SASL_SSL"时需配置。** SSL认证所使用的CA证书内容。                                                                                                                                                                                                                                                                                                                                                                                                    |
   | **元数据配置信息**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                ||
   | 系统元数据      | 推送的日志中，需要携带的系统字段信息。 其中，start_time、request_id、client_ip、request_time、http_status、scheme、request_method、upstream_addr、upstream_status、upstream_response_time、http_x_forwarded_for、http_user_agent和error_type字段信息默认勾选，其他系统字段需勾选后才携带。                                                                                                                                                                                                                |
   | 请求数据       | 推送的日志中，需要携带的API请求信息。 - 日志包含请求头域信息：勾选后，需填写日志中要携带的请求Header参数。多个字段间使用英文逗号（,）分隔，支持使用\*进行通配设置。  - 日志包含请求QueryString信息：勾选后，需填写日志中要携带的请求Query参数信息。多个字段间使用英文逗号（,）分隔，支持使用\*进行通配设置。  - 日志包含请求Body体信息：勾选后，日志中会携带API请求的Body体信息。   |
   | 响应数据       | 推送的日志中，需要携带的API响应信息。 - 日志包含响应头域信息：勾选后，需填写日志中要携带的响应Header参数。多个字段间使用英文逗号（,）分隔，支持使用\*进行通配设置。  - 日志包含响应Body体信息：勾选后，日志中会携带响应Body体信息。                                                                                                                                                   |
   | 自定义认证配置    | 推送的日志中，需要携带的自定义认证信息。 - 前端：填写日志中要携带的前端自定义认证的响应字段信息，多个字段间使用英文逗号（,）分隔。  - 后端：填写日志中要携带的后端自定义认证的响应字段信息，多个字段间使用英文逗号（,）分隔。                                                                                                                                                              |
      
   
5. 单击"确定"，完成插件策略的创建。
   - 在策略列表中显示已创建的访问控制策略，表示策略创建成功。
   
   - 如果您需要复制已创建的策略，请在已创建策略的"操作"列中单击"克隆"配置参数即可。**克隆策略的名称不能与已创建的策略名称重复。**
    
6. 插件策略创建后，您还需要[为API绑定插件策略]，才能使插件策略对API生效。
   **策略的绑定、解绑、更新会实时生效，不需要重新发布API。**
   
 
 #### 为API绑定插件策略
1. 在"策略管理"页签右上角的过滤条件中选择"Kafka日志推送"。
2. 在页面中单击策略的名称，进入策略详情页面。
3. 在"关联API"下选择要绑定API的环境，然后单击"绑定API"。
4. 在绑定API弹窗中，勾选要绑定策略的API。 您可以通过指定API分组和API名称，筛选所需API。
   
5. 单击"确定"，完成API与插件策略的绑定。
 
 #### 脚本配置示例
```
{
  "broker_list": [
    "10.10.10.10:81",
    "10.10.10.11:82",
    "10.10.10.12:83"
  ],
  "topic": "Topic-test",
  "key": "aaa",
  "max_retry_count": 0,
  "retry_backoff": 1,
  "sasl_config": {
    "security_protocol": "PLAINTEXT",
    "sasl_mechanisms": "PLAIN",
    "sasl_username": "",
    "sasl_password": "",
    "ssl_ca_content": ""
  },
  "meta_config": {
    "system": {
      "start_time": true,
      "request_id": true,
      "client_ip": true,
      "api_id": false,
      "user_name": false,
      "app_id": false,
      "request_time": true,
      "http_status": true,
      "server_protocol": false,
      "scheme": true,
      "request_method": true,
      "host": false,
      "api_uri_mode": false,
      "uri": false,
      "request_size": false,
      "response_size": false,
      "upstream_uri": false,
      "upstream_addr": true,
      "upstream_status": true,
      "upstream_connect_time": false,
      "upstream_header_time": false,
      "upstream_response_time": true,
      "http_x_forwarded_for": true,
      "http_user_agent": true,
      "error_type": true,
      "access_model1": false,
      "access_model2": false,
      "inner_time": false,
      "proxy_protocol_vni": false,
      "proxy_protocol_vpce_id": false,
      "proxy_protocol_addr": false,
      "body_bytes_sent": false,
      "api_name": false,
      "app_name": false,
      "provider_app_id": false,
      "all_upstream_response_time": false,
      "region_id": false,
      "auth_type": false,
      "response_source": false,
      "provider_app_name": false,
      "custom_data_log01": false,
      "custom_data_log02": false,
      "custom_data_log03": false,
      "custom_data_log04": false,
      "custom_data_log05": false,
      "custom_data_log06": false,
      "custom_data_log07": false,
      "custom_data_log08": false,
      "custom_data_log09": false,
      "custom_data_log10": false
    },
    "call_data": {
      "log_request_header": true,
      "request_header_filter": "aaa",
      "log_request_query_string": true,
      "request_query_string_filter": "bbb",
      "log_request_body": true,
      "log_response_header": true,
      "response_header_filter": "ccc",
      "log_response_body": true,
      "custom_authorizer": {
        "frontend": [],
        "backend": []
      }
    }
  }
}
```
