Örnekleme
Trace'lerin bir kısmını tutmak, her birinin bir kısmını tutmadan.
Karar bir kez, kökte verilir
Bir trace bütün olarak tutulur veya bütün olarak düşürülür. Karar, kök span başladığında verilir ve her alt span tarafından devralınır, yani bir çalıştırma hiçbir zaman yarım kaydedilmez.
Geri kalan her şey bu kuraldan çıkar. Span'lerinin rastgele %30'u eksik olan bir trace, örneklenmiş bir trace gibi okunmaz. Gözlemlediğiniz sistemdeki bir hata gibi okunur: hiç olmamış görünen bir araç çağrısı, ebeveyni olmayan bir model çağrısı, geri getirmenin olması gereken yerde bir boşluk. Boşluğun ajanınız değil gözlemlenebilirlik aracınız olduğunu anlayana kadar bir öğleden sonranızı buna verirsiniz.
Varsayılan her şeyi tutar
Örnekleme yapılandırılmadığında politika always olur ve hacim
aksini söyleyene kadar doğru varsayılan budur. Örnekleme, okumak
isteyeceğiniz çalıştırmayı gözden çıkarır. Bunu yalnızca depolama veya bant
genişliği sizi zorladığında ödeyin.
Beş strateji
| Strateji | Davranış |
|---|---|
always | Her şeyi tutar. Varsayılan. |
never | Hiçbir şey tutmaz. |
ratio | Sabit bir kesir tutar; kesir, trace başına bir kez kökte rastgele çekilir. |
deterministic | Sabit bir kesir tutar; karar trace kimliği özetlenerek verilir. Her collector, başka hiçbiriyle konuşmadan aynı yanıta ulaşır. |
tail | Kararı trace bitene kadar erteler, sonra oran ne derse desin her hatayı ve her yavaş çalıştırmayı tutar. |
Oran ayarlamak
--sample veya MCPD_SAMPLE, 0.0 ile 1.0 arasında bir
kesir alır ve deterministik stratejiyi yapılandırır. Bu aralığın dışındaki
bir değer, ne verdiğinizi adlandıran bir iletiyle daemon'u açılışta durdurur.
Değeri aralığa kırpmaz, çünkü sessizce 1.0'a dönüşen yanlış yazılmış bir
oran bir ay sonra depolama faturasından fark edilir.
on trace'ten birini tut
mcpd --sample 0.1
Her SDK aynı kesri okur: istemci yapılandırmasında sample,
ortamda MCPD_SAMPLE. İstemcide örneklemek daha ucuzdur:
örneklenmemiş bir span hiç kuyruğa alınmaz ve hiç dışa aktarılmaz, yani hiç
bant genişliği harcamaz. Daemon'da örneklemek size gidiş dönüşe mal olur ama
oranı tek bir yerde tutar; bir düzine servis tek bir örneğe rapor
verdiğinde istediğiniz şey budur.
Beş stratejiden daemon always ve deterministic
stratejilerine ulaşır: --sample ve yapılandırma dosyasındaki
bir projenin sample değeri, ikisi de deterministic stratejiyi
ayarlar. never, ratio ve tail
politika türünde uygulanmıştır, ama bu yapıda ne bir seçenekten ne de
yapılandırma dosyasından erişilebilir.
Özetleme bir filoyu neden anlaştırır
Bir yük dengeleyicinin arkasında birkaç mcpd örneği çalıştırın; tek bir trace'in span'lerinin hepsi aynı örneğe ulaşmaz. Örnek başına ya da span başına yazı tura atan bir örnekleyici, bir trace'in bir kısmını tutar, geri kalanını düşürür; ilk kural tam olarak bu başarısızlığı önlemek için vardır.
Deterministik strateji, trace kimliğini 64 bitlik aralığın tamamına eşler ve bu değer oranın gerektirdiği eşiğin altına düştüğünde trace'i tutar. Her örnek, aynı kimlikten aynı sayıyı hesaplar, yani hepsi anlaşır: paylaşılan durum yok, eşgüdüm protokolü yok, senkronu bozulacak bir şey yok. Aynı kimlik bir yeniden denemede de aynı yanıtı verir, yani yeniden oynatılan bir yığın yarım ulaşamaz.
Bu eşlemeyi dürüst kılan iki ayrıntı var. Kimliğin sondaki on altı onaltılık karakterini okur: OpenTelemetry trace kimliklerinin rastgele olmasını ister, ama bazı üreticiler baştaki baytları bir zaman damgasından türetir ve onları okuyan bir örnekleyici örneklemek yerine günün saatiyle ilişkilenir. Kimlik hiç onaltılık değilse, her şeyi tutmaya indirgenmek yerine sonlandırıcı bir karıştırma içeren gerçek bir özete iner, yani gerçekleşen oran istediğiniz orana yakın kalır.
SDK'larda yukarıdan gelen karar kazanır
Bir SDK gelen bir W3C traceparent üzerinden bir trace'i
sürdürdüğünde, örneklendi bayrağını kimliklerle birlikte devralır ve kendi
oranını uygulamaz. Bu iki yönde de geçerlidir: bayrak açıksa trace yerel oran
ne olursa olsun tutulur, kapalıysa yerel oran ne olursa olsun düşürülür.
Bu sürümde daemon bunu yapmaz. OTLP üzerinden gelen bir span'in trace-flags
baytını daemon mcpd.otlp.flags özniteliğinde saklar, ama
daemon'un örnekleyicisi onu okumaz. Oran ayarlanmış bir daemon, bayrak ne
derse desin bu oranı her trace'e uygular.
Alternatifi kulağa geldiğinden daha kötüdür. Her servis kendi oranını uygulasaydı, dört servisten geçen bir trace ikisi tarafından tutulur ikisi tarafından düşürülürdü ve sonunda elinizdeki şey dağıtık bir trace olmazdı. Bir trace biçiminde bir delikler kümesi olurdu.
Kuyruk örneklemesi okunmaya değer çalıştırmaları tutar
Baş örnekleyici hiçbir şey bilmeden karar verir. Ucuzdur ve kördür: onda bir oranda hataların da onda birini tutar. Gerçekte açtığınız trace'ler seyrek olanlardır ve bir oran örnekleyicisinin en kötü olduğu şey tam olarak seyrekliktir.
Bir gecikme kaydı böyle görünür: düz bir taban çizgisi ve birkaç sapma. Hacim taban çizgisindedir, yanıtlar sapmalardadır. Kuyruk örneklemesi trace'i bitene kadar tutar, sonra içinde bir şey hata verdiyse saklar, ayarladığınız eşikten uzun sürdüyse saklar, aksi hâlde önceki deterministik özetin aynısını uygular. Hataları tutmak varsayılan olarak açıktır, çünkü en çok ihtiyaç duyduğunuz trace'ler seyrek olanlardır ve bir oran örnekleyicisi de en çok onları atar.
Bedeli tamponlamadır. Bir kuyruk örnekleyicisi, karar verebilene kadar bitmemiş her trace'i bellekte tutmalıdır; varsayılan değil de bilinçli bir seçim olmasının nedeni budur. Yukarıdaki gibi, kuyruk stratejisi politika türünde uygulanmıştır ve bu yapıda ne bir seçenekten ne de yapılandırma dosyasından erişilebilir; daemon'un alım yolu baş kararını uygular.
Neyin düşürüldüğünü bilmek
Örnekleyicinin attığı her span
mcpd_traces_sampled_out_total sayacını artırır; bu sayaç
/metrics altında Prometheus metin biçiminde dışa aktarılır.
Oranı ekibinizin okuduğu bir yere yazın. Belgelenmiş bir örnekleme oranıyla
eksik bir trace bir açıklamadır; açıklaması olmayan eksik bir trace bir
destek kaydıdır ve onu açan kişi genellikle sizsinizdir.
Sonraki
- Daha az saklamanın diğer yolu: Maskeleme ve saklama.
- Her seçenek ve ortam değişkeni: Yapılandırma.
-
/metricsve daemon'un kendi sinyallerinin geri kalanını okumak: İşletme.