当前位置: 首页 > 知识库问答 >
问题:

Spring Sleuth-跟踪失败

宣原
2023-03-14

在微服务环境中,我看到了通过整个业务流程中的所有微服务实例跟踪请求的两个主要好处。

  1. 查找服务实例之间或服务实例中的延迟间隙
  2. 寻找失败的根源,无论是技术上的还是关于商业案例的

Zipkin提供了一个解决第一个问题的工具。但是,如何使用跟踪来揭示html" target="_blank">微服务环境中的故障呢?我当然想跟踪所有受错误影响的范围,但不是每个请求,因为它们没有出错。如本文所述,可以使用自定义采样器。

或者,您可以注册自己的采样器bean定义,并以编程方式决定应该对哪些请求进行采样。您可以更智能地选择要跟踪哪些内容,例如,通过忽略成功的请求,或者检查某个组件是否处于错误状态,或者其他任何情况。

所以我试着实现它,但是它不起作用或者我用错了。所以,正如博客文章建议的那样,我注册了自己的采样器:

    @Bean
    Sampler customSampler() {
    return new Sampler() {
        @Override
        public boolean isSampled(Span span) {

            boolean isErrorSpan = false;
            for(String tagKey : span.tags().keySet()){
                if(tagKey.startsWith("error_")){
                    isErrorSpan = true;
                }
            }
            return isErrorSpan ;
        }
    };
}

在我的控制器中,我创建了一个新的Span,如果出现异常,它将被标记为错误

private final Tracer tracer;

@Autowired
public DemoController(Tracer tracer) {
    this.tracer = tracer;
}

@RequestMapping(value = "/calc/{i}")
public String calc(@PathVariable String i){
    Span span = null;
    try {
        span = this.tracer.createSpan("my_business_logic");
        return "1 / " + i + " = " + new Float(1.0 / Integer.parseInt(i)).toString();
    }catch(Exception ex){
        log.error(ex.getMessage(), ex);

        span.logEvent("ERROR: " + ex.getMessage());
        this.tracer.addTag("error_" + ex.hashCode(), ex.getMessage());
        throw ex;
    }
    finally{
        this.tracer.close(span);
    }
}

现在,这不起作用。如果我要求/计算/a方法采样器。在控制器方法引发NumberFormatException之前调用isSampled(Span)。这意味着,当isSampled()检查Span时,它还没有标记。并且采样器方法不会在稍后的过程中再次调用。只有当我打开采样器并允许对每个跨度进行采样时,我才能在Zipkin中看到我的标记错误跨度。在这种情况下,取样器。isSampled(Span)只调用了1次,但HttpZipkinSpanReporter没有调用。报告(Span)执行了3次。

那么,如果只传输具有错误跨度的跟踪,用例会是什么样子呢?这是用任意“error_”标签标记跨度的正确方法吗?

共有1个答案

马淳
2023-03-14

采样决定是为了跟踪。这意味着当第一个请求进来并创建跨度时,您必须做出决定。那时您没有任何标签/行李,因此您不能依赖标签的内容来做出这个决定。这是一种错误的方法。

您正在采用一种非常自定义的方法。如果您想走这条路(不推荐),您可以创建SpanReport-https://github.com/spring-cloud/spring-cloud-sleuth/blob/master/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/SpanReporter.java#L30的自定义实现。SpanReport-是将spans发送到zipkin的实现。您可以创建一个实现来包装现有的SpanReport-实现,并且仅当某些标签值匹配时才将执行委托给它。但从我的角度来看,这听起来不太对劲。

 类似资料:
  • 跟踪行为控制着 Entity Framework Core 是否会在其变更跟踪器里维持实体实例的信息。如果实体是被跟踪的,任何检测到的该实体的变更都将在 SaveChanges() 时持久化到数据库中。Entity Framework Core 还会对已跟踪的、之前已加载到 DbContext 实例中的查询和实体进行相互的导航属性装配。 提示 你可以在 GitHub 上查阅当前文章涉及的代码样例。

  • Trace 事件提供了一种机制,可以集中由 V8,Node 核心, 以及用户代码生成的跟踪信息。 启动 Node.js 应用时添加 --trace-events-enabled 标记,可以启用 Tracing. 可以通过在 --trace-event-categories 标记后跟一个用逗号分隔的类别名称列表, 来指定特定的跟踪记录集合。 node 和 v8 默认启用。 node --trace-

  • 跟踪配置指定了Envoy使用的HTTP跟踪器的全局设置。在服务的顶层配置上定义。未来,Envoy可能会支持其他跟踪器,但现在HTTP跟踪器是唯一支持的跟踪器。 { "http": { "driver": "{...}" } } http (optional, object) 提供HTTP跟踪器的配置。 driver (optional, object) 提供处理跟踪和创建span

  • 概述 分布式跟踪使开发人员可以在大型面向服务的体系结构中获得调用流的可视化。在理解序列化,并行性和延迟来源方面,这是非常宝贵的。Envoy支持系统范围与跟踪相关的三个功能: 请求ID生成:Envoy将在需要时生成UUID并填充x-request-id HTTP头。 应用程序可以转发x-request-id头以进行统一日志记录以及跟踪。 外部跟踪服务集成:Envoy支持可插入的外部跟踪可视化提供程序

  • Bug跟踪是一个宽泛的话题;贯穿本书会讨论此问题的各个方面。尽管这里我们要着重于配置和技术因素,但是首先要从一个策略问题开始:Bug跟踪系统中应该包含哪些信息? 术语Bug跟踪很有误导性。Bug跟踪系统也通常会用来跟踪哪些初始与结束状态不同,包含可选的中间状态,并在生命周期中积累信息的问题,例如新特性请求、一次性任务以及被动性的补丁。由于这些原因,Bug跟踪也被称为问题跟踪(issue track

  • 本章介绍如何使用Zipkin或Jaeger收集启用了Istio的应用程序的调用链信息。 完成本章后,你可以理解有关应用程序的所有假设以及如何使其参与跟踪,无论您使用何种语言/框架/平台构建应用程序。 BookInfo示例用来作为此任务的示例应用程序。 环境准备 参照安装指南的说明安装Istio。 如果您在安装过程中未启动Zipkin或Jaeger插件,则可以运行以下命令启动: 启动Zipkin: