您可以通过设置、获取bizId的API,将请求链路各环节通过bizId串联起来,再结合traceId,对调用请求进行跟踪、分析。
在SDK中设置bizId API和traceId
CSB目前支持两种协议的SDK,HTTP SDK和WebService SDK。同时,使用这两种SDK又包含两种调用方式,命令行调用和代码调用。所以下文分别介绍在HTTP SDK和WebService SDK中如何使用命令行和代码调用bizId API。
- HTTP SDK
- 命令行调用
将bizIdKey和bizId以命令参数的形式添加到命令中。格式如下:
-bizIdKey <bizid的key> -bizId <bizId的value>
其中,bizIdKey的默认值为_biz_id,不可配置。
- 调用请求示例
java -jar http-client-1.1.5.8.jar -api item.hsf.add -version 1.0.0 -method post \ -bizIdKey _biz_id -bizId e48ffd7c1e7f4d07b7fc141f4350**** \ -D "item={\"itemName\":\"benz\",\"quantity\":10}" \ -url http://csb.broker.server:8086/CSB
- 调用响应示例
{ "body": { "msg": "SUCCESS", "result": { "itemName": "benz", "trace": { "traceId": "1e195a1e15586942836161002d****", "rpcId": "0.1", "requestId": "1e195a1e15586942832381001d6898", "bizId": "e48ffd7c1e7f4d07b7fc141f4350****" }, "quantity": 220 }, "code": "0" }, "code": 200, "message": "SUCCESS", "requestId": "1e195a1e15586942836161002d6898" }
- 调用请求示例
- 代码调用
在代码中设置bizId,并启用Trace。bizIdKey的默认值为_bizId。
- 设置bizId
HttpParameters.Builder builder = HttpParameters.newBuilder() .bizId(BIZ_ID);
- 启用Trace 生成traceId、rpcId和requestId。
- traceId:单次完整请求traceId相同(中间可能调用多次CSB服务)。
- requestId:每次调用CSB服务重新生成。
针对服务所在环境不同,又分为以下两种情况:
- Web(独立部署,不能使用EagleEye组件):包含引入trace filter和调用API两种方式。
- 在web.xml文件中引入trace filter
通过filter将接收到的trace header封装到请求上下文,最终封装到SDK请求header中。
<filter> <filter-name>TraceFilter</filter-name> <filter-class>com.alibaba.csb.trace.TraceFilter</filter-class> </filter> <filter-mapping> <filter-name>TraceFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- 调用API 调用trace方法(将接收到的trace封装到SDK请求header)
- builder.trace(httpServletRequest)
- builder.setRequest(httpServletRequest).trace()
- 在web.xml文件中引入trace filter
- EDAS 部署到EDAS的服务,可以使用EDAS的EagleEye,只需引入trace-eagleeye依赖。
<dependency> <groupId>com.alibaba.csb.trace</groupId> <artifactId>trace-eagleeye</artifactId> <version>${http.sdk.version}</version> </dependency>
- 设置bizId
- 命令行调用
- WebService SDK
- 命令行调用
将bizIdKey和bizId以命令参数的形式添加到命令中。格式如下:
-bizIdKey <bizid的key> -bizId <bizId的value>
其中,bizIdKey的默认值为_biz_id,不可配置。
- 调用请求示例
java -jar ws-client-1.1.5.8.jar -api item.hsf.add -version 1.0.0 \ -bizIdKey _biz_id -bizId e48ffd7c1e7f4d07b7fc141f43503cb2 \ -wa http://csb.broker.server:9081/item.hsf.add/1.0.0/add?wsdl \ -ea http://csb.broker.server:9081/item.hsf.add/1.0.0/add \ -ns http://itemcenter.carshop.edas.alibaba.com/ \ -sname item.hsf.add \ -pname addPortType \ -rd ' <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:test="http://itemcenter.carshop.edas.alibaba.com/"> <soapenv:Header/> <soapenv:Body> <test:add> <item> <itemName>benz</itemName> <quantity>5</quantity> </item> </test:add> </soapenv:Body> </soapenv:Envelope> ';
- 调用响应示例
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Header/> <soap:Body xmlns:ns1="http://itemcenter.carshop.edas.alibaba.com/"> <ns1:addResponse> <return> <code>0</code> <msg>SUCCESS</msg> <innerMsg/> <result> <itemName>benz</itemName> <quantity>250</quantity> <trace> <traceId>1e195a1e15586975657511003d****</traceId> <rpcId>0.1</rpcId> <bizId>e48ffd7c1e7f4d07b7fc141f435****</bizId> <requestId>1e195a1e15586975655741001d7506</requestId> </trace> </result> </return> </ns1:addResponse> </soap:Body> </soap:Envelope>
- 调用请求示例
- 代码调用
在代码中设置bizId,并启用Trace。
说明 bizIdKey的默认值为_bizId,不可配置。- 设置bizId
HttpParameters.Builder builder = HttpParameters.newBuilder() .bizId(BIZ_ID);
- 启用Trace 生成traceId/rpcId/requestId。
- traceId:单次完整请求traceId相同(中间可能调用多次CSB服务)。
- requestId:每次调用CSB服务重新生成。
针对服务所在环境不同,又分为以下两种情况:
- Web(独立部署,不能使用EagleEye组件):包含引入trace filter和调用API两种方式。
- 在web.xml文件中引入trace filter
通过filter将接收到的trace header封装到请求上下文,最终封装到SDK请求header中。
<filter> <filter-name>TraceFilter</filter-name> <filter-class>com.alibaba.csb.trace.TraceFilter</filter-class> </filter> <filter-mapping> <filter-name>TraceFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- 调用API 调用trace方法(将接收到的trace封装到SDK请求header)
wsparam.trace(request)
wsparam.setRequest(request).trace()
- 在web.xml文件中引入trace filter
- EDAS 部署到EDAS的服务,可以使用EDAS的EagleEye,只需引入trace-eagleeye依赖。
<dependency> <groupId>com.alibaba.csb.trace</groupId> <artifactId>trace-eagleeye</artifactId> <version>${http.sdk.version}</version> </dependency>
- 设置bizId
- 命令行调用
获取请求链路信息
完成在SDK中设置bizId API和traceId 后,就可以通过TraceData、TraceId、HTTP Header或rpcId等方式获取链路信息。不同的服务类型,方式有所不同。
- HTTP/WS
- TraceFilter(HTTP/WS)
TraceFactory.getTraceData()
- EDAS(WEB)
- EagleEye.getTraceId()
- EagleEye.getRpcId()
- EagleEye.getUserData($bizIdKey)
- EagleEye.getUserData(TraceData.REQUESTID_KEY) //请求唯一标记。
- TraceFilter(HTTP/WS)
- HTTP/WS
- request.getHeader(TraceData.TRACEID_KEY) //鹰眼TraceId。
- request.getHeader(TraceData.RPCID_KEY) //鹰眼RPCId。
- request.getHeader(HttpCaller.bizIdKey()) //设置的bizIdKey。
- request.getHeader(TraceData.REQUESTID_KEY) //请求唯一标记。
- HSF
- EagleEye.getTraceId()
- EagleEye.getRpcId()
- EagleEye.getUserData(HttpCaller.bizIdKey()) //设置的bizIdKey。
- EagleEye.getUserData(TraceData.REQUESTID_KEY) //请求唯一标记。
- Dubbo
- RpcContext.getContext().getAttachment(TraceData.TRACEID_KEY) //鹰眼TraceId。
- RpcContext.getContext().getAttachment(TraceData.RPCID_KEY) //鹰眼RPCId。
- RpcContext.getContext().getAttachment(HttpCaller.bizIdKey()) //设置的bizIdKey。
- RpcContext.getContext().getAttachment(TraceData.REQUESTID_KEY) //请求唯一标记。
查看日志
- 引入log4j
完成在SDK中设置bizId API和traceId后,您还可以引入log4j,从而基于bizId查看相关日志。
<?xml version="1.0" encoding="UTF-8"?> <configuration status="WARN" monitorInterval="30"> <appenders> <File name="csbsdk" fileName="logs/csbsdk.log"> <PatternLayout pattern="%m%n"/> </File> <Async name="async"> <AppenderRef ref="csbsdk"/> </Async> </appenders> <loggers> <logger name="CSBSDK" level="INFO" additivity="false"> <appender-ref ref="async" /> </logger> </loggers> </configuration>
- 查看客户端日志
客户端日志格式如下:
startTime|endTime|cost|HTTP/WS|localhost|dest|bizId|requestId|traceId|rpcId|api|version|ak|sk|method|ur|httpcode|httpreturn|msg 1559179173797|1559179173850|53|HTTP|192.168.*.*|csb.target.server|1e195a2815591791594031001d6512|1e195a2815591791737961004d****|1e195a2815591791737961005d****|0|item.hsf.remove|1.0.0|ak|sk|GET|http://csb.target.server:8086/CSB|200|HTTP/1.1 200 OK| 1558949495655|1558949497782|62|WS|192.168.*.*|csb.target.server|1e195a2715589494944221001d5b76|1e195a2715589494954281002d****|1e195a2715589494969271003d****|0|item.dubbo.add|1.0.0|ak|sk|GET|http||add|http://csb.target.server:9081/item.dubbo.add/1.0.0/add|200||
- 查看Broker日志
Broker日志格式如下:
| 1.日志打印时间 | 11.签名 | 21.服务组名称 |31.返回数据大小 | 2.实例名称 | 12.调用后端服务开始时间 | 22.服务拥有者 |32.requestId | 3.traceId | 13.是否成功 | 23.输入参数 |33.bizId | 4.rpcId | 14.错误类型 | 24.输出参数 | 5.服务名称 | 15.错误代码 | 25.内部requestId | 6.凭证名字 | 16.错误信息 | 26.来源IP | 7.消费者 | 17.调用总耗时 | 27.目标IP | 8.请求类型 | 18.后端服务调用耗时 | 28.请求写buffer时间 | 9.请求时间 | 19.后端服务调用结束时间 | 29.请求写成功时间 | 10.accessKey | 20.请求结束时间 | 30.请求数据大小