华为云用户手册

  • 约束与限制 同一个环境中,一个API只能被一个断路器策略绑定,但一个断路器策略可以绑定多个API。 策略和API本身相互独立,只有为API绑定策略后,策略才对API生效。为API绑定策略时需指定发布环境,策略只对指定环境上的API生效。 策略的绑定、解绑、更新会实时生效,不需要重新发布API。 API的下线操作不影响策略的绑定关系,再次发布后仍然会带有下线前绑定的策略。 如果策略与API有绑定关系,则策略无法执行删除操作。
  • 查看或编辑实例信息 进入API网关控制台页面。 在左侧导航栏选择“实例管理”。 在待查看或编辑的实例上,单击“查看控制台”或实例名称。 在“实例信息”页签,根据下表参数说明,查看或编辑实例的配置信息。 表1 实例信息 可编辑项 说明 基本信息 实例的基本信息,包括实例名称、实例ID、实例规格、可用区、描述、企业项目和时间窗。 用户可以根据实际需要修改基本信息。 用户可以单击“实例ID”右侧的复制实例ID信息。 计费信息 实例的计费模式和创建实例的时间。 网络配置 虚拟私有云 实例所关联的VPC,用户可以单击VPC名称跳转查看VPC的具体配置信息。 子网 实例所关联的子网,用户可以单击子网名称跳转查看子网的具体配置信息。 安全组 实例所关联的安全组,用户可以单击安全组名称跳转查看安全组的具体配置信息,也可以单击,绑定新的安全组。 访问控制 API网关提供实例级的访问控制策略,您可以通过设置IP地址的黑白名单来禁止/允许某个IP地址访问实例。IP地址说明如下: 常规IP格式,如:127.0.0.1 IP加掩码,如:192.145.0.0/16 IP段范围,如:127.0.0.1-192.145.0.1 访问控制策略最多支持设置100个IP地址或网段,且最大长度为5120。 如果使用IPv6地址,请先确保对应实例支持IPv6协议。 如果不开启访问控制策略,默认允许所有IP访问;如果开启访问控制策略,设置“白名单”类型,但是没有配置任何IP地址,则禁止任何IP访问;如果开启访问控制策略,设置“黑名单”类型,但是没有配置任何IP地址,则允许任何IP访问。 安全组策略、实例级访问控制策略和API级访问控制策略遵循Deny优先原则。 入口地址 虚拟私有云访问地址 弹性IP地址 如果实例未绑定弹性IP地址,您可以单击地址右侧的“立即启用”,绑定弹性IP地址。 如果实例已绑定弹性IP地址,您可以单击地址右侧的复制地址信息。 如果实例已绑定弹性IP地址,您可以编辑公网带宽。公网带宽费用按小时计算,以弹性公网IP服务的价格为准。 如果实例已绑定弹性IP地址,您可以单击地址右侧的“解绑EIP”,解绑弹性IP地址。 出口地址 指允许实例API的后端服务部署在外部网络,API网关为实例开启公网出口。公网出口可随时关闭或开启。 开启公网出口后,您可以单击“查看带宽监控”查看数据,也可编辑出公网带宽。 路由 配置私有网段。实例创建完成后,默认能够与创建时指定的VPC子网网段进行互通。如果有额外的私有网段需要与实例互通,可通过该配置项进行路由配置。 如果本地数据中心的子网不在以下三个大子网段内,暂时不支持配置本地路由。 10.0.0.0/8-24 172.16.0.0/12-24 192.168.0.0/16-24
  • x-apigateway-backend.httpVpcEndpoints 含义:API网关定义的HTTP VPC类型API后端服务定义。 作用域:x-apigateway-backend 示例: paths: '/users/{userId}': get: produces: - "application/json" parameters: - name: "X-Auth-Token" description: "认证token" type: "string" in: "header" required: true responses: default: description: "default response" x-apigateway-request-type: "public" x-apigateway-backend: type: "HTTP-VPC" httpVpcEndpoints: name: "vpc-test-1" scheme: "http" method: "GET" path: "/users" timeout: 30000 表1 参数说明 参数 是否必选 类型 说明 name 是 Array VPC通道名称。 scheme 是 String 后端请求协议定义,支持http、https。 method 是 String 后端请求方法,支持GET、POST、PUT、DELETE、HEAD、OPTIONS、PATCH、ANY。 path 是 String 后端请求路径,支持路径变量。 timeout 否 Number 后端请求超时时间,单位毫秒,缺省值为5000,取值范围为1 ~ 60000。 父主题: APIG的API设计文件扩展定义
  • 使用流程 在控制台创建签名密钥。 将新创建的签名密钥绑定API。 API网关将签名后的请求发送到后端服务,此时Authorization头中包含签名信息。后端服务通过不同的开发语言(例如Java、Go、Python、JavaScript、C#、PHP、C++、C、Android等)进行签名,比对签名结果和API网关传过来的Authorization头中签名是否一致来校验API的合法性。 图1 签名密钥流程
  • 操作场景 签名密钥用于后端服务验证API网关的身份,在API网关请求后端服务时,保障后端服务的安全。 签名密钥是由一对Key和Secret组成,签名密钥需要绑定到API才能生效。当签名密钥绑定API后,API网关向后端服务发送此API的请求时,会增加相应的签名信息,此时需要后端服务依照同样方式进行签名,通过比对签名结果和API网关传过来的Authorization头中签名是否一致来校验API的合法性。 同一个环境中一个API只能绑定一个签名密钥,一个签名密钥可以绑定多个API。
  • 什么是跨域访问 浏览器出于安全性考虑,会限制从页面脚本内发起的跨域访问(CORS)请求,此时页面只能访问同源的资源,而CORS允许浏览器向跨域服务器,发送XMLHttpRequest请求,从而实现跨域访问。 图1 跨域访问示意图 浏览器将CORS请求分为两类: 简单请求 简单跨域请求的场景需要满足以下两个条件: 请求方法是HEAD,GET,或者POST。 HTTP的头信息不超出以下范围: Accept Accept-Language Content-Language Last-Event-ID Content-Type:取值范围:application/x-www-form-urlencoded、multipart/form-data、text/plain 对于简单请求,浏览器自动在头信息之中,添加一个Origin字段,Origin字段用于说明本次请求来自哪个源(协议+ 域名 +端口)。服务器根据这个值,决定是否同意这次请求。服务器响应消息中包含“Access-Control-Allow-Origin”时,表示同意请求。 非简单请求 不满足简单请求两个条件的都为非简单请求。 对于非简单请求,在正式通信之前,浏览器会增加一次HTTP查询请求,称为预检请求。浏览器询问服务器,当前页面所在的源是否在服务器的许可名单之中,以及可以使用哪些HTTP请求方法和头信息字段。预检通过后,浏览器向服务器发送简单请求。
  • 开启跨域访问 API网关默认不开启跨域访问,如果您需要开启,请参考以下说明完成跨域配置。 简单请求的跨域访问 如果是创建新的API,在定义API请求时,打开“支持跨域(CORS)”开关。详细的使用指导,可参考简单请求。 图2 支持跨域 非简单请求的跨域访问 非简单请求的跨域访问需要在API的分组中创建一个“Method”为“OPTIONS”的API,作为预检请求。 预检请求API的参数设置,请参考以下说明填写。详细的使用指导可参考非简单请求。 在API的基本信息中,安全认证选“无认证”。 图3 预检请求-使用无认证 定义API请求时,参数填写说明如下: 请求协议:选择与已开启CORS的API相同的请求协议 请求Path:填斜杠/ Method:选择“OPTIONS” 支持CORS:选择开启CORS 图4 预检请求-设置API请求 后端服务选择Mock。 图5 预检请求-后端服务类型Mock
  • 简单请求 对于简单请求,您需要开启简单跨域访问。 场景一:已开启CORS,且后端服务响应消息中未指定跨域头时,API网关接受任意域的请求,并返回“Access-Control-Allow-Origin”跨域头,示例如下: 浏览器发送一个带Origin字段的请求消息: GET /simple HTTP/1.1Host: www.test.comOrigin: http://www.cors.comContent-Type: application/x-www-form-urlencoded; charset=utf-8Accept: application/jsonDate: Tue, 15 Jan 2019 01:25:52 GMT Origin:此字段必选,表示请求消息所属源,上例中请求来源于“http://www.cors.com”,API网关/后端服务根据这个值,决定是否同意本次请求。 后端服务返回响应消息: HTTP/1.1 200 OKDate: Tue, 15 Jan 2019 01:25:52 GMTContent-Type: application/jsonContent-Length: 16Server: api-gateway{"status":"200"} API网关响应消息: HTTP/1.1 200 OKDate: Tue, 15 Jan 2019 01:25:52 GMTContent-Type: application/jsonContent-Length: 16Server: api-gatewayX-Request-Id: 454d689fa69847610b3ca486458fb08bAccess-Control-Allow-Origin: *{"status":"200"} Access-Control-Allow-Origin:此字段必选,“*”表示API网关接受任意域的请求。 场景二:已开启CORS,且后端服务响应消息中指定跨域头时,后端服务响应的跨域头将覆盖API网关增加的跨域头,示例如下: 浏览器发送一个带Origin字段的请求消息: GET /simple HTTP/1.1Host: www.test.comOrigin: http://www.cors.comContent-Type: application/x-www-form-urlencoded; charset=utf-8Accept: application/jsonDate: Tue, 15 Jan 2019 01:25:52 GMT Origin:此字段必选,表示请求消息所属源,上例中请求来源于“http://www.cors.com”,API网关/后端服务根据这个值,决定是否同意本次请求。 后端服务返回响应消息: HTTP/1.1 200 OKDate: Tue, 15 Jan 2019 01:25:52 GMTContent-Type: application/jsonContent-Length: 16Server: api-gatewayAccess-Control-Allow-Origin: http://www.cors.com{"status":"200"} Access-Control-Allow-Origin:表示后端服务接受“http://www.cors.com”的请求。 API网关响应消息: HTTP/1.1 200 OKDate: Tue, 15 Jan 2019 01:25:52 GMTContent-Type: application/jsonContent-Length: 16Server: api-gatewayX-Request-Id: 454d689fa69847610b3ca486458fb08bAccess-Control-Allow-Origin: http://www.cors.com{"status":"200"} 后端服务响应消息中的跨域头覆盖API网关响应消息中的跨域头。
  • 非简单请求 对于非简单请求,您需要开启跨域访问,并且创建一个“Method”为“OPTIONS”的API。 跨域共享资源插件不需要创建一个“Method”为“OPTIONS”的API。 “Method”为“OPTIONS”的API和普通API的区别如下: 所属分组:选择已开启CORS的API所在的分组。 安全认证:可选择“无认证”。无论选择哪种认证方式,API网关都按照无认证处理。 请求协议:选择与已开启CORS的API相同的请求协议。 请求Path:填斜杠/即可,也可选择与已开启CORS的API相同或者匹配的请求Path。 Method:选择“OPTIONS”。 支持CORS:选择开启CORS。 假设后端服务类型为Mock,示例如下: 浏览器发送“Method”为“OPTIONS”的API请求: OPTIONS /HTTP/1.1User-Agent: curl/7.29.0Host: localhostAccept: */*Origin: http://www.cors.comAccess-Control-Request-Method: PUT Access-Control-Request-Headers: X-Sdk-Date Origin:此字段必选,表示请求消息所属源。 Access-Control-Request-Method:此字段必选,表示请求会使用哪些HTTP请求方法。 Access-Control-Request-Headers:此字段可选,表示请求会额外发送的头信息字段。 后端服务返回消息:无 API网关返回消息: HTTP/1.1 200 OKDate: Tue, 15 Jan 2019 02:38:48 GMTContent-Type: application/jsonContent-Length: 1036Server: api-gatewayX-Request-Id: c9b8926888c356d6a9581c5c10bb4d11Access-Control-Allow-Origin: *Access-Control-Allow-Headers: X-Stage,X-Sdk-Date,X-Sdk-Nonce,X-Proxy-Signed-Headers,X-Sdk-Content-Sha256,X-Forwarded-For,Authorization,Content-Type,Accept,Accept-Ranges,Cache-Control,RangeAccess-Control-Expose-Headers: X-Request-Id,X-Apig-Latency,X-Apig-Upstream-Latency,X-Apig-RateLimit-Api,X-Apig-RateLimit-User,X-Apig-RateLimit-App,X-Apig-RateLimit-Ip,X-Apig-RateLimit-Api-AllenvAccess-Control-Allow-Methods: GET,POST,PUT,DELETE,HEAD,OPTIONS,PATCHAccess-Control-Max-Age: 172800 Access-Control-Allow-Origin:此字段必选,“*”表示API网关接受任意域的请求。 Access-Control-Allow-Headers:当请求消息中包含此字段时,此字段必选。表示允许跨域的所有请求头信息字段。 Access-Control-Expose-Headers:表示跨域访问允许查看的返回头信息字段。 Access-Control-Allow-Methods:此字段必选,表示API网关支持的所有HTTP请求方法。 Access-Control-Max-Age:此字段可选,表示本次预检的有效期,单位:秒。在有效期内,无需再次发出预检请求。 浏览器发送一个带Origin字段的请求头: PUT /simple HTTP/1.1Host: www.test.comOrigin: http://www.cors.comContent-Type: application/x-www-form-urlencoded; charset=utf-8Accept: application/jsonDate: Tue, 15 Jan 2019 01:25:52 GMT 后端服务返回消息: HTTP/1.1 200 OKDate: Tue, 15 Jan 2019 01:25:52 GMTContent-Type: application/jsonContent-Length: 16Server: api-gateway{"status":"200"} API网关返回消息: HTTP/1.1 200 OKDate: Tue, 15 Jan 2019 01:25:52 GMTContent-Type: application/jsonContent-Length: 16Server: api-gatewayX-Request-Id: 454d689fa69847610b3ca486458fb08bAccess-Control-Allow-Origin: *{"status":"200"}
  • 操作场景 使用APP认证的API,需要在API网关中创建一个应用,以生成应用ID和密钥对(AppKey、AppSecret)。将创建的应用绑定API后,才可以使用APP认证调用API。在API调用过程中,把密钥对替换SDK中的密钥对,API网关服务根据密钥对进行身份核对,完成鉴权。关于使用APP认证的方法,具体请参考《API网关开发指南》。 从云商店购买的API,系统自动创建一个应用,无需单独创建应用。 使用无认证/华为 IAM 认证的API,无需创建应用。 应用配额包括您自行创建的应用和在云商店购买API生成的应用。
  • API网关监控指标 表1 API网关共享版支持的监控指标 指标ID 指标名称 指标含义 取值范围 测量对象 监控周期(原始指标) avg_latency 平均延迟毫秒数 该指标用于统计测量api接口平均响应延时时间 ≥0 单位:毫秒 单个API 1分钟 input_throughput 流入流量 该指标用于统计测量api接口请求流量 ≥0 单位:Byte/KB/MB/GB 单个API 1分钟 max_latency 最大延迟毫秒数 该指标用于统计测量api接口最大响应延时时间 ≥0 单位:毫秒 单个API 1分钟 output_throughput 流出流量 该指标用于统计测量api接口返回流量 ≥0 单位:Byte/KB/MB/GB 单个API 1分钟 req_count 接口调用次数 该指标用于统计测量api接口调用次数 ≥0 单个API 1分钟 req_count_2xx 2xx调用次数 该指标用于统计测量api接口调用2xx的次数 ≥0 单个API 1分钟 req_count_4xx 4xx异常次数 该指标用于统计测量api接口返回4xx错误的次数 ≥0 单个API 1分钟 req_count_5xx 5xx异常次数 该指标用于统计测量api接口返回5xx错误的次数 ≥0 单个API 1分钟 req_count_error 异常次数 该指标用于统计测量api接口总的错误次数 ≥0 单个API 1分钟
  • 错误码 当调用API时,可能遇到如表1所示的错误码。如果遇到“APIGW”开头的错误码,请参见API网关错误码进行处理。 通过APIG接口管理API,发生错误时,产生的错误码请参考错误码。 使用APIG错误码时,请以错误码(如APIG.0101)为准,错误信息并非固定不变,有时会对错误信息进行优化修改。 表1 错误码 错误码 错误信息 HTTP状态码 语义 解决方案 APIG.0101 The API does not exist or has not been published in the environment. 404 API不存在或未发布到环境 检查调用API所使用的域名、请求方法、路径和创建的API是否一致;检查API是否发布,如果发布到非生产环境,检查请求X-Stage头是否为发布的环境名;检查调用API使用的域名是否已经绑定到API所在的分组。 APIG.0101 The API does not exist. 404 API请求方法不存在 检查API请求方法是否与API定义的方法相同 APIG.0103 The backend does not exist. 500 无法找到后端 联系技术支持 APIG.0104 The plug-ins do not exist. 500 无法找到插件配置 联系技术支持 APIG.0105 The backend configurations do not exist. 500 无法找到后端配置 联系技术支持 APIG.0106 Orchestration error. 400 编排错误 检查API配置的前后端参数是否合理 APIG.0201 API request error. 400 请求格式不合法 使用合法的请求 APIG.0201 Request entity too large. 413 请求body过大(大于12M) 减小请求body大小 APIG.0201 Request URI too large. 414 请求URI过大(大于32K) 减小请求URI大小 APIG.0201 Request headers too large. 494 请求头过大(单个请求头大于32K或所有请求头总长度大于128K) 减小请求头大小 APIG.0201 Backend unavailable. 502 后端不可用 检查API配置的后端地址是否可用 APIG.0201 Backend timeout. 504 后端超时 增大超时时间或缩小后端的处理时间 APIG.0201 An unexpected error occurred 500 内部错误 联系技术支持 APIG.0202 Backend unavailable 502 后端不可用 检查API配置的后端请求协议是否与后端服务请求协议一致 APIG.0203 Backend timeout. 504 后端超时 增大超时时间或缩小后端的处理时间 APIG.0204 SSL protocol is not supported: TLSv1.1 400 SSL协议版本不支持 使用支持的SSL协议版本 APIG.0301 Incorrect IAM authentication information. 401 IAM认证信息错误 检查token是否正确,具体请参见IAM信息认证错误 APIG.0302 The IAM user is not authorized to access the API. 403 IAM用户不允许访问API 检查用户是否被黑白名单限制 APIG.0303 Incorrect app authentication information. 401 APP认证信息错误 APP签名认证时,做如下检查: 检查请求的方法、路径、查询参数、请求体和签名使用的方法、路径、查询参数、请求体是否一致 检查客户端机器时间是否正确 请参考使用APP认证调用API检查签名代码的问题。 APPCODE简易认证时,做如下检查:检查请求是否携带了X-Apig-AppCode头域 APIG.0304 The app is not authorized to access the API. 403 APP不允许访问API 检查APP是否授权访问API APIG.0305 Incorrect authentication information. 401 认证信息错误 检查认证信息是否正确 APIG.0306 API access denied. 403 不允许访问API 检查是否授权访问API APIG.0307 The token must be updated. 401 token需要更新 重新从IAM获取token APIG.0308 The throttling threshold has been reached. 429 超出流控值限制 等待流控刷新后访问。如果触发子域名的单日请求数上限,请绑定独立域名。 APIG.0310 The project is unavailable. 403 project不可使用 使用其他project访问 APIG.0311 Incorrect debugging authentication information. 401 调试认证信息错误 联系技术支持 APIG.0401 Unknown client IP address. 403 无法识别客户端IP地址 联系技术支持 APIG.0402 The IP address is not authorized to access the API. 403 IP地址不允许访问 检查IP地址是否被黑白名单限制 APIG.0404 Access to the backend IP address has been denied. 403 后端IP不允许访问 后端IP地址或后端域名对应的IP地址不允许访问 APIG.0501 The app quota has been used up. 405 APP已经超出配额 或云商店调用次数用完 扩大APP配额 或重新购买云商店调用次数 APIG.0502 The app has been frozen. 405 APP被冻结 余额不足 APIG.0601 Internal server error. 500 内部错误 联系技术支持 APIG.0602 Bad request. 400 非法请求 检查请求是否合法 APIG.0605 Domain name resolution failed. 500 域名解析失败 检查域名拼写,以及域名是否绑定了正确的后端地址 APIG.0606 Failed to load the API configurations. 500 未加载API配置 联系技术支持 APIG.0607 The following protocol is supported: {xxx} 400 协议不被允许,允许的协议是xxx。 注意:xxx以实际响应中的内容为准。 改用支持的协议(HTTP/HTTPS)访问 APIG.0608 Failed to obtain the admin token. 500 无法获取管理租户 联系技术支持 APIG.0609 The VPC backend does not exist. 500 找不到vpc后端 联系技术支持 APIG.0610 No backend available. 502 没有可连接的后端 检查所有后端是否可用,如调用信息与实际配置是否一致。 APIG.0611 The backend port does not exist. 500 后端端口未找到 联系技术支持 APIG.0612 An API cannot call itself. 500 API调用自身 修改API后端配置,递归调用层数不能超过10层。 APIG.0613 The IAM service is currently unavailable. 503 IAM服务暂时不可用 联系技术支持 APIG.0705 Backend signature calculation failed. 500 计算后端签名失败 联系技术支持 APIG.0802 The IAM user is forbidden in the currently selected region 403 该IAM用户在当前region中被禁用 联系技术支持 APIG.1009 AppKey or AppSecret is invalid 400 AppKey或AppSecret不合法 检查请求的AppKey或AppSecret是否正确 父主题: 调用已发布的API
  • 云视频交付实施服务可以提供哪些服务? 3D数字内容制作、虚拟视频制作、虚拟直播。 服务类型 服务内容 典型应用场景 3D数字内容制作 面向互娱、教育、企业、电商等场景,提供3D卡通数字人、美型数字人、写实数字人及相关配饰制作服务 面向制作行业、文旅、金融等行业客户,通过数字人视频介绍公司产品,传递公司价值 虚拟视频制作 提供视频镜头设计,结合数字人模型、虚拟背景、真实背景输出高质量视频 面向教育、培训等行业客户,使用数字人制作教育课件,降低教师重复繁琐的工作投入 虚拟直播 面向互娱、企业、电商等直播场景,提供数字人直播服务,用户可配置各种直播属性,即可生成主播视觉驱动的数字人直播流 面向娱乐、电商等行业客户,通过引入数字人和真人互动,提升直播带货效果,增加用户粘性 父主题: 关于服务咨询
  • 场景三:删除和重命名字段(e_drop_fields函数和e_rename函数) 一般情况下,推荐您使用e_compose函数进行多个函数的组合操作。 示例如下所示: 原始日志 {"content":"123","age":23,"name":"twiss","IdNumber":1} 加工规则:首先判断content字段值是否为123,如果是,则删除age和name字段,再将IdNumber字段重命名为Id。 e_if(e_search("content==123"),e_compose(e_drop_fields("age|name"), e_rename("IdNumber", "Id"))) 加工结果 {"Id": 1,"content": 123} 父主题: 使用DSL加工函数清洗LTS日志数据
  • 场景四:转换日志参数类型(v函数、cn_int函数和dt_totimestamp函数) 场景1:调用op_add函数进行字符拼接和数据相加。 op_add函数既可以接收字符串类型,也可以接受数值类型,因此不需要做参数类型转换。 示例如下所示: 原始日志 { "a":"1", "b":"2"} 加工规则 e_set("d",op_add(v("a"), v("b")))e_set("e",op_add(ct_int(v("a")), ct_int(v("b")))) 加工结果 {"a": 1,"b": 2,"d": 12,"e": 3} 场景2:运用字段操作函数和ct_int函数进行类型转换并调用op_mul函数进行数据相乘。 示例如下所示: 原始日志 { "a":"2", "b":"5"} 加工规则 e_set("c",op_mul(ct_int(v("a")), ct_int(v("b"))))e_set("d",op_mul(v("a"), ct_int(v("b")))) 加工结果 {"a": 2,"b": 5,"c": 10,"d": 22222} 子场景3:调用dt_parse函数和dt_parsetimestamp函数将字符串或日期时间转换为标准时间。 dt_totimestamp函数接收的参数类型为日期时间对象,不是字符串。因此需要调用dt_parse函数将time1的字符串值类型转化为日期时间对象类型。您也可以直接使用dt_parsetimestamp函数,它既能接收日期时间对象,也能接收字符串。 示例如下所示: 原始日志 { "time1":"2019-09-17 9:00:00"} 加工规则:将time1表示的日期时间转化为Unix时间戳。 e_set("time2", dt_totimestamp(dt_parse(v("time1")))) 加工结果 {"time1": "2019-09-17 9:00:00","time2": 1568710800} 父主题: 使用DSL加工函数清洗LTS日志数据
  • 日期时间对象和Unix时间戳的相互转换 处理函数 推荐dt_parse函数将Unix时间戳转换为日期时间字符串。 e_set函数中的tz参数设置会将不带时区的日期时间对象处理为带时区的,或将原时区的转换为目标时区。 Unix时间戳转换成带时区的时间字符串对象。 原始日志 { "time": 1562741899} 加工规则 e_set("new_time", dt_parse(v("time"), tz="Asia/Shanghai")) 加工结果 {"new_time": "2019-07-10 14:58:19+08:00","time": 1562741899} 父主题: 使用DSL加工函数处理日期时间
  • 数据类型转换和转换函数 日期时间字符串、日期时间对象和Unix时间戳的相互转换方式和对应转换函数如下图所示。 上图所示的转换场景和对应的转换函数具体描述如下表所示。 转换场景 转换函数 日期时间对象和Unix时间戳的相互转换 日期时间对象转为Unix时间戳。 dt_parsetimestamp智能转换函数,可以将日期时间对象或日期时间字符串转换为Unix时间戳。 dt_totimestamp专用函数,只支持将日期时间对象转换为Unix时间戳。 Unix时间戳转为日期时间对象。 dt_parse智能转换函数,可以将Unix时间戳或日期时间字符串转换为日期时间对象。 dt_fromtimestamp专用函数,只支持将Unix时间戳转换为日期时间对象。 日期时间对象和日期时间字符串的相互转换。 日期时间对象转为日期时间字符串。 dt_str智能转换函数,可以将日期时间对象、Unix时间戳和日期时间字符串转换为指定格式的日期时间字符串。 dt_strftime专用函数,只支持将日期时间对象转换为日期时间字符串。 日期时间字符串转为日期时间对象。 dt_parse智能转换函数,可以将日期时间字符串或Unix时间戳转换为日期时间对象。 dt_strptime专用函数,只支持将日期时间字符串转化为日期时间对象。 日期时间字符串和Unix时间戳的相互转换。 日期时间字符串转为Unix时间戳。 dt_parsetimestamp智能转换函数,可以将日期时间字符串或日期时间对象转换为Unix时间戳。 Unix时间戳转为日期时间字符串。 dt_str智能转换函数,可以将Unix时间戳、日期时间对象和日期时间字符串转换为指定格式的日期时间字符串。 dt_strftimestamp专用函数,只支持将Unix时间戳转换为日期时间字符串。 上图和上表展示了三种数据类型之间的六种转换,转换过程涉及两种方式,一种使用智能转换函数,另一种使用该转换的专用函数。 智能转换函数 以dt_parse函数为代表的智能转换函数可以接收Unix时间戳、日期时间对象以及日期时间字符串等不同类型的参数,实现智能转换。 专用函数 智能转换函数无法满足用户的全部需求。如对于用户自定义的特殊日期格式,dt_parse等智能转换函数无法自动解析日志,需要使用dt_strptime函数来进行解析指定格式。 父主题: 使用DSL加工函数处理日期时间
  • 日期时间对象和日期时间字符串的相互转换 处理函数 dt_parse智能转换函数可以将日期时间字符串或Unix时间戳转换为日期时间对象。 dt_astimezone函数返回一个带新时区信息的日期时间对象。 场景1:不带时区信息的日期时间字符串转换成指定时区的日期时间对象。 对于不带时区信息的日期时间字符串2019-06-02 18:41:26,可以通过Unix时间戳,实现不同时区下的日期时间的相互转换。将洛杉矶时区的日期时间转换为上海时区的日期时间。 原始日志:已知time字段的值的时间是洛杉矶时间 { "time" : "2019-06-04 2:41:26"} 加工规则 e_set("timestamp", dt_parsetimestamp(v("time"), tz="America/Los_Angeles"))e_set("Shanghai_time", dt_parse(v("timestamp"), tz="Asia/Shanghai")) 加工结果 {"Shanghai_time": "2019-06-04 17:41:26+08:00","time": "2019-06-04 2:41:26","timestamp": 1559641286} 场景2:不带时区的日期时间字符串转换成带时区的日期时间对象。 原始日志 { "time" : "2019-07-10 06:58:19"} 加工规则 e_set("new_time", dt_parse(v("time"), tz="Asia/Shanghai")) 加工结果 {"new_time": "2019-07-10 06:58:19+08:00","time": "2019-07-10 06:58:19"} 场景3:带时区的日期时间字符串转换为目标时区的日期时间对象。 原始日志 { "time" : "2019-06-04 2:41:26+08:00"} 加工规则 e_set("new_time",dt_astimezone(v("time"), "America/Los_Angeles")) 加工结果 {"new_time": "2019-06-03 11:41:26-07:00","time": "2019-06-04 2:41:26+08:00"} 父主题: 使用DSL加工函数处理日期时间
  • 背景信息 OBS是华为云提供的一个高可靠、高性能、高安全的基于对象的海量存储云服务。针对更新不频繁的数据,建议您存储在OBS上,只需要支付少量的存储费用即可。当您分散存储数据,面临日志数据不完善时,您可以从OBS中获取数据。日志服务数据加工支持使用res_obs_file函数从OSS中获取数据,再使用tab_parse_csv函数构建表格,最后使用e_table_map函数进行字段匹配,返回指定字段和字段值,生成新的日志数据。
  • 实践案例 原始日志 { "account":"Sf24asc4ladDS"} OBS Bucket中的 CS V文件数据 表1 CSV文件数据 id account nickname 1 Sf24asc4ladDS 多弗朗明哥 2 Sf24asc4ladSA 凯多 3 Sf24asc4ladCD 罗杰 CSV文件需要是UNIX文件格式,windows文件格式暂不支持。 加工规则 通过原始日志中的account字段和OBS CSV文件中的account字段进行匹配,只有account字段的值完全相同,才能匹配成功。匹配成功后,返回OBS CSV文件中的nickname字段和字段值,与原始日志中的数据拼接,生成新的数据。 e_table_map(tab_parse_csv(res_obs_file("https://obs.xxx.myhuaweicloud.com","dsl-test-xx","data.csv")),"account","nickname") res_obs_file函数重要字段说明如下表所示,更多参数说明请参见资源函数。 字段 说明 endpoint obs访问域名,详情请参见res_obs_file。 bucket 用于存储CSV文件的OBS Bucket。 file 目标OBS文件的路径。例如test/data.txt,不能以正斜线(/)开头。 加工结果 {"nickname": "多弗朗明哥","account": "Sf24asc4ladDS"}
  • 分页方式 云日志 服务的日志搜索和统计图表功能支持在查询分析语句中同时实现关键字查询和针对查询结果进行SQL分析。 日志搜索:使用关键字查询,获取原始日志内容。您可以通过查询日志接口中的line_num、search_type、limit和is_desc参数实现多种形式的翻页效果。更多信息请参见查询日志。 统计图表:使用SQL对查询结果进行分析,获取统计结果。您可以通过SQL中的LIMIT语法实现分页。更多信息请参见SQL查询语法概述。
  • 新建可视化图表 SQL查询与分析。 登录云日志服务控制台,在左侧导航栏中,选择“日志管理”。 在日志列表中,单击日志组名称前对应的,选择目标日志流,进入日志详情页面。 选择“ 日志分析 ”,在SQL查询条件框中,选择对应时间并输入SQL语句,单击“查询”进行日志搜索。 当设置时间范围内日志量超过10亿行时会触发迭代查询,可以通过迭代查询分多次完成全部日志的查询,界面会显示“查询状态:结果精确”。 根据SQL查询返回的数据,依照您的业务需求选择不同图表类型,呈现查询结果。 关于更多SQL查询的说明,请参见SQL分析语法介绍。 新建图表。 单击“新建”,新建可视化图表。 或单击“保存”,将当前查询结果新建为可视化图表。 在创建图表页面中,配置相关参数。 如果开启“同时添加到仪表盘”按钮,新建图表可以直接添加到仪表盘中。 完成后,单击“确定”。 查看可视化图表。 单击“展开图表”,查看可视化图表。
  • 将图表添加到仪表盘 将图表添加到仪表盘有两种方式: 方式一: 鼠标悬浮可视化图表名称,单击选择“添加到仪表盘”。 在弹出的移动图表页面中,选择待存放的仪表盘。 完成后,单击“确定”。 方式二: 创建仪表盘。 在左侧导航栏中,选择“仪表盘”。 在仪表盘下方,选择仪表盘分组。 单击“添加仪表盘”,在创建仪表盘页面,配置相关参数。 关于仪表盘参数的说明,请参见使用仪表盘将日志可视化。 将图表添加到仪表盘。 在创建仪表盘页面,单击“开始添加图表”,进入添加可视化图表界面,选择目标日志新建的可视化图表。 完成后,单击“确定”。
  • 场景七:数据转化纳秒级的Unix时间戳 部分场景需要云日志服务的数据加工才能够满足纳秒级精度时间戳的需求,当原始日志中存在Unix时间格式字段,您可以使用e_set字段操作函数,将其解析成纳秒精度的日志时间。 原始日志 { "source": "1.2.3.4", "time": 1704983810, "topic": "test", "log_time_nano":"1705043680630940602"} 加工规则 e_set( "time", op_div_floor(ct_int(v("log_time_nano")), 1000000000),)e_set( "time_ns_part", op_mod(ct_int(v("log_time_nano")), 1000000000),) 加工结果 {"time_ns_part": 630940602,"log_time_nano": "1705043680630940602","topic": "test","source": "1.2.3.4","time": 1705043680} 父主题: 使用DSL加工函数清洗LTS日志数据
  • 方案概述 ELK是Elasticsearch、Logstash和Kibana的简称,它们组合起来提供了业界最常用的日志分析和可视化工具。 Elasticsearch是一个基于Lucene的开源、分布式、RESTful搜索和分析引擎。 Logstash是一个开源的、服务器端的数据处理管道,能够同时从多个来源实时接收、转换并将数据发送到用户选择的“存储库”。通常用于日志的收集、过滤和转发。 Kibana是一个开源的分析和可视化平台,用于数据的可视化、仪表盘创建和搜索查询。通常与Elasticsearch一起使用。 华为 云日志服务LTS 在功能丰富度、成本、性能方面优于开源ELK方案,具体对比可以参考云日志服务LTS对比自建ELK Stack有什么优势?。本文提供最佳实践,使用自定义Python脚本和LTS采集器ICAgent,协助用户将日志从Elasticsearch(简称ES)迁移到LTS中。 当前华为云支持ECS机器通过安装ICAgent来采集日志文件,因此可以基于该功能实现Elasticsearch日志导入云日志服务。 Elasticsearch数据先通过python脚本将数据落盘到ECS,然后通过LTS服务的日志接入功能,将落盘的日志文件采集到LTS服务。 图1 方案流程图
  • 日期时间偏移 处理函数 dt_add函数的参数如下: dt_add(字段名, dt1=None, dt2=None, year(s)=None, month(s)=None, day(s)=None, hour(s)=None, minute(s)=None, second(s)=None, microsecond(s)=None, weeks(s)=None, weekday=None) year(s)、month(s)、day(s)等参数的后面都带有s,表示这些参数可以有两种形式,即year和years,month和months等。以year和years为例,如果参数传递的是year,表示在年份粒度上覆盖为year参数的值;如果传递的是years,表示在年份粒度上增加years参数的值。同时要一起组合使用的dt_add函数支持在特定时间粒度上修改(增加、减少、覆盖)日期时间的值。 dt_add中weekday参数通常和dt_MO、dt_TU等参数一起使用,表示特定星期几的偏移,如下例所示。 场景1:按年和月进行日期偏移。 原始日志 { "time1" : "2019-06-04 2:41:26"} 加工规则1 e_set("time2", dt_add(v("time1"), year=2018)) 加工结果1 {"time1": "2019-06-04 2:41:26","time2": "2018-06-04 02:41:26"} 加工规则2 e_set("time2", dt_add(v("time1"), years=2018)) 加工结果2 {"time1": "2019-06-04 2:41:26","time2": "4037-06-04 02:41:26"} 场景2:按周进行日期偏移。 原始日志:2019-06-04是周二 { "time1" : "2019-06-04 2:41:26"} 加工规则 #time1的下一个星期一对应的日期e_set("nex_Monday", dt_add(v("time1"), weekday=dt_MO(1)))#time1的上一个星期二对应的日期e_set("previous_Tuesday", dt_add(v("time1"), weekday=dt_TU(op_neg(1))))#time1的下下一个星期六对应的日期e_set("nex_next_Saturday", dt_add(v("time1"), weekday=dt_SA(2)))#time1的上上一个星期日对应的日期e_set("previous_previous_Sunday", dt_add(v("time1"), weekday=dt_SU(op_neg(2)))) 加工结果 {"time1": "2019-06-04 2:41:26","previous_Tuesday": "2019-05-28 02:41:26","previous_previous_Sunday": "2019-05-26 02:41:26","nex_next_Saturday": "2019-06-15 02:41:26","nex_Monday": "2019-06-10 02:41:26"} 父主题: 使用DSL加工函数处理日期时间
  • 概念解释 LTS DSL语法中的日期时间处理主要涉及三种数据类型:日期时间字符串、日期时间对象和Unix时间戳。 日期时间字符串:日期时间字符串的主要用途是为了便于展示以及提升用户可读性。 LTS DSL语法中的日期时间字符串主要分为两种形式: 带有时区信息的日期时间字符串,如2018-06-02 18:41:26+08:00。 不带时区信息的日期时间字符串,如2019-06-02 10:41:26。 带有时区信息的日期时间字符串通过在日期时间后添加额外的时差信息来表达时区: 2019-06-02 18:41:26+08:00表示该时间是东8区时区下的2019-06-02 18:41:26。 2019-06-02 18:41:26-07:00表示该时间是西7区时区下的2019-06-02 18:41:26。 日期时间对象 实例化的日期时间,专指Datetime类型的数据。日期时间对象的主要用途是为了便于展示以及提升用户可读性。 Unix时间戳 从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数。Unix时间戳的主要应用场景有: 表示系统时间:日志事件中表示日志接收时间的字段collectTime字段的值就是使用Unix时间戳来表示对应的系统时间,如下例所示。 source: 192.0.2.1collectTime: 1562741899topic: 时间相关的计算:Unix时间戳是从1970年1月1日开始所经过的秒数,因此在很多场景下便于直接进行日期时间相关的计算,例如如下示例。 原始日志 {"time1": 1562741899,"time2": 1562731122} 加工规则 e_set("time_diff", op_sub(v("time1"), v("time2"))) 加工结果 {time1: 1562741899time2: 1562731122time_diff: 10777} 父主题: 使用DSL加工函数处理日期时间
  • 日期时间字符串和Unix时间戳的相互转换 处理函数 dt_str智能转换函数,可以将Unix时间戳、日期时间对象和日期时间字符串转化为指定格式的日期时间字符串。 dt_strftimestamp函数只支持将Unix时间戳转化为日期时间字符串。 dt_parsetimestamp智能转换函数,可以将日期时间字符串或日期时间对象转换为Unix时间戳。 场景1:不带时区信息的日期时间字符串类型转换为Unix时间戳。 对于不带时区信息的日期时间字符串如2019-06-02 18:41:26,将日期时间转化为Unix时间戳,需要指定该日期时间的时区,不同的时区转化得到的Unix时间戳的值不一样。 原始日志 { "time": "2019-07-10 14:58:19"} 加工规则 e_set("Shanghai_timestamp", dt_parsetimestamp(v("time"), tz="Asia/Shanghai"))e_set("Los_Angeles_timestamp", dt_parsetimestamp(v("time"), tz="America/Los_Angeles"))e_set("UTC_timestamp", dt_parsetimestamp(v("time"))) 加工结果 {"time": "2019-07-10 14:58:19","Shanghai_timestamp": 1562741899,"Los_Angeles_timestamp": 1562795899,"UTC_timestamp": 1562770699} 子场景2:自定义的不带时区的特殊日期格式转换成Unix时间戳。 原始日志 { "time1" : "2019-07-10 06:58:19", "time2": "2019/07/10 06-58-19"} 加工规则 e_set("time3", dt_parsetimestamp(v("time1"))) e_set("time4", dt_parsetimestamp(dt_strptime(v("time2"), "%Y/%m/%d %H-%M-%S"))) 加工结果 {"time1": "2019-07-10 06:58:19","time2": "2019/07/10 06-58-19","time3": 1562741899,"time4": 1562741899} 父主题: 使用DSL加工函数处理日期时间
  • 场景二:判断字段值是否存在且不为空 原始日志 { "a": "a_value", "b":""} 加工规则 e_if_else(v("a"), e_set("not_empty_a", true),e_set("not_empty_a", false))e_if_else(v("b"), e_set("not_empty_b", true),e_set("not_empty_b", false)) 加工结果 {"a": "a_value","not_empty_b": false,"b": "","not_empty_a": true}
  • 场景三:判断字段值是否存在且为空 原始日志 { "a": "a_value", "b":""} 加工规则 e_if_else(op_and(e_has("a"), op_not(v("a"))), e_set("empty_a", true),e_set("empty_a", false))e_if_else(op_and(e_has("b"), op_not(v("b"))), e_set("empty_b", true),e_set("empty_b", false)) 加工结果 {"a": "a_value","b": "","empty_b": true,"empty_a": false}
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全