Дружеское напоминание: автономный метод развертывания jaeger может быстро начать пробную версию.
В этой статье используются два простых примера, чтобы проиллюстрировать, как использовать Java API для создания простой цепочки вызовов. Для большей сериализации, пожалуйста, обратите внимание на «Вкус мисс сестры». См. соответствующий код на github.
https://github.com/sayhiai/example-jaeger-opentracing-tutorial-001-002
Поскольку jaeger основан на OpenTracing, если ваше приложение поддерживает протокол OpenTracing, его можно интегрировать с Jaeger.
Адрес для OpenTracing:
https://opentracing.io/
Давайте двигать руками.
Напишите HelloWorld
1. зависимость от maven
Сначала создайте нормальный проект maven. Затем добавьте зависимости:
opentracing-util 0.32.0
jaeger-client 0.35.0
logback-classic 1.2.3
В основном используются пакеты jar, связанные с opentracing, и используется реализация клиента java для jaeger.
2. Простой фрагмент кода
Сначала создайте простойloveyou
класс с простым методом в немhello
. Этот раздел относится к OpenTracing, а не к Jaeger.
существуетhello
До и после тела метода добавьте несколько строк простого кода, в основном для добавления некоторой информации о вызовах и другого содержимого в соответствии с API, определенным спецификацией OpenTracing.
public class LoveYou {
Tracer tracer;
public LoveYou() {
tracer = JaegerTracerHelper.initTracer("loveYouService");
}
public void hello(String name) {
Span span = tracer.buildSpan("hello").start();
span.setTag("name", name);
System.out.println("Hello " + name);
span.log("Love service say hello to " + name);
span.finish();
}
public static void main(String[] args) {
new LoveYou().hello("小姐姐味道");
}
}
Код в основном добавляет следующую важную информацию.
1. Создайте новыйspan
, каждый диапазон имеет три идентификатора: rootid, parentid, id. Они составляют каждый конкретный узел древовидной цепочки вызовов.
2. Добавьте новый диапазон к вновь добавленному диапазону.tag
информация для некоторой пользовательской идентификации. Есть несколько стандартных списков для тегов, но их также можно настроить.
3. Добавлен журнал к вновь добавленному промежутку. регистрировать информационную встречу附着
На информационном отрезке собирается кусок, а определяется только какая-то более важная информация, включая стек исключений и так далее. Некоторую маловажную информацию не рекомендуется использовать в логе, она будет занимать много места для хранения.
После выполнения кода вы можете увидеть информацию об этом вызове на стороне пользовательского интерфейса jaeger. следующее:
В-третьих, постройте реализацию Jaeger
Как наши данные OpenTracing создаются и отправляются на сервер Jaeger? Это делается следующим кодом.
public class JaegerTracerHelper {
public static JaegerTracer initTracer(String service) {
final String endPoint = "http://10.30.94.8:14268/api/traces";
final CompositeReporter compositeReporter = new CompositeReporter(
new RemoteReporter.Builder()
.withSender(new HttpSender.Builder(endPoint).build())
.build(),
new LoggingReporter()
);
final Metrics metrics = new Metrics(new NoopMetricsFactory());
JaegerTracer.Builder builder = new JaegerTracer.Builder(service)
.withReporter(compositeReporter)
.withMetrics(metrics)
.withExpandExceptionLogs()
.withSampler(new ConstSampler(true));
return builder.build();
}
}
Есть много параметров JaegerTracer, которые подробно описываться в этой статье не будут. Для завершения сборки примера необходимы следующие простые шаги:
1. Build Reporter, который относится к методу отправки на сервер.В код встроена конечная точка http, которая напрямую отправляется в jaeger-collector через jaeger-agent
2. Создайте семплер и укажите информацию, которую нужно собрать, так как на этот раз нужно собрать всю информацию. Так что используйте ConstSampler по умолчанию
Да, кстати, чтобы облегчить отладку и обнаружение, код также добавляет LoggingReporter для вывода диапазона на консоль. Эффект следующий:
На данный момент простой пример Java-примера девять завершен. Код выше см. на github:GitHub.com/say Hi Ai/Отвратительно…Реализовать двухуровневую глубокую цепочку
Приведенный выше код генерирует только диапазон, то есть вызов метода. Далее давайте посмотрим, как завершить многоуровневую цепочку вызовов.
Следующим шагом является изменение класса LoveYou. мы вызываем методhello
демонтировать, демонтироватьdispatch
а такжеhello
Два метода и сон на одну секунду в методе приветствия.
Ожидайте создания двух сообщений трассировки.
dispatch
public void dispatch(String cmd, String content) {
Span span = tracer.buildSpan("dispatch").start();
tracer.activateSpan(span);
if (cmd.equals("hello")) {
this.hello(content);
}
if (null != span) {
span.setTag("cmd", cmd);
span.finish();
}
}
hello
public void hello(String name) {
Span span = tracer.buildSpan("hello").start();
tracer.activateSpan(span);
System.out.println("Hello " + name);
try {
Thread.sleep(TimeUnit.SECONDS.toMillis(1));
} catch (InterruptedException e) {
e.printStackTrace();
}
span.setTag("name", name);
span.log("Love service say hello to " + name);
span.finish();
}
В отличие от примера 1, после генерации каждого спана мы должны его активировать
tracer.activateSpan(span);
Его цель в основном состоит в том, чтобы поддерживать активным экземпляр span (например, поток) в текущем ctx. Таким образом, если новый диапазон определяет, что в данный момент есть активные диапазоны, поместите их в один и тот же диапазон.scope
середина. Таким образом, цепь нанизывается вместе.
Ниже приведен эффект программы после запуска.
выборка
Иногда QPS нашего сервиса очень высок, и за одно мгновение может быть сгенерировано большое количество трассировочной информации. Эта информация очень похожа и потребует большого объема памяти.
Если вам не нужно подсчитывать некоторую информацию, например количество запросов в секунду, вы можете использовать сэмплер для сбора только части трассировки.
Помните экземпляр jaeger, который мы создали с помощью javaapi? Среди них есть такая строчка кода:
.withSampler(new ConstSampler(true))
это проще всего采样
, что означает собрать всю информацию. jaeger поддерживает четыре различных типа выборки.
Constant
Это логический переключатель, еслиsampler.param=1
, значит собрать все трассы, если0
, что означает, что ничего не собирается.
Probabilistic
Выборка на основе вероятности, например sampler.param=0,1, означает, что будет собрана 1/10 трасс.
Rate Limiting
Метод ограничения тока с использованием корзины токенов для ограничения тока.sampler.param=2.0
Это означает, что в секунду собирается 2 трассы, а лишнее будет отбрасываться.
Remote
Настройка через удаленную настройку, которая также используется по умолчанию. Например настроить в Collectorstrategies.json
{
"service_strategies": [
{
"service": "foo",
"type": "probabilistic",
"param": 0.8,
"operation_strategies": [
{
"operation": "op1",
"type": "probabilistic",
"param": 0.2
},
{
"operation": "op2",
"type": "probabilistic",
"param": 0.4
}
]
},
{
"service": "bar",
"type": "ratelimiting",
"param": 5
}
],
"default_strategy": {
"type": "probabilistic",
"param": 0.5
}
}
End
С помощью API OpenTracing можно легко реализовать функцию цепочки вызовов. Но видно, что из-за наличия различных клиентов основная нагрузка приходится на совместимость этих клиентов. Например, пулы потоков, SpringCloud, MQ, пулы соединений с базами данных и так далее.
Использование Aop может избавить вас от кода и вторжений, но управляемость будет меньше.
Затем мы добавляем функцию трассировки к простому вызову OkHttp+SpringBoot, который является распределенным приложением.