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

前提条件

使用的 CSB SDK 版本为 http-client-1.1.5.8ws-client-1.1.5.8

在 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,不可配置。

      • 调用请求示例
        java -jar http-client-1.1.5.7.jar -api item.hsf.add -version 1.0.0 -method post \
        -bizIdKey _biz_id -bizId e48ffd7c1e7f4d07b7fc141f43503cb2 \
        -D "item={\"itemName\":\"benz\",\"quantity\":10}" \
        -url http://csb.broker.server:8086/CSB
      • 调用响应示例
        {
          "body": {
            "msg": "SUCCESS",
            "result": {
              "itemName": "benz",
              "trace": {
                "traceId": "1e195a1e15586942836161002d6898",
                "rpcId": "0.1",
                "requestId": "1e195a1e15586942832381001d6898",
                "bizId": "e48ffd7c1e7f4d07b7fc141f43503cb2"
              },
              "quantity": 220
            },
            "code": "0"
          },
          "code": 200,
          "message": "SUCCESS",
          "requestId": "1e195a1e15586942836161002d6898"
        }
    • 代码调用

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

      说明 bizIdKey 的默认值为_bizId,不可配置。
      1. 设置 bizId
        HttpParameters.Builder builder = HttpParameters.newBuilder()
                  .bizId(BIZ_ID);
      2. 启用 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()
        • EDAS
          部署到 EDAS 的服务,可以使用 EDAS 的 EagleEye,只需引入 trace-eagleeye 依赖。
          <dependency>
              <groupId>com.alibaba.csb.trace</groupId>
              <artifactId>trace-eagleeye</artifactId>
              <version>${http.sdk.version}</version>
          </dependency>
  • WS-SDK
    • 命令行调用

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

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

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

      • 调用请求示例
        java -jar ws-client-1.1.5.7.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>1e195a1e15586975657511003d7506</traceId>
                                <rpcId>0.1</rpcId>
                                <bizId>e48ffd7c1e7f4d07b7fc141f43503cb2</bizId>
                                <requestId>1e195a1e15586975655741001d7506</requestId>
                            </trace>
                        </result>
                    </return>
                </ns1:addResponse>
            </soap:Body>
        </soap:Envelope>
    • 代码调用

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

      说明 bizIdKey 的默认值为_bizId,不可配置。
      1. 设置 bizId
        HttpParameters.Builder builder = HttpParameters.newBuilder()
                  .bizId(BIZ_ID);
      2. 启用 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()
        • EDAS
          部署到 EDAS 的服务,可以使用 EDAS 的 EagleEye,只需引入 trace-eagleeye 依赖。
          <dependency>
              <groupId>com.alibaba.csb.trace</groupId>
              <artifactId>trace-eagleeye</artifactId>
              <version>${http.sdk.version}</version>
          </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.getUserData(TraceData.REQUESTID_KEY) //_inner_ecsb_request_id
  • 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.getUserData(TraceData.REQUESTID_KEY) //_inner_ecsb_request_id
  • 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 查看相关日志。

    <?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|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|
    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.日志打印时间  | 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.请求数据大小