mirror of
https://github.com/hanzoai/o11y.git
synced 2026-10-15 12:58:33 +00:00
MAIN HAD NOT COMPILED SINCE 2026-07-30. Commit 5e3210f759 rewrote tables.go in three telemetry packages and the sentrytypes Event struct without updating their consumers, while its message claimed the read paths 'build clean' — proven false with a detached worktree at clean HEAD. That is why the deployed backend is SHA-pinned and stale: CI could not build main at all. THE RENAME: /api/v1|v2|v3|v4/<rest> -> /v1/o11y/<rest> (290 replacements; the host already says api, so the path never does, and one live generation carries no version segments). 21 duplicate v1 registrations DELETED with their v2 twins kept — gorilla/mux is first-match, so after the collapse the v1 line would have shadowed v2 silently, with no error, forever: rules (6), dashboards (6), services/top_operations/entry_point_operations/ttl (5), features, query_range v3+v4 -> v5, metrics/dashboards. 16 orphaned handler funcs (430 lines) deleted. CONSUMERS MIGRATED to the one-way table names, never the reverse: tables.go's deletion of the versioned constants was deliberate (stated three times), and the new blocks are positional 1:1 rewrites of the old, so every resolution is a constant the same commit declared — SpanIndexV3->span, LogsV2->log, SamplesV4->metric, TimeseriesV4->series, UpdatedMetadata->descriptor, ambiguity on operation-vs-trace settled by tables.go's own inline comments. sentrytypes.Frame/Event.Frames/Event.Handled RECONSTRUCTED, not guessed: pinned independently by eventsql.go's projection, eventstore.go's scan targets and module.go's clampLine/InApp, and asserted literally by the pre-existing TestFramesRoundTrip. TraceSummary.Sample -> Message (event.error has no sample column). Event.Sample deleted: a field that always read "" while claiming to hold the occurrence JSON. PATH MANGLERS KILLED, both deployment shapes: mount.go rewriteExternalPath+ setPath deleted (it mapped /v1/o11y/services -> /api/services => 404 on the cloud-binary path — proven with a real test before deletion); server.go StripPrefix removed (it reduced /v1/o11y/services -> /services => the web catch-all answered index.html on the standalone path). versionless.go + versionless_test.go + both call sites deleted: its regex matched 0 of the registered routes and walked the router at every startup to register nothing — the second spelling of one path, gone with the mechanism that needed it. FRONTEND: prependBase '/api/v1/' -> '/v1/o11y/' (both baseURL branches), 17 /api/v1/assistant literals renamed (note: no assistant route exists in pkg/ — client-only surface, a real product gap, not papered over), 21 MSW mocks moved so they intercept the paths the app now requests. GATE, all executed: go build ./... green; go test ./... green (exit 0); 0 /api/v[0-9] references in pkg code (frontend's 5 are query-builder escaping fixtures); 0 duplicate (method,path) registrations; /v1/o11y/services survives both mount.go and server.go untouched. Co-authored-by: Hanzo Dev <[email protected]>
198 lines
5.3 KiB
Go
198 lines
5.3 KiB
Go
package o11yquerier
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/hanzoai/o11y/pkg/cache"
|
|
"github.com/hanzoai/o11y/pkg/factory"
|
|
"github.com/hanzoai/o11y/pkg/flagger"
|
|
"github.com/hanzoai/o11y/pkg/prometheus"
|
|
"github.com/hanzoai/o11y/pkg/querier"
|
|
"github.com/hanzoai/o11y/pkg/querybuilder"
|
|
"github.com/hanzoai/o11y/pkg/telemetryaudit"
|
|
"github.com/hanzoai/o11y/pkg/telemetrylogs"
|
|
"github.com/hanzoai/o11y/pkg/telemetrymetadata"
|
|
"github.com/hanzoai/o11y/pkg/telemetrymeter"
|
|
"github.com/hanzoai/o11y/pkg/telemetrymetrics"
|
|
"github.com/hanzoai/o11y/pkg/telemetrystore"
|
|
"github.com/hanzoai/o11y/pkg/telemetrytraces"
|
|
)
|
|
|
|
// NewFactory creates a new factory for the o11y querier provider.
|
|
func NewFactory(
|
|
telemetryStore telemetrystore.TelemetryStore,
|
|
prometheus prometheus.Prometheus,
|
|
cache cache.Cache,
|
|
flagger flagger.Flagger,
|
|
) factory.ProviderFactory[querier.Querier, querier.Config] {
|
|
return factory.NewProviderFactory(
|
|
factory.MustNewName("o11y"),
|
|
func(
|
|
ctx context.Context,
|
|
settings factory.ProviderSettings,
|
|
cfg querier.Config,
|
|
) (querier.Querier, error) {
|
|
return newProvider(ctx, settings, cfg, telemetryStore, prometheus, cache, flagger)
|
|
},
|
|
)
|
|
}
|
|
|
|
func newProvider(
|
|
_ context.Context,
|
|
settings factory.ProviderSettings,
|
|
cfg querier.Config,
|
|
telemetryStore telemetrystore.TelemetryStore,
|
|
prometheus prometheus.Prometheus,
|
|
cache cache.Cache,
|
|
flagger flagger.Flagger,
|
|
) (querier.Querier, error) {
|
|
|
|
// Create telemetry metadata store
|
|
telemetryMetadataStore := telemetrymetadata.NewTelemetryMetaStore(
|
|
settings,
|
|
telemetryStore,
|
|
telemetrytraces.DBName,
|
|
telemetrytraces.SpanAttributeTableName,
|
|
telemetrytraces.SpanKeyTableName,
|
|
telemetrytraces.SpanTableName,
|
|
telemetrymetrics.DBName,
|
|
telemetrymetrics.AttributeTableName,
|
|
telemetrymeter.DBName,
|
|
telemetrymeter.SamplesAgg1dTableName,
|
|
telemetrylogs.DBName,
|
|
telemetrylogs.LogTableName,
|
|
telemetrylogs.LogAttributeTableName,
|
|
telemetrylogs.LogKeyTableName,
|
|
telemetrylogs.LogResourceKeyTableName,
|
|
telemetryaudit.DBName,
|
|
telemetryaudit.AuditLogsTableName,
|
|
telemetryaudit.TagAttributesTableName,
|
|
telemetryaudit.LogAttributeKeysTblName,
|
|
telemetryaudit.LogResourceKeysTblName,
|
|
telemetrymetadata.DBName,
|
|
telemetrymetadata.AttributesMetadataLocalTableName,
|
|
telemetrymetadata.ColumnEvolutionMetadataTableName,
|
|
flagger,
|
|
)
|
|
|
|
// Create trace statement builder
|
|
traceFieldMapper := telemetrytraces.NewFieldMapper()
|
|
traceConditionBuilder := telemetrytraces.NewConditionBuilder(traceFieldMapper)
|
|
|
|
traceAggExprRewriter := querybuilder.NewAggExprRewriter(settings, nil, traceFieldMapper, traceConditionBuilder, nil, flagger)
|
|
traceStmtBuilder := telemetrytraces.NewTraceQueryStatementBuilder(
|
|
settings,
|
|
telemetryMetadataStore,
|
|
traceFieldMapper,
|
|
traceConditionBuilder,
|
|
traceAggExprRewriter,
|
|
telemetryStore,
|
|
flagger,
|
|
cfg.SkipResourceFingerprint.Enabled,
|
|
cfg.SkipResourceFingerprint.Threshold,
|
|
)
|
|
|
|
// Create trace operator statement builder
|
|
traceOperatorStmtBuilder := telemetrytraces.NewTraceOperatorStatementBuilder(
|
|
settings,
|
|
telemetryMetadataStore,
|
|
traceFieldMapper,
|
|
traceConditionBuilder,
|
|
traceStmtBuilder,
|
|
traceAggExprRewriter,
|
|
flagger,
|
|
)
|
|
|
|
// Create log statement builder
|
|
logFieldMapper := telemetrylogs.NewFieldMapper(flagger)
|
|
logConditionBuilder := telemetrylogs.NewConditionBuilder(logFieldMapper, flagger)
|
|
logAggExprRewriter := querybuilder.NewAggExprRewriter(
|
|
settings,
|
|
telemetrylogs.DefaultFullTextColumn,
|
|
logFieldMapper,
|
|
logConditionBuilder,
|
|
telemetrylogs.GetBodyJSONKey,
|
|
flagger,
|
|
)
|
|
logStmtBuilder := telemetrylogs.NewLogQueryStatementBuilder(
|
|
settings,
|
|
telemetryMetadataStore,
|
|
logFieldMapper,
|
|
logConditionBuilder,
|
|
logAggExprRewriter,
|
|
telemetrylogs.DefaultFullTextColumn,
|
|
telemetrylogs.GetBodyJSONKey,
|
|
flagger,
|
|
telemetryStore,
|
|
cfg.SkipResourceFingerprint.Enabled,
|
|
cfg.SkipResourceFingerprint.Threshold,
|
|
)
|
|
|
|
// Create audit statement builder
|
|
auditFieldMapper := telemetryaudit.NewFieldMapper()
|
|
auditConditionBuilder := telemetryaudit.NewConditionBuilder(auditFieldMapper)
|
|
auditAggExprRewriter := querybuilder.NewAggExprRewriter(
|
|
settings,
|
|
telemetryaudit.DefaultFullTextColumn,
|
|
auditFieldMapper,
|
|
auditConditionBuilder,
|
|
nil,
|
|
flagger,
|
|
)
|
|
auditStmtBuilder := telemetryaudit.NewAuditQueryStatementBuilder(
|
|
settings,
|
|
telemetryMetadataStore,
|
|
auditFieldMapper,
|
|
auditConditionBuilder,
|
|
auditAggExprRewriter,
|
|
telemetryaudit.DefaultFullTextColumn,
|
|
nil,
|
|
flagger,
|
|
)
|
|
|
|
// Create metric statement builder
|
|
metricFieldMapper := telemetrymetrics.NewFieldMapper()
|
|
metricConditionBuilder := telemetrymetrics.NewConditionBuilder(metricFieldMapper)
|
|
metricStmtBuilder := telemetrymetrics.NewMetricQueryStatementBuilder(
|
|
settings,
|
|
telemetryMetadataStore,
|
|
metricFieldMapper,
|
|
metricConditionBuilder,
|
|
flagger,
|
|
)
|
|
|
|
// Create meter statement builder
|
|
meterStmtBuilder := telemetrymeter.NewMeterQueryStatementBuilder(
|
|
settings,
|
|
telemetryMetadataStore,
|
|
metricFieldMapper,
|
|
metricConditionBuilder,
|
|
metricStmtBuilder,
|
|
)
|
|
|
|
// Create bucket cache
|
|
bucketCache := querier.NewBucketCache(
|
|
settings,
|
|
cache,
|
|
cfg.CacheTTL,
|
|
cfg.FluxInterval,
|
|
)
|
|
|
|
// Create and return the querier
|
|
return querier.New(
|
|
settings,
|
|
telemetryStore,
|
|
telemetryMetadataStore,
|
|
prometheus,
|
|
traceStmtBuilder,
|
|
logStmtBuilder,
|
|
auditStmtBuilder,
|
|
metricStmtBuilder,
|
|
meterStmtBuilder,
|
|
traceOperatorStmtBuilder,
|
|
bucketCache,
|
|
flagger,
|
|
cfg.LogTraceIDWindowPadding,
|
|
), nil
|
|
}
|