insight

package
v0.10.78 Latest Latest
Warning

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

Go to latest
Published: Aug 26, 2026 License: MIT Imports: 6 Imported by: 0

Documentation

Overview

Package insight — gömülü "insight kartı"nın SUNUCU sözleşmesi (AI Assistant Faz 2.1, v0.9.1129; docs/plans/ai-assistant-design-2026-08-16.md §2.3).

Kartın tek fikri: kanıt DÖRT dik yoldan gelir ve hiçbiri diğerini bekletmez.

SIGNALS  deterministik projeksiyon — LLM'siz de doğru, ANINDA
LINKS    sunucu-üretimi derin linkler — pencereyi TAŞIRLAR
CHARTS   doğrulanmış chart spec'leri (opsiyonel)
PROSE    modelin anlatısı — akar, gecikir, HİÇ gelmeyebilir

Ayrım TİPTE yaşıyor çünkü ürün kararı şu: AI kapalı, yapılandırılmamış ya da kotası dolmuş bir kurulumda kart YİNE tam değerli olmalı. Emsal ServiceChartsExplainBody (v0.9.477): anlatım ile yapısal kanıt ayrı yollardan gelir, model metni bozsa bile tablo doğru kalır. Burada aynı ilke tipe kaldırıldı — bir yüzey Signals'ı prose'un İÇİNDEN türetmeye kalkarsa derleyici izin vermiyor.

SUNUCU-ÜRETİMİ LİNKLER — bilinçli sapma. ChartProblemSignal ailesi (explain_service_charts.go:181) linkleri FRONTEND'e bıraktı: "rotalar frontend'in bilgisi". Kart için ters karar verildi, iki nedenle: (1) kart DÖRT yuvada aynı bileşenle çizilecek (exception satırı, problem satırı, log paneli, slow-span), yani rota bilgisi FE'de dörde kopyalanırdı; (2) pencere-taşıma disiplini (pivotHref, serviceHref, logsRangeParam) tam olarak "kopyalandığı için dört kez kırıldı" diye var. Kanıtı üreten yer linki de üretir; FE yalnız Label+Href çizer.

Index

Constants

View Source
const (
	KindException  = "exception"
	KindProblem    = "problem"
	KindLogPattern = "log-pattern"
	KindSlowQuery  = "slow-query"
)

Faz 2.1'in yuvaları: exception grubu (id = fingerprint) ve problem (id = problem id). Log deseni + yavaş sorgu 2.4'te aynı sözleşmeye bindi — o yüzden tür bir ENUM, handler başına ayrı uç değil.

KİMLİK KARARLARI (v0.9.1137, Faz 2.4) — her ikisi de "satırın KENDİ taşıdığı kimlik", türetilmiş bir şey değil:

KindLogPattern — id = küratörlü desenin ADI ("Out of memory").
  LogPatternAnomaly'nin id alanı YOK; adı ise detektörün
  patterns[] listesinin anahtarı (internal/anomaly/log_patterns.go)
  ve susturma parmak izinin orta alanı (FingerprintAnomaly
  "log_pattern|<pattern>|<service>"). Yani kimlik olarak ZATEN
  kullanılıyor. Drain şablonlarının (log_templates.ID) hash'i AYRI
  bir aile: "Desenleri anlat" paneli ikisini birden anlatıyor ama
  operatörün TIKLADIĞI satır küratörlü desen — şablon hash'ini
  kimlik yapmak, olmayan bir satırı adreslemek olurdu.
  Servis kimliğe GİRMEZ: kartın servisi "bu pencerede en çok basan"
  servistir, pencereyle DEĞİŞİR — kimliğe koymak aynı deseni iki
  pencerede iki farklı kart yapardı.

KindSlowQuery — id = `?stmt=` kodeğinin ta kendisi:
  "<stmtHash>[|<dbSystem>]". stmtHash v0.8.375'in ingest-zamanı
  parmak izi (pencereler arası KALICI), dbSystem ise katalog
  sayfasının kapsamı; ikisi birlikte /slow-queries çekmecesinin
  URL kimliği (stmtParam.ts encodeStmtParam) ve detay ucunun
  (hash, system) argüman çifti. Üçüncü bir yazılış üretmedik.
