您可以通过设置、获取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和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

      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>
  • 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,不可配置。
      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|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.请求数据大小