当前位置: 首页 > article >正文

Jaeger UI使用、采集应用API排除特定路径

Jaeger使用

注:
Jaeger服务端版本为:jaegertracing/all-in-one-1.6.0
OpenTracing版本为:0.33.0,最后一个版本,停留在May 06, 2019。最好升级到OpenTelemetry。
Jaeger客户端版本为:jaeger-client-1.3.2

Tags

Tag是一个非常常见的概念,时序数据库如InfluxDB,Prometheus里的基础概念。Jaeger也有这个概念,如下Jaeger UI里有一个Tags,主要用于筛选过滤部分可能会造成干扰的数据。
在这里插入图片描述
点击某个Trace进去,会发现如下信息:
在这里插入图片描述
因此,可输入如下内容实现过滤搜索:

  • 精确匹配:hostname=DESKTOP-L20EH42
  • 排除匹配:hostname=~DESKTOP-L20EH42

其他可用的Tag(常用的在前面):

  • hostname
  • ip
  • http.status_code
  • http.method
  • http.url
  • jaeger.version
  • component
  • span.kind
  • sampler.type
  • sampler.param

排除特定路径

在这里插入图片描述
如上图,Operation里列出该应用下的所有接口。

在k8s集群里,pod健康检查需要应用暴露一个/health接口。这个/health接口是写在框架Jar里的,而不是每个应用都写一个HealthController(虽然可以这样做,我在上家公司也这样干过)。

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.util.ReflectionUtils;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;

@Slf4j
@Component
@RequiredArgsConstructor
public class HealthyConfiguration implements ApplicationRunner {
    private final RequestMappingHandlerMapping requestMappingHandlerMapping;

    @Override
    public void run(ApplicationArguments args) {
        RequestMappingInfo healthRequestMappingInfo = RequestMappingInfo.paths("/health")
                .methods(RequestMethod.GET)
                .produces(MediaType.APPLICATION_JSON_VALUE)
                .options(requestMappingHandlerMapping.getBuilderConfiguration())
                .build();
        Method healthMethod = ReflectionUtils.findMethod(getClass(), "health", HttpServletRequest.class, HttpServletResponse.class);
        requestMappingHandlerMapping.registerMapping(healthRequestMappingInfo, this, healthMethod);
    }

    @ResponseBody
    public R<String> health(HttpServletRequest request, HttpServletResponse response) {
        return R.success("ok", "ok");
    }
}

需求:类似于这个GitHub Issue,Jaeger能不能不收集应用下的特定接口,即,排除特定路径。

方案

经过各种尝试,以及Google,DeepSeek,ChatGPT,最后还是GitHub Copilot给出的答复能解决问题。

新增一个Filter类,当然这个Filter类也是需要放在框架Jar里,然后所有应用都需要去引用它:

import com.johnny.security.util.CommonUtil;
import io.opentracing.Tracer;
import io.opentracing.util.GlobalTracer;
import org.springframework.context.annotation.Configuration;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * @author johnny
 */
@Configuration
public class TracingInterceptor implements Filter {
    private final Tracer tracer;

    public TracingInterceptor() {
        this.tracer = GlobalTracer.get();
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String path = CommonUtil.getRequestPath(request);
        // 排除/health路径
        if ("/health".equals(path)) {
            // 停止当前请求的Tracing
            tracer.activeSpan().finish();
            chain.doFilter(servletRequest, response);
            return;
        }
        chain.doFilter(servletRequest, response);
    }
}

CommonUtil工具类如下:

public class CommonUtil {
    /**
     * 获取请求路径
     */
    public static @NotNull String getRequestPath(HttpServletRequest request) {
        String path = "";
        String servletPath = request.getServletPath();
        if (StrUtil.isNotBlank(servletPath)) {
            path += servletPath;
        }
        String contextPath = request.getContextPath();
        if (StrUtil.isNotBlank(contextPath)) {
            path += contextPath;
        }
        String pathInfo = request.getPathInfo();
        if (StrUtil.isNotBlank(pathInfo)) {
            path += pathInfo;
        }
        return path;
    }
}

参考

  • GitHub Copilot

http://www.kler.cn/a/500399.html

相关文章:

  • Cline(原Claude Dev)开源的IDE AI插件,如何搭配OpenRouter实现cursor功能,Cline怎么使用
  • 机器学习数据预处理preprocessing
  • Linux (CentOS) 安装 Docker 和 Docker Compose
  • Unity Burst详解
  • 嵌入式C语言:二维数组
  • python类和对象
  • [人工智能自学] Python包学习-Matplotlib
  • 如何快速适应新入职的公司
  • 【Ubuntu与Linux操作系统:四、文件与目录管理】
  • [Git] git log / git reflog
  • 【云计算】OpenStack云计算平台
  • 【习题】<HarmonyOS第一课>应用程序框架基础
  • 2025_1_12_Makefile_进度条
  • uniapp运行到IOS真机提示 错误:请查看是否设备未加入到证书列表或者确认证书类型是否匹配
  • 《PC 上的开源神经网络多模态模型:开启智能交互新时代》
  • 网络安全设备主要有什么
  • CentOS7下Spark-2.4.3-bin-without-hadoop版本安装详细图文教程
  • 宝塔安装mongodb后,写脚本监控运行状态,关闭后自动重启
  • QT Must be called on Chrome_UIThread; actually called on Unknown Thread.
  • C# OpenCV机器视觉:主色提取
  • 命令模式-Command Pattern
  • Linux 攻击Exploit编写
  • 针对数据库系统安全的漏洞扫描加固工具【WebSocket + MySQL】
  • awr报告无法生成:常见分析手段
  • jmeter使用说明
  • JAVA 冒泡排序算法