View Source
const (
	SignalDeploy    = "deploy"
	SignalProblem   = "problem"
	SignalOpDelta   = "opdelta"
	SignalBlast     = "blast"
	SignalException = "exception"
	SignalGeneric   = "generic"
	// v0.9.1137 (Faz 2.4) — iki yeni yuvanın kendi aileleri. Kapalı küme
	// GENİŞLEDİ, esnetilmedi: FE'nin InsightSignalKind birleşimi bu
	// listeyle 1:1 (types.ts) ve bugün hiçbiri BOYANMIYOR — küme
	// gelecekteki ikon dili için var (InsightCard.tsx gerekçesi).
	SignalLog = "log"
	SignalDB  = "db"
)

Sinyal türü, FE'nin ikon/renk seçimi için. Serbest metin DEĞİL: kart dört yuvada aynı görsel dili konuşsun diye kapalı küme.

View Source
const (
	SevOK   = "ok"
	SevWarn = "warn"
	SevErr  = "err"
)

Şiddet — boş DEĞER GEÇERLİ ve anlamlı: "nötr bilgi" (servis adı, operasyon sayısı). ok/warn/err olmayan bir üçüncü renk yok.

View Source
const (
	ChartRangeDefaultS int64 = 1800
	ChartRangeMaxS     int64 = 7 * 86400
)

Chart penceresi bandı — normalizeRenderChart ile AYNI (varsayılan 30dk, tavan 7g). Kart spec'i modelden gelmiyor ama bandın tek olması FE'nin "hangi pencere gelebilir" kabulünü tek tutuyor.

Variables

This section is empty.

Functions

func ExceptionWindow

func ExceptionWindow(firstSeenNs, lastSeenNs int64) (fromNs, toNs int64)

ExceptionWindow — exception grubunun OLAY penceresi.

Grubun tamamı (FirstSeen→LastSeen) haftalar sürebilir; log/trace pivotunu o aralığa açmak hem pahalı hem yanlış soru — operatörün baktığı şey SON oluşum. Kural: [LastSeen-30dk, LastSeen+5dk]; grup bu pencereden GENÇSE alt kenar FirstSeen-5dk olur (yeni grubun run-up'ı pencerede kalsın). Saf; sıfır/ters damgalarda boş (0,0) döner ve pencere isteyen linkler üretilmez.

func FmtDurTR

func FmtDurTR(seconds int64) string

FmtDurTR — bağıl süre. fmtAgoTR (copilot_guided.go:830) ile BAYT BAYT aynı yazılış: aynı operatör aynı gün sohbet cevabında "38dk", kartta "38 min" görmemeli. İki yazılışın ayrışmasını signals_test.go pinler.

Her birim ayrı dalda (sn/dk/sa/gün) — v0.6.36 birim-karıştırma sınıfının kuralı: değer+birim üreten şablon HER birimi testler.

func Kinds

func Kinds() []string

Kinds — route'un tanıdığı tür listesi. Sıra sabit: /ai yüzey kırılımı ve testler bu listeden türer.

func KnownKind

func KnownKind(k string) bool

KnownKind — bilinmeyen tür 404 olur ve LLM'e HİÇ ulaşmaz. Bu, ai_calls yüzey etiketinin sonlu kalmasının da kapısı (aiSurfaceFromPath aynı whitelist'i ikinci kez uygular — ucuz ikinci kapı).

func LogPatternPromptUser added in v0.9.1137

func LogPatternPromptUser(ev LogPatternEvidence) string

LogPatternPromptUser — TEK desenin kanıt paketi.

Sistem prompt'u SystemPromptLogPatterns (panel anlatıcısının prompt'u) ve bu BİLİNÇLİ: yeni bir sistem prompt'u eklemek prompts.go'nun sicil kapısını (prompt_language_test.go) büyütür ve aynı işi ikinci kez tarif eder. Ama o prompt PANEL paketini bekliyor — "kaç yeni/patlayan desen", "Sürekli Gürültü" bölümü vb. Kart paketinde o bölümlerin kanıtı YOK; prompt'un kendi kuralı ("kanıtı olmayan bölümü tamamen atla") bunu çözüyor, ama tahmine bırakmıyoruz: kapsam kanıt gövdesinde AÇIKÇA söyleniyor.

func MetricFamily

func MetricFamily(metric string) string

MetricFamily — problemin ihlal ettiği metrik ailesi. Alt dize listesi exemplarKindForMetric (internal/api/rootcause.go:44) ile BİREBİR: aynı problemde örnek trace "yavaş" seçilirken kart linki "hatalı" göstermesin. Dönüş: "error" | "latency" | "other".

func PatternKQL added in v0.9.1137

func PatternKQL(service string, tokens []string) string

PatternKQL — desenin /logs sorgusu.

PARAM DOĞRULAMASI (ölü-param disiplini, v0.9.1130 sınıfı): /logs okuyucusu readLogsParams (frontend/src/lib/logsUrl.ts) YALNIZ service · cluster · q · severity · traceId · spanId · hasTrace · filters · cols okur, pencere de `range`ten. `pattern=` ya da `tokens=` diye bir param YOK — yazsak sessizce düşer ve hedef sayfa FİLTRESİZ açılır.

Servis de `q`ya giriyor, `service=`ye DEĞİL: v0.5.311'de operatör-bildirimli karar ("servis picker'da ön-seçili gelmesin, KQL'e girsin") — kardeş üretici logsLinkForPattern bugün aynen bunu yapıyor. İki üretici aynı çipi çiziyor; ayrışmaları operatörün "aynı link neden farklı" sorusudur.

func PatternLogWindow added in v0.9.1137

func PatternLogWindow(lastSeenNs int64) (fromNs, toNs int64)

PatternLogWindow — desenin OLAY penceresi: son görülmenin 30dk öncesi → 10dk sonrası. patternLogWindow (streams.tsx, v0.9.862) ile AYNI formül: aynı desen için satırın "logs ↗" çipi ile kartın pivotu farklı pencere açarsa operatör iki farklı cevap görür.

Saf; damga yoksa (0,0) döner ve pencere isteyen linkler üretilmez.

func ProblemPromptUser

func ProblemPromptUser(ev ProblemEvidence, hypBlock string) string

ProblemPromptUser — problem kanıtının prompt gövdesi. hypBlock, anomaly.HypothesisPromptBlockTR çıktısı (boş olabilir): deterministik korelasyon motorunun BİRİNCİL kanıtı, aynen taşınır.

func RangeParam

func RangeParam(fromNs, toNs int64) string

RangeParam — [fromNs, toNs] → /logs, /traces, /service ve /problems'ın okuduğu `custom:<fromMs>-<toMs>` token'ı. logsRangeParam (frontend/src/lib/logsUrl.ts) ile AYNI sözleşme:

  • ns → ms; alt kenar AŞAĞI, üst kenar YUKARI yuvarlanır ki yuvarlama pencereyi DARALTMASIN (kesilen üst kenar en yeni kovayı düşürür);
  • decodeRange'in kabul testini birebir aynala: fromMs > 0 ve toMs > fromMs. Reddedeceği bir token'ı ÜRETMEYİZ, boş döner ve çağıran linki atar.

func SlowQueryPromptUser added in v0.9.1137

func SlowQueryPromptUser(ev SlowQueryEvidence) string

SlowQueryPromptUser — yavaş sorgu sınıfının kanıt paketi.

Etiketler İNGİLİZCE ve bu bilinçli: SystemPromptSlowQuery gövdesi "You receive: the normalized statement, a real sample with literals, the DB engine name, and the aggregate stats" diye SAYIYOR ve bugünkü /api/copilot/explain-slow-query gövdesi de bu etiketlerle yazılıyor. Cevap dili AnswerInTurkish ile sistem tarafında sabit.

Eski gövdeden İKİ FARK, ikisi de kartın lehine:

  • "Service:" tek servis yazıyordu (satırın servisi); ifade sınıfı servisler ARASI, o yüzden burada çağıran KIRILIMI var.
  • literalli örnek eskiden frontend'den geliyordu; burada MV'nin kendi bucket örneği (anyMerge(sample_stmt_state)), yani kartın gösterdiği sınıfla hash-tutarlı.

func StmtParam added in v0.9.1137

func StmtParam(hash uint64, system string) string

StmtParam — kanonik `?stmt=` üreticisi.

Sistem adı YALNIZ güvenli karakterlerden oluşuyorsa taşınır; aksi halde DÜŞÜRÜLÜR ve link motorlar arası katlanmış hâle açılır. Gerekçe: FE kodeği ikinci parçayı decodeURIComponent'ten geçiriyor ve bozuk bir %-kaçışı orada ATAR (çekmece hiç açılmaz). Bugün gerçek değerler (postgresql/oracle/mysql/redis/mssql) bu kümenin içinde; dışına çıkan bir değerde DAHA GENİŞ ama açılan bir kapsam, açılmayan bir çekmeceden iyidir (v0.9.655: kırık link, link yokluğundan kötü).

Types

type BlastRef

type BlastRef struct {
	TotalCallers     int
	CascadingCallers int
	TopCallers       []string
}

BlastRef — etki alanının kart yüzü.

type CallerRef added in v0.9.1137

type CallerRef struct {
	Service string
	Calls   uint64
	P95Ms   float64
	TotalMs float64
}

CallerRef — ifade sınıfını çağıran bir servis (db_statement_summary_5m MV'sinin servis kırılımı).

type ChartSpec

type ChartSpec struct {
	Title     string `json:"title"`
	Service   string `json:"service"`
	Operation string `json:"operation,omitempty"`
	Agg       string `json:"agg"`
	RangeS    int64  `json:"rangeS"`
}

ChartSpec — render_chart'ın DOĞRULANMIŞ çıktısıyla aynı şekil (chatChartBlock, copilot_chat.go:337 → guidedChartSpec). Aynı şekil olması şart: FE tarafında ```chart``` fence'ini çizen bileşen (CosreChart) bu alan kümesini okuyor, kart ikinci bir çizici istemiyor.

func ExceptionCharts

func ExceptionCharts(ev ExceptionEvidence) []ChartSpec

ExceptionCharts — grubun servisinin hata oranı, olay penceresinde. Tek kart: exception'ın sorusu "hata ne zaman patladı", ve error_rate bunu bir bakışta gösteriyor.

func NewChartSpec

func NewChartSpec(title, service, operation, agg string, rangeS int64) (ChartSpec, bool)

NewChartSpec — spec kurucusu + doğrulayıcı. ok=false ⇒ spec ATILIR (kart chart'sız çizilir); yarım/uydurma bir spec basıp FE'de boş bir panel çizdirmek, hiç chart olmamasından kötü.

Saf — table-testli.

func ProblemCharts

func ProblemCharts(ev ProblemEvidence) []ChartSpec

ProblemCharts — ihlal edilen metriğin AİLESİNE uygun seri. Aile eşlemesi MetricFamily ile tek yerden: kart linki "en yavaş trace" derken chart error_rate çizmesin.

type DeployCandidate

type DeployCandidate struct {
	Version   string
	OffsetSec int64
	After     bool
}

DeployCandidate — grubun başlangıcı çevresinde seçilmiş deploy.

OffsetSec MUTLAK uzaklık (≥0) ve yön AYRI bir bayrak. İşaretle kodlamak cazip ama yanlış: sub-saniye bir "sonra" deploy'u (ns→sn kırpması) 0'a düşer ve işaret 0'da yön TAŞIMAZ. Yön seçimi yapan yer (anomaly.PickDeploysAroundStartRefs) biliyor, tahmine bırakmıyoruz — After=true olan aday KÖK NEDEN OLAMAZ.

func NearestDeployBefore

func NearestDeployBefore(cands []DeployCandidate) (DeployCandidate, bool)

NearestDeployBefore — başlangıçtan ÖNCEKİ (After=false) en YAKIN deploy. Saf; sonrası-adayları eler.

type DeployRef

type DeployRef struct {
	Version     string
	AgeSec      int64
	HasImpact   bool
	P99DeltaPct float64
	ErrDeltaPP  float64
}

DeployRef — problemin yakın deploy'u + (varsa) ölçülmüş etkisi. Impact YALNIZ hipotez yolunda dolar (RecentDeploy.Impact, v0.9.1059); problems listesi enrichment'ı doldurmaz — HasImpact bu ayrımı taşır.

type ExceptionEvidence

type ExceptionEvidence struct {
	Fingerprint string
	Type        string
	Service     string
	State       string
	Occurrences uint64
	Last24      uint64
	PeakCount   uint64
	FirstSeenNs int64
	LastSeenNs  int64
	Deploys     []DeployCandidate
	TraceID     string
	// NowNs — bağıl süreleri hesaplayan referans an. Parametre olması
	// ŞART: time.Now() okuyan bir projeksiyon test edilemez ve
	// "şimdi"yi iki kez okuyup iki farklı yaş basma riski taşır.
	NowNs int64
}

ExceptionEvidence — exception grubu kartının deterministik girdisi. Alanların hepsi anomaly.BuildExceptionExplainInput'un ZATEN okuduğu veriden gelir; kart için ikinci bir sorgu YOK (yeniden okumak, modelin gördüğü deploy/stack ile kartın gösterdiğinin ayrışması demekti — exception_context.go'nun kendi gerekçesi).

type HypothesisRef

type HypothesisRef struct {
	TopSuspect string
	Confidence float64
	Candidates []string
	Others     int
}

HypothesisRef — kalıcı kök-neden hipotezinin kart yüzü.

Others = top suspect DIŞINDAKİ toplam aday sayısı. Candidates o kümenin (belki kırpılmış) hâli; ikisi ayrı çünkü "+N" ancak GERÇEK toplamdan türetilirse dürüst olur. Top suspect'i saymayan bir sayı bilerek seçildi: "Diğer adaylar" satırı zaten onu listelemiyor, dahil eden bir toplam satırın kendi "+N"ini bir fazla gösterirdi.

type Link struct {
	Label string `json:"label"`
	Href  string `json:"href"`
}

Link — kartın derin-link çipi. Şekil guidedAnswerLink'in ikizi (copilot_followup.go:185): FE'nin çip şeridi bu şekli çiziyor.

func ExceptionLinks(ev ExceptionEvidence) []Link

ExceptionLinks — exception kartının çipleri, sıra sabit.

func LogPatternLinks(ev LogPatternEvidence) []Link

LogPatternLinks — desen kartının çipleri, sıra sabit.

func ProblemLinks(ev ProblemEvidence) []Link

ProblemLinks — problem kartının çipleri, sıra sabit.

func SlowQueryLinks(ev SlowQueryEvidence) []Link

SlowQueryLinks — yavaş sorgu kartının çipleri, sıra sabit.

PARAM DOĞRULAMASI:

  • /databases/statement → `stmt` (decodeStmtParam) + `range` (usePageZoomRange → useUrlRange). İfade DETAY SAYFASI; aynı şekli stmtDetailHref (stmtParam.ts) da üretiyor.

    ⚠ v0.9.1377 — bu satır `/slow-queries` yazıyordu ve o yol App.tsx'te KAYITLI DEĞİL. Kayıtsız yol catch-all'a düşüyor (`path="*"` → <Navigate to="/" replace />), yani kartın "İfade detayı" çipi operatörü ANA SAYFAYA atıyordu — 404 bile değil, sessiz bir yön değişimi. Bu, v0.9.1323'ün BİREBİR aynısı: o sürüm frontend'deki stmtDetailHref'i düzeltti, buradaki ikizini bırakmıştı. Üstelik yukarıdaki şerh "aynı şekli stmtDetailHref de üretiyor" diyerek iki tarafın hizalı olduğunu İDDİA ediyordu; 1323 sonrası bu iddia yanlıştı ve hiçbir şey onu ölçmüyordu. Artık ölçülüyor: TestServerLinkPathsAreRegisteredRoutes.

    Hedef ayrıca v0.9.1374'te taşındı (çekmece → tam sayfa), yani tek düzeltme iki kusuru birden kapatıyor.

  • /databases → `dbsys` + `dbname` (Databases.tsx:80-81) + `range`.

  • /trace → `id`; pencere OKUMAZ (nokta nesnesi, links.go üst notu).

/database (TEKİL, detay sayfası) BİLİNÇLİ YOK: oradaki kimlik bir ÜÇLÜ (system, instance, dbName) ve bir ifade sınıfının instance'ı yoktur — sınıf motorun bütün instance'larına yayılır. Uydurma bir instance sessizce BOŞ bir detay sayfası açar (v0.9.821'in "etiketi kimlik sanmak" arızası). databasesFilterHref (v0.9.964) bu kararı frontend'de zaten vermiş; sunucu tarafı aynı kararı tekrarlıyor.

dbname da yazılmıyor: gruplama db_name'i KATLIYOR, yani özetten gelen ad temsili olabilir (katalog satırının "+N"i) ve 'default' MV'nin "db.name yoktu" nöbetçisi. Katalogda motor filtresi kalıyor: olabileceğinden dar bir katalog, kendinden emin ama yanlış olandan iyidir.

type LogPatternEvidence added in v0.9.1137

type LogPatternEvidence struct {
	Pattern string
	// Kind — "new" | "spike". Kartın rengi buradan: FE'nin desen
	// kartındaki rozet dili (streams.tsx: NEW=warning, SPIKE=danger)
	// ile AYNI eşleme, yoksa aynı olay iki yüzeyde iki renk olur.
	Kind          string
	CurrentCount  uint64
	BaselineCount uint64 // pencere-eşdeğerine normalize edilmiş taban
	Ratio         float64
	Service       string // pencerede en çok basan servis
	Sample        string
	TopServices   []PatternServiceRef
	// Tokens — desenin gövde alt dizeleri (küratörlü patterns[] listesi).
	// SİNYAL değil, LİNK malzemesi: /logs sorgusu bunlardan kuruluyor
	// (PatternKQL). Kanıt yapısında durması bilinçli — linki üreten yer
	// kanıtı üreten yerle aynı olsun (v0.9.831'in "iki yerde seçim" tuzağı).
	Tokens     []string
	LastSeenNs int64
	// WindowSec — sayımların penceresi. Sinyal olarak BASILIYOR çünkü
	// "1.240" tek başına birimsiz bir sayı: hangi pencerede 1.240?
	WindowSec int64
	NowNs     int64
}

LogPatternEvidence — küratörlü log deseni kartının deterministik girdisi. TAMAMI anomaly.DetectLogPatterns'ın ZATEN döndürdüğü alanlardan gelir: kart için ikinci bir ES sorgusu YOK (operatörün duran kısıtı "elastice çok sorgu yükü oluşturma sakın").

ŞİDDET KARIŞIMI (severity mix) BİLİNÇLİ YOK: detektörün okuması (logstore.CountPatterns) severity boyutu döndürmüyor, dolayısıyla karışımı göstermek YENİ bir sorgu şekli isterdi. Olmayan bir kırılımı tahminle doldurmak yerine hiç göstermiyoruz.

type OpRef

type OpRef struct {
	Name      string
	P95Ms     float64
	ErrorRate float64
}

OpRef — DeepEvidence'ın en yavaş operasyonu. Bugün HİÇBİR yüzeyde gösterilmiyordu (tasarım §1.6: "hesaplanıp hiç anlatılmayan"), kart onu deterministik satır olarak getiriyor.

type PatternServiceRef added in v0.9.1137

type PatternServiceRef struct {
	Service string
	Count   uint64
}

PatternServiceRef — desenin bir servisteki payı (logstore'un PatternServiceHit projeksiyonu).

type ProblemEvidence

type ProblemEvidence struct {
	ID             string
	Service        string
	Metric         string
	Severity       string
	Priority       string
	PriorityReason string
	Comparator     string
	Status         string
	Value          float64
	Threshold      float64
	StartedNs      int64
	ResolvedNs     int64 // 0 = açık
	FromNs         int64 // analiz penceresi (boundAnalysisWindow)
	ToNs           int64
	NowNs          int64
	Deploy         *DeployRef
	Hyp            *HypothesisRef
	Blast          *BlastRef
	SlowOp         *OpRef
}

ProblemEvidence — problem kartının deterministik girdisi.

type Response

type Response struct {
	// Prose — modelin anlatısı. Boş olabilir ve bu bir HATA DEĞİL
	// (AIOff, kota, model hatası). Kart boş prose'u "anlatım yok"
	// diye söyler, sinyalleri yine çizer.
	Prose string `json:"prose"`

	// Signals / Links — DAİMA dizi, asla null. nil bırakmak JSON'da
	// `null` üretir ve FE'de `.map` çöker; v0.9.836'nın (rootcause
	// correlations) tam olarak bu sınıfı. Normalize() garanti eder.
	Signals []Signal    `json:"signals"`
	Links   []Link      `json:"links"`
	Charts  []ChartSpec `json:"charts,omitempty"`

	// ExchangeID — bu CEVABIN kimliği; 👍/👎 bununla
	// POST /api/ai/feedback'e gider (v0.8.399 rayı). AI kapalıyken
	// BOŞ: oylanacak bir model cevabı yok, ai_calls satırı da yok.
	ExchangeID string `json:"exchangeId,omitempty"`

	// AIOff — "AI yapılandırılmamış/kapalı" işareti. Kartın prose
	// alanını neden boş gördüğünü FE'nin ARIZA sanmaması için AÇIK
	// bir bayrak: 503 yerine 200 + bayrak, çünkü cevabın geri kalanı
	// (sinyaller, linkler) tamamen geçerli.
	AIOff bool `json:"aiOff,omitempty"`

	// Truncated — deterministik yarının KIRPILDIĞI işareti (çipler
	// tavana takıldı). Dürüstlük zarfının kart-içi hâli: operatör
	// "hepsi bu mu" sorusunu sormak zorunda kalmaz.
	Truncated bool `json:"truncated,omitempty"`

	// Model — anlatıyı üreten model kimliği (copilot.ActiveModel).
	// Yalnız Active() iken dolu; baseURL/apiKey ASLA (v0.9.1037 çipi
	// ile aynı dar sözleşme).
	Model string `json:"model,omitempty"`

	// Verdict — v0.9.1207 (Faz 6.3): ÖNCEDEN üretilmiş, kalkanlı RCA
	// verdict'inin ham gövdesi (api.RCAVerdict şekli; bu paket şekle
	// bilinçli kör — stdlib-only kalır). YALNIZ rootcause-explain
	// önbelleğinde hazır bir verdict varsa dolar; insight kartı LLM
	// ATEŞLEMEZ (A2 kararı: collapsed pasif, açılış deterministik).
	// Deterministik yarının parçası — `signals` çerçevesinde taşınır.
	Verdict json.RawMessage `json:"verdict,omitempty"`
}

Response — kartın TAM cevabı. Akan kipte `signals` çerçevesi bunun prose'suz hâlidir, `answer` çerçevesi prose'u getirir; buffered kipte tek gövde olarak döner. TEK tip olması bilinçli: FE iki çerçeveyi aynı okuyucuyla çözer.

func (*Response) Normalize

func (r *Response) Normalize()

Normalize — nil dilimleri boş dilime çevirir. Çerçeve/gövde yazan TEK yer bunu çağırır, çağrı noktalarına dağıtılmaz.

func (Response) WithoutProse

func (r Response) WithoutProse() Response

WithoutProse — `signals` çerçevesinin gövdesi: aynı tip, prose boş. Değer kopyası döner (çağıran Response'u sonra prose ile doldurmaya devam eder).

type Signal

type Signal struct {
	Kind     string `json:"kind"`
	Label    string `json:"label"`
	Value    string `json:"value"`
	Severity string `json:"severity,omitempty"`
}

Signal — kartın deterministik satırı. Value bir DİZE çünkü kart onu olduğu gibi çizer; birim/biçim kararı burada, sunucuda verilir.

MUTLAK SAAT YOK. Value içine "16.08 09:11" basmak yasak: sunucu UTC basar, sayfanın kalanı tarayıcı saatini basar (fmtClock/fmtDateTime, 24 saat konvansiyonu v0.9.879) ve iki damga yan yana ÇELİŞİR. Zaman bilgisi ya bağıl gösterilir ("38dk önce") ya da Link'in penceresine biner (custom:<ms>-<ms> — birim belirsizliği olmayan tek yol).

func ExceptionSignals

func ExceptionSignals(ev ExceptionEvidence) (out []Signal, truncated bool)

ExceptionSignals — exception grubunun deterministik satırları. Sıra SABİT (kart her açılışta aynı satırları aynı yerde gösterir). truncated her zaman false: bu projeksiyonda liste-şekilli sinyal yok (deploy adaylarından yalnız en yakın ÖNCE olanı bir sinyal olur ve bu kırpma değil, seçim — bkz. aşağıdaki gerekçe).

func LogPatternSignals added in v0.9.1137

func LogPatternSignals(ev LogPatternEvidence) (out []Signal, truncated bool)

LogPatternSignals — desenin deterministik satırları, sıra sabit.

func ProblemSignals

func ProblemSignals(ev ProblemEvidence) (out []Signal, truncated bool)

ProblemSignals — problemin deterministik satırları, sıra sabit. truncated = liste-şekilli sinyallerden biri tavana takıldı.

func SlowQuerySignals added in v0.9.1137

func SlowQuerySignals(ev SlowQueryEvidence) (out []Signal, truncated bool)

SlowQuerySignals — yavaş sorgunun deterministik satırları, sıra sabit.

type SlowQueryEvidence added in v0.9.1137

type SlowQueryEvidence struct {
	// StmtParam — `?stmt=` kodeği ("<hash>[|<system>]"); linkler bunu
	// AYNEN taşır ki kart ile çekmece AYNI sınıfı açsın.
	StmtParam string
	Statement string // '?'-normalize görünüm formu
	Sample    string // literalli gerçek örnek (yalnız prompt'a girer)
	DBSystem  string
	DBName    string
	Calls     uint64
	Errors    uint64
	TotalMs   float64
	AvgMs     float64
	P95Ms     float64
	P99Ms     float64
	MaxMs     float64
	Callers   []CallerRef
	// CallersCapped — çağıran okuması TAVANA dayandı (okuma limiti).
	// Ayrı bir bayrak çünkü kırpma İKİ yerde oluyor: okuma limitinde ve
	// gösterim tavanında; ikisini tek sayıya karıştırmak "+N"i yalan yapar.
	CallersCapped bool
	SlowTraceID   string
	ErrorTraceID  string
	FromNs, ToNs  int64
	NowNs         int64
}

SlowQueryEvidence — yavaş sorgu sınıfı kartının deterministik girdisi. Kaynak: db_statement_summary_5m MV'si (özet + çağıran kırılımı) + MV-gömülü exemplar (v0.9.1097). HAM spans taraması YOK.

type StmtRef added in v0.9.1137

type StmtRef struct {
	// Hash — ayrıştırılmış kimlik.
	Hash uint64
	// System — db_system kapsamı; "" = motorlar arası katlanmış
	// (katalogun varsayılanı).
	System string
	// Param — kanonik `?stmt=` değeri (linkler bunu taşır). ESCAPE
	// EDİLMEZ: href() url.Values ile kodlar, iki kez kodlamak '|'yi
	// %257C yapar ve FE kodeği onu tanımaz.
	Param string
}

stmtref.go — `slow-query` kartının kimlik kodeği (v0.9.1137, Faz 2.4). Saf, tablo-testli.

Kimlik ZATEN var ve ÜÇ yerde aynı: /slow-queries çekmecesinin `?stmt=` paramı (frontend/src/pages/slowqueries/stmtParam.ts), /api/databases/statements/detail'in (hash, system) argüman çifti ve v0.8.375'in kalıcı stmt_hash'i. Kart DÖRDÜNCÜ bir yazılış üretmiyor, aynı dizeyi okuyor:

"<stmtHash>[|<dbSystem>]"

Neden hash bir DİZE olarak taşınıyor: uint64 JSON'da 2^53 sonrası sessizce hassasiyet kaybeder (SlowQueryRow.stmtHash sözleşmesi). Bu yüzden tel üstünde ondalık dize, sunucuda ParseUint.

KABUL TESTİ decodeStmtParam ile BİREBİR aynı olmalı: FE'nin reddettiği bir dizeyi sunucunun kabul etmesi (ya da tersi) "link çalışıyor ama çekmece açılmıyor" sınıfı üretir. Reddedilenler:

  • rakam-dışı ya da 20 haneden uzun hash,
  • "0" (MV'nin "ifade yok" nöbetçisi — hiçbir sınıfı adreslemez),
  • ikiden fazla parça,
  • ikinci parça VAR ama boş,
  • bozuk %-kaçışı.

func ParseStmtRef added in v0.9.1137

func ParseStmtRef(raw string) (StmtRef, bool)

ParseStmtRef — id → StmtRef. ok=false ⇒ 400 (LLM'e hiç gitmez).

Jump to

Keyboard shortcuts

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