# 添加或修改应用发现规则
#### 功能介绍
该接口用于添加或修改一条或多条应用发现规则。同一projectid下可添加的规则上限为100条。
#### URI
PUT /v1/{project_id}/inv/servicediscoveryrules
#### 请求消息
**请求参数**
请求参数如[表1]所示。
 表1请求参数 
| 参数         | 是否必选 | 参数类型 | 取值范围 | 描述                                                                                        |
|:---|:---|:---|:---|:---|
| appRules | 否 | Array                       | -     | 详见[表2]。 |
   
 表2appRules参数 
| 参数        | 是否必选 | 参数类型   | 取值范围                                         | 描述                                                                                             |
|:---|:---|:---|:---|:---|
| projectid   | 是   | String                        | -                                               | 租户从IAM申请到的projectid，一般为32位字符串。                                                                 |
| id          | 是  | String                         | -                                            | 创建时填空，修改时填规则ID。                                                                                |
| name     | 是    | String                        | 字符长度最大63位，以小写字母(a-z)开头，只能包含0-9/a-z/-，不能以-结尾。 | 规则名称。                                                                                         |
| createTime | 否     | String                        | -                                           | 创建时间（创建时不传，修改时传查询返回的createTime）                                                                |
| enable    | 是    | Boolean                        | true、false                                    | 规则是否启用。                                                                                        |
| hostid    | 否     | Array   | -                                            | 主机ID（暂不使用，传空即可）。                                                                                |
| eventName | 是    | String      | aom_inventory_rules_event                     | 规则事件名称，对于应用发现固定为"aom_inventory_rules_event"                                                    |
| spec         | 是    | Object | -                                             | 规则详情。详见[表3]。 |
   
 表3spec参数 
| 参数             | 是否必选 | 参数类型    | 取值范围                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | 描述                                                                                                                                   |
|:---|:---|:---|:---|:---|
| detectLog      | 是     | String                         | true、false                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | 是否开启日志采集。                                                                                                                          |
| logFileFix   | 是     | Array                           | log、trace、out                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | 日志文件的后缀。                                                                                                                         |
| discoveryRule | 是     | Array | - checkType为cmdLine时checkMode填contain，checkContent格式为\["xxx"\]表示进程命令行参数中需要包含xxx。  - checkType为env时checkMode填contain，checkContent格式为 \["k1","v1"\]表示进程环境变量中需要包含名为k1值为v1的环境变量。  - checkType为scope时checkMode填equals，checkContent格式为节点ID数组\["hostId1","hostId2"\]，表示规则仅会在这些节点上生效（如果不指定节点范围，规则将下发到该项目所有的节点）。   | 规则发现部分，数组中有多个对象时表示需要同时满足所有条件的进程才会被匹配到。详见[表4]。 |
| attrList      | 否      | Array | cmdLine、env                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | 属性列表（暂不使用，可不传）。                                                                                                                    |
| isDetect    | 是     | String                        | true、false                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | 是否为规则预探测场景（预探测场景不会保存规则，仅用于规则下发之前对规则正确性的检测）。                                                                                         |
| isDefaultRule | 是   | String                        | true、false                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | 是否为默认规则。                                                                                                                          |
| priority    | 是      | Integer | 1\~9999的整数，默认取值为9999                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | 规则优先级。                                                                                                                             |
| nameRule     | 是      | Object                         | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       | 应用发现规则命名部分。详见[表5]。                         |
| appType     | 是    | String | -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | 应用类型，用于标记应用的分类，仅用于规则分类和界面展示。可以填写任意字段，如按技术栈分类可填写Java，Python。按作用分类可填写collector(采集)，database(数据库)等。                                    |
| logPathRule   | 否     | Array  | - 当cmdLineHash为固定字符串时，指定日志路径或者日志文件。否则只采集进程当前打开的以.log和.trace结尾的文件。  - nameType取值cmdLineHash时，args格式为\["00001"\]，value格式为\["/xxx/xx.log"\]，表示当启动命令是00001时，日志路径为/xxx/xx.log。                                                                                                                                                                                                                                                                                                      | 日志路径配置规则。详见[表8]。                              |
   
 表4discoveryRule参数 
| 参数             | 是否必选 | 参数类型      | 取值范围            | 描述     |
|:---|:---|:---|:---|:---|
| checkType   | 是   | String                        | cmdLine、env、scope | 匹配类型。  |
| checkMode   | 是    | String | contain、equals    | 匹配条件。   |
| checkContent | 是   | Array                           | -              | 匹配值。 |
   
 表5nameRule参数 
| 参数                   | 是否必选 | 参数类型   | 取值范围                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | 描述                                                                                                                                     |
|:---|:---|:---|:---|:---|
| appNameRule          | 是   | Array | - nameType取值cmdLine时args格式为\["start","end"\]，表示抽取命令行中start、end之间的字符。  - nameType取值cmdLine时args格式为 \["aa"\]，表示抽取环境变量名为aa对应的环境变量值。  - nameType取值str时，args格式为\["fix"\]，表示应用名称最后拼接固定文字fix。  - nameType取值cmdLineHash时，args格式为\["0001"\]，value格式为\["ser"\]，表示当启动命令是0001时，应用名称为ser。                 | 应用命名部分，数组中有多个对象时表示将每个对象抽取到的字符串拼接作为应用的名称。详见[表6]。 |
| applicationNameRule | 是  | Array  | - nameType取值cmdLine时args格式为\["start","end"\]，表示抽取命令行中start、end之间的字符。  - nameType取值cmdLine时args格式为 \["aa"\]，表示抽取环境变量名为aa对应的环境变量值。  - nameType取值str时，args格式为\["fix"\]，表示应用名称最后拼接固定文字fix。  - nameType取值cmdLineHash时，args格式为\["0001"\]，value格式为\["ser"\]，表示当启动命令是0001时，应用名称为ser。   | 应用命名部分。详见[表7]。                                   |
   
 表6appNameRule参数 
| 参数         | 是否必选 | 参数类型   | 取值范围                         | 描述                            |
|:---|:---|:---|:---|:---|
| nameType | 是   | String                         | cmdLineHash、cmdLine、env、str | 取值类型。                         |
| args     | 是   | Array | -                            | 输入值。                            |
| value     | 否     | Array | -                            | 应用名（仅nameType为cmdLineHash时填写）。 |
   
 表7applicationNameRule参数 
| 参数        | 是否必选 | 参数类型 | 取值范围                          | 描述                             |
|:---|:---|:---|:---|:---|
| nameType | 是  | String                       | cmdLineHash、cmdLine、env、str | 取值类型。                          |
| args       | 是  | Array                       | -                             | 输入值。                            |
| value      | 否  | Array                      | -                            | 应用名（仅nameType为cmdLineHash时填写）。 |
   
 表8logPathRule参数 
| 参数      | 是否必选 | 参数类型  | 取值范围         | 描述      |
|:---|:---|:---|:---|:---|
| nameType | 是     | String | cmdLineHash | 取值类型。  |
| args      | 是  | Array                         | -             | 命令行。   |
| value    | 是     | Array                        | -               | 日志路径。 |
   
**Header** **说明**
请求消息头（Header）如[表9]所示。
 表9Header说明 
| 名称            | 是否必选 | 说明                    |
|:---|:---|:---|
| X-Auth-Token | 是     | 从IAM服务获取的用户Token。      |
| Content-Type | 是     | 指定类型为application/json。 |
   
**请求示例**
```
{
    "appRules": [
        {
            "id": "",
            "name": "bytest",
            "createTime": "",
            "projectid": "5a6036f48e954fcd84d198cb28db311a",
            "enable": true,
            "hostid": [],
            "eventName": "aom_inventory_rules_event",
            "spec": {
                "detectLog": "true",
                "logFileFix": ["log","trace"],
                "discoveryRule": [
                    {
                        "checkType": "cmdLine",
                        "checkMode": "contain",
                        "checkContent": ["default"]
                    },{
                        "checkType": "scope",
                        "checkMode": "equals",
                        "checkContent": [
                            "44d6c4bb-f673-4bf4-8d33-313832f37b28"
                        ]
                    }
                ],
                "attrList": ["cmdLine"],
                "isDetect": "false",
                "priority": "1",
                "nameRule": {
                    "appNameRule": [
                        {
                            "nameType":"cmdLineHash",
                            "args":["00000000001"],
                            "value":["serviceName1"]
                        },
                        {
                            "nameType": "cmdLine",
                            "args": [
                                "/var/paas/kubernetes/","/kubeconfig"
                            ]
                        },
                        {
                            "nameType": "env",
                            "args": ["APP_NAME"]
                        },
                        {
                            "nameType": "str",
                            "args": ["kube"]
                        }
                    ],
                    "applicationNameRule": [
                        {
                            "nameType":"cmdLineHash",
                            "agrs":["00000000001"],
                            "value":["applicationName1"]
                        },
                        {
                            "nameType": "str",
                            "args": ["kubeproxy"]
                        }
                    ]
                },
                "appType": "",
                "isDefaultRule":"false",
                "logPathRule": [
                    {
                        "nameType":"cmdLineHash",
                        "agrs":["00000000001"],
                        "value":["/xx/xxx/xx.log","/xx/xxx/xx"]
                    }
                ]
            }
        }
    ]
}
```
#### 响应消息
**响应参数**
响应参数如[表10]所示。
 表10响应参数 
| 参数名称         | 类型   | 描述      |
|:---|:---|:---|
| errorCode  | String | 响应码。     |
| errorMessage | String                       | 响应信息描述。 |
   
**响应示例**
```
{
     "errorCode":"SVCSTG.INV.2000000",
     "errorMessage":""
}
```
#### 状态码
- 正常 状态码如[表11]所示。
   表11状态码 
  | 状态码 | 编码  | 描述         |
  |:---|:---|:---|
  | 200 | OK | 请求响应成功。 |
     
  

- 异常 状态码如[表12]所示。更多状态码请见[状态码](https://support.huaweicloud.com/api-aom/aom_04_0021.html)。
   表12状态码 
  | 状态码 | 编码                    | 描述                                                                                                                                                                      |
  |:---|:---|:---|
  | 400   | BadRequest        | 非法请求。 建议直接修改该请求，不要重试该请求。                                                           |
  | 401 | Unauthorized         | 在客户端提供认证信息后，返回该状态码，表明服务端指出客户端所提供的认证信息不正确或非法。                                                                                                                       |
  | 403 | Forbidden          | 请求被拒绝访问。 返回该状态码，表明请求能够到达服务端，且服务端能够理解用户请求，但是拒绝做更多的事情，因为该请求被设置为拒绝访问，建议直接修改该请求，不要重试该请求。 |
  | 500 | InternalServerError | 表明服务端能被请求访问到，但是不能理解用户的请求。                                                                                                                                          |
  | 503 | ServiceUnavailable   | 被请求的服务无效。 建议直接修改该请求，不要重试该请求。                                                    |
     
  
 
#### 错误码
表13错误码 
| 错误码                  | 错误信息                                         | 处理措施           |
|:---|:---|:---|
| SVCSTG.INV.4030000   | Forbidden                                       | 请更换有权限的账号。      |
| SVCSTG.INV.4000115   | Invalid request parameter.                      | 请检查参数。          |
| SVCSTG.INV.5000002 | The Elasticsearch execution is abnormal.     | 请联系技术支持工程师解决。   |
| SVCSTG.INV.5000003    | The call ICMGR is abnormal.                   | 请联系技术支持工程师解决。  |
| SVCSTG.INV.5000001   | The Elasticsearch session is null.            | 请联系技术支持工程师解决。    |
| SVCSTG.INV.5000006 | The apprule name already exists.               | 请修改规则名称。        |
| SVCSTG.INV.5000007   | The maximum number of rules has been reached. | 请删除不需要的规则后重新添加规则。 |
   
