mirror of
https://github.com/hanzoai/o11y.git
synced 2026-10-15 12:58:33 +00:00
Re-sync the entire SigNoz-derived Go tree to a clean fork of latest SigNoz main (upstream 3e6339019), eliminating the version-skew that broke `go build ./...` (mixed-era packages, ~14 imported-but-absent packages, partial signoz->o11y / clickhouse->datastore rebrands, self-import cycle, duplicate package decls). - pkg/ + cmd/ wholesale replaced with latest SigNoz; imports rewritten github.com/SigNoz/signoz/ -> github.com/hanzoai/o11y/. - Adopt SigNoz's CURRENT structure (resourcefilter->telemetryresourcefilter, integrationtypes->cloudintegrationtypes, roletypes/grammar/times folded in upstream); old paths dropped. - Fork deps repathed to hanzoai + bumped: signoz-otel-collector v0.144.6, clickhouse-go-mock v0.14.1, govaluate v0.1.0; expr-lang/expr => hanzoai/expr v1.17.8 (replace). go.mod reconciled from latest SigNoz; go.sum re-tidied. - ee/ + cmd/enterprise stripped — o11y stays MIT-only; community edition imports no ee packages. - Preserved o11y additions: module path github.com/hanzoai/o11y, mount.go (cloud.Register/zip mount adapter, HIP-0106), NOTICE + LICENSE (SigNoz §4c attribution retained; upstream pkg files are headerless per SigNoz convention). - Reverted o11y cosmetic renames (o11y*/datastore*) and experimental originals (authz/iamauthz, billing, zapreceiver, zapmetricreceiver) to SigNoz canonical to kill the skew; snapshots retained in git history for re-layering. go build ./... = exit 0. go vet clean except benign "unreachable code" in generated ANTLR parser files (inherited from upstream).
78 lines
3.2 KiB
Go
78 lines
3.2 KiB
Go
package tracedetail
|
|
|
|
import (
|
|
"github.com/hanzoai/o11y/pkg/errors"
|
|
"github.com/hanzoai/o11y/pkg/factory"
|
|
)
|
|
|
|
type Config struct {
|
|
Waterfall WaterfallConfig `mapstructure:"waterfall"`
|
|
Flamegraph FlamegraphConfig `mapstructure:"flamegraph"`
|
|
}
|
|
|
|
type FlamegraphConfig struct {
|
|
MaxSelectedLevels int `mapstructure:"max_selected_levels"`
|
|
MaxSpansPerLevel int `mapstructure:"max_spans_per_level"`
|
|
SamplingTopLatencySpansCount int `mapstructure:"sampling_top_latency_count"`
|
|
SamplingBucketCount int `mapstructure:"sampling_bucket_count"`
|
|
SelectAllSpansLimit uint `mapstructure:"select_all_spans_limit"`
|
|
}
|
|
|
|
type WaterfallConfig struct {
|
|
// SpanPageSize is the window size of spans returned per request.
|
|
SpanPageSize float64 `mapstructure:"span_page_size"`
|
|
// MaxDepthToAutoExpand is the depth of auto-expanded descendants below selectedSpanID.
|
|
MaxDepthToAutoExpand int `mapstructure:"max_depth_to_auto_expand"`
|
|
// MaxLimitToSelectAllSpans is the threshold below which all spans are returned without windowing.
|
|
MaxLimitToSelectAllSpans uint `mapstructure:"max_limit_to_select_all_spans"`
|
|
}
|
|
|
|
func NewConfigFactory() factory.ConfigFactory {
|
|
return factory.NewConfigFactory(factory.MustNewName("traces"), newConfig)
|
|
}
|
|
|
|
func newConfig() factory.Config {
|
|
return Config{
|
|
Waterfall: WaterfallConfig{
|
|
SpanPageSize: 500,
|
|
MaxDepthToAutoExpand: 5,
|
|
MaxLimitToSelectAllSpans: 10_000,
|
|
},
|
|
Flamegraph: FlamegraphConfig{
|
|
MaxSelectedLevels: 50,
|
|
MaxSpansPerLevel: 100,
|
|
SamplingTopLatencySpansCount: 5,
|
|
SamplingBucketCount: 50,
|
|
SelectAllSpansLimit: 100_000,
|
|
},
|
|
}
|
|
}
|
|
|
|
func (c Config) Validate() error {
|
|
if c.Waterfall.SpanPageSize <= 0 {
|
|
return errors.NewInvalidInputf(errors.CodeInvalidInput, "traces.waterfall.span_limit_per_request must be positive, got %v", c.Waterfall.SpanPageSize)
|
|
}
|
|
if c.Waterfall.MaxDepthToAutoExpand < 0 {
|
|
return errors.NewInvalidInputf(errors.CodeInvalidInput, "traces.waterfall.max_depth_for_selected_children cannot be negative, got %d", c.Waterfall.MaxDepthToAutoExpand)
|
|
}
|
|
if c.Waterfall.MaxLimitToSelectAllSpans == 0 {
|
|
return errors.NewInvalidInputf(errors.CodeInvalidInput, "traces.waterfall.max_limit_to_select_all_spans must be positive")
|
|
}
|
|
if c.Flamegraph.MaxSelectedLevels <= 0 {
|
|
return errors.NewInvalidInputf(errors.CodeInvalidInput, "traces.flamegraph.max_selected_levels must be positive, got %d", c.Flamegraph.MaxSelectedLevels)
|
|
}
|
|
if c.Flamegraph.MaxSpansPerLevel <= 0 {
|
|
return errors.NewInvalidInputf(errors.CodeInvalidInput, "traces.flamegraph.max_spans_per_level must be positive, got %d", c.Flamegraph.MaxSpansPerLevel)
|
|
}
|
|
if c.Flamegraph.SamplingTopLatencySpansCount < 0 {
|
|
return errors.NewInvalidInputf(errors.CodeInvalidInput, "traces.flamegraph.sampling_top_latency_count cannot be negative, got %d", c.Flamegraph.SamplingTopLatencySpansCount)
|
|
}
|
|
if c.Flamegraph.SamplingBucketCount <= 0 {
|
|
return errors.NewInvalidInputf(errors.CodeInvalidInput, "traces.flamegraph.sampling_bucket_count must be positive, got %d", c.Flamegraph.SamplingBucketCount)
|
|
}
|
|
if c.Flamegraph.SelectAllSpansLimit == 0 {
|
|
return errors.NewInvalidInputf(errors.CodeInvalidInput, "traces.flamegraph.select_all_spans_limit must be positive")
|
|
}
|
|
return nil
|
|
}
|