stackparse

package
v0.10.458 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 6, 2026 License: MIT Imports: 5 Imported by: 0

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

Constants

This section is empty.

Variables

This section is empty.

Functions

func ErrorCodeTokens added in v0.10.100

func ErrorCodeTokens(text string) []string

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

func FromLog(attrs map[string]string, body string) (stack string, fromBody bool)

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

func HasAppPrefix(class string, prefixes []string) bool

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

func IsAppClass(class string) bool

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

func MessageHead(body string) string

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

func AppFrames(frames []Frame, n int) []Frame

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

func ParseJava(stack string) []Frame

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

func RankFrames(frames []Frame, n int, appPrefixes []string) []Frame

RankFrames — kod çekmenin aday listesi, UYGULAMA FRAME'İ ÖNCE (v0.10.112). AppFrames'in üstüne bir birincil anahtar koyar:

  1. 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).
  2. Segment — derin "Caused by" önce (v0.9.1235 sözleşmesi tier içinde aynen korunur).
  3. 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

func (f Frame) PackagePath() string

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ş.

func (Frame) String

func (f Frame) String() string

String — "com.x.Y.m(Y.java:246)". Prompt'ta ve kaynak satırında frame'i tek parça göstermek için.

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.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL