Áttekintés
A telemetry önálló Go modul (github.com/gp-system/telemetry, +telemetry/logx, +telemetry/otelx, +telemetry/sentryx): a logolást, a mérést és a hibariportolást egyetlen hívás bootolja. Egy generált projektben ezt a hívást sem te írod: a server.Run és a worker.Run első dolga a telemetry.Setup. Amikor a shop main.go-ja elindul, a logolás, a trace-elés és a hibariportolás már be van kötve, mielőtt az első kérés beérkezne.
Telepítés
go get github.com/gp-system/telemetry@v0.1.0 # a kit is ezt a taget használja
go get github.com/gp-system/telemetry@latest
| Import-út | Mit ad hozzá |
|---|---|
github.com/gp-system/telemetry | a facade-ot: a Setup egy hívásba komponálja a lenti hármat |
github.com/gp-system/telemetry/logx (+/monolog) | a slog kompozíciót: konzolformátum, szintszűrés, fanout |
github.com/gp-system/telemetry/otelx | az OpenTelemetry SDK bootstrapjét |
github.com/gp-system/telemetry/sentryx | az opcionális Sentry-integrációt |
Egy bináris, aminek csak egy darabra van szüksége, importálhatja önmagában azt az alcsomagot: egy CLI vagy migrátor, ami OTel-trace-elést akar, de Sentryt nem, önmagában importálja a telemetry/otelx-et, és sosem linkeli be a sentry-go-t.
A telemetry facade
Három csomag birtokol egy-egy képességet, és egy negyedik komponálja őket:
| Csomag | Mit birtokol | Oldal |
|---|---|---|
logx (+ logx/monolog) | a default slog logger kompozíciója: konzolformátum, szintszűrés, fanout | Logolás |
otelx | az OpenTelemetry SDK bootstrapje: trace-ek, metrikák, OTLP log-bridge | OpenTelemetry |
sentryx | az opcionális Sentry-integráció: span-exporter + slog capture handler | Sentry |
telemetry | a facade, amit a chassis hív (a másik hármat egyetlen Setup-ban komponálja) | ez az oldal |
A telemetry.Config pontosan az, amit a server.Config.Telemetry és a worker.Config.Telemetry mező hordoz:
type Config struct {
Otel otelx.Config // OTEL_SERVICE_NAME, OTEL_SERVICE_VERSION, OTEL_DEV_MODE
Log logx.Config // LOG_LEVEL, LOG_STDOUT, LOG_FORMAT
Sentry sentryx.Config // SENTRY_DSN, SENTRY_ENVIRONMENT, SENTRY_TRACES, SENTRY_DEBUG
}
Prefix nélkül ágyazódik be, így az env-változók a standard neveiken töltődnek: a deployment ugyanúgy konfigurálja a service-t, mint bármely más OTel-instrumentált appot. A teljes változólista: Konfiguráció-referencia.
func Setup(ctx context.Context, cfg Config) (shutdown func(context.Context) error, err error)
A telemetry az egyetlen csomag, ami mindhárom építőkockát importálja: az otelx és a sentryx nem tud egymásról, a logx-nek pedig nincs véleménye arról, hova megy még egy logrekord. Ez nem kozmetika: egy nem-chassis bináris (egy CLI, egy migrátor), ami csak az otelx-et használja, soha nem linkeli be a sentry-go-t.
Mi történik a Setup-ban
A sorrend számít, mert a részek egymásba drótozódnak:
- Sentry először. A
sentryx.Setupfut le elsőnek:SENTRY_DSNnélkül minden hookja no-op, és minden pontosan úgy viselkedik, mintha a Sentry nem is létezne. - OTel, a Sentry span-exporterével. Az
otelx.Setupazotelx.WithSpanExporter(sentryHandle.SpanExporter())opcióval kapja meg a Sentry exporterét: ugyanazok a spanek egy plusz batcherrel a Sentrybe is mennek, így egy hiba a teljes request-trace-hez linkelődik. - Egy
slog.Default(). A konzol-handler (dev módban mindig, prodbanLOG_STDOUT=trueesetén), az OTLP log-bridge és a Sentry capture handler alogx.Fanout-tal egyetlen handlerré áll össze, elé egylogx.LevelFilter(LOG_LEVEL, ...)kerül, és az egész lesz a processz default loggere.
Vagyis egyetlen slog.InfoContext(ctx, ...) hívás a service-edben egyszerre: olvasható konzolsor (dev), OTLP-n exportált, trace-korrelált logrekord (prod), és hiba esetén Sentry event breadcrumb-nyomvonallal.
Mit kapsz nulla konfigurációval
Dev (OTEL_DEV_MODE=true) | Prod (default) | |
|---|---|---|
| Konzollog | mindig, olvasható szöveg (vagy Monolog-formátum) | csak LOG_STDOUT=true esetén, JSON |
| Trace-ek / metrikák | nincs exporter, nem kell collector | OTLP a standard OTEL_* változók szerint |
| OTLP log-bridge | nincs | van (a logok is a collectorba mennek) |
| Sentry | ki (SENTRY_DSN üres) | ki (SENTRY_DSN üres) |
OTEL_SERVICE_NAME | opcionális | kötelező (a Setup hibával áll le nélküle) |
OTEL_DEV_MODE=true. A service olvasható logokkal és request loggerrel bootol, infrastruktúra nélkül. Tedd mellé a LOG_FORMAT=monolog-ot, és a konzol PHP-ról ismerős, Monolog-stílusú sorokat ír, kattintható stack trace-szel.Egy kivétel van: ha dev módban SENTRY_DSN-t állítasz be, a kit egy Sentry-only tracer providert épít, így collector nélkül, lokálisan is teljes trace-t és hibát kapsz a Sentryben; a részletek a Sentry oldalon.
A flush a legvégén fut
A Setup visszatérési értéke egy aggregált shutdown-függvény, amit a chassis az alkalmazás-életciklus Flush lépéseként, legutolsóként futtat, a HTTP-drain és az összes WithCloser closered után. Ez a sorrend nem véletlen: a closerek maguk is bocsátanak ki telemetriát (egy pool-lezárás logja, egy cleanup közben nyitott span), és ezek csak akkor érnek célba, ha az exporterek még élnek.
A shutdown-on belül is van sorrend: előbb az OTel providerek állnak le, és a Sentry flushol legutoljára, így a providerek leállása közben keletkező eventek is kimennek.
Ha nem kell, vagy magad akarod
Mindhárom chassis-nak van kikapcsolója:
server.Run(ctx, cfg.Server, register, server.WithoutTelemetry())
worker.Run(ctx, cfg.Worker, register, worker.WithoutTelemetry())
realtime.Run(ctx, cfg.Realtime, register, realtime.WithoutTelemetry())
A WithoutTelemetry a telemetry.Setup-ot és a HTTP-oldali OTel middleware-t is kihagyja. Tesztekben ez az alapfelállás (nincs globális állapot-piszkálás), élesben pedig akkor kell, ha a processz maga konfigurálja a telemetriáját: például egy már meglévő OTel-setupba illeszkedik.
Nem-chassis processzben (CLI, cron-szerű egyszeri futás) a telemetry.Setup közvetlenül is hívható: ugyanazt a kompozíciót kapod, csak a shutdown-függvényt neked kell defer-elni. Ha a Sentry sem kell, az otelx.Setup önmagában is megáll.
Merre tovább
- Logolás: a
slogkompozíció és a Monolog-formátumú dev konzol, PHP-s szemmel a leglátványosabb rész. - OpenTelemetry: mit instrumentál a kit magától, és hogyan áll össze a shop „kövesd a rendelést" trace-e.
- Sentry: hibariportolás
errs-kód szerinti issue-csoportosítással, az OTel tetején.