* refactor(cmd): extract per-build sqlstore/sqlschema factory helpers
Move the build-specific composition of sqlstore and sqlschema provider
factories out of community/server.go and enterprise/server.go into
sibling metastore.go files. This deduplicates the wiring that will
otherwise be repeated in the upcoming metastore command, and keeps each
build's postgres opt-in expressed in exactly one place.
refs SigNoz/platform-pod#706
* feat(cmd): add metastore migrate sync up command
Introduce a 'metastore migrate sync up' cobra command that applies
SQL schema migrations as a standalone CLI step. Operators can now run
migrations to completion before bringing up the application, instead
of having them implicitly run on server startup.
The command accepts the same --config flag shape as 'server' so the
same YAML configuration files line up across both entrypoints. The
build-specific composition of sqlstore and sqlschema provider
factories is injected from cmd/{community,enterprise}/metastore.go.
refs SigNoz/platform-pod#706
* feat(cmd): register metastore command from both build mains
Wire RegisterMetastore into cmd/community/main.go and
cmd/enterprise/main.go so the new 'metastore migrate sync up'
subcommand is reachable from both binaries.
refs SigNoz/platform-pod#706
* feat(sqlmigrator): add Check method to report pending migrations
Check reports whether the database has any unapplied migrations
without applying them, intended for use by preflight/CI gates. It
returns nil when the database is up to date and a typed error
(ErrCodePendingSQLMigrations) listing the pending migration names
otherwise.
refs SigNoz/platform-pod#706
* refactor(cmd): split metastore registration from execution, add sync check
Mirror the server.go pattern: registerSync{Up,Check} only build the
cobra commands and parse flags; runSync{Up,Check} hold the actual
work and share a newSyncMigrator helper so the wiring of sqlstore,
sqlschema, telemetrystore and the SQL migrator lives in one place.
Adds the new 'metastore migrate sync check' subcommand, which calls
sqlmigrator.Check and exits non-zero when migrations are pending —
useful as a deployment preflight gate before bringing up the server.
refs SigNoz/platform-pod#706
* fix(sqlmigrator): drop Init from Check
Check should report state, not create the migration table. If the
migration table is missing, that's itself a signal that 'up' has not
been run.
refs SigNoz/platform-pod#706
* fix(sqlmigrator): use TypeUnexpected for pending migrations error
Pending migrations are a state mismatch, not bad caller input.
TypeUnexpected ('Generic mismatch of expectations') is the correct
category.
refs SigNoz/platform-pod#706
* fix(sqlmigrator): switch pending migrations error to TypeInternal
Pending migrations describe internal system state (the schema is
behind the target version), not bad caller input or a caller-visible
state mismatch. None of the existing types maps to a FAILED_PRECONDITION
equivalent, so TypeInternal is the closest fit.
refs SigNoz/platform-pod#706
* fix(sqlmigrator): use TypeNotFound for pending migrations error
refs SigNoz/platform-pod#706
* feat(instrumentation): add OTel exception semantic convention log handler
Add a loghandler.Wrapper that enriches error log records with OpenTelemetry
exception semantic convention attributes (exception.type, exception.code,
exception.message, exception.stacktrace).
- Add errors.Attr() helper for standardized error logging under "exception" key
- Add exception log handler that replaces raw error attrs with structured group
- Wire exception handler into the instrumentation SDK logger chain
- Remove LogValue() from errors.base as the handler now owns structuring
* refactor: replace "error", err with errors.Attr(err) across codebase
Migrate all slog error logging from ad-hoc "error", err key-value pairs
to the standardized errors.Attr(err) helper, enabling the exception log
handler to enrich these logs with OTel semantic convention attributes.
* refactor: enforce attr-only slog style across codebase
Change sloglint from kv-only to attr-only, requiring all slog calls to
use typed attributes (slog.String, slog.Any, etc.) instead of key-value
pairs. Convert all existing kv-style slog calls in non-excluded paths.
* refactor: tighten slog.Any to specific types and standardize error attrs
- Replace slog.Any with slog.String for string values (action, key, where_clause)
- Replace slog.Any with slog.Uint64 for uint64 values (start, end, step, etc.)
- Replace slog.Any("err", err) with errors.Attr(err) in dispatcher and segment analytics
- Replace slog.Any("error", ctx.Err()) with errors.Attr in factory registry
* fix(instrumentation): use Unwrapb message for exception.message
Use the explicit error message (m) from Unwrapb instead of
foundErr.Error(), which resolves to the inner cause's message
for wrapped errors.
* feat(errors): capture stacktrace at error creation time
Store program counters ([]uintptr) in base errors at creation time
using runtime.Callers, inspired by thanos-io/thanos/pkg/errors. The
exception log handler reads the stacktrace from the error instead of
capturing at log time, showing where the error originated.
* fix(instrumentation): apply default log wrappers uniformly in NewLogger
Move correlation, filtering, and exception wrappers into NewLogger so
all call sites (including CLI loggers in cmd/) get them automatically.
* refactor(instrumentation): remove variadic wrappers from NewLogger
NewLogger no longer accepts arbitrary wrappers. The core wrappers
(correlation, filtering, exception) are hardcoded, preventing callers
from accidentally duplicating behavior.
* refactor: migrate remaining "error", <var> to errors.Attr across legacy paths
Replace all remaining "error", <variable> key-value pairs with
errors.Attr(<variable>) in pkg/query-service/ and ee/query-service/
paths that were missed in the initial migration due to non-standard
variable names (res.Err, filterErr, apiErrorObj.Err, etc).
* refactor(instrumentation): use flat exception.* keys instead of nested group
Use flat keys (exception.type, exception.code, exception.message,
exception.stacktrace) instead of a nested slog.Group in the exception
log handler.