Практика сокрытия URL-адресов для мониторинга цепочки вызовов CAT

Spring Cloud

Роль скрытой точки мониторинга URL

  • После того, как придет HTTP-запрос, он будет автоматически проверен, что может зафиксировать статус доступа каждого URL-адреса и связать последующие ссылки вызова этого запроса.Вы можете просмотреть журнал на странице cat
  • Вы можете видеть два типа данных: URL и URL.Forward (если есть запрос Forward) как на странице транзакции cat, так и на странице события; данные, щелкнутые в URL-адресе в данных транзакции, представляют собой конкретный URL-адрес, к которому осуществляется доступ (удалите часть префикса параметра)
  • Пожалуйста, храните Catfilter в качестве первого фильтра, чтобы обеспечить максимальную возможность контролировать все запросы

упражняться

Техническое описание

Название конструкции порт эффект
cat-ui 8082 Позвоните в службу входа
cat-business-consumer 8083 обслуживание делового потребления
cat-order-service 8084 Заказать услугу
cat-storage-service 8085 Служба инвентаризации

На приведенном выше рисунке показана диаграмма скрытых точек примера в этом разделе.Во-первых, точки входа и вызова cat-ui добавляются в скрытую точку кота, а точка входа и вызова cat-business-consumer добавляются в скрытую точку. point, cat-order-service и cat-storage-service Никакие другие микросервисы не вызываются, поэтому добавляется только точка входа. Через такие закопанные точки можно сформировать полную цепочку вызовов.

ключевой код

Общий класс контекста цепочки вызовов

CatContextImpl.java
/**
 * Cat.context接口实现类,用于context调用链传递,相关方法Cat.logRemoteCall()和Cat.logRemoteServer()
 */
public class CatContextImpl implements Cat.Context {

    private Map<String, String> properties = new HashMap<>(16);

    @Override
    public void addProperty(String key, String value) {
        properties.put(key, value);
    }

    @Override
    public String getProperty(String key) {
        return properties.get(key);
    }
}
CatHttpConstants
/**
 * 添加header常量,用于http协议传输rootId、parentId、childId三个context属性
 */
public class CatHttpConstants {

    /**
     * http header 常量
     */
    public static final String CAT_HTTP_HEADER_ROOT_MESSAGE_ID = "X-CAT-ROOT-MESSAGE-ID";
    public static final String CAT_HTTP_HEADER_PARENT_MESSAGE_ID = "X-CAT-ROOT-PARENT-ID";
    public static final String CAT_HTTP_HEADER_CHILD_MESSAGE_ID = "X-CAT-ROOT-CHILD-ID";

}
CatServletFilter
/**
 * http协议传输,远程调用链目标端接收context的filter,
 * 通过header接收rootId、parentId、childId并放入CatContextImpl中,调用Cat.logRemoteCallServer()进行调用链关联
 * 注:若不涉及调用链,则直接使用cat-client.jar中提供的filter即可
 * 使用方法(视项目框架而定):
 *      1、web项目:在web.xml中引用此filter
 *      2、Springboot项目,通过注入bean的方式注入此filter
 */
public class CatServletFilter implements Filter {


    private String[] urlPatterns = new String[0];

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String patterns = filterConfig.getInitParameter("CatHttpModuleUrlPatterns");
        if (patterns != null) {
            patterns = patterns.trim();
            urlPatterns = patterns.split(",");
            for (int i = 0; i < urlPatterns.length; i++) {
                urlPatterns[i] = urlPatterns[i].trim();
            }
        }
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;

        String url = request.getRequestURL().toString();
        for (String urlPattern : urlPatterns) {
            if (url.startsWith(urlPattern)) {
                url = urlPattern;
            }
        }

        CatContextImpl catContext = new CatContextImpl();
        catContext.addProperty( Cat.Context.ROOT, request.getHeader(CatHttpConstants.CAT_HTTP_HEADER_ROOT_MESSAGE_ID));
        catContext.addProperty(Cat.Context.PARENT, request.getHeader(CatHttpConstants.CAT_HTTP_HEADER_PARENT_MESSAGE_ID));
        catContext.addProperty(Cat.Context.CHILD, request.getHeader(CatHttpConstants.CAT_HTTP_HEADER_CHILD_MESSAGE_ID));
        Cat.logRemoteCallServer(catContext);

        Transaction t = Cat.newTransaction( CatConstants.TYPE_URL, url);

        try {

            Cat.logEvent("Service.method", request.getMethod(), Message.SUCCESS, request.getRequestURL().toString());
            Cat.logEvent("Service.client", request.getRemoteHost());

            filterChain.doFilter(servletRequest, servletResponse);

            t.setStatus(Transaction.SUCCESS);
        } catch (Exception ex) {
            t.setStatus(ex);
            Cat.logError(ex);
            throw ex;
        } finally {
            t.complete();
        }
    }

    @Override
    public void destroy() {

    }
}

Каждый проект в примерах в этом разделе использует универсальный класс контекста цепочки вызовов.

кошачий интерфейс проекта

CatRestInterceptor
@Component
public class CatRestInterceptor implements ClientHttpRequestInterceptor {

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
        Transaction t = Cat.newTransaction(CatConstants.TYPE_REMOTE_CALL, request.getURI().toString());

        try {
            HttpHeaders headers = request.getHeaders();

            // 保存和传递CAT调用链上下文
            Cat.Context ctx = new CatContextImpl();
            Cat.logRemoteCallClient(ctx);
            headers.add(CatHttpConstants.CAT_HTTP_HEADER_ROOT_MESSAGE_ID, ctx.getProperty(Cat.Context.ROOT));
            headers.add(CatHttpConstants.CAT_HTTP_HEADER_PARENT_MESSAGE_ID, ctx.getProperty(Cat.Context.PARENT));
            headers.add(CatHttpConstants.CAT_HTTP_HEADER_CHILD_MESSAGE_ID, ctx.getProperty(Cat.Context.CHILD));

            // 保证请求继续被执行
            ClientHttpResponse response =  execution.execute(request, body);
            t.setStatus(Transaction.SUCCESS);
            return response;
        } catch (Exception e) {
            Cat.getProducer().logError(e);
            t.setStatus(e);
            throw e;
        } finally {
            t.complete();
        }

    }
}

CatServletFilter скрывает запись cat-ui. CatRestInterceptor реализует интерфейс ClientHttpRequestInterceptor для перехвата запросов, инициированных RestTemplate, и использует его для скрытия точки вызова. В то же время контекст цепочки вызовов сохраняется в заголовке Http, а вызов цепь пройдена.

Встраивание в cat-business-consumer, cat-order-service, cat-storage-service — это то же самое, что и закапывание cat-ui.

тестовое задание

обратиться с просьбой

curl http://127.0.0.1:8082/start

В интерфейсе мониторинга кошек можно увидеть сервисы из примеров в этом разделе.

Нажмите «logView», чтобы просмотреть полную информацию о цепочке вызовов.

Нажмите «График», чтобы просмотреть информацию о цепочке вызовов в виде графика.

исходный код

GitHub.com/Kung Fu-Change сенсорный экран…

Ссылаться на

GitHub.com/comments/rubbing…

Добро пожаловать, чтобы отсканировать код или выполнить поиск в общедоступной учетной записи «Programmer Guoguo» на WeChat и подписаться на меня, вас ждут сюрпризы~