Service Tracing, OpenTracing және Jaeger

Service Tracing, OpenTracing және Jaeger

Біз өз жобаларымызда микросервис архитектурасын қолданамыз. Өнімділік кедергілері орын алған кезде журналдарды бақылауға және талдауға көп уақыт жұмсалады. Жеке операциялардың уақыттарын журнал файлына тіркеген кезде, әдетте бұл операциялардың шақырылуына не себеп болғанын түсіну, әрекеттердің реттілігін немесе әртүрлі қызметтердегі бір операцияның екіншісіне қатысты уақыт ауысуын қадағалау қиын.

Қол еңбегін азайту үшін біз бақылау құралдарының бірін пайдалануды шештік. Бақылауды қалай және не үшін қолдануға болады және біз оны қалай жасадық, осы мақалада талқыланады.

Бақылау көмегімен қандай мәселелерді шешуге болады?

  1. Бір қызмет ішінде де, барлық қатысушы қызметтер арасындағы бүкіл орындау тармағы бойынша да өнімділік кедергілерін табыңыз. Мысалы:
    • Қызметтер арасындағы көптеген қысқа ретті қоңыраулар, мысалы, геокодтау немесе дерекқорға.
    • Желі арқылы деректерді тасымалдау немесе дискіден оқу сияқты ұзақ енгізу/шығару күтеді.
    • Ұзақ деректерді талдау.
    • Орталық процессорды қажет ететін ұзақ операциялар.
    • Түпкілікті нәтиже алу үшін қажет емес және жойылуы немесе кейінге қалдырылуы мүмкін код бөлімдері.
  2. Қандай ретпен шақырылатынын және операция орындалғанда не болатынын анық түсініңіз.
    Service Tracing, OpenTracing және Jaeger
    Мысалы, Сұраныс WS қызметіне келді -> WS қызметі R қызметі арқылы деректерді толықтырды -> содан кейін сұранысты V қызметіне жіберді -> V қызметі серверден көптеген деректерді жүктеп алды. R қызметі -> P қызметіне барды -> P қызметі R қызметіне қайта барды -> V нәтижені елемеді және J -> қызметіне өтті, содан кейін ғана WS қызметіне жауапты қайтарды, бұл ретте басқа нәрсені есептеуді жалғастырады. фон.
    Бүкіл процесс үшін мұндай із немесе егжей-тегжейлі құжаттамасыз, кодты бірінші рет қарағаннан кейін не болып жатқанын түсіну өте қиын, ал код әртүрлі қызметтерге шашыраңқы және көптеген бұршақтар мен интерфейстердің артына жасырылады.
  3. Кейінге қалдырылған талдау үшін орындау ағашы туралы ақпарат жинау. Орындаудың әрбір кезеңінде сіз осы кезеңде қол жетімді ақпаратты ізге қосып, содан кейін қандай кіріс деректері осындай сценарийге әкелгенін анықтай аласыз. Мысалы:
    • Қолданушының ID
    • Құқықтар
    • Таңдалған әдіс түрі
    • Журнал немесе орындау қатесі
  4. Жолдарды метриканың ішкі жиынына айналдыру және метрика түріндегі одан әрі талдау.

Қандай бақылау журналына жазылуы мүмкін. Аралық

Трассада аралық ұғымы бар, бұл консольге бір журналдың аналогы. Span бар:

  • Атау, әдетте орындалған әдістің атауы
  • Аралық жасалған қызмет атауы
  • Жеке идентификатор
  • Оған енгізілген кілт/мән түріндегі кейбір мета ақпарат. Мысалы, әдіс параметрлері немесе әдіс қатемен аяқталды ма, жоқ па
  • Осы аралықты орындаудың басталу және аяқталу уақыттары
  • Ата-аналық аралық идентификаторы

Әрбір аралық орындалуды аяқтағаннан кейін кейінірек қарау үшін дерекқорда сақтау үшін аралық коллекторына жіберіледі. Болашақта сіз оларды ата-ана идентификаторы арқылы қосу арқылы барлық аралықтардың ағашын құра аласыз. Талдау кезінде, мысалы, біраз уақыттан көп уақыт алған кейбір қызметтегі барлық аралықты табуға болады. Содан кейін белгілі бір аралыққа өтіп, осы аралықтың үстіндегі және астындағы бүкіл ағашты қараңыз.

Service Tracing, OpenTracing және Jaeger

Opentrace, Jagger және біз оны жобаларымызға қалай енгіздік

Ортақ стандарт бар Opentrace, ол қалай және нені жинау керектігін сипаттайды, кез келген тілдегі нақты іске асыруға ізімен байланбайды. Мысалы, Java тілінде іздермен барлық жұмыс жалпы Opentrace API арқылы жүзеге асырылады және оның астында жасыруға болады, мысалы, Jaeger немесе ештеңе жасамайтын бос әдепкі іске асыру.
Біз қолданамыз Джейгер Opentrace іске асыру ретінде. Ол бірнеше құрамдас бөліктерден тұрады:

