Праћење услуга, ОпенТрацинг и Јаегер

Праћење услуга, ОпенТрацинг и Јаегер

У нашим пројектима користимо микросервисну архитектуру. Када дође до уских грла у перформансама, много времена се троши на праћење и рашчлањивање дневника. Приликом евидентирања тајминга појединачних операција у датотеку евиденције, обично је тешко разумети шта је довело до позивања ових операција, да се прати редослед акција или временски помак једне операције у односу на другу у различитим услугама.

Да бисмо минимизирали ручни рад, одлучили смо да користимо један од алата за праћење. Како и за шта можете да користите праћење и како смо то урадили, биће речи у овом чланку.

Који проблеми се могу решити праћењем

  1. Пронађите уска грла у перформансама како унутар једне услуге, тако и у целом стаблу извршења између свих услуга које учествују. На пример:
    • Многи кратки узастопни позиви између услуга, на пример, геокодирању или бази података.
    • Дуга И/О чекања, као што је пренос података преко мреже или читање са диска.
    • Дуго рашчлањивање података.
    • Дуге операције које захтевају ЦПУ.
    • Делови кода који нису потребни за добијање коначног резултата и могу се уклонити или покренути одложено.
  2. Јасно схватите којим редоследом се зове и шта се дешава када се операција изврши.
    Праћење услуга, ОпенТрацинг и Јаегер
    Види се да је, на пример, Захтев дошао до ВС сервиса -> ВС сервис је допунио податке преко Р сервиса -> затим послао захтев В сервису -> В сервис је преузео доста података са Р сервис -> отишао на П сервис -> П сервис је поново отишао у сервис Р -> сервис В је игнорисао резултат и отишао у сервис Ј -> и тек онда вратио одговор сервису ВС, док је наставио да израчунава нешто друго у позадина.
    Без таквог трага или детаљне документације за цео процес, веома је тешко разумети шта се дешава када први пут погледате код, а код је разбацан по различитим сервисима и сакривен иза гомиле канти и интерфејса.
  3. Прикупљање информација о стаблу извршења за накнадну одложену анализу. У свакој фази извршења можете додати информације које су доступне у овој фази праћењу, а затим открити који су улазни подаци довели до таквог сценарија. На пример:
    • ИД корисник
    • prava
    • Тип изабране методе
    • Грешка у евиденцији или извршењу
  4. Претварање трагова у подскуп метрика и даља анализа у облику метрике.

Шта праћење може да евидентира. Спан

У праћењу постоји концепт распона, ово је аналог једног дневника на конзоли. Спан има:

  • Име, обично име методе која је извршена
  • Назив услуге у којој је генерисан распон
  • Сопствени јединствени ИД
  • Неке мета информације у облику кључа/вредности које су биле укључене у њих. На пример, параметри методе или да ли је метода завршена са грешком или не
  • Време почетка и завршетка овог распона извршења
  • ИД родитељског распона

Сваки распон се шаље у колектор распона да би се сачувао у бази података за касније гледање чим заврши своје извршење. У будућности можете да направите стабло свих распона тако што ћете их повезати преко ИД-а родитеља. Када анализирате, можете пронаћи, на пример, све распоне у некој услузи за које је било потребно више времена. Затим, прелазећи на одређени распон, видите цело дрво изнад и испод овог распона.

Праћење услуга, ОпенТрацинг и Јаегер

Опентраце, Јаггер и како смо то имплементирали за наше пројекте

Постоји заједнички стандард опентраце, који описује како и шта треба прикупити, без везивања праћењем за конкретну имплементацију на било ком језику. На пример, у Јави, сав рад са траговима се обавља преко заједничког Опентраце АПИ-ја, а испод њега се, на пример, може сакрити Јаегер или празна подразумевана имплементација која ништа не ради.
Ми користимо Стрелац као имплементација Опентраце-а. Састоји се од неколико компоненти:

Праћење услуга, ОпенТрацинг и Јаегер

  • Јаегер-агент је локални агент који је обично инсталиран на свакој машини и услуге су пријављене на њега на локалном подразумеваном порту. Ако нема агента, онда су трагови свих услуга на овој машини обично онемогућени
  • Јаегер-цоллецтор - сви агенти му шаљу прикупљене трагове, а он их ставља у изабрану базу података
  • База података – њихова преферирана је касандра, али ми користимо еластицсеарцх, постоје имплементације за неколико других база података и имплементација у меморији која ништа не чува на диску
  • Јаегер-куери је сервис који иде у базу података и враћа већ прикупљене трагове на анализу
  • Јаегер-уи је веб интерфејс за претрагу и преглед трагова, ради у јаегер-куери-у

Праћење услуга, ОпенТрацинг и Јаегер

Засебна компонента се може назвати опентраце јаегер имплементацијом за одређене језике, преко које се спанови шаљу јаегер-агенту.
Повезивање Јаггера у Јави своди се на имплементацију интерфејса ио.опентрацинг.Трацер, након чега ће сви трагови кроз њега летети до правог агента.

Праћење услуга, ОпенТрацинг и Јаегер

Такође можете повезати опружне компоненте опентрацинг-спринг-цлоуд-стартер и имплементација из Јегера опентрацинг-спринг-јаегер-цлоуд-стартер који ће аутоматски конфигурисати праћење за све што пролази кроз ове компоненте, на пример хттп захтеве контролерима, захтеви бази података преко јдбц итд.

Трагови пријављивања у Јаву

Негде на највишем нивоу мора да се креира први Спан, то се може урадити аутоматски, на пример помоћу контролера опруге када се добије захтев, или ручно ако га нема. Затим се преноси преко Сцопе испод. Ако неки метод у наставку жели да дода Спан, узима тренутни ацтивеСпан из Сцопе, креира нови Спан и каже да је његов родитељ примио АцтивеСпан, и чини нови Спан активним. Када се позову екстерни сервиси, тренутни активни распон се прослеђује њима, а те услуге креирају нове опсеге повезане са овим распоном.
Сав посао иде кроз инстанцу Трацера; можете га добити преко ДИ механизма или ГлобалТрацер.гет() као глобалне променљиве ако ДИ механизам не ради. Подразумевано, ако трагач није иницијализован, биће враћен НоопТрацер који ништа не ради.
Даље, тренутни опсег се добија из трацер-а преко СцопеМанагер-а, од тренутног се креира нови опсег са повезивањем новог опсега, а затим се креирани опсег затвара, чиме се креирани опсег затвара и враћа претходни опсег у активно стање. Опсег је везан за нит, тако да при вишенитном програмирању не смете заборавити да пренесете активни распон у другу нит, за даљу активацију опсега друге нити у односу на овај распон.

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)) {
                ...
            }
        });
    }
}

За програмирање са више нити, постоји и ТрацедЕкецуторСервице и слични омотачи који аутоматски прослеђују тренутни распон у нит када се извршавају асинхрони задаци:

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

За екстерне хттп захтеве постоји ТрацингХттпЦлиент

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

Проблеми са којима смо се суочили

  • Беанс и ДИ не раде увек ако се трацер не користи у сервису или компоненти Аутовиред Трацер можда неће радити и мораћете да користите ГлобалТрацер.гет().
  • Напомене не функционишу ако није компонента или услуга, или ако позив методе долази из суседне методе исте класе. Морате бити опрезни, проверити шта ради и користити ручно креирање праћења ако @Трацед не ради. Такође можете да приложите додатни компајлер за јава напомене, онда би требало да ради свуда.
  • У старом пролећном и пролећном покретању, аутоматска конфигурација опентраинг пролећног облака не ради због грешака у ДИ, онда ако желите да трагови у спринг компонентама раде аутоматски, можете то да урадите по аналогији са гитхуб.цом/опентрацинг-цонтриб/јава-спринг-јаегер/блоб/мастер/опентрацинг-спринг-јаегер-стартер/срц/маин/јава/ио/опентрацинг/цонтриб/јава/спринг/јаегер/стартер/ЈаегерАутоЦонфигуратион.јава
  • Пробајте са ресурсима не ради у гроови-у; морате користити три финалли.
  • Сваки сервис мора имати свој спринг.апплицатион.наме под којим ће се трагови евидентирати. Шта кажете на посебан назив за продају и тестирање, како их не бисте мешали.
  • Ако користите ГлобалТрацер и томцат, онда све услуге које раде у овом томцат-у имају један ГлобалТрацер, тако да ће све имати исто име услуге.
  • Када додајете трагове методи, морате бити сигурни да се не позива у петљи много пута. Потребно је да додате један заједнички траг за све позиве, који ће забележити укупно време рада. У супротном ће се створити вишак оптерећења.
  • Једном су у јаегер-уи-у поставили превелике захтеве за велики број трагова и, пошто нису чекали одговор, урадили су то поново. Као резултат тога, јаегер-куери је почео да једе много меморије и успорава еластичност. Помогло поновним покретањем јаегер-куери-а

Узорковање, чување и преглед трагова

Postoje tri vrste узорковање трагова:

  1. Цонст који шаље и чува све трагове.
  2. Вероватноћа која филтрира трагове са одређеном вероватноћом.
  3. Ратемитинг који ограничава број трагова у секунди. Ова подешавања можете да конфигуришете на клијенту, било на јаегер-агент-у или на колектору. Сада користимо цонст 1 у стеку процењивача пошто нема много захтева, али захтевају много времена. У будућности, ако ово непотребно оптерећује систем, можете га ограничити.

Ако користите касандру, она подразумевано чува трагове само два дана. Користимо еластична претрага а трагови се чувају за цело време и не бришу се. За сваки дан се креира посебан индекс, на пример јаегер-сервице-2019-03-04. У будућности ћете морати да конфигуришете аутоматско чишћење старих трагова.

Да бисте видели трагове потребно је:

  • Изаберите услугу према којој желите да филтрирате трагове, на пример томцат7-дефаулт за услугу која је покренута у Томцат-у и не може имати своје име.
  • Затим изаберите операцију, временски период и минимално време рада, на пример од 10 секунди, да бисте извршили само дуга извршавања.
    Праћење услуга, ОпенТрацинг и Јаегер
  • Идите на један од трагова и видите шта се тамо успорава.
    Праћење услуга, ОпенТрацинг и Јаегер

Такође, ако је неки ИД захтева познат, онда можете пронаћи траг по овом ИД-у кроз претрагу ознака, ако је овај ИД уписан у распону трага.

Записи

Чланци

Видео

Извор: ввв.хабр.цом

Додај коментар