Кызматты көзөмөлдөө, OpenTracing жана Jaeger

Кызматты көзөмөлдөө, OpenTracing жана Jaeger

Биз долбоорлорубузда микросервис архитектурасын колдонобуз. Иштин майнаптуулугу пайда болгондо, журналдарды көзөмөлдөө жана талдоо үчүн көп убакыт сарпталат. Жеке операциялардын убакыттарын журнал файлына киргизгенде, адатта, бул операциялардын чакырылышына эмне себеп болгонун түшүнүү, ар кандай кызматтарда аракеттердин ырааттуулугун же бир операциянын экинчисине салыштырмалуу убакыттын жылышына көз салуу кыйынга турат.

Кол эмгегин азайтуу үчүн биз калька куралдарынын бирин колдонууну чечтик. Кантип жана эмне үчүн сиз издөөнү колдонсоңуз болот жана биз муну кантип жасаганбыз жана бул макалада талкууланат.

Издөө менен кандай көйгөйлөрдү чечсе болот

  1. Бир кызматтын ичинде да, бардык катышуучу кызматтардын ортосундагы бүтүндөй аткаруу дарагында да майнаптуу тоскоолдуктарды табыңыз. Мисалы:
    • Кызматтардын ортосунда, мисалы, геокодго же маалымат базасына көптөгөн кыска ырааттуу чалуулар.
    • Тармактык которуулар же дискти окуу сыяктуу узакка созулган киргизүү/чыгаруу күтөт.
    • Узак маалымат талдоо.
    • CPU талап кылган узак операциялар.
    • Акыркы жыйынтыкты алуу үчүн талап кылынбаган жана алынып салынышы же кечиктирилиши мүмкүн болгон коддун бөлүмдөрү.
  2. Кандай ырааттуулукта эмне деп аталарын жана операция жасалганда эмне болоорун так түшүнүңүз.
    Кызматты көзөмөлдөө, OpenTracing жана Jaeger
    Көрсө болот, мисалы, Сурам WS кызматына келди -> WS кызматы R кызматы аркылуу маалыматтарды кошту -> андан кийин V кызматына суроо-талап жөнөттү -> V кызматы Rден көп маалыматтарды жүктөдү. кызмат -> Р кызматына кетти -> P кызматы кайрадан R кызматына кетти -> кызмат V натыйжаны этибарга албай, J -> кызматына кетти жана андан кийин гана WS кызматына жооп кайтарды, ошол эле учурда башка нерсени эсептөөнү улантууда. фон.
    Бүт процесс үчүн мындай из жок же деталдуу документтерсиз, кодду биринчи жолу караганыңызда эмне болуп жатканын түшүнүү абдан кыйын жана код ар кандай кызматтарга чачырап, бир топ кутулардын жана интерфейстердин артына катылган.
  3. Кийинки кийинкиге калтырылган талдоо үчүн аткаруу дарагы жөнүндө маалыматтарды чогултуу. Аткаруу процессинин ар бир этабында сиз бул этапта жеткиликтүү болгон изиге маалыматты кошуп, андан кийин кандай киргизилген маалыматтар окшош сценарийге алып келгенин аныктай аласыз. Мисалы:
    • Колдонуучунун ID
    • укуктары
    • Тандалган ыкманын түрү
    • Журнал же аткаруу катасы
  4. Издерди метрикалардын бир бөлүгүнө айландыруу жана андан ары анализдөө метрика түрүндө.

Кандай из каттай алат. Span

Издөөдө аралык деген түшүнүк бар, бул консолго бир журналдын аналогу. СПА төмөнкүлөргө ээ:

  • Аты, эреже катары, аткарылган ыкманын аталышы
  • Аралыгы түзүлгөн кызматтын аталышы
  • Өз уникалдуу ID
  • Ага кирген ачкыч/маани түрүндөгү кандайдыр бир мета маалымат. Мисалы, ыкманын параметрлери же метод ката менен аяктады же жок
  • Бул аралыктын башталышы жана бүтүшү убакыттары
  • Ата-эненин идентификатору

