全部产品
云市场

如何通过 bizId 和 traceId 跟踪交易的调用请求

更新时间:2019-10-15 10:11:15

您可以通过设置、获取 bizId 的 API,将请求链路各环节通过 bizId 串联起来,再结合 traceId,对调用请求进行跟踪、分析。

在 SDK 中设置 bizId API 和 traceId

CSB 目前支持两种协议的 SDK,HTTP-SDK 和 WS-SDK。同时,使用这两种 SDK 又包含两种调用方式,命令行调用和代码调用。所以下文分别介绍在 HTTP-SDK 和 WS-SDK 中如何使用命令行和代码调用 bizId API。

HTTP-SDK

命令行调用

将 bizIdKey 和 bizId 以命令参数的形式添加到命令中。格式如下:

-bizIdKey <bizid 的 key> -bizId <bizId 的 value>

其中,bizIdKey的默认值为_biz_id,不可配置。

  • 调用请求示例

    1. java -jar http-client-1.1.5.3.jar -api item.hsf.add -version 1.0.0 -method post \
    2. -bizIdKey _biz_id -bizId e48ffd7c1e7f4d07b7fc141f43503cb2 \
    3. -D "item={\"itemName\":\"benz\",\"quantity\":10}" \
    4. -url http://csb.broker.server:8086/CSB
  • 调用响应示例

    1. {
    2. "body": {
    3. "msg": "SUCCESS",
    4. "result": {
    5. "itemName": "benz",
    6. "trace": {
    7. "traceId": "1e195a1e15586942836161002d6898",
    8. "rpcId": "0.1",
    9. "requestId": "1e195a1e15586942832381001d6898",
    10. "bizId": "e48ffd7c1e7f4d07b7fc141f43503cb2"
    11. },
    12. "quantity": 220
    13. },
    14. "code": "0"
    15. },
    16. "code": 200,
    17. "message": "SUCCESS",
    18. "requestId": "1e195a1e15586942836161002d6898"
    19. }

代码调用

在代码中设置bizId,并启用Trace

