С ростом популярности микросервисной архитектуры запрос часто должен включать несколько служб, поэтому мониторинг производительности служб и устранение неполадок становятся более сложными. Так родился АПМ.
В настоящее время на рынке существует множество реализаций серверов APM. Такие как Zipkin, Jaeger, SkyWalking, Elastic APM и т. д. (Pinpoint не поддерживает OpenTracing, поэтому мы не будем его представлять).
В этом руководстве представлены только некоторые идеи разработки, которые имеют высокие технические требования, поскольку для большинства из них необходимо понимать исходный код соответствующих компонентов. Весь исходный код можно найти на github.
На этот раз Jaeger выбран в качестве примера сервера. Основное содержание состоит в следующем.
первая часть
В первой части мы рассмотрим ключевую информацию об apm и некоторые концептуальные элементы в рамках подготовки к последующим примерам. Здесь мы кратко опишем, как устанавливается jaeger и некоторые подготовительные работы.
Вторая часть
Используйте простую программу Java, чтобы проиллюстрировать, как использовать OpenTracing API для создания трассировки, и продемонстрируйте создание цепочки вызовов с двумя узлами.
третья часть
Используйте OkHttp3 и SpringBoot, чтобы продемонстрировать, как реализовать распределенный вызов. Эта статья по-прежнему построена с использованием базового API, и если вы хорошо относитесь к разработке, вы должны иметь дело с различными сценариями.
четвертая часть
Возьмите SpringCloud в качестве примера, чтобы проиллюстрировать логику генерации цепочки вызовов микросервисов. Из-за большого количества различных вызовов мы используем только наиболее популярные вызовы Feign для иллюстрации их принципов. Реализация SpringCloud уже имеет лучшие колеса, и соображения более полны.Вы можете обратиться к его исходному коду для анализа.
Если вы разрабатываете собственное промежуточное ПО или выполняете некоторые работы по интеграции, это руководство позволит вам быстро добавить функциональность apm к вашим компонентам. Предполагается, что ваш API совместим с протоколом OpenTracing.
Общее введение
Для системы мониторинга и ссылки apm в официальном аккаунте Miss Sister Taste есть более подробное описание, рекомендуется сначала ознакомиться с ним.
С таким количеством компонентов мониторинга всегда найдется подходящий для вас
Основные элементы цепочки вызовов кратко описаны ниже.
Основные факторы цепочки звонков
Секция сбора данных
В основном используется для сбора разнообразных данных при подготовке к анализу данных. Требуется, чтобы он был простым в использовании и простым в использовании с минимальным вмешательством, насколько это возможно (рабочая нагрузка разработки), а в крайних случаях (например, недоступность компонентов коллекции) он не должен оказывать никакого влияния на бизнес. Видно, что объем разработки этой части огромен, особенно когда необходимо интегрировать Nginx вверх и вниз по течению, различные базовые компоненты и различные технологические стеки.
Секция анализа данных
В основном включают анализ в реальном времени и автономный анализ. В целом ценность анализа в реальном времени больше, а основной вывод — это количество вызовов в секундах, среднее время ответа, значение TP и т. д. Кроме того, цепочка вызовов (Trace) должна хранить полный объем данных, а некоторые запросы с высокой степенью параллелизма и большими скрытыми точками будут иметь проблемы с производительностью.
Мониторинг тревоги
Эта часть использует результаты анализа данных для уведомления подписчиков о внимании через SMS и электронную почту. Платформа мониторинга и оповещения должна быть максимально приближена к платформе devops, включая автономную сервисную платформу.
Почему выбирают егеря
Развитие jaeger более активное, а его модульное деление более гибкое. В случае очень большого объема данных, данные можно предварительно буферизовать с помощью kafka (при этом он полностью подготовлен для доступа к различным платформам потокового анализа). Это содержание объясняется кстати в части установки jaeger.
Способ расширения
Если в вашем проекте используется SpringBoot, его очень удобно расширять. Следующий контент упоминается более одного раза, пожалуйста, игнорируйте его, если вы его читали.
Следующая функция, которую мы реализуем: любая добавленная
@OwlTrace
Аннотированные методы будут генерировать информацию о цепочке вызовов.
Во-первых, нам нужно определить аннотацию:
import java.lang.annotation.*;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface OwlTrace {
}
Затем реализуйте его класс обработки. проход кодаAOP
Перехват бинов, управляемых Spring, очень простTrace
структура информации. код показывает, как показано ниже:
import io.opentracing.Span;
import io.opentracing.Tracer;
import io.opentracing.tag.Tags;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import java.util.LinkedHashMap;
import java.util.Map;
@Configuration
@Slf4j
public class OwlTraceAutoConfiguration {
static final String TAG_COMPONENT = "java";
@Autowired
@Lazy
Tracer tracer;
@Bean
public TracingAspect pxTracingAspect() {
return new TracingAspect();
}
@Aspect
class TracingAspect {
@Around("@annotation(com.sayhiai.arch.trace.annotation.OwlTrace)")
public Object pxTraceProcess(ProceedingJoinPoint pjp) throws Throwable {
Span span = null;
if (tracer != null) {
final String cls = pjp.getTarget().getClass().getName();
final String mName = pjp.getSignature().getName();
span = tracer.buildSpan(cls + "." + mName)
.withTag(Tags.COMPONENT.getKey(), TAG_COMPONENT)
.withTag("class", cls)
.withTag("method", mName)
.startActive(false)
.span();
}
try {
return pjp.proceed();
} catch (Throwable t) {
Map<String, Object> exceptionLogs = new LinkedHashMap<>(2);
exceptionLogs.put("event", Tags.ERROR.getKey());
exceptionLogs.put("error.object", t);
span.log(exceptionLogs);
Tags.ERROR.set(span, true);
throw t;
} finally {
if (tracer != null && span != null) {
span.finish();
}
}
}
}
}
Наконец, согласноSpring
, добавьте путь кsrc/main/resources/META-INF/spring.factories
середина:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
arch.trace.core.owl.OwlTraceAutoConfiguration,\
arch.trace.core.log.LoggingAutoConfiguration
сделать компонентыjar
сумка, аspring boot starter
Это сбылось.
использовать
application.properties
убедитесь, что он включенAOP
# AOP
spring.aop.auto=true
spring.aop.proxy-target-class=true
opentracing.jaeger.log-spans=true
opentracing.jaeger.udp-sender.host=192.168.3.237
opentracing.jaeger.udp-sender.port=5775
End
Далее постепенно будем входить в разработку клиентского апи.