华为云用户手册

  • 请求示例 更新通道生命周期 PUT https://{Endpoint}/v3/{project_id}/streams/{stream_name} { "stream_name" : "stz_test", "data_duration" : 48 } 更新通道类型 PUT https://{Endpoint}/v3/{project_id}/streams/{stream_name} { "stream_name" : "stz_test", "data_type" : "JSON" }
  • 响应参数 状态码: 200 表4 响应Body参数 参数 参数类型 描述 stream_name String 通道名称。 create_time Long 通道创建的时间,13位时间戳。 last_modified_time Long 通道最近一次修改的时间,13位时间戳。 status String 通道的当前状态。 CREATING:创建中 RUNNING:运行中 TERMINATING:删除中 TERMINATED:已删除 枚举值: CREATING RUNNING TERMINATING FROZEN stream_type String 通道类型。 COMMON:普通通道,表示1MB带宽。 ADVANCED:高级通道,表示5MB带宽。 枚举值: COMMON ADVANCED partitions Array of PartitionResult objects 通道的分区列表。 has_more_partitions Boolean 是否还有更多满足请求条件的分区。 是:true。 否:false。 retention_period Integer 数据保留时长,单位是小时。 stream_id String 通道唯一标示符。 data_type String 源数据类型。 BLOB:存储在数据库管理系统中的一组二进制数据。 JSON:一种开放的文件格式,以易读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象。 CS V:纯文本形式存储的表格数据,分隔符默认采用逗号。 缺省值:BLOB。 枚举值: BLOB JSON CSV data_schema String 用于描述用户JSON、CSV格式的源数据结构,采用Avro Schema的语法描述。Avro介绍您也可以点击这里查看。 compression_format String 数据的压缩类型,目前支持: snappy gzip zip 默认不压缩。 枚举值: snappy gzip zip csv_properties CSVProperties object CSV 格式数据的相关属性,比如分隔符 delimiter writable_partition_count Integer 可写分区总数量(只包含ACTIVE状态的分区)。 readable_partition_count Integer 可读分区总数量(包含ACTIVE与DELETED状态的分区)。 update_partition_counts Array of UpdatePartitionCount objects 扩缩容操作记录列表。 tags Array of Tag objects 通道的标签列表。 sys_tags Array of SysTag objects 通道的企业项目。 auto_scale_enabled Boolean 是否开启自动扩缩容。 true:开启自动扩缩容。 false:关闭自动扩缩容。 默认不开启。 auto_scale_min_partition_count Integer 当自动扩缩容启用时,自动缩容的最小分片数。 auto_scale_max_partition_count Integer 当自动扩缩容启用时,自动扩容的最大分片数。 表5 PartitionResult 参数 参数类型 描述 status String 分区的当前状态。 CREATING:创建中 ACTIVE:可用 DELETED:删除中 EXPIRED:已过期 枚举值: CREATING ACTIVE DELETED EXPIRED partition_id String 分区的唯一标识符。 hash_range String 分区的可能哈希键值范围。 sequence_number_range String 分区的序列号范围。 parent_partitions String 父分区。 表6 CSVProperties 参数 参数类型 描述 delimiter String 数据分隔符。 表7 UpdatePartitionCount 参数 参数类型 描述 create_timestamp Long 扩缩容操作执行时间戳,13位时间戳。 src_partition_count Integer 扩缩容操作前分区数量。 target_partition_count Integer 扩缩容操作后分区数量。 result_code Integer 扩缩容操作响应码。 result_msg Integer 扩缩容操作响应信息。 auto_scale Boolean 本次扩缩容操作是否为自动扩缩容。 true:自动扩缩容。 false:手动扩缩容。 表8 Tag 参数 参数类型 描述 key String 键。 不能为空。 对于同一资源键值唯一。 字符集:A-Z,a-z , 0-9,‘-’,‘_’,UNICODE字符(\u4E00-\u9FFF)。 最小长度:1 最大长度:36 value String 值。 长度不超过43个字符。 字符集:A-Z,a-z , 0-9,‘.’,‘-’,‘_’,UNICODE字符(\u4E00-\u9FFF)。 只能包含数字、字母、中划线“-”、下划线“_”。 最小长度:0 最大长度:43 表9 SysTag 参数 参数类型 描述 key String 键。 不能为空。 值必须为_sys_enterprise_project_id。 status String 枚举值: _sys_enterprise_project_id value String 值。 对应的是企业项目ID,需要在企业管理页面获取。 36位UUID。
  • 响应示例 状态码: 200 正常返回 { "stream_id" : "8QM3Nt9YTLOwtUVYJhO", "stream_name" : "newstream", "create_time" : 1593569685875, "last_modified_time" : "1599050091026,", "retention_period" : 24, "status" : "RUNNING", "stream_type" : "COMMON", "data_type" : "BLOB", "writable_partition_count" : 1, "readable_partition_count" : 1, "tags" : [ ], "auto_scale_enabled" : false, "auto_scale_min_partition_count" : 0, "auto_scale_max_partition_count" : 0, "partitions" : [ { "status" : "ACTIVE", "partition_id" : "shardId-0000000000", "hash_range" : "[0 : 9223372036854775807]", "sequence_number_range" : "[289911 : 289927]" } ], "has_more_partitions" : false }
  • URI GET /v2/{project_id}/streams/{stream_name} 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 项目ID。 stream_name 是 String 需要查询的通道名称。 最大长度:60 表2 Query参数 参数 是否必选 参数类型 描述 start_partitionId 否 String 从该分区值开始返回分区列表,返回的分区列表不包括此分区。 必须将“start_partitionId”的值设置为“shardId-0000000xxx”格式,xxx为要查询的通道分区Id。 limit_partitions 否 Integer 单次请求返回的最大分区数。 最小值:1 最大值:1000 缺省值:100
  • 状态码 状态码是每次API请求响应的HTTPS状态码,表示本次HTTPS请求服务器返回的状态。 状态码 编码 状态说明 100 Continue 继续请求。 这个临时响应用来通知客户端,它的部分请求已经被服务器接收,且仍未被拒绝。 101 Switching Protocols 切换协议。只能切换到更高级的协议。 例如,切换到HTTP的新版本协议。 200 OK 服务器已成功处理了请求。 201 Created 创建类的请求完全成功。 202 Accepted 已经接受请求,但未处理完成。 203 Non-Authoritative Information 非授权信息,请求成功。 204 NoContent 请求完全成功,同时HTTP响应不包含响应体。 在响应OPTIONS方法的HTTPS请求时返回此状态码。 205 Reset Content 重置内容,服务器处理成功。 206 Partial Content 服务器成功处理了部分GET请求。 300 Multiple Choices 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择。 301 Moved Permanently 永久移动,请求的资源已被永久的移动到新的URI,返回信息会包括新的URI。 302 Found 资源被临时移动。 303 See Other 查看其它地址。 使用GET和POST请求查看。 304 Not Modified 所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。 305 Use Proxy 所请求的资源必须通过代理访问。 306 Unused 已经被废弃的HTTP状态码。 400 BadRequest 非法请求。 建议直接修改该请求,不要重试该请求。 401 Unauthorized 在客户端提供认证信息后,返回该状态码,表明服务端指出客户端所提供的认证信息不正确或非法。 402 Payment Required 保留请求。 403 Forbidden 请求被拒绝访问。 返回该状态码,表明请求能够到达服务端,且服务端能够理解用户请求,但是拒绝做更多的事情,因为该请求被设置为拒绝访问,建议直接修改该请求,不要重试该请求。 404 NotFound 所请求的资源不存在。 建议直接修改该请求,不要重试该请求。 405 MethodNotAllowed 请求中带有该资源不支持的方法。 建议直接修改该请求,不要重试该请求。 406 Not Acceptable 服务器无法根据客户端请求的内容特性完成请求。 407 Proxy Authentication Required 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权。 408 Request Time-out 服务器等候请求时发生超时。 客户端可以随时再次提交该请求而无需进行任何更改。 409 Conflict 服务器在完成请求时发生冲突。 返回该状态码,表明客户端尝试创建的资源已经存在,或者由于冲突请求的更新操作不能被完成。 410 Gone 客户端请求的资源已经不存在。 返回该状态码,表明请求的资源已被永久删除。 411 Length Required 服务器无法处理客户端发送的不带Content-Length的请求信息。 412 Precondition Failed 未满足前提条件,服务器未满足请求者在请求中设置的其中一个前提条件。 413 Request Entity Too Large 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息。 414 Request-URI Too Large 请求的URI过长(URI通常为网址),服务器无法处理。 415 Unsupported Media Type 服务器无法处理请求附带的媒体格式。 416 Requested range not satisfiable 客户端请求的范围无效。 417 Expectation Failed 服务器无法满足Expect的请求头信息。 422 UnprocessableEntity 请求格式正确,但是由于含有语义错误,无法响应。 429 TooManyRequests 表明请求超出了客户端访问频率的限制或者服务端接收到多于它能处理的请求。建议客户端读取相应的Retry-After首部,然后等待该首部指出的时间后再重试。 441 Authentication Error 鉴权失败。 500 InternalServerError 表明服务端能被请求访问到,但是不能理解用户的请求。 501 Not Implemented 服务器不支持请求的功能,无法完成请求。 502 Bad Gateway 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求。 503 ServiceUnavailable 被请求的服务无效。 建议直接修改该请求,不要重试该请求。 504 ServerTimeout 请求在给定的时间内无法完成。客户端仅在为请求指定超时(Timeout)参数时会得到该响应。 505 HTTP Version not supported 服务器不支持请求的HTTP协议的版本,无法完成处理。 父主题: 附录
  • 创建带数据Schema的通道 您还可以为通道配置Schema,在使用DIS转储到其它服务时,可以根据通道配置的Schema来完成映射,示例如下。 Token认证,具体操作请参考Token认证。 发送“POST https://dis的Endpoint/v2/{project_id}/streams”。 在Request Header中增加“X-Auth-Token”。 在Request Body中传入参数如下: { "stream_name": "dis-DLpR", "partition_count": 1, "stream_type": "COMMON", "data_duration": 24 "auto_scale_enabled": true, "auto_scale_min_partition_count": 1, "auto_scale_max_partition_count": 10 "data_type": "JSON", "data_schema": "{\"type\":\"record\",\"name\":\"RecordName\",\"fields\":[{\"name\":\"key1\",\"type\":\"string\"},{\"name\":\"key2\",\"type\":\"string\"}]}" } 这个示例中创建了一个源数据类型为JSON,且数据包含“key1”、“key2”这两个属性的通道。 data_type:指定源数据的类型,“JSON”表示分区中的数据格式为JSON格式。 data_schema:源数据Schema,用于描述JSON、CSV格式的源数据结构,采用Avro Schema的语法描述。 请求响应成功后,返回201 Created,表示通道创建成功。 若请求失败,则会返回错误码及对应的错误信息说明,详细错误码信息请参考错误码。
  • 创建支持自动扩缩容的通道 您还可以创建支持自动扩缩容的通道,可以根据通道的流量情况自动为您扩充或缩减分片数量。示例如下。 Token认证,具体操作请参考Token认证。 发送“POST https://dis的Endpoint/v2/{project_id}/streams”。 在Request Header中增加“X-Auth-Token”。 在Request Body中传入参数如下: { "stream_name": "dis-DLpR", "partition_count": 1, "stream_type": "COMMON", "data_duration": 24 "auto_scale_enabled": true, "auto_scale_min_partition_count": 2, "auto_scale_max_partition_count": 10 } 这个示例中创建了支持自动扩缩容的通道,通道缩容的最小分区数量是2,扩容的最大分区数量是10,也就是说如果通道10个分区后不会再触发自动扩容。 auto_scale_enabled:是否开启自动扩缩容,true表示开启。 auto_scale_min_partition_count:当自动扩缩容启用时,自动缩容的最小分片数,比如这个示例中当分区数量为2时,不会再触发自动缩容。 auto_scale_max_partition_count:当自动扩缩容启用时,自动扩容的最大分片数,比如这个示例中当分区数量为10时,不会再触发自动扩容。 请求响应成功后,返回201 Created,表示通道创建成功。 若请求失败,则会返回错误码及对应的错误信息说明,详细错误码信息请参考错误码。
  • 创建通道 如下示例是创建通道最简单的配置。 Token认证,具体操作请参考Token认证。 发送“POST https://dis的Endpoint/v2/{project_id}/streams”。 在Request Header中增加“X-Auth-Token”。 在Request Body中传入参数如下: { "stream_name": "dis-DLpR", "partition_count": 1, "stream_type": "COMMON", "data_duration": 24 } stream_name:通道的名称,由您自行定义,例如取名为newstream。 partition_count:分区是DIS数据通道的基本吞吐量单位,您可以根据业务吞吐的需求选择通道的分区数。 stream_type:通道类型,“COMMON”表示普通分区,单分区支持最大1MB/s的写入速度和2MB/s的读取速度。 data_duration:通道生命周期,即通道分区中数据的保留时长。 请求响应成功后,返回201 Created,表示通道创建成功。 若请求失败,则会返回错误码及对应的错误信息说明,详细错误码信息请参考错误码。
  • 错误码 当您调用API时,如果遇到“APIGW”开头的错误码,请参见API网关错误码进行处理。 更多服务错误码请参见API错误中心。 状态码 错误码 错误信息 描述 处理措施 400 DIS.4117 Invalid Project Id. %s 用户传入的projectId无效 请检查传入的projectId是否有效,是否传入了其他project的id。 400 DIS.4200 Invalid request. %s 用户的请求无效 请参考API文档检查请求。 400 DIS.4201 Invalid partition_id. %s 用户传入的partition_id无效 请检查partition_id是否无效。 400 DIS.4202 Empty request. 用户的请求为空 请传入有效的请求。 400 DIS.4203 Invalid monitoring period. %s 查询监控信息的startTime无效 请传入有效的时间戳。 400 DIS.4204 The monitoring period cannot be longer than 7 days. 仅允许查询最近7天内的监控信息 请查询最近7天内的监控信息。 400 DIS.4205 Stream is not running. 通道状态不是运行中 请检查通道状态。 400 DIS.4208 Mrs cluster is invalid. %s 创建 MRS 转储任务时,传入的MRS集群无效 请检查传入的MRS集群名称和ID,集群状态是否为运行中,以及是否为安全模式的集群。 400 DIS.4209 Invalid metrics label. %s 查询监控信息时,传入的监控指标不合法 请参考API文档检查监控指标并修正。 400 DIS.4215 Invalid cursor type. %s 获取数据游标时,传入的游标类型cursor-type不合法 请参考API文档检查cursor-type字段的范围并修正。 400 DIS.4216 Invalid sequence_number. %s 获取数据游标时,传入的序列号starting-sequence-number不合法 请传入有效的starting-sequence-number。 400 DIS.4217 Invalid partition cursor. %s 从DIS通道下载数据时,传入的数据游标partition-cursor无效 请重新获取partition-cursor并下载数据。 400 DIS.4224 Sequence_number out of range. %s 获取数据游标时,传入的序列号starting-sequence-number不在有效范围 请传入有效的starting-sequence-number。 400 DIS.4225 Expired partition cursor. %s 从DIS通道下载数据时,传入的数据游标partition-cursor过期 请重新获取partition-cursor并下载数据。 400 DIS.4226 A partition iterator error occurred or a record to which the SN corresponds has expired. Try to obtain the partition iterator again. 获取数据时,传入的数据游标partition-cursor对应的序列号starting-sequence-number过期 请重新获取数据游标,并用新游标获取数据。 400 DIS.4300 Request error. 请求体错误 请对照API文档修正请求体。 400 DIS.4301 The stream does not exist. %s 通道不存在 请检查传入的通道是否存在。 400 DIS.4302 Partition does not exist. %s 通道的分区不存在 请检查用户传入的分区ID是否存在。 400 DIS.4303 Exceeded traffic control limit. 超出流控 请扩容通道或降低上传速率。 400 DIS.4305 Too many stream requests. 同一时间内用户请求太多 请降低请求频率并重试。 400 DIS.4306 Bucket does not exist. %s 传入的OBS桶不存在 请检查OBS桶是否存在。 400 DIS.4307 The stream already exists. 指定的通道已经存在 请修改通道名称并重新创建通道 400 DIS.4308 Insufficient quota. 通道或分区的配额不足 请释放配额或提工单修改账号的配额。 400 DIS.4309 Too many request failures. Please try again later. IP被加入黑名单 由于频繁的错误访问导致用户ip被加入黑名单,请检查认证信息和请求是否有效,并稍后重试。 400 DIS.4310 OBS access error. 访问OBS失败 请检查用户是否有访问OBS的权限。 400 DIS.4319 Partition is expired. %s 分区已过期 该分区已过期失效,主要针对缩容场景,检查该分区是否已失效,使用正确有效的分区。 400 DIS.4329 app quota exceeded. APP配额超出限制 请释放APP的配额。 400 DIS.4330 app already exist. 已经存在同名的APP 请修改APP名称并重新创建APP。 400 DIS.4331 app is using. 删除app时,当前app在使用中 请确认app是否在使用中,如需删除请停止使用并重新删除。 400 DIS.4332 app not found. 指定的APP不存在 请检查指定的APP名称是否正确 400 DIS.4335 Invalid IAM agency. 创建转储任务时,使用的IAM委托无效 检查DIS创建的dis_admin_agency或用户自定义的IAM委托是否存在,权限是否完整。 400 DIS.4336 Invalid HDFS path. 创建MRS转储任务时,传入的MRS HDFS路径无效 请检查传入的MRS HDFS路径是否存在。 400 DIS.4337 The DLI database does not exist. 创建DLI转储任务时,传入的DLI数据库不存在 请检查传入的DLI数据库是否存在。 400 DIS.4338 The DLI table does not exist. 创建DLI转储任务时,传入的DLI数据表不存在 请检查传入的DLI表是否存在,并且是否为DLI内表。 400 DIS.4339 Consumer quota exceeded. 消费组消费者配额不足 该消费组内的消费者数量已经超越最大配额,请合理分配消费者或者使用新消费组满足诉求。 400 DIS.4341 The CloudTable cluster does not exist. 创建CloudTable转储任务时,传入的CloudTable集群不存在 请检查传入的CloudTable集群是否存在,集群状态是否正常。 400 DIS.4342 The CloudTable table does not exist 创建CloudTable转储任务时,传入的CloudTable表不存在 请检查传入的CloudTable表是否存在。 400 DIS.4343 The CloudTable table family does not exist. 创建CloudTable转储任务时,传入的CloudTable表的列族不存在 请检查传入的CloudTable表的列族名称是否存在。 400 DIS.4345 Invalid CloudTable schema. 创建CloudTable转储任务时,传入的schema无效 请根据返回的详细信息检查schema,例如配置的JSON属性名称是否存在,参数是否合法等。 400 DIS.4348 Invalid CloudTable openTSDB schema. 创建CloudTable openTSDB转储任务时,传入的schema无效 请根据返回的详细信息检查schema,例如配置的JSON属性名称是否存在,参数是否合法等。 400 DIS.4350 Invalid DWS cluster. 创建DWS转储任务时,传入的DWS集群不存在 请检查DWS集群是否存在,运行是否正常。 400 DIS.4351 Invalid KMS userKey. 创建DWS转储任务时,传入的KMS秘钥信息无效 请检查KMS密钥是否存在。 400 DIS.4354 The transfer task does not exist. 删除或更新转储任务时,转储任务不存在 请检查转储任务是否存在。 400 DIS.4355 The transfer task already exists. 创建转储任务时,同一个通道下已存在同名的转储任务 请修改新创建转储任务的名称并重新创建。 400 DIS.4357 Exceeded transfer task quota. 单个通道仅允许同时存在5个转储任务,再创建新的转储任务会超出配额限制 请删除废弃的转储任务释放配额。 400 DIS.4360 Invalid data schema. 创建通道或更新通道时,传入的data_schema无效 请检查data_schema的格式并重试。 400 DIS.4375 The app does not commit checkpoint 该app没有在通道中提交checkpoint操作 请确认该app是否已在消费通道提交了checkpoint操作 400 DIS.4601 The number of resource tags has reached the maximum. 一个资源上最多有10个标签,添加标签时资源上已添加的标签数超出限制 请删除废弃的标签并重新添加标签。 400 DIS.4602 Invalid resource type. 资源类型不合法 请检查资源类型是否合法。 400 DIS.4603 The resource does not exist. 资源不存在 请确认该资源是否已被删除。 400 DIS.4604 The key does not exist. 标签Key不存在 请确认标签Key是否存在。 400 DIS.4605 The action is not supported. 当前标签操作不支持 请确认当前标签操作是否合法,当前仅支持create和delete操作。 403 DIS.4116 Invalid RBAC. %s 用户操作受限 请根据返回的具体信息判断账号是否欠费、无DIS服务的操作权限等。 500 DIS.5000 System error. 系统错误,请联系客服或技术支持工程师处理。 系统错误,请联系客服或技术支持工程师处理。 父主题: 附录
  • 请求参数 表2 请求Header参数 参数 是否必选 参数类型 描述 X-Auth-Token 是 String 用户Token。 通过调用IAM服务获取用户Token接口获取(响应消息头中X-Subject-Token的值)。 表3 请求Body参数 参数 是否必选 参数类型 描述 stream_name 是 String 需要变更分区数量的通道名称。 最大长度:64 target_partition_count 是 Integer 变更的目标分区数量。 取值为大于0的整数。 设置的值大于当前分区数量表示扩容,小于当前分区数量表示缩容。 注意: 每个通道在一小时内扩容和缩容总次数最多5次,且一小时内扩容或缩容操作有一次成功则最近一小时内不允许再次进行扩容或缩容操作。 最小值:0
  • 响应示例 状态码: 200 正常返回 { "stream_id" : "RdMFID6edQdf8eDzc9e", "stream_name" : "newstream", "task_name" : "newtask", "task_id" : "As805BudhcH1lDs6gbn", "destination_type" : "OBS", "state" : "RUNNING", "create_time" : 1606554932552, "last_transfer_timestamp" : 1606984428612, "obs_destination_description" : { "agency_name" : "dis_admin_agency", "file_prefix\"" : "", "partition_format" : "yyyy/MM/dd", "obs_bucket_path" : "obsbucket", "deliver_time_interval" : 60, "consumer_strategy" : "LATEST", "retry_duration" : 0, "destination_file_type" : "text", "record_delimiter" : "\n\n" }, "partitions" : [ { "partitionId" : "shardId-0000000000", "discard" : 0, "state" : "RUNNING", "last_transfer_timestamp" : 1606984428612, "last_transfer_offset" : 289897 } ] }
  • 请求示例 添加OBS转储任务 POST https://{Endpoint}/v2/{project_id}/streams/{stream_name}/transfer-tasks { "destination_type" : "OBS", "obs_destination_descriptor" : { "task_name" : "newtask", "consumer_strategy" : "LATEST", "agency_name" : "dis_admin_agency", "destination_file_type" : "text", "obs_bucket_path" : "obsbucket", "file_prefix" : "", "partition_format" : "yyyy/MM/dd/HH/mm", "record_delimiter" : "|", "deliver_time_interval" : 30 } } 添加OBS转储任务(转储文件格式是parquet) POST https://{Endpoint}/v2/{project_id}/streams/{stream_name}/transfer-tasks { "destination_type" : "OBS", "obs_destination_descriptor" : { "task_name" : "newtask", "consumer_strategy" : "LATEST", "agency_name" : "dis_admin_agency", "destination_file_type" : "parquet", "obs_bucket_path" : "obsbucket", "file_prefix" : "", "partition_format" : "yyyy/MM/dd/HH/mm", "record_delimiter" : "|", "deliver_time_interval" : 30 } }
  • 请求参数 表2 请求Header参数 参数 是否必选 参数类型 描述 X-Auth-Token 是 String 用户Token。 通过调用IAM服务获取用户Token接口获取(响应消息头中X-Subject-Token的值)。 表3 请求Body参数 参数 是否必选 参数类型 描述 action 是 String 操作标识:仅限于delete delete:批量删除 枚举值: delete tags 是 Array of Tag objects 标签列表。 表4 Tag 参数 是否必选 参数类型 描述 key 否 String 键。 不能为空。 对于同一资源键值唯一。 字符集:A-Z,a-z , 0-9,‘-’,‘_’,UNICODE字符(\u4E00-\u9FFF)。 最小长度:1 最大长度:36 value 否 String 值。 长度不超过43个字符。 字符集:A-Z,a-z , 0-9,‘.’,‘-’,‘_’,UNICODE字符(\u4E00-\u9FFF)。 只能包含数字、字母、中划线“-”、下划线“_”。 最小长度:0 最大长度:43
  • 请求示例 批量删除资源标签 POST https://{Endpoint}/v2/{project_id}/stream/{stream_id}/tags/action { "action" : "delete", "tags" : [ { "key" : "key1", "value" : "value1" }, { "key" : "key2", "value" : "value3" } ] }
  • 调用API获取项目ID 项目ID可以通过调用查询指定条件下的项目信息API获取。 获取项目ID的接口为“GET https://{Endpoint}/v3/projects”,其中{Endpoint}为IAM的终端节点,可以从地区和终端节点获取。接口的认证鉴权请参见认证鉴权。 响应示例如下,其中projects下的“id”即为项目ID。当返回多个id,请依据实际的区域(name)获取。 { "projects": [ { "domain_id": "65382450e8f64ac0870cd180d14e684b", "is_domain": false, "parent_id": "65382450e8f64ac0870cd180d14e684b", "name": "region_name", "description": "", "links": { "next": null, "previous": null, "self": "https://www.example.com/v3/projects/a4a5d4098fb4474fa22cd05f897d6b99" }, "id": "a4a5d4098fb4474fa22cd05f897d6b99", "enabled": true } ], "links": { "next": null, "previous": null, "self": "https://www.example.com/v3/projects" } }
  • 请求示例 添加DWS转储任务 POST https://{Endpoint}/v2/{project_id}/streams/{stream_name}/transfer-tasks { "destination_type" : "DWS", "dws_destination_descriptor" : { "task_name" : "dwstask", "consumer_strategy" : "LATEST", "agency_name" : "dis_admin_agency", "dws_cluster_name" : "dwscluster", "dws_cluster_id" : "f82dc227-3691-47eb-bca7-e7851f509b2a", "dws_database_name" : "postgres", "dws_schema" : "dbadmin", "dws_table_name" : "dwstablename", "dws_delimiter" : "", "user_name" : "dbadmin", "user_password" : "userpassword", "kms_user_key_name" : "kmskey", "kms_user_key_id" : "1e759f06-9188-4d21-afab-a75e57c04d2b", "obs_bucket_path" : "obsbucket", "file_prefix" : "", "deliver_time_interval" : 60, "retry_duration" : 1800, "options" : { "fill_missing_fields" : "false", "ignore_extra_data" : "false", "compatible_illegal_chars" : "false" } } }
  • 请求参数 表2 请求Header参数 参数 是否必选 参数类型 描述 X-Auth-Token 是 String 用户Token。 通过调用IAM服务获取用户Token接口获取(响应消息头中X-Subject-Token的值)。 表3 请求Body参数 参数 是否必选 参数类型 描述 destination_type 是 String 转储任务类型。 OBS:转储到OBS MRS:转储到MRS DLI:转储到DLI CLOUDTABLE:转储到CloudTable DWS:转储到DWS 缺省值:NOWHERE 枚举值: DWS dws_destination_descriptor 否 DWSDestinationDescriptorRequest object 转储目的地为DWS的参数列表。 表4 DWSDestinationDescriptorRequest 参数 是否必选 参数类型 描述 task_name 是 String 转储任务的名称。 任务名称由英文字母、数字、中划线和下划线组成。长度为1~64个字符。 agency_name 是 String 在 统一身份认证 服务(IAM)中创建委托的名称,DIS需要获取IAM委托信息去访问您指定的资源。创建委托的参数设置如下:- 委托类型:云服务- 云服务:DIS- 持续时间:永久- “所属区域”为“全局服务”,“项目”为“ 对象存储服务 ”对应的“策略”包含“Tenant Administrator”。如果已经创建过委托,可以使用IAM服务提供的查询委托列表接口,获取有效可用的委托名称。取值范围:长度不超过64位,且不可配置为空。如果有在Console控制台使用转储任务,会提示自动创建委托,自动创建的委托名称为:dis_admin_agency 最大长度:64 deliver_time_interval 是 Integer 根据用户配置的时间,周期性的将数据导入OBS,若某个时间段内无数据,则此时间段不会生成打包文件。 单位:秒 最小值:30 最大值:900 缺省值:300 consumer_strategy 否 String 偏移量。 LATEST:最大偏移量,即获取最新的数据。 TRIM_HORIZON:最小偏移量,即读取最早的数据。 缺省值:LATEST 枚举值: LATEST TRIM_HORIZON dws_cluster_name 是 String 存储该通道数据的DWS集群名称。 dws_cluster_id 是 String 存储该通道数据的DWS集群ID。 dws_database_name 是 String 存储该通道数据的DWS数据库名称。 dws_schema 是 String 存储该通道数据的DWS数据库模式。 dws_table_name 是 String 存储该通道数据的DWS数据库模式下的数据表。 dws_delimiter 是 String 用户数据的字段分隔符,根据此分隔符分隔用户数据插入DWS数据表的相应列。 取值范围:“,”、“;”和“|”三种字符中的一个。 user_name 是 String 存储该通道数据的DWS数据库的用户名。 user_password 是 String 存储该通道数据的DWS数据库的密码。 kms_user_key_name 是 String 用户在密钥管理服务(简称KMS)创建的用户主密钥名称,用于加密存储DWS数据库的密码。 kms_user_key_id 是 String 用户在密钥管理服务(简称KMS)创建的用户主密钥ID,用于加密存储DWS数据库的密码。 obs_bucket_path 是 String 临时存储该通道数据的OBS桶名称。 file_prefix 否 String 临时存储该通道数据的OBS桶下的自定义目录,多级目录可用“/”进行分隔,不可以“/”开头。 取值范围:英文字母、数字、下划线和斜杠,最大长度为50个字符。 默认配置为空。 retry_duration 否 String 用户数据导入DWS集群失败的重试失效时间。超出此配置项配置的时间,转储DWS失败的数据将备份至“OBS桶/ file_prefix/dws_error”目录下。取值范围: 0~7200。单位:秒。默认配置为1800。 dws_table_columns 否 String 指定要转储到DWS表中的列,为null或者为空则默认全列。比如“c1,c2”表示将Schema中c1和c2这两列转储到DWS。 默认为空。 options 否 Options object DWS容错性选项(用于指定外表数据的各类参数)。 表5 Options 参数 是否必选 参数类型 描述 fill_missing_fields 否 String 数据入库时,数据源文件中某行的最后一个字段缺失时,请选择是直接将字段设为Null,还是在错误表中报错提示。 取值范围: true/on false/off 缺省值:false/off 枚举值: true/on false/off ignore_extra_data 否 String 数据源文件中的字段比外表定义列数多时,是否忽略多出的列。该参数只在数据导入过程中使用。 取值范围: true/on false/off 缺省值:false/off 枚举值: true/on false/off compatible_illegal_chars 否 String 导入非法字符容错参数。是将非法字符按照转换规则转换后入库,还是报错中止导入。 取值范围: true/on false/off 缺省值:false/off 枚举值: true/on false/off reject_limit 否 String 指定本次数据导入允许出现的数据格式错误个数,当导入过程中出现的数据格式错误未达到限定值时,本次数据导入可以成功。 取值范围: 整型值 unlimited(无限制) 缺省值为0,有错误信息立即返回。 error_table_name 否 String 用于记录数据格式错误信息的错误表表名。并行导入结束后查询此错误信息表,能够获取详细的错误信息。
  • 基本概念 账号 用户注册时的账号,账号对其所拥有的资源及云服务具有完全的访问权限,可以重置用户密码、分配用户权限等。由于账号是付费主体,为了确保账号安全,建议您不要直接使用账号进行日常管理工作,而是创建用户并使用他们进行日常管理工作。 用户 由账号在IAM中创建的用户,是云服务的使用人员,具有身份凭证(密码和访问密钥)。 在我的凭证下,您可以查看账号ID和用户ID。通常在调用API的鉴权过程中,您需要用到账号、用户和密码等信息。 项目 区域默认对应一个项目,这个项目由系统预置,用来隔离物理区域间的资源(计算资源、存储资源和网络资源),以默认项目为单位进行授权,用户可以访问您账号中该区域的所有资源。如果您希望进行更加精细的权限控制,可以在区域默认的项目中创建子项目,并在子项目中创建资源,然后以子项目为单位进行授权,使得用户仅能访问特定子项目中资源,使得资源的权限控制更加精确。 图1 项目隔离模型 Checkpoint 消费检查点。应用程序消费数据时,记录已消费数据的最新序列号作为检查点。当重新消费数据时,可根据此检查点继续消费。 APP 应用程序标识符。当多个应用程序分别消费同一通道的数据时,为区分不同应用程序的消费检查点,使用APP作为标识。 父主题: 使用前必读
  • 响应示例 状态码: 200 正常返回 { "total_number" : 1, "stream_names" : [ "newstream" ], "stream_info_list" : [ { "stream_id" : "8QM3Nt9YTLOwtUVYJhO", "stream_name" : "newstream", "create_time" : 1593569685875, "retention_period" : 24, "status" : "RUNNING", "stream_type" : "COMMON", "data_type" : "BLOB", "partition_count" : 1, "tags" : [ ], "auto_scale_enabled" : false, "auto_scale_min_partition_count" : 0, "auto_scale_max_partition_count" : 0 } ], "has_more_streams" : false }
  • 响应参数 状态码: 200 表4 响应Body参数 参数 参数类型 描述 total_number Long 当前租户所有通道数量。 stream_names Array of strings 满足当前请求条件的通道名称的列表。 has_more_streams Boolean 是否还有更多满足条件的通道。 true:是 false:否 缺省值:false stream_info_list Array of StreamInfo objects 通道列表详情。 表5 StreamInfo 参数 参数类型 描述 stream_name String 通道名称。 create_time Long 通道创建的时间,13位时间戳。 retention_period Integer 数据保留时长,单位是小时。 status String 通道的当前状态。 CREATING:创建中 RUNNING:运行中 TERMINATING:删除中 TERMINATED:已删除 枚举值: CREATING RUNNING TERMINATING FROZEN stream_type String 通道类型。 COMMON:普通通道,表示1MB带宽。 ADVANCED:高级通道,表示5MB带宽。 枚举值: COMMON ADVANCED data_type String 源数据类型。 BLOB:存储在数据库管理系统中的一组二进制数据。 JSON:一种开放的文件格式,以易读的文字为基础,用来传输由属性值或者序列性的值组成的数据对象。 CSV:纯文本形式存储的表格数据,分隔符默认采用逗号。 缺省值:BLOB。 枚举值: BLOB JSON CSV partition_count Integer 分区数量。 分区是DIS数据通道的基本吞吐量单位。 auto_scale_enabled Boolean 是否开启自动扩缩容。 true:开启自动扩缩容。 false:关闭自动扩缩容。 默认不开启。 缺省值:false auto_scale_min_partition_count Integer 当自动扩缩容启用时,自动缩容的最小分片数。 最小值:1 auto_scale_max_partition_count Integer 当自动扩缩容启用时,自动扩容的最大分片数。 tags Array of Tag objects 通道标签列表。 sys_tags Array of SysTag objects 通道企业项目列表。 表6 Tag 参数 参数类型 描述 key String 键。 不能为空。 对于同一资源键值唯一。 字符集:A-Z,a-z , 0-9,‘-’,‘_’,UNICODE字符(\u4E00-\u9FFF)。 最小长度:1 最大长度:36 value String 值。 长度不超过43个字符。 字符集:A-Z,a-z , 0-9,‘.’,‘-’,‘_’,UNICODE字符(\u4E00-\u9FFF)。 只能包含数字、字母、中划线“-”、下划线“_”。 最小长度:0 最大长度:43 表7 SysTag 参数 参数类型 描述 key String 键。 不能为空。 值必须为_sys_enterprise_project_id。 status String 枚举值: _sys_enterprise_project_id value String 值。 对应的是企业项目ID,需要在企业管理页面获取。 36位UUID。
  • URI GET /v2/{project_id}/streams 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 项目ID。 表2 Query参数 参数 是否必选 参数类型 描述 limit 否 Integer 单次请求返回通道列表的最大数量。 最小值:1 最大值:100 缺省值:10 start_stream_name 否 String 从该通道开始返回通道列表,返回的通道列表不包括此通道名称。如果需要分页查询,第一页查询时不传该字段。返回结果has_more_streams为true时,进行下一页查询,start_stream_name传入第一页查询结果的最后一条通道名称。
  • 请求示例 添加DLI转储任务 POST https://{Endpoint}/v2/{project_id}/streams/{stream_name}/transfer-tasks { "destination_type" : "DLI", "dli_destination_descriptor" : { "task_name" : "dlitask", "consumer_strategy" : "LATEST", "agency_name" : "dis_admin_agency", "dli_database_name" : "dlidatabasename", "dli_table_name" : "dlitablename", "obs_bucket_path" : "obsbucket", "file_prefix" : "", "deliver_time_interval" : 300, "retry_duration " : 300 } }
  • 请求参数 表2 请求Header参数 参数 是否必选 参数类型 描述 X-Auth-Token 是 String 用户Token。 通过调用IAM服务获取用户Token接口获取(响应消息头中X-Subject-Token的值)。 表3 请求Body参数 参数 是否必选 参数类型 描述 destination_type 是 String 转储任务类型。 OBS:转储到OBS MRS:转储到MRS DLI:转储到DLI CLOUDTABLE:转储到CloudTable DWS:转储到DWS 缺省值:NOWHERE 枚举值: DLI dli_destination_descriptor 否 DliDestinationDescriptorRequest object 转储目的地为DLI的参数列表。 表4 DliDestinationDescriptorRequest 参数 是否必选 参数类型 描述 task_name 是 String 转储任务的名称。 任务名称由英文字母、数字、中划线和下划线组成。长度为1~64个字符。 agency_name 是 String 在统一身份认证服务(IAM)中创建委托的名称,DIS需要获取IAM委托信息去访问您指定的资源。创建委托的参数设置如下:- 委托类型:云服务- 云服务:DIS- 持续时间:永久- “所属区域”为“全局服务”,“项目”为“对象存储服务”对应的“策略”包含“Tenant Administrator”。如果已经创建过委托,可以使用IAM服务提供的查询委托列表接口,获取有效可用的委托名称。取值范围:长度不超过64位,且不可配置为空。如果有在Console控制台使用转储任务,会提示自动创建委托,自动创建的委托名称为:dis_admin_agency 最大长度:64 deliver_time_interval 是 Integer 根据用户配置的时间,周期性的将数据导入OBS,若某个时间段内无数据,则此时间段不会生成打包文件。 单位:秒 最小值:30 最大值:900 缺省值:300 consumer_strategy 否 String 偏移量。 LATEST:最大偏移量,即获取最新的数据。 TRIM_HORIZON:最小偏移量,即读取最早的数据。 缺省值:LATEST 枚举值: LATEST TRIM_HORIZON dli_database_name 是 String 存储该通道数据的DLI数据库名称。 dli_table_name 是 String 存储该通道数据的DLI表名称。 说明: 仅支持数据位置为DLI的表,且用户需具有该表的插入权限。 obs_bucket_path 是 String 临时存储该通道数据的OBS桶名称。 file_prefix 否 String 临时存储该通道数据的OBS桶下的自定义目录,多级目录可用“/”进行分隔,不可以“/”开头。 取值范围:英文字母、数字、下划线和斜杠,最大长度为50个字符。 默认配置为空。 retry_duration 否 String 用户数据导入DLI失败的失效重试时间。重试时间超过该配置项配置的值,则将转储失败的数据备份至“OBS桶/ file_prefix/dli_error”目录下。取值范围:0~7200。单位:秒。默认配置为1800。配置为“0”表示DIS服务不会在转储失败时进行重试。
  • 主机接入LTS后无法采集到日志? 如果主机接入LTS后无法采集到日志,请按如下方法进行排查: 刚完成接入配置则需要等待1~5分钟,日志才会开始上报。 排查主机配置的采集路径是否重复,即有可能主机的路径配置了多次,这样则需要修改配置,同一个主机的路径只允许存在一种配置。 排查相同主机的同一个日志采集路径,是否已在 AOM 进行了配置。在AOM配置后则不能在LTS重复配置。 参考ECS接入排查是否存在不规范的配置导致日志采集失败。 若以上解决办法无法解决您的问题,请提交工单寻求技术支持工程师的帮助。 父主题: 日志接入
  • 成本对比 场景一: 假设客户每天原始日志100GB(日志平均速率1.16MB/s),日志平均存储30天,30天原始日志总量为3000GB,日志存储方式为一主一副本。 根据Elasticsearch官方推荐,在一主一副本存储方式下,原始日志+副本数据+索引数据等合计占用的存储空间约为原始日志大小2.2倍,另外由于ES集群存在写不均匀且磁盘不能被耗尽,因此为了存储3000GB原始日志,至少需要准备3000GB*2.2(存储膨胀)*2(50%磁盘冗余) = 13200GB磁盘。 搭建ES最小典型配置是3台ECS(16U64G5TB),kafka双副本能支持缓存最近12小时的日志。 表1 自建ELK 大类 小类 月成本(合计:12597元) 费用占比 搭建ES 3 * ECS(C6 16U64G) 3*1999=5997元 47.6% 云硬盘EVS(高IO 15TB) 0.35*15*1024=5376元 42.7% 搭建KAFKA 3 * ECS(2U4G) 3*208=624元 4.9% 云硬盘EVS(超高IO 3*200GB) 600元 4.7% LTS使用价格计算器,计算出来月成本约为2102元,使用LTS的成本约为自建ELK成本的16.7%,原因是在小日志量场景下,自建ELK起步资源成本很高,相比于按需付费的LTS,有很大劣势。 场景二: 假设客户每天原始日志1TB(日志平均速率11.6MB/s),日志平均存储7天,7天原始日志总量为7TB,日志存储方式为一主一副本。根据Elasticsearch官方推荐,在一主一副本存储方式下,原始日志+副本数据+索引数据等合计占用的存储空间约为原始日志大小2.2倍,另外由于ES集群存在写不均匀且磁盘不能被耗尽,因此为了存储7TB原始日志,至少需要准备7TB*2.2(存储膨胀)*2(50%磁盘冗余) = 31 TB磁盘。 搭建ES最小典型配置是3台ECS(16U64G10TB),kafka双副本能支持缓存最近12小时的日志 表2 自建ELK 大类 小类 月成本(合计:18931元) 费用占比 搭建ES 3 * ECS(C6 16U64G) 3*1999=5997元 31.7% 云硬盘EVS(高IO 31TB) 0.35*31*1024=11110元 58.7% 搭建KAFKA 3 * ECS(2U4G) 3*208=624元 3.3% 云硬盘EVS(超高IO 3*400GB) 1200元 6.3% LTS使用价格计算器,计算出来月成本约为13408元,使用LTS的成本约为自建ELK成本的71%,原因是LTS的存储收费是按用量付费,自建ELK为了保证集群的正常运行需要留有很多磁盘冗余。 场景三: 假设客户每天原始日志5TB(日志平均速率58MB/s),日志平均存储30天,30天原始日志总量为150TB,日志存储方式为一主一副本。 根据Elasticsearch官方推荐,在一主一副本存储方式下,原始日志+副本数据+索引数据等合计占用的存储空间约为原始日志大小2.2倍,另外由于ES集群存在写不均匀且磁盘不能被耗尽,因此为了存储150TB原始日志,至少需要准备150TB*2.2(存储膨胀)*2(50%磁盘冗余) = 660 TB磁盘。 搭建ES最小典型配置是66台ECS(16U64G10TB),kafka双副本能支持缓存最近12小时的日志 表3 自建ELK 大类 小类 月成本(合计:374202元) 费用占比 搭建ES 66 * ECS(C6 16U64G) 66*1999=131934元 35.3% 云硬盘EVS(高IO 660TB) 0.35*660*1024=236544元 63.2% 搭建KAFKA 3 * ECS(2U4G) 3*208=624元 0.2% 云硬盘EVS(超高IO 3*1700GB) 5100元 1.4% LTS使用价格计算器,计算出来月成本约为107655元,使用LTS的成本约为自建ELK成本的28.8%,原因是LTS的存储收费是按用量付费,自建ELK为了保证集群的正常运行需要留有很多磁盘冗余。
  • 功能对比 云日志服务LTS 在功能特性的完备度、日志搜索分析性能方面对比ELK有明显的优势,详细对比请见如下表格: 特性 子特性 LTS ELK 描述 日志采集 云服务日志采集 ☆☆☆☆☆ 无 ELK:不支持采集云服务日志。 LTS:云服务租户面日志统一采集到LTS。 虚机和容器日志采集 ☆☆☆☆☆ ☆☆☆☆ ELK:使用logstash或者filebeat等开源采集器采集日志。 LTS:使用ICAgent采集日志,有提供向导页面,上手难度低。 多语言SDK日志采集 ☆☆☆ 无 ELK:不支持。 LTS:提供java SDK直接上报日志到LTS 主机组管理(主机动态扩缩容) ☆☆☆☆☆ 无 ELK:不支持。 LTS:提供主机管理、主机组管理能力,主机组支持自定义标识主机组,可以管理动态扩缩容主机组。 日志结构化解析 ☆☆☆☆ ☆☆☆☆☆ ELK:基于采集器实现自定义日志结构化解析。 LTS:提供结构化解析能力,可以正则表达式、JSON、分隔符、自定义模板等方式解析日志。 日志搜索 关键词搜索、模糊搜索、快速分析 ☆☆☆☆☆ ☆☆☆☆☆ ELK和LTS:提供类似的日志关键词搜索能力。 实时日志查看 ☆☆☆☆☆ 无 ELK:未提供实时日志查看页面。 LTS:提供实时日志查看页面。 百亿日志秒级搜索 ☆☆☆☆☆ ☆☆ ELK:自建ELK受限于机器资源数量,搜索海量日志时耗时较长。 LTS:利用公有云海量的弹性计算资源,百亿日志可以在3秒内返回搜索结果。 千亿级日志迭代搜索 ☆☆☆☆☆ 无 ELK:无法直接搜索千亿条日志,会出现响应超时。 LTS:提供迭代搜索能力,用户可以直接搜索千亿条日志。 日志管理规模 百PB级 百TB级 ELK:经常要关注机器扩容,费时费力。 LTS:按需付费,LTS自动管理百PB级日志,不用关心底层资源消耗情况。 日志搜索 SQL分析日志 ☆☆☆☆☆ ☆☆ ELK:SQL性能差,语法上不支持嵌套SQL。 LTS:SQL性能强,支持嵌套SQL。 日志搜索 SQL函数 ☆☆☆☆☆ ☆☆ ELK:只支持最基础的SQL统计函数。 LTS:在基础SQL函数基础上,提供了大量的扩展函数,例如IP函数、统计函数、环比同比函数、URL函数等,极大扩展了使用场景。 日志搜索 可视化图表 ☆☆☆☆ ☆☆☆ LTS:提供了表格、折线图、饼图、柱状图等多种可视化图表。 日志搜索 仪表盘 ☆☆☆☆☆ ☆☆ ELK:没有云服务日志开箱即用仪表盘。 LTS:提供开箱即用的仪表盘,对常见的云服务日志例如ELB/APIG/DDS/DCS/CFW等提供开箱即用的仪表盘。 日志告警 日志关键词告警和SQL告警 ☆☆☆☆☆ ☆ ELK:没有日志告警功能。 LTS:提供准实时的日志关键词和SQL告警功能。 告警通知渠道(邮件、短信、HTTPS等) ☆☆☆☆☆ ☆ ELK:无法将告警方便的以钉钉、微信、短信等方式通知用户。 LTS:对接华为 云消息 通知服务,能以邮件、短信、微信、钉钉、飞书、HTTP等多种渠道通知客户。 日志转储 转储到对象存储 ☆☆☆☆☆ 无 ELK:无法直接转储对象存储。 LTS:页面简单配置可以将日志转储到对象存储。 日志转储 转储到kafka ☆☆☆☆☆ ☆☆ ELK:需要自己部署程序将日志转发到KAFKA。 LTS:页面简单配置可以将日志实时转储到KAFKA。 日志转储 转储到 数据仓库 ☆☆☆☆☆ 无 ELK:无法直接将日志转储到数据仓库。 LTS:页面简单配置可以将日志转储到数据仓库。 日志加工 定时SQL作业 ☆☆☆☆☆ 无 ELK:没有定时SQL作业能力。 LTS:可以配置定时SQL作业,将原始日志加工统计为想要的少量日志结果。 函数加工 ☆☆☆☆☆ 无 ELK:没有日志加工功能。 LTS:提供函数触发器,在函数服务中可以配置自定义脚本将日志灵活加工。
  • 关键字加工 e_kv函数和e_kv_delimit函数都可以通过prefix="", suffix=""对关键字和值进行加工。 原始日志 { "content":"q=asd&a=1&b=2" } 加工规则(各语句分开执行,功能相同) e_kv("content", sep="=", quote='"', prefix="start_", suffix="_end") e_kv_delimit("content", pair_sep=r"&", kv_sep="=", prefix="start_", suffix="_end") e_regex("content",r"(\w+)=([a-zA-Z0-9]+)",{r"start_\1_end": r"\2"}) 加工结果 加工后的数据都是关键字加工形式,如下: { "start_b_end": 2, "start_a_end": 1, "start_q_end": "asd", "content": "q=asd&a=1&b=2" } e_regex函数对关键字加工的能力更强,例如: 加工规则 e_regex("content",r"(\w+)=([a-zA-Z0-9]+)",{r"\1_\1": r"\2"}) 加工结果 加工后的数据都是关键字加工形式,如下: { "q_q": "asd", "a_a": 1, "b_b": 2, "content": "q=asd&a=1&b=2" }
  • 值加工 日志格式为k1:"v1\"abc"形式, 同时值加工的内容存在有双引号符号的情形,使用e_kv函数可正常进行提取。 原始日志 """ 这里的\只是普通的符号,不是转义符 """ { "content":"k1:\"v1\\\"abc\", k2:\"v2\", k3: \"v3\"" } 加工规则: e_kv("content",sep=":", quote='"') 加工结果 提取后的日志为: { "k1": "v1\\", "k2": "v2", "k3": "v3", "content": "k1:\"v1\\\"abc\", k2:\"v2\", k3: \"v3\"" }
  • 关键字提取 示例1 以k1: q=asd&a=1&b=2&__1__=3日志为例,如果要对该格式的日志作关键字和值提取,三种方案如下: e_kv函数 原始日志 { "k1":"q=asd&a=1&b=2&__1__=3" } 加工规则 e_kv("k1") 加工结果 { "q": "asd", "a": 1, "b": 2, "k1": "q=asd&a=1&b=2&__1__=3", "__1__": 3 } e_kv_delimit函数 原始日志 { "k1":"q=asd&a=1&b=2&__1__=3" } 加工规则 # 以&分隔键值后,用&分隔提取出关键字 e_kv_delimit("k1", pair_sep=r"&") 加工结果 { "q": "asd", "a": 1, "b": 2, "k1": "q=asd&a=1&b=2&__1__=3", "__1__": 3 } e_regex函数 原始日志 { "k1":"q=asd&a=1&b=2&__1__=3" } 加工规则 # 自行指定字符集提取关键字和值 e_regex("k1",r"(\w+)=([a-zA-Z0-9]+)",{r"\1": r"\2"}) 加工结果 { "q": "asd", "a": 1, "b": 2, "k1": "q=asd&a=1&b=2&__1__=3", "__1__": 3 } 示例2 以content:k1=v1&k2=v2?k3:v3为例,需要特定正则提取关键字,方案如下: e_kv_delimit函数 原始日志 { "content":"k1=v1&k2=v2?k3:v3" } 加工规则 e_kv_delimit("content",pair_sep=r"&?",kv_sep="(?:=|:)") 加工结果 { "k1": "v1", "k2": "v2", "k3": "v3", "content": "k1=v1&k2=v2?k3:v3" } e_regex函数 原始日志 { "content":"k1=v1&k2=v2?k3:v3" } 加工规则 e_regex("content",r"([a-zA-Z0-9]+)[=|:]([a-zA-Z0-9]+)",{r"\1": r"\2"}) 加工结果 { "k1": "v1", "k2": "v2", "k3": "v3", "content": "k1=v1&k2=v2?k3:v3" }
  • 常用方案比较 字符串动态键值对提取分为关键字提取、值提取、关键字加工和值加工,常用方案为采用e_kv函数、e_kv_delimit函数和e_regex函数等。不同提取场景的三种方案如下: 方案 关键字提取 值提取 关键字加工 值加工 e_kv 使用特定正则表达式 支持默认的字符集、特定分隔符或者带(、)或(")分隔 支持前后缀 支持文本escape e_kv_delimit 使用特定正则表达式 使用分隔符 支持前后缀 默认无 e_regex 组合自定义正则表达式和默认字符集过滤 完全自定义 自定义 自定义 大部分键值对的提取使用e_kv函数并配置特定参数就可以很好地满足,尤其是带括字符和反斜杠需要提取并转义时。其他复杂或高级的场景可以用e_regex函数来提取。部分特定场景下的键值对使用e_kv_delimit函数会更简单。
共100000条