Coder Social home page Coder Social logo

Comments (18)

guanchao-yang avatar guanchao-yang commented on June 15, 2024

如何将生成的追踪信息不打印到日志中

配置 com.alipay.sofa.tracer.disableDigestLog=true 将不会打印日志到文件中。配置文档

而在代码中获取?我需要做持久化

通过上下文中获取 Span 如 SofaTracerSpan sofaTracerSpan = sofaTraceContext.getCurrentSpan(); 获取的 Span 就是链路调用信息的抽象。参考工具类

from sofa-tracer.

zhaojinchao95 avatar zhaojinchao95 commented on June 15, 2024

thanks ,but I have yet a question!

请问这个是服务追踪的一些信息,但是没有状态码什么的
[{
"fields":{
"event":"sr"
},
"time":1531714665907
}]
{"span.kind":"server","current.thread.name":"http-nio-8080-exec-1","request.url":"http://127.0.0.1:8080/getUserById","method":"GET"}
{}
{"req.size.bytes":-1}
{
"bizBaggage":{},
"bizSerializedBaggage":"",
"childContextIndex":0,
"parentId":"",
"sampled":false,
"spanId":"0",
"sysBaggage":{},
"sysSerializedBaggage":"",
"traceId":"ac1e0016153171466590410011834"
}

其他的如果我需要,是不是根据OpenTracing规范去取呢?

from sofa-tracer.

guanchao-yang avatar guanchao-yang commented on June 15, 2024

@ZjcNB 我理解你说的状态码,应该是具体组件的一个状态信息,你可直接使用 Span 设置 tags ,然后再需要的时候,取出这个 tag 即可。

from sofa-tracer.

zhaojinchao95 avatar zhaojinchao95 commented on June 15, 2024

不单单是状态码,我给你看一下日志输出的吧,都有这些信息:
{"time":"2018-07-16 11:46:13.260","local.app":"null","traceId":"ac1e0016153171276940610011786","spanId":"0","request.url":"http://127.0.0.1:8080/getUserById","method":"GET","result.code":"200","req.size.bytes":-1,"resp.size.bytes":84,"time.cost.milliseconds":3853,"current.thread.name":"http-nio-8080-exec-1","baggage":""}

而我代码里面获得的呢,是这些信息:
{
"bizBaggage":{},
"bizSerializedBaggage":"",
"childContextIndex":0,
"parentId":"",
"sampled":false,
"spanId":"0",
"sysBaggage":{},
"sysSerializedBaggage":"",
"traceId":"ac1e0016153171789576510011911"
}

from sofa-tracer.

guanchao-yang avatar guanchao-yang commented on June 15, 2024

@ZjcNB 你的这个示例是用 Spring MVC 的,可以在 请求的时候,使用 SofaTracerSpan sofaTracerSpan = sofaTraceContext.getCurrentSpan(); 获取 Span,然后通过 com.alipay.common.tracer.core.span.SofaTracerSpan#getTagsWithStr("${tagKey}"),但是 result.code 是获取不到的,因为 result.code 是在你的 Controller 被调用完成后才设置的这个值,而你获取的时候,应该是调用中,具体可以调试看下这里代码

from sofa-tracer.

zhaojinchao95 avatar zhaojinchao95 commented on June 15, 2024

我可以写一个拦截器,A服务调用B服务,A服务方法请求执行完之后再走
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) throws Exception {
//获取请求的上下文
SofaTraceContext sofaTraceContext = SofaTraceContextHolder.getSofaTraceContext();
//从ThreadLocal中获取调用服务的信息
SofaTracerSpan sofaTracerSpan = sofaTraceContext.getCurrentSpan();
Map<String,String> map = sofaTracerSpan.getTagsWithStr();
String result = map.get("${tagKey}");

}

还有想要确定一下的是,这个获取traceId这些信息,是请求之前获取好,还是请求结束之后获取好呢

from sofa-tracer.

zhaojinchao95 avatar zhaojinchao95 commented on June 15, 2024

我的项目是springboot,服务A 我写了一个拦截器,在每次请求过后来执行这个方法:

@OverRide
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) throws Exception {
//获取请求的上下文
SofaTraceContext sofaTraceContext = SofaTraceContextHolder.getSofaTraceContext();
//从ThreadLocal中获取调用服务的信息
SofaTracerSpan sofaTracerSpan = sofaTraceContext.getCurrentSpan();
SofaTracer sofaTracer = sofaTracerSpan.getSofaTracer();
System.out.println("hahaahhahahahahahahah" + JSON.toJSONString(sofaTracer,true));
SofaTracerSpanContext sofaTracerSpanContext = sofaTracerSpan.getSofaTracerSpanContext();
System.out.println("哦哦哦哦哦哦哦" + JSON.toJSONString(sofaTracerSpanContext,true));
}

服务B 也是一个拦截器,每次请求之后执行这个方法

@OverRide
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) throws Exception {
//获取请求的上下文
SofaTraceContext sofaTraceContext = SofaTraceContextHolder.getSofaTraceContext();
//从ThreadLocal中获取调用服务的信息
SofaTracerSpan sofaTracerSpan = sofaTraceContext.getCurrentSpan();
SofaTracer sofaTracer = sofaTracerSpan.getSofaTracer();
System.out.println("hahaahhahahahahahahah" + JSON.toJSONString(sofaTracer,true));
SofaTracerSpanContext sofaTracerSpanContext = sofaTracerSpan.getSofaTracerSpanContext();
System.out.println("哈哈哈哈哈" + JSON.toJSONString(sofaTracerSpanContext,true));
}

然后我的依赖是:
//sofa-tracer 链路追踪
compile group: 'com.alipay.sofa', name: 'sofaboot-dependencies', version: '2.4.2', ext: 'pom'
compile group: 'com.alipay.sofa', name: 'tracer-sofa-boot-starter', version: '2.1.1'
//end

application.properties:

com.alipay.sofa.tracer.disableDigestLog=true

from sofa-tracer.

guanchao-yang avatar guanchao-yang commented on June 15, 2024

还有想要确定一下的是,这个获取traceId这些信息,是请求之前获取好,还是请求结束之后获取好呢

这里就涉及到 traceId 的生成地方,traceId 是在每一个请求的 Filter 中产生的。不存在之前/后 好坏的问题哈。只要在请求的 SpringMvcSofaTracerFilter 生成了 traceId 后你都可以获取到。
@ZjcNB

from sofa-tracer.

zhaojinchao95 avatar zhaojinchao95 commented on June 15, 2024

嗯嗯,好

from sofa-tracer.

guanchao-yang avatar guanchao-yang commented on June 15, 2024

@ZjcNB 第二个问题,你想咨询的是为什么 traceId 不同的问题,是吧?

因为你的这两个服务分别是服务 A 和服务 B,而这两个分别响应 MVC 的请求,而请求的上下文中没有能够还原出 SpanContext 的数据,所以这两个请求就会认为这次请求是链路的开始,就会重新生成一个 traceId 同时 spanId 均是 0 ,关于 traceId 和 spanId 可以参考文档。而如果请求上下文中携带了 SpanContext 的信息即可以还原出 Span,并构造 ChildSpan,这个功能目前正在 Review 中,可以参考这里多提意见

from sofa-tracer.

zhaojinchao95 avatar zhaojinchao95 commented on June 15, 2024

嗯,知道了。其实目前开源的现有功能,是不支持服务A和服务B之间传递traceid的吧

from sofa-tracer.

guanchao-yang avatar guanchao-yang commented on June 15, 2024

@ZjcNB RPC 组件是支持的。另,如上文,相应的组件我们逐步
 Roadmap 支持上,如到时候 HttpClient 和 SpringMVC 也是可以的,其他也是类似。

from sofa-tracer.

khotyn avatar khotyn commented on June 15, 2024

@ZjcNB 服务 A 调用服务 B 你们用的是什么?

from sofa-tracer.

zhaojinchao95 avatar zhaojinchao95 commented on June 15, 2024

@khotyn 用的springclould

from sofa-tracer.

zhaojinchao95 avatar zhaojinchao95 commented on June 15, 2024

@guanchao-yang 好的

from sofa-tracer.

khotyn avatar khotyn commented on June 15, 2024

@ZjcNB 具体用的 SpringCloud 里面的哪个组件,HttpClient?RestTemplate 还是啥?能够贴一下关键的代码信息么?

from sofa-tracer.

zhaojinchao95 avatar zhaojinchao95 commented on June 15, 2024

用的@RestController。mvc模式吧

from sofa-tracer.

khotyn avatar khotyn commented on June 15, 2024

@ZjcNB RestController 是提供服务吧?调用是怎么调用的?

from sofa-tracer.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.