Documentation
¶
Overview ¶
Package stackparse — stack trace metnini yapısal frame'lere çeviren SAF çözümleyici (v0.9.830).
Amacı tek: bir frame'i KAYNAK KODDA konumlandırabilmek. Bunun için dosya adı, satır numarası ve "bu uygulama kodu mu, çerçeve gürültüsü mü?" bilgisi gerekir; gerisi (repo eşleme, dosya çekme) devops paketinin işi.
fingerprint bilinçli ayrı, bkz. spec 2026-08-09 ¶
chstore.topFrames / FingerprintException bu paketi KULLANMAZ ve kullanmamalıdır. Parmak izi, ClickHouse'ta hâlihazırda milyonlarca satırın kimliği: buradaki normalizasyonun (war// öneki soyma, JPMS modülü ayırma) oraya sızması mevcut TÜM grupları yeniden numaralandırır — operatörün ekranında bir gecede "yeni" exception seli, üstelik sessiz. Bu paket yalnız OKUMA tarafıdır; gruplama hattına dokunmaz. İki taraf da aynı metni okur, farklı soruyu cevaplar ve bilinçli olarak ayrı kalır.
Java önce (operatörün filosu JBoss/WildFly ağırlıklı). Go/Python istenirse aynı Frame sözleşmesiyle eklenir.
Index ¶
- func ErrorCodeTokens(text string) []string
- func FromLog(attrs map[string]string, body string) (stack string, fromBody bool)
- func HasAppPrefix(class string, prefixes []string) bool
- func IsAppClass(class string) bool
- func MessageHead(body string) string
- func ResourceExts() []string
- type Frame
- type ResourceRef
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func ErrorCodeTokens ¶ added in v0.10.100
ErrorCodeTokens — hata METNİNDEKİ nitelikli kimliklerin SON parçasından dil-bağımsız arama token'ları (v0.10.100, operatör-raporlu "Aslında kod var"): hata zinciri Java'dan .NET'e geçince fırlatan kod .cs dosyasında yaşıyor ve frame-türevi .java araması onu YAPISAL olarak bulamaz. Hata kodunun kendisi ("…CustomerCardsNoCreditCardSmFlag" gibi) ise dilden bağımsız: kodu fırlatan satır o token'ı içerir ve org araması onu her uzantıda bulur.
Seçicilik bilinçli sıkı: SON parça, BüyükHarfle başlar, içinde küçük harf taşır (CamelCase — SABİT_YAZIM kimlikleri ve kısaltmalar elenir) ve ≥8 karakterdir; ilk görülme sırası korunur, tavan 3. Gevşek bir süzgeç org aramasını gürültüye boğar — yanlış kanıt, kanıt yokluğundan kötü (PickSearchHit başlığındaki ders).
func FromLog ¶ added in v0.9.1182
FromLog, log özniteliklerinde ve gerekirse gövdede stacktrace arar. Bulamazsa ("", false) döner — çağıran bugünkü "stacktrace yok" davranışını aynen sürdürür.
func HasAppPrefix ¶ added in v0.10.112
HasAppPrefix — sınıf adı operatörün uygulama paket öneklerinden biriyle mi başlıyor? ÖNEK eşleşmesi ("içeriyor" değil); boş/beyaz önekler yok sayılır. Saf.
func IsAppClass ¶
IsAppClass — sınıf adı uygulama kodu mu? Saf; tablo-testli.
Önek eşleşmesi, "içeriyor" DEĞİL: com.example.jdk.Helper bir uygulama sınıfıdır, "jdk." alt dizgisi geçiyor diye elenmemeli.
func MessageHead ¶ added in v0.9.1182
MessageHead — gövdeden İLK frame'e kadarki kısım (stack gövdeden geldiğinde prompt'a giren "mesaj" yarısı).
Frame'leri kesip atmak değil, mesajı AYIRMAK: frame'ler zaten stack alanında ve orada daha büyük bir bütçeyle duruyor; ikisini birden göndermek aynı baytları iki kez ödemek olurdu.
func ResourceExts ¶ added in v0.10.73
func ResourceExts() []string
ResourceExts — çağıranın deneyeceği uzantılar (Ext boş olan adaylar için).
Types ¶
type Frame ¶
type Frame struct {
// Class — tam nitelikli sınıf adı (paket dahil), örn.
// com.example.billing.CardService. İç sınıflarda $ korunur.
Class string
// Method — metot adı; <init> / <clinit> / lambda$x$0 aynen kalır.
Method string
// File — kaynak dosya adı (yol YOK, Java stack'i yol taşımaz).
File string
// Line — kaynak satırı; 0 = bilinmiyor.
Line int
// Module — soyulan önek: "deployment.BSAWEB.war", "java.base",
// "org.jboss.as.ee", "mymodule@1.2.3". Boş = önek yoktu.
Module string
// IsApp — uygulama kodu mu? Çerçeve/JDK frame'leri false.
IsApp bool
// Segment — frame'in "Caused by" zincirindeki derinliği (v0.9.1235).
// 0 = en dış (wrapper) exception'ın kendi stack'i, 1 = ilk
// "Caused by:" bölümü, 2 = onun sebebi… Java en DIŞTAKİNİ önce
// basar, kök neden ise EN DERİN segmenttedir; bu alan olmadan
// zincirdeki yer aşağı akışta geri kazanılamıyordu.
Segment int
// Tier — RankFrames damgası (v0.10.112): 0 = operatörün uygulama
// paket öneklerinden biriyle başlıyor, 1 = diğer (kurum-içi
// çerçeve, üçüncü parti kütüphane — IsApp ama önek listesinde
// değil). Yalnız RankFrames'in döndürdüğü kopyalarda anlamlı;
// ParseJava 0 bırakır.
Tier int
}
Frame — çözümlenmiş tek stack satırı.
File/Line boş olabilir ("Unknown Source", "Native Method") — o frame kodda konumlandırılamaz, çağıran atlar.
func AppFrames ¶
AppFrames — IsApp olan ve kodda konumlandırılabilen (dosya+satır) en fazla n frame, EN DERİN "Caused by" segmentinden dışa doğru. Kod çekmenin girdisi; saf.
Satırsız app frame'i ELENİR: dosya adı eşleşse bile pencere merkezi olmaz, "dosyanın başından 60 satır" ise kanıt değil gürültüdür.
Neden en derin segment önce (v0.9.1235) ¶
Java stack'i en DIŞTAKİ (wrapper) exception'la başlar; gerçek kök neden en derin "Caused by:" bölümündedir. Metin sırasına göre ilk n frame'i almak, katmanlı BSA/EJB kodunda — ki orada catch-rethrow yolu da uygulama sınıflarından geçer — üç kod penceresinin üçünü de wrapper'ın yeniden-fırlatma satırlarına harcıyor, hatanın DOĞDUĞU satır hiç pencere alamıyordu. Artık bütçe önce kök nedene gidiyor, artan kalırsa dışarı doğru yürüyor.
Segment İÇİNDEKİ sıra korunur (fırlatma noktası o segmentin de en üstündedir) ve tek segmentli stack'te davranış eskisiyle BİRE BİR aynıdır — elle kurulan Frame'lerin Segment'i 0'dır.
func ParseJava ¶
ParseJava — Java/Kotlin/Scala stack trace'ini frame'lere çevirir.
Tanınmayan satırlar (mesaj başlığı, "... 42 more", yarım kesilmiş satır) sessizce ATLANIR: stacktrace'ler log alanlarında kırpılmış gelir, tek bozuk satır tüm çözümlemeyi düşürmemeli.
"Caused by:" satırı da bir frame DEĞİL, ama artık sessiz değil: gördüğü yerde segment sayacı artar ve sonraki frame'ler Segment=N ile işaretlenir (v0.9.1235). Frame'ler yine metindeki SIRAYLA listeye girer — sıralamayı değiştirmek çağıranın işi (AppFrames), çünkü bu paketin sözleşmesi "metni sadakatle çevir".
"Suppressed:" bölümleri BİLİNÇLİ kapsam dışı: try-with-resources'ın bastırılmış hatası semantik olarak bir sebep zinciri değil, paralel bir yan olaydır ve operatörün filosunda nadirdir. Segment sayacına karışmaması, bastırılmış bir kapatma hatasının kök neden yerine geçmesini engeller.
func RankFrames ¶ added in v0.10.112
RankFrames — kod çekmenin aday listesi, UYGULAMA FRAME'İ ÖNCE (v0.10.112). AppFrames'in üstüne bir birincil anahtar koyar:
- Tier — appPrefixes'ten biriyle başlayan sınıf (0) önce, kalan uygulama frame'leri (1) sonra. Çerçeve/JDK frame'leri yine dışarıda; AMA operatörün açık öneki frameworkPrefixes'i EZER (org.apache.myco bir uygulama olabilir — açık ayar, sabit listeden güçlüdür).
- Segment — derin "Caused by" önce (v0.9.1235 sözleşmesi tier içinde aynen korunur).
- Metin sırası.
appPrefixes boşsa (ya da yalnız boş dizeler taşıyorsa) sonuç AppFrames ile BİRE BİR aynıdır: bugün çalışan hiçbir kurulumun sırası değişmez; sıralama yalnız operatör önek yazınca devreye girer.
Neden sıralama, süzme değil: kurum-içi çerçeve sınıfları (RestFilter, BasicDispatcher…) bazen gerçekten hatanın atıldığı yerdir; onları atmak kanıtı düşürür. Arkaya almak, tavanı önce iş sınıflarına harcatır — iş sınıfı bulunamazsa sıra yine onlara gelir.
func (Frame) PackagePath ¶
PackagePath — sınıfın paket yolu, "/" ayraçlı: com.x.billing.Card → "com/x/billing". Depo ağacında dosya eşleştirirken skorlayıcının girdisi. Paketsiz sınıf → boş.
type ResourceRef ¶ added in v0.10.73
type ResourceRef struct {
// Base — uzantısız dosya adı ("IntTfraudMapper").
Base string
// Ext — biliniyorsa uzantı (".xml"); boşsa çağıran resourceExts'i dener.
Ext string
// Member (v0.10.113) — nitelikli kimliğin SON parçası: MyBatis
// statement id'si (`…IntTfraudMapper.ariCTelefonSelect` → Member
// "ariCTelefonSelect"). Açık dosya adından türeyen adaylarda boş.
// Çağıran bununla dosyanın tamamı yerine İLGİLİ sorgu bloğunu keser.
Member string
}
ResourceRef — aranacak bir kaynak dosya adayı.
func ResourceRefs ¶ added in v0.10.73
func ResourceRefs(text string) []ResourceRef
ResourceRefs — hata metninden kaynak dosya adaylarını çıkarır.
Sıra DETERMİNİSTİK: açık dosya adları önce (kanıtı daha güçlü), sonra nitelikli kimliklerden türeyenler; her grup kendi içinde alfabetik. Deterministik sıra şart, çünkü çağıran ilk N adayı çekiyor — sıra rastgele olsaydı aynı hata iki kez farklı kanıt üretirdi.