Ар бир спам, аткарылышын аяктагандан кийин, кийинчерээк карап чыгуу үчүн маалымат базасында сакталуу үчүн спам жыйноочуга жөнөтүлөт. Келечекте сиз ата-эне идентификатору менен туташтыруу менен бардык аралыктагы даракты кура аласыз. Талдоодо сиз, мисалы, бир нече убакыттан ашык убакытты талап кылган кээ бир кызматтын бардык аралыгын таба аласыз. Андан ары, белгилүү бир аралыкка баруу менен, бул аралыктын үстүндө жана астындагы бүт даракты караңыз.

Кызматты көзөмөлдөө, OpenTracing жана Jaeger

Opentrace, Jagger жана аны долбоорлорубуз үчүн кантип ишке ашырганбыз

Жалпы стандарт бар opentrace, кандайча жана эмнени чогултуу керектигин сүрөттөп, кандайдыр бир тилде белгилүү бир ишке ашырууга байланбастан. Мисалы, Java-да издер менен иштөө жалпы Opentrace API аркылуу ишке ашырылат жана анын астында, мисалы, Jaeger же эч нерсе кылбаган бош демейки ишке ашыруу жашырылышы мүмкүн.
Биз колдонуп жатабыз Джагер Opentrace ишке ашыруу катары. Ал бир нече компоненттерден турат:

Кызматты көзөмөлдөө, OpenTracing жана Jaeger

  • Jaeger-агент, адатта, ар бир машинада орнотулган жергиликтүү агент болуп саналат жана кызматтар ага жергиликтүү демейки порт аркылуу кирет. Эгерде агент жок болсо, анда бул машинадагы бардык кызматтардын издери адатта өчүрүлөт
  • Jaeger-жыйноочу - бардык агенттер ага чогултулган издерди жөнөтөт жана аларды тандалган маалымат базасына киргизет
  • Маалыматтар базасы алардын жактырган кассандрасы, бирок биз elasticsearch колдонобуз, бир нече башка маалымат базалары үчүн ишке ашыруулар жана дискке эч нерсени сактабаган эстутумдагы ишке ашыруу бар.
  • Jaeger-суроо - бул маалымат базасына барып, талдоо үчүн буга чейин чогултулган издерди кайтарып турган кызмат
  • Jaeger-ui - издөө жана издер көрүү үчүн веб-интерфейс, ал jaeger-queryге барат

Кызматты көзөмөлдөө, OpenTracing жана Jaeger

Өзүнчө компонентти конкреттүү тилдер үчүн opentrace jaegerди ишке ашыруу деп атоого болот, ал аркылуу spans jaeger-агентке жөнөтүлөт.
Java менен Jagger туташтыруу io.opentracing.Tracer интерфейсин ишке ашырууга келет, андан кийин ал аркылуу бардык издер чыныгы агентке учуп кетет.

Кызматты көзөмөлдөө, OpenTracing жана Jaeger

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

Java'да кирүүнүн издери

Жогорку деңгээлдеги бир жерде биринчи Span түзүлүшү керек, бул автоматтык түрдө аткарылышы мүмкүн, мисалы, суроо-талап түшкөндө пружиналык контроллер тарабынан же жок болсо кол менен. Андан кийин ал төмөндөгү чөйрө аркылуу өткөрүлүп берилет. Эгерде төмөндөгү кайсы бир ыкма Span кошууну кааласа, ал учурдагы ActiveSpanды Scopeдон алып, жаңы Span түзөт жана анын ата-энеси натыйжада activeSpan экенин айтат жана жаңы Spanды активдүү кылат. Тышкы кызматтарга чалганда, учурдагы активдүү аралыгы аларга өткөрүлүп берилет жана ал кызматтар ушул аралыкка шилтеме кылуу менен жаңы аралыктарды түзөт.
Бардык иш Tracer инстанциясы аркылуу өтөт, сиз аны DI механизми же GlobalTracer.get () аркылуу глобалдык өзгөрмө катары ала аласыз, эгерде DI механизми иштебесе. Демейки боюнча, эгерде трекер инициализацияланбаган болсо, 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 аннотациялары үчүн кошумча компиляторду тиркөөгө болот, анда алар бардык жерде иштеши керек.
  • Эски жазда жана жазгы жүктөөдө, opentraing жазгы булуттун автоконфигурациясы 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
  • Ресурстар менен аракет кылуу анчалык деле иштебейт, акыры аракет кылуу керек.
  • Ар бир кызматтын өзүнүн spring.application.name болушу керек, анын астында издер жазылат. Аларга чогуу тоскоол болбош үчүн, сатуу жана сыноо үчүн өзүнчө ат эмне кылат.
  • Эгер сиз GlobalTracer жана tomcat колдонсоңуз, анда бул tomcatта иштеген бардык кызматтарда бир GlobalTracer бар, ошондуктан алардын бардыгы бирдей кызмат атына ээ болот.
  • Методго издерди кошууда, циклде ал көп жолу чакырылбаганына ынануу керек. Бардык чалуулар үчүн жалпы иш убактысын кепилдеген бир жалпы изди кошуу зарыл. Болбосо, ашыкча жүк түзүлөт.
  • Бир жолу жаэгер-уиде, ото чоц суроо-талаптар коп сандаган изи учун жасалган жана алар жооп кутпегендуктен, кайра кайталашты. Натыйжада, jaeger-query эстутум көп жеп, ийкемдүүлүктү жайлай баштады. jaeger-query кайра иштетүү аркылуу жардам берди

Издерди үлгү алуу, сактоо жана көрүү

Үч түрү бар үлгү алуу издери:

  1. Const бардык издерди жөнөтөт жана сактайт.
  2. Белгилүү бир ыктымалдуулук менен издерди чыпкалай турган ыктымалдык.
  3. Секундадагы издердин санын чектеген Ratelimiting. Сиз бул орнотууларды кардарда, же jaeger-агентте же коллектордо конфигурациялай аласыз. Азыр биз баалоочу стекте const 1ди колдонобуз, анткени сурамдар көп эмес, бирок алар көп убакытты талап кылат. Келечекте бул системага ашыкча жүк алып келсе, аны чектей аласыз.

Эгер сиз кассандраны колдонсоңуз, анда демейки боюнча ал издерди эки күн гана сактайт. Биз колдонуп жатабыз ElasticSearch жана издер бардык убакытка сакталат жана жок кылынбайт. Ар бир күн үчүн өзүнчө индекс түзүлөт, мисалы jaeger-service-2019-03-04. Келечекте эски издерди автоматтык түрдө тазалоону конфигурациялашыңыз керек.

Издерди көрүү үчүн сизге керек:

  • Издерди чыпкалоону каалаган кызматты тандаңыз, мисалы, tomcat'та иштеп жаткан жана өзүнүн аты болушу мүмкүн эмес кызмат үчүн tomcat7-default.
  • Андан кийин операцияны, убакыт аралыгын жана минималдуу иштөө убактысын тандаңыз, мисалы, 10 секунддан баштап, узак аткарууларды гана кабыл алыңыз.
    Кызматты көзөмөлдөө, OpenTracing жана Jaeger
  • Издердин бирине барып, ал жерде эмне жайлап жатканын көр.
    Кызматты көзөмөлдөө, OpenTracing жана Jaeger

Ошондой эле, эгер кандайдыр бир сурам идентификатору белгилүү болсо, анда сиз бул id боюнча изди тег издөө аркылуу таба аласыз, эгерде бул id трассада катталган болсо.

жазуулар

Макалалар

Видео

Source: www.habr.com

Комментарий кошуу