说明bizIdKey的默认值为_biz_id,不可配置。

  • 设置 bizId

    1. HttpParameters.Builder builder = HttpParameters.newBuilder()
    2. .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 中。

        1. <filter>
        2. <filter-name>TraceFilter</filter-name>
        3. <filter-class>com.alibaba.csb.trace.TraceFilter</filter-class>
        4. </filter>
        5. <filter-mapping>
        6. <filter-name>TraceFilter</filter-name>
        7. <url-pattern>/*</url-pattern>
        8. </filter-mapping>
      • 调用 API

        调用 trace 方法(将接收到的 trace 封装到 SDK 请求 header)

        • builder.trace(httpServletRequest)
        • builder.setRequest(httpServletRequest).trace()
    • EDAS

      部署到 EDAS 的服务,可以使用 EDAS 的 EagleEye,只需引入 trace-eagleeye 依赖。

      1. <dependency>
      2. <groupId>com.alibaba.csb.trace</groupId>
      3. <artifactId>trace-eagleeye</artifactId>
      4. <version>${http.sdk.version}</version>
      5. </dependency>

WS-SDK

命令行调用

将 bizIdKey 和 bizId 以命令参数的形式添加到命令中。格式如下:

-bizIdKey <bizid 的 key> -bizId <bizId 的 value>

其中,bizIdKey的默认值为_biz_id,不可配置。

  • 调用请求示例

    1. java -jar ws-client-1.1.5.3.jar -api item.hsf.add -version 1.0.0 \
    2. -bizIdKey _biz_id -bizId e48ffd7c1e7f4d07b7fc141f43503cb2 \
    3. -wa http://csb.broker.server:9081/item.hsf.add/1.0.0/add?wsdl \
    4. -ea http://csb.broker.server:9081/item.hsf.add/1.0.0/add \
    5. -ns http://itemcenter.carshop.edas.alibaba.com/ \
    6. -sname item.hsf.add \
    7. -pname addPortType \
    8. -rd '
    9. <soapenv:Envelope
    10. xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    11. xmlns:test="http://itemcenter.carshop.edas.alibaba.com/">
    12. <soapenv:Header/>
    13. <soapenv:Body>
    14. <test:add>
    15. <item>
    16. <itemName>benz</itemName>
    17. <quantity>5</quantity>
    18. </item>
    19. </test:add>
    20. </soapenv:Body>
    21. </soapenv:Envelope>
    22. ';
  • 调用响应示例

    1. <soap:Envelope
    2. xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    3. xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    4. <SOAP-ENV:Header/>
    5. <soap:Body
    6. xmlns:ns1="http://itemcenter.carshop.edas.alibaba.com/">
    7. <ns1:addResponse>
    8. <return>
    9. <code>0</code>
    10. <msg>SUCCESS</msg>
    11. <innerMsg/>
    12. <result>
    13. <itemName>benz</itemName>
    14. <quantity>250</quantity>
    15. <trace>
    16. <traceId>1e195a1e15586975657511003d7506</traceId>
    17. <rpcId>0.1</rpcId>
    18. <bizId>e48ffd7c1e7f4d07b7fc141f43503cb2</bizId>
    19. <requestId>1e195a1e15586975655741001d7506</requestId>
    20. </trace>
    21. </result>
    22. </return>
    23. </ns1:addResponse>
    24. </soap:Body>
    25. </soap:Envelope>

代码调用

在代码中设置bizId,并启用Trace

说明bizIdKey的默认值为_biz_id,不可配置。

  • 设置 bizId

    1. HttpParameters.Builder builder = HttpParameters.newBuilder()
    2. .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 中。

        1. <filter>
        2. <filter-name>TraceFilter</filter-name>
        3. <filter-class>com.alibaba.csb.trace.TraceFilter</filter-class>
        4. </filter>
        5. <filter-mapping>
        6. <filter-name>TraceFilter</filter-name>
        7. <url-pattern>/*</url-pattern>
        8. </filter-mapping>
      • 调用API

        调用 trace 方法(将接收到的 trace 封装到 SDK 请求 header)

        • wsparam.trace(request)
        • wsparam.setRequest(request).trace()
    • EDAS

      部署到 EDAS 的服务,可以使用 EDAS 的 EagleEye,只需引入 trace-eagleeye 依赖包。

      1. <dependency>
      2. <groupId>com.alibaba.csb.trace</groupId>
      3. <artifactId>trace-eagleeye</artifactId>
      4. <version>${http.sdk.version}</version>
      5. </dependency>

获取请求链路信息

在完成在 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.getRequestId()

HTTP/WS

  • request.getHeader(TraceData.TRACEID_KEY) //_inner_ecsb_trace_id
  • request.getHeader(TraceData.RPCID_KEY) //_inner_ecsb_rpc_id
  • request.getHeader(HttpCaller.bizIdKey()) //设置的bizIdKey
  • request.getHeader(TraceData.REQUESTID_KEY) //_inner_ecsb_request_id

HSF

  • EagleEye.getTraceId()
  • EagleEye.getRpcId()
  • EagleEye.getUserData(HttpCaller.bizIdKey()) //设置的bizIdKey
  • EagleEye.getRequestId()

Dubbo

  • RpcContext.getContext().getAttachment(TraceData.TRACEID_KEY) //_inner_ecsb_trace_id
  • RpcContext.getContext().getAttachment(TraceData.RPCID_KEY) //_inner_ecsb_rpc_id
  • RpcContext.getContext().getAttachment(HttpCaller.bizIdKey()) //设置的bizIdKey
  • RpcContext.getContext().getAttachment(TraceData.REQUESTID_KEY) //_inner_ecsb_request_id

查看日志

引入 log4j

在完成在 SDK 中设置 bizId API 和 traceId后,您还可以引入 log4j,从而基于 bizId 查看相关日志。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration status="WARN" monitorInterval="30">
  3. <appenders>
  4. <File name="csbsdk" fileName="logs/csbsdk.log">
  5. <PatternLayout pattern="%m%n"/>
  6. </File>
  7. <Async name="async">
  8. <AppenderRef ref="csbsdk"/>
  9. </Async>
  10. </appenders>
  11. <loggers>
  12. <logger name="CSBSDK" level="INFO" additivity="false">
  13. <appender-ref ref="async" />
  14. </logger>
  15. </loggers>
  16. </configuration>

查看客户端日志

客户端日志格式如下:

  1. startTime|endTime|cost|HTTP/WS|localhost|dest|bizId|requestId|traceId|rpcId|api|version|ak|sk|method|ur|httpcode|httpreturn|msg
  2. 1559179173797|1559179173850|53|HTTP|30.25.90.40|csb.target.server|1e195a2815591791594031001d6512|1e195a2815591791737961004d6512|1e195a2815591791737961005d6512|0|item.hsf.remove|1.0.0|||GET|http://csb.target.server:8086/CSB|200|HTTP/1.1 200 OK|
  3. 1558949495655|1558949497782|62|WS|30.25.90.39|csb.target.server|1e195a2715589494944221001d5b76|1e195a2715589494954281002d5b76|1e195a2715589494969271003d5b76|0|item.dubbo.add|1.0.0|||add|http://csb.target.server:9081/item.dubbo.add/1.0.0/add|200||

查看 Broker 日志

Broker 日志格式如下:

  1. | 1.日志打印时间 | 11.签名 | 21.服务组名称 |31.返回数据大小
  2. | 2.实例名称 | 12.调用后端服务开始时间 | 22.服务拥有者 |32.requestId
  3. | 3.traceId | 13.是否成功 | 23.输入参数 |33.bizId
  4. | 4.rpcId | 14.错误类型 | 24.输出参数
  5. | 5.服务名称 | 15.错误代码 | 25.内部requestId
  6. | 6.凭证名字 | 16.错误信息 | 26.来源IP
  7. | 7.消费者 | 17.调用总耗时 | 27.目标IP
  8. | 8.请求类型 | 18.后端服务调用耗时 | 28.请求写buffer时间
  9. | 9.请求时间 | 19.后端服务调用结束时间 | 29.请求写成功时间
  10. | 10.accessKey | 20.请求结束时间 | 30.请求数据大小