【问题标题】:How to do time tracing for *monolithic* clearly-moduled systems (not distributed systems), or should we do that?如何对 *monolithic* 清晰模块化的系统(不是分布式系统)进行时间跟踪,或者我们应该这样做?
【发布时间】:2020-05-04 13:48:23
【问题描述】:

我看到许多微服务的分布式跟踪解决方案。例如,Spring Cloud Sleuth、Zipkin's Brave 等。但是,我有一个 monolithic 服务,其中许多模块分离得很清楚。因此,这些解决方案对我不起作用。

恕我直言,我需要一个跟踪系统来告诉我哪个模块(类似于非单体系统中的哪个微服务)花费了多少时间。但是,我找不到任何东西。因此,我想知道我的需要是否真的不是真正的需要而是伪需要?或者,如果确实需要,我该如何找到一些解决方案?

谢谢!

【问题讨论】:

  • 你决定它是否是一个真正的需要。你有理由相信这些信息是有用的吗?如果是这样,请在适当的位置插入跟踪。但是,如果您认为自己有特定的热点,您可以考虑只使用 metrics; Boot 可以使用 Micrometer @Timed 自动为您处理。
  • @chrylis-onstrike- 非常感谢!我天真的想法是:我选择单体而不是微服务,但是为了使代码干净(像微服务一样干净),我把它组织成模块。因此,我的单体在某种程度上是一个“伪微服务”。所以我想要那个微服务监控 :) 我会尝试使用 Timed,谢谢!

标签: java spring spring-boot


【解决方案1】:

在这种用例中使用 sleuth 可能并不常见(sleuth 主要用于实现分布式跟踪和监控系统内部的关键延迟)。

但是...Sleuth 与 Logback 和 SLF4J 等日志框架集成,以添加有助于使用日志跟踪和诊断问题的唯一标识符。

因此,当请求进入您的系统时,侦探会为其分配一个TraceId,并且该请求中的所有不同步骤,即使跨应用程序和线程边界,都将具有相同的traceId。

如果您想监控在某个模块内执行的不同复杂操作,您可以使用专用的Span 包装这些操作。

例子:

   Span newSpan = tracer.nextSpan().name("module1Span").start();
   try (SpanInScope ws = tracer.withSpanInScope(newSpan.start())) {
       // Some logic
   } finally {
       newSpan.finish();
   }

【讨论】:

  • 非常感谢“traceid”,听起来很有趣!对了,如果只使用traceid,有没有更轻量级的解决方案?
猜你喜欢
  • 2015-11-27
  • 2020-02-21
  • 2014-05-07
  • 2019-01-04
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 2023-01-05
相关资源
最近更新 更多