Bir is icin, sentry’deki¹ trace’lerimizin tamamini indirmek, ve zaman icinde indirmeye devam edip guncel tutmak gerekti. Fakat API’leri² bunu kolaylastiracak sekilde tasarlanmamis.
Basit bir cozum urettim, su anda calisiyor. Alternatiflerle ilgili beyin firtinasi yapmak istedim, buraya yazayim dedim.
Trace listeleme API’si cok basit:
GET {org}/traces/ → Son 100 trace’i veriyor. Header’larda next/prev linki var³:
GET {org}/traces/?&cursor=0:100:0 → “Siradaki” 100 trace’i, yani son 101.~200. trace’i veriyor. Header’da next/prev var:
GET {org}/traces/?&cursor=0:200:0 → …
Gelen data bana ait olmadigi icin ornek veremeyecegim, fakat soyle ozetleyeyim:
Gunde 3-4 kere calisip son 8-6 saatteki trace’leri isleyecek bir script yazdim/gerekiyor.
Cozumleri kolaylastiracak seyler:
Her trace’in unique ID’si var
Her trace’in asagiya ve ileri sayfaya gittikce azalan timestamp’i var
Sayfa link’leri her zaman 0:N00:0 seklinde. Yani aslinda istenen bir sayfaya atlamak mumkun.
Hatta 0:X:0 ile X. ila X+99. siradaki trace’lere erismek mumkun
Geriye yonelik linkler var, ve 0:N00:1 seklindeler. “1” neye yariyor, anlamadim.
Linklerin yaninda sayfanin bos olup olmadigi da veriliyor.
Cozumleri zorlastiracak seyler:
Cok sayfa var. Su aralar 1000 tane filan. Bastan sonra gitmesi yarim saati bulabiliyor.
Yeni trace’ler olustukca sayfalarin kaydigini varsayiyorum.
Akliniza guzel cozumler geliyor mu?
1: Evet, o firma. Link vermek istemedim.
2: Aslinda “api documentation” diye aratinca cikiyor.
3: API dokumentasyonunda “Paginating Results” diye bir kisim var
Öncelikle belirtmek isterim sentry’e hakim değilim. Konunuz üzerine biraz dokümantasyon incelemesi yaptım.
anladığım kadarı ile sentry cursor bazlı sayfalama yapıyor. Döndüğü cursor A:B:C tamamen opak yapıda, position:offset:direction pointerlari anlamında verilmiş ama semantik bir veri yapısı ifade etmiyor. Kullanıcı prev ve next page cursorlarını kullanmalı. Manuel cursor oluşturmak bizi istediğimiz sonuca ulaştırmayacak buna dikkat etmek gerek. Github issueları biraz tararsan bu konu baya tartısılmış
?&cursor=0:100:0 buradaki cursor her zaman bize sentry’nin verdiği cursor olmalı. Bunu manuel olarak yazmak bizi doğru veri setine götürmeyecek. Zaten bu kısmı fark etmişsinizdir.
belki ihtiyacınız olan şey Search ?query kısmı olabilir. Belirli bir takım trace’i ön eleyebilirsiniz.
Bütün verileri tüketmek için
initial isteği at
next cursoru varsa cursor ile tekrarlamaya devam et
dönen bütün sonuçları bir öncekinin önüne append et
100 trace’in boyutu ne kadar? Acaba daha fazla sayıda çekmek hatta hepsini çekmek mümkün mü diye düşündüm, daha basit olurdu. Mesela günde bir çalışıp 24 saatlik veriyi çekemez mi, çok mu büyük olur veri boyutu? Bu arada API ile zamana göre trace getirilebiliyor mu?
Cursor bazlı bir pagination yapısı kullanmışlar.
Her endpoint sabit bir limit/offset değil, tamamen cursor token üzerinden ilerliyor.
Bu yüzden:
Toplam kaç kayıt olduğu
Kaç sayfa olduğu
Son sayfa numarası gibi bilgiler response içerisinde gelmiyor.
Sadece varsa:
next_cursor
previous_cursor
alanları dönüyor.
Yani pagination modeli sadece “ileri/geri devam edebiliyorsan et” şeklinde çalışıyor.
Filtreleme açısından neyseki belirli bir zaman aralığı, belirli trace tipleri, belirli severity’ler için filtreler gönderebiliyorsun.
API sana sadece “devam edebilirsin” diyor, sayfa sayısı veya toplam entry bilgisi vermiyor.
Benim yukarıda oluşturmak istediğim çözüm de aslında sizin yaklaşımınıza oldukça benzerdi:
Tüm API’yi cursor bitene kadar tüket
Gelen her sayfayı — sırayla — tek bir dosyaya append et
En azından son gelen veri en üstte olacak şekilde birleşik bir çıktı elde edilebilir. Ben olsam böyle yapardım, Bunu bir cron’a bağlayıp belli aralıklarla çalıştırtırdım.
Cursor {cursor_id}:{offset}:{direction} yapisinda diye okudugumu hatirliyorum ama nerede, bulamadim. Neyse, yukarida da yazdigim gibi pratikte 0:X:0 olarak kullanilabiliyor. (Veya en azindan 0:{sayfa}00:0)
Yazdigim script’in calisma mantigi basit: last_trace_id Tut. Her sefer: Ilk sayfadan basla, son trace’i gorene kadar gorulen butun ID’leri kaydet. Sonuncuyu gordugunde, kayitli ID’leri tersten islemeye basla. Islenen her ID sonunda last_trace_id’yi update et. Ikinci fazda interrupt edilebilen/kaldigi yerden devam edebilen, yavastan hizliya giden basit bir yontem. Sayfalari ileriye dogru takip ettigi icin kaymalar da sorun olusturmuyor. (Gerekirse ID’ler de-duplike edilebilir)
Son trace’i bulmak icin de basit bir binary search yazmistim, ama zaten ona giden butun sayfalari islemek gerektigi icin pratikte cok ise yaramiyor. Soyle kullaniyorum:
Listeyi sifirdan islemem gerektiginde binary search’u calistirip, son trace’in ID’sini kaydedip sayfa numarasini buluyorum, sonra ondan 100 sayfa oncesinden baslayip calistiriyorum, sonra ondan 100 sayfa oncesinden baslayip tekrar calistiriyorum, vs. ta ki 0’dan baslayana kadar. Aslinda bu kismi automate etmek mantikli olabilir.
Cok kucuk; onlarca KB. Asil sorun latency: Cevap almak saniyeler suruyor
Su anda yukaridaki “bilinen sonuncuya gelene kadar ilerle” algoritmasini 12 saatte bir calistiriyorum. Eksik veriyi kolayca yakaliyor.
Oyle bir endpoint goremedim
Bu script kimin icin?
Hangi modelden nasil prompt’larla urettiginizi yazsaniz okuyanlara daha cok fayda saglar sanki.