Service Tracing, OpenTracing және Jaeger

  • Jaeger-агент әдетте әрбір құрылғыда орнатылатын жергілікті агент және қызметтер оған жергілікті әдепкі портта тіркеледі. Егер агент болмаса, бұл құрылғыдағы барлық қызметтердің іздері әдетте өшіріледі
  • Jaeger-коллектор - барлық агенттер оған жиналған іздерді жібереді және ол оларды таңдалған дерекқорға орналастырады.
  • Деректер базасы - олардың таңдаулысы кассандра, бірақ біз elasticsearch қолданамыз, бірнеше басқа дерекқорларға арналған іске асырулар және дискіге ештеңе сақтамайтын жадтағы іске асыру бар.
  • Jaeger-query - бұл дерекқорға кіретін және талдау үшін бұрыннан жиналған іздерді қамтамасыз ететін қызмет
  • Jaeger-ui - іздерді іздеуге және көруге арналған веб-интерфейс, ол jaeger-query-де жұмыс істейді

Service Tracing, OpenTracing және Jaeger

Жеке құрамдас белгілі бір тілдерге арналған opentrace jaeger іске асыру деп атауға болады, ол арқылы аралықтар jaeger-агентке жіберіледі.
Java тілінде Jagger қосылуы io.opentracing.Tracer интерфейсін енгізуге түседі, содан кейін ол арқылы барлық іздер нақты агентке ұшады.

Service Tracing, OpenTracing және Jaeger

Сондай-ақ, серіппелі компоненттерді қосуға болады opentracing-spring-cloud-starter және Jaeger компаниясынан жүзеге асыру opentracing-spring-jaeger-cloud-starter ол осы құрамдас бөліктер арқылы өтетін барлық нәрсе үшін бақылауды автоматты түрде конфигурациялайды, мысалы, контроллерлерге http сұраулары, jdbc арқылы дерекқорға сұраулар және т.б.

Java тіліндегі іздерді тіркеу

Жоғарғы деңгейде бір жерде бірінші Span жасалуы керек, мұны автоматты түрде орындауға болады, мысалы, сұрауды алған кезде серіппелі контроллер арқылы немесе егер жоқ болса, қолмен. Содан кейін ол төменде Scope арқылы жіберіледі. Төмендегі қандай да бір әдіс Span қосқысы келсе, ол Scope ішінен ағымдағы activeSpan алады, жаңа Span жасайды және оның ата-анасы activeSpan алғанын айтады және жаңа Span белсенді етеді. Сыртқы қызметтер шақырылғанда, ағымдағы белсенді аралықтар оларға беріледі және сол қызметтер осы аралыққа байланысты жаңа аралықтар жасайды.
Барлық жұмыс Tracer данасы арқылы өтеді; DI механизмі жұмыс істемесе, оны DI механизмі немесе GlobalTracer.get() арқылы жаһандық айнымалы ретінде алуға болады. Әдепкі бойынша, егер тресер инициализацияланбаған болса, NoopTracer қайтарылады, ол ештеңе жасамайды.
Әрі қарай, ағымдағы аумақ бақылаушыдан ScopeManager арқылы алынады, жаңа аумақ қосылған ағымдағыдан жаңа аумақ жасалады, содан кейін жасалған аумақ жабылады, ол жасалған аумақты жабады және алдыңғы аумақты белсенді күйге қайтарады. . Аумақ ағынмен байланыстырылған, сондықтан көп ағынды бағдарламалау кезінде осы аралыққа байланысты басқа ағынның Ауқымын одан әрі белсендіру үшін белсенді аралықты басқа ағынға тасымалдауды есте сақтау керек.

io.opentracing.Tracer tracer = ...; // GlobalTracer.get()

void DoSmth () {
   try (Scope scope = tracer.buildSpan("DoSmth").startActive(true)) {
      ...
   }
}
void DoOther () {
    Span span = tracer.buildSpan("someWork").start();
    try (Scope scope = tracer.scopeManager().activate(span, false)) {
        // Do things.
    } catch(Exception ex) {
        Tags.ERROR.set(span, true);
        span.log(Map.of(Fields.EVENT, "error", Fields.ERROR_OBJECT, ex, Fields.MESSAGE, ex.getMessage()));
    } finally {
        span.finish();
    }
}

void DoAsync () {
    try (Scope scope = tracer.buildSpan("ServiceHandlerSpan").startActive(false)) {
        ...
        final Span span = scope.span();
        doAsyncWork(() -> {
            // STEP 2 ABOVE: reactivate the Span in the callback, passing true to
            // startActive() if/when the Span must be finished.
            try (Scope scope = tracer.scopeManager().activate(span, false)) {
                ...
            }
        });
    }
}

Көп ағынды бағдарламалау үшін, сондай-ақ асинхронды тапсырмаларды орындау кезінде ағымдағы аралықты ағынға автоматты түрде жіберетін TracedExecutorService және ұқсас орауыштар бар:

private ExecutorService executor = new TracedExecutorService(
    Executors.newFixedThreadPool(10), GlobalTracer.get()
);

Сыртқы http сұраулары үшін бар TracingHttpClient

HttpClient httpClient = new TracingHttpClientBuilder().build();

Біз кездескен проблемалар

  • Бақылау құралы қызметте немесе құрамдас бөлікте пайдаланылмаса, бұршақ және DI әрқашан жұмыс істемейді Автоматты сым Tracer жұмыс істемеуі мүмкін және GlobalTracer.get() пайдалануыңыз керек.
  • Егер ол құрамдас немесе қызмет болмаса немесе әдіс шақыруы сол сыныптың көрші әдісінен келсе, аннотациялар жұмыс істемейді. Сақ болу керек, не жұмыс істейтінін тексеріңіз және @Traced жұмыс істемесе, қолмен із жасауды пайдаланыңыз. Сіз сондай-ақ java аннотациялары үшін қосымша компиляторды қоса аласыз, содан кейін ол барлық жерде жұмыс істеуі керек.
  • Ескі көктемде және көктемгі жүктеуде DI қателеріне байланысты көктемгі бұлтты автоматты конфигурациялау жұмыс істемейді, содан кейін көктемгі құрамдас бөліктердегі іздердің автоматты түрде жұмыс істеуін қаласаңыз, оны ұқсастығы бойынша жасауға болады. github.com/opentracing-contrib/java-spring-jaeger/blob/master/opentracing-spring-jaeger-starter/src/main/java/io/opentracing/contrib/java/spring/jaeger/starter/JaegerAutoConfiguration.java
  • Ресурстармен әрекет ету керемет түрде жұмыс істемейді; сіз try finally пайдалануыңыз керек.
  • Әрбір қызметте жолдар тіркелетін өзінің spring.application.name болуы керек. Сату мен тестілеудің бөлек атауына не қатысы бар, оларды араластырмас үшін.
  • Егер сіз GlobalTracer және tomcat қолданбаларын пайдалансаңыз, онда осы томкатта жұмыс істейтін барлық қызметтерде бір GlobalTracer болады, сондықтан олардың барлығында бірдей қызмет атауы болады.
  • Әдіске іздерді қосқанда, оның циклде көп рет шақырылмағанына сенімді болу керек. Барлық қоңыраулар үшін жалпы жұмыс уақытын жазатын бір жалпы ізді қосу керек. Әйтпесе, артық жүктеме пайда болады.
  • Jaeger-ui-де олар көп іздер үшін тым үлкен сұраулар жасады және олар жауап күтпегендіктен, оны қайтадан жасады. Нәтижесінде jaeger-query көп жадты жей бастады және серпімділікті баяулатады. jaeger-query қайта іске қосу арқылы көмектесті

Сынамаларды алу, сақтау және іздерді қарау

Үш түрі бар із сынамаларын алу:

  1. Барлық іздерді жіберетін және сақтайтын Const.
  2. Белгілі бір ықтималдықпен іздерді сүзетін ықтималдық.
  3. Секундына іздердің санын шектейтін бағалау. Бұл параметрлерді клиентте, не jaeger-агентте немесе коллекторда конфигурациялауға болады. Қазір бағалаушы стекінде const 1 қолданамыз, өйткені сұраулар көп емес, бірақ олар көп уақыт алады. Болашақта бұл жүйеге қажетсіз жүктеме түсірсе, оны шектей аласыз.

Кассандраны пайдалансаңыз, әдепкі бойынша ол іздерді тек екі күн сақтайды. Біз қолданамыз эластикалық ізденіс және іздер бүкіл уақыт бойы сақталады және жойылмайды. Әрбір күн үшін жеке индекс жасалады, мысалы jaeger-service-2019-03-04. Болашақта ескі іздерді автоматты түрде тазалауды конфигурациялау қажет.

Іздерді көру үшін сізге қажет:

  • Жолдарды сүзгіңіз келетін қызметті таңдаңыз, мысалы, Tomcat жүйесінде іске қосылған және өз атауы жоқ қызмет үшін tomcat7-әдепкі.
  • Әрі қарай, тек ұзақ орындалатын әрекеттерді қабылдау үшін операцияны, уақыт кезеңін және ең аз жұмыс уақытын таңдаңыз, мысалы, 10 секундтан.
    Service Tracing, OpenTracing және Jaeger
  • Іздердің біріне барып, онда не баяулағанын көріңіз.
    Service Tracing, OpenTracing және Jaeger

Сондай-ақ, егер кейбір сұрау идентификаторы белгілі болса, бұл идентификатор жолдың ауқымында тіркелген болса, тегтерді іздеу арқылы осы идентификатор бойынша ізді таба аласыз.

жазбалар

Мақалалар

Видео

  • www.youtube.com/watch?v=qg0ENOdP1Lo Біз Йегер мен Прометейді пайдаланушының жылдам сұрауларын жеткізу үшін қалай пайдаландық - Брайан Борхэм
  • www.youtube.com/watch?v=WRntQsUajow Кіріспе: Джегер - Юрий Шкуро, Убер және Павол Лоффай, Red Hat
  • www.youtube.com/watch?v=fsHb0qK37bc Сергей Яковлев, «Үлкен жеңістің шағын тарихы: OpenTracing, AWS және Jaeger»

Ақпарат көзі: www.habr.com

пікір қалдыру