Xidmət İzləmə, OpenTracing və Jaeger

Xidmət İzləmə, OpenTracing və Jaeger

Layihələrimizdə mikroservis arxitekturasından istifadə edirik. Performans darboğazları yarandıqda, logların monitorinqinə və təhlilinə çox vaxt sərf olunur. Fərdi əməliyyatların vaxtlarını jurnal faylına daxil edərkən, bu əməliyyatların çağırılmasına nəyin səbəb olduğunu başa düşmək, müxtəlif xidmətlərdə hərəkətlərin ardıcıllığını və ya bir əməliyyatın digərinə nisbətən vaxt dəyişikliyini izləmək adətən çətindir.

Əl əməyini minimuma endirmək üçün izləmə vasitələrindən birini istifadə etmək qərarına gəldik. İzləmədən necə və niyə istifadə edə biləcəyiniz və bunu necə etdiyimiz haqqında və bu məqalədə müzakirə olunacaq.

İzləmə ilə hansı problemləri həll etmək olar

  1. Həm bir xidmət daxilində, həm də bütün iştirak edən xidmətlər arasında bütün icra ağacında performans darboğazlarını tapın. Misal üçün:
    • Xidmətlər arasında bir çox qısa ardıcıl zənglər, məsələn, coğrafi kodlaşdırma və ya verilənlər bazası.
    • Şəbəkə köçürmələri və ya disk oxunması kimi uzun I/O gözləmələri.
    • Uzun məlumat təhlili.
    • CPU tələb edən uzun əməliyyatlar.
    • Son nəticəni əldə etmək üçün lazım olmayan və silinə və ya gecikdirilə bilən kod bölmələri.
  2. Hansı ardıcıllıqla nə adlandığını və əməliyyat həyata keçirildikdə nə baş verdiyini aydın şəkildə anlayın.
    Xidmət İzləmə, OpenTracing və Jaeger
    Görünür ki, məsələn, Sorğu WS xidmətinə gəldi -> WS xidməti R xidməti vasitəsilə məlumatları əlavə etdi -> sonra V xidmətinə sorğu göndərdi -> V xidməti serverdən çoxlu məlumat yüklədi. R xidməti -> P xidmətinə getdi -> P xidməti yenidən xidmətə getdi R -> xidmət V nəticəyə məhəl qoymadı və xidmətə getdi J -> və yalnız bundan sonra WS xidmətinə cavab qaytardı, başqa bir şey hesablamağa davam etdi. fon.
    Bütün proses üçün belə bir iz və ya ətraflı sənədlər olmadan, koda ilk dəfə baxarkən nə baş verdiyini başa düşmək çox çətindir və kod müxtəlif xidmətlər arasında səpələnmiş və bir dəstə qutu və interfeys arxasında gizlənmişdir.
  3. Sonradan təxirə salınmış təhlil üçün icra ağacı haqqında məlumatların toplanması. İcranın hər mərhələsində siz bu mərhələdə mövcud olan izə məlumat əlavə edə və sonra hansı giriş məlumatlarının oxşar ssenariyə səbəb olduğunu anlaya bilərsiniz. Misal üçün:
    • İstifadəçi adı
    • Hüquqlar
    • Seçilmiş metodun növü
    • Giriş və ya icra xətası
  4. İzləri metriklərin alt çoxluğuna çevirmək və artıq metriklər şəklində əlavə təhlil.

Hansı iz daxil ola bilər. Qarış

İzləmədə aralıq anlayışı var, bu, konsolun bir logun analoqudur. Spada var:

  • Ad, adətən icra edilən metodun adı
  • Aralığın yaradıldığı xidmətin adı
  • Öz unikal ID
  • Daxil edilmiş açar/dəyər şəklində bir növ meta məlumat. Məsələn, metod parametrləri və ya metod xəta ilə bitib ya yox
  • Bu aralıq üçün başlanğıc və bitmə vaxtları
  • Valideyn span ID

Hər bir span icrasını başa vurduqdan sonra sonra nəzərdən keçirmək üçün verilənlər bazasında saxlanmaq üçün span kollektoruna göndərilir. Gələcəkdə valideyn identifikatoru ilə birləşdirərək bütün aralıqların ağacını qura bilərsiniz. Təhlil edərkən, məsələn, bəzi xidmətlərdə bir müddətdən çox vaxt aparan bütün aralıqları tapa bilərsiniz. Bundan əlavə, müəyyən bir aralığa keçərək, bu aralığın üstündə və altındakı bütün ağaca baxın.

Xidmət İzləmə, OpenTracing və Jaeger

Opentrace, Jagger və bunu layihələrimiz üçün necə həyata keçirdiyimiz

Ümumi standart var açıq iz, hər hansı bir dildə xüsusi bir tətbiqi izləməklə bağlı olmadan necə və nəyin toplanacağını təsvir edir. Məsələn, Java-da izlərlə bütün işlər ümumi Opentrace API vasitəsilə həyata keçirilir və onun altında, məsələn, Jaeger və ya heç bir şey etməyən boş bir standart tətbiq gizlənə bilməz.
istifadə edirik Jaeger Opentrace tətbiqi kimi. Bir neçə komponentdən ibarətdir:

Xidmət İzləmə, OpenTracing və Jaeger

  • Jaeger-agent adətən hər maşında quraşdırılan yerli agentdir və xidmətlər yerli standart portda daxil edilir. Heç bir agent yoxdursa, bu maşındakı bütün xidmətlərin izləri ümumiyyətlə söndürülür
  • Jaeger-kollektor - bütün agentlər toplanmış izləri ona göndərir və onları seçilmiş verilənlər bazasına qoyur.
  • Verilənlər bazası onların üstünlük verdiyi kassandradır, lakin biz elasticsearch-dan istifadə edirik, bir neçə başqa verilənlər bazası üçün tətbiqlər və diskə heç nə saxlamayan yaddaşdaxili tətbiqetmə var.
  • Jaeger-query verilənlər bazasına gedən və analiz üçün artıq toplanmış izləri qaytaran xidmətdir
  • Jaeger-ui izləri axtarmaq və görmək üçün veb interfeysdir, o, jaeger-query-ə gedir

Xidmət İzləmə, OpenTracing və Jaeger

Ayrı bir komponenti spesifik dillər üçün opentrace jaeger-in tətbiqi adlandırmaq olar, bunun vasitəsilə spanlar jaeger-agentə göndərilir.
Java-da Jagger-i birləşdirin io.opentracing.Tracer interfeysini tətbiq etməyə gəlir, bundan sonra onun vasitəsilə bütün izlər real agentə uçacaq.

Xidmət İzləmə, OpenTracing və Jaeger

Yay komponenti üçün də qoşula bilərsiniz opentracing-bahar-bulud-başlanğıc və Jaeger tərəfindən həyata keçirilir opentracing-spring-jaeger-cloud-starter bu komponentlərdən keçən hər şey üçün izləməni avtomatik konfiqurasiya edəcək, məsələn, nəzarətçilərə http sorğuları, jdbc vasitəsilə verilənlər bazasına sorğular və s.

Java-da giriş izləri

Üst səviyyədə bir yerdə, ilk Span yaradılmalıdır, bu avtomatik olaraq edilə bilər, məsələn, sorğu qəbul edildikdə yay nəzarətçisi tərəfindən və ya heç biri yoxdursa əl ilə. Daha sonra aşağıdakı Əhatə dairəsi vasitəsilə ötürülür. Aşağıdakı üsullardan hər hansı biri Span əlavə etmək istəsə, o, Scope-dan cari activeSpan-ı götürür, yeni Span yaradır və onun əsas hissəsinin nəticədə aktivSpan olduğunu bildirir və yeni Span-ı aktiv edir. Xarici xidmətlərə zəng edilərkən, cari aktiv span onlara ötürülür və həmin xidmətlər bu aralığa istinad edərək yeni spanlar yaradır.
Bütün işlər Tracer instansiyasından keçir, siz onu DI mexanizmi və ya DI mexanizmi işləmədiyi təqdirdə qlobal dəyişən kimi GlobalTracer.get () vasitəsilə əldə edə bilərsiniz. Varsayılan olaraq, əgər izləyici işə salınmayıbsa, NoopTracer geri qayıdacaq və heç bir şey olmayacaq.
Bundan əlavə, cari əhatə dairəsi ScopeManager vasitəsilə izləyicidən əldə edilir, yeni əhatə dairəsi ilə mövcud olandan yeni əhatə dairəsi yaradılır və sonra yaradılmış əhatə dairəsi bağlanır, bu da yaradılmış əhatə dairəsini bağlayır və əvvəlki əhatə dairəsini qaytarır. aktiv vəziyyət. Əhatə dairəsi bir iplə bağlıdır, buna görə də çox yivli proqramlaşdırma zamanı, bu span ilə əlaqəli başqa bir mövzunun əhatə dairəsini daha da aktivləşdirmək üçün aktiv aralığı başqa bir ipə köçürməyi unutmamalısınız.

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

Çox yivli proqramlaşdırma üçün, həmçinin asinxron tapşırıqlar işə salındıqda cari aralığı avtomatik olaraq ipə yönləndirən TracedExecutorService və oxşar sarğılar da mövcuddur:

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

Xarici http sorğuları üçün var TracingHttpClient

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

Qarşılaşdığımız problemlər

  • İzləyici bir xidmətdə və ya komponentdə istifadə olunmursa, lobya və DI həmişə işləmir Avtomatik simli Tracer işləməyə bilər və siz GlobalTracer.get() istifadə etməli olacaqsınız.
  • Əgər bu komponent və ya xidmət deyilsə və ya metod eyni sinifin qonşu metodundan çağırılsa, annotasiyalar işləmir. Nə işlədiyini yoxlamaq üçün diqqətli olmalısınız və @Traced işləmirsə, əl ilə iz yaratma istifadə edin. Siz həmçinin java annotasiyaları üçün əlavə kompilyator əlavə edə bilərsiniz, onda onlar hər yerdə işləməlidir.
  • Köhnə yaz və yay çəkmələrində, DI-dəki səhvlərə görə opentraing yay buludunun avtomatik konfiqurasiyası işləmir, onda yay komponentlərindəki izlərin avtomatik işləməsini istəyirsinizsə, bunu analoqla edə bilərsiniz. 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
  • Resurslarla sınayın groovy işləmir, siz nəhayət cəhd istifadə etməlisiniz.
  • Hər bir xidmətin öz spring.application.name olmalıdır, onun altında izlər qeyd olunacaq. Satış və test üçün ayrı bir ad nə edir ki, bunlara birlikdə qarışmasın.
  • Əgər siz GlobalTracer və Tomcat istifadə edirsinizsə, onda bu tomcat-da işləyən bütün xidmətlərdə bir GlobalTracer var, ona görə də onların hamısı eyni xidmət adına malik olacaq.
  • Bir metoda izlər əlavə edərkən, onun bir döngədə çox dəfə çağırılmadığından əmin olmaq lazımdır. Bütün zənglər üçün ümumi iş vaxtına zəmanət verən bir ümumi iz əlavə etmək lazımdır. Əks halda, artıq yük yaranacaq.
  • Bir dəfə jaeger-ui-də çoxlu sayda izlər üçün çox böyük sorğular edildi və onlar cavab gözləmədikləri üçün bunu yenidən etdilər. Nəticədə, jaeger-query çox yaddaş yeməyə və elastikliyi yavaşlamağa başladı. jaeger-query-ni yenidən başlatmaqla kömək etdi

Nümunə götürmə, saxlama və izlərə baxmaq

Üç növ var nümunə izləri:

  1. Bütün izləri göndərən və saxlayan Const.
  2. Bəzi verilmiş ehtimalla izləri süzgəcdən keçirən ehtimal.
  3. Saniyədə izlərin sayını məhdudlaşdıran Ratelimiting. Siz bu parametrləri müştəridə, ya jaeger-agentdə və ya kollektorda konfiqurasiya edə bilərsiniz. İndi biz qiymətləndirici yığınında const 1-dən istifadə edirik, çünki sorğular çox deyil, lakin onlar çox vaxt aparır. Gələcəkdə bu sistemə həddindən artıq yük verəcəksə, onu məhdudlaşdıra bilərsiniz.

Cassandra istifadə etsəniz, standart olaraq izləri yalnız iki gün saxlayır. istifadə edirik elastik tədqiqat və izlər hər zaman saxlanılır və silinmir. Hər gün üçün ayrıca indeks yaradılır, məsələn jaeger-service-2019-03-04. Gələcəkdə köhnə izlərin avtomatik təmizlənməsini konfiqurasiya etməlisiniz.

İzləri görmək üçün sizə lazımdır:

  • İzləri süzgəcdən keçirmək istədiyiniz xidməti seçin, məsələn, tomcat-da işləyən və öz adı ola bilməyən xidmət üçün tomcat7-default.
  • Sonra əməliyyatı, vaxt intervalını və minimum əməliyyat müddətini, məsələn, 10 saniyədən başlayaraq, yalnız uzun icraları yerinə yetirmək üçün seçin.
    Xidmət İzləmə, OpenTracing və Jaeger
  • İzlərdən birinə gedin və orada nəyin yavaşladığını görün.
    Xidmət İzləmə, OpenTracing və Jaeger

Həmçinin, əgər bəzi sorğu id-si məlumdursa, bu id izləmə aralığında daxil olubsa, teq axtarışı vasitəsilə bu id ilə iz tapa bilərsiniz.

Documentation

Məqalələr

video

Mənbə: www.habr.com

Добавить комментарий