mirror of
https://github.com/hanzoai/o11y.git
synced 2026-10-15 12:58:33 +00:00
* debrand: signoz/SigNoz/SIGNOZ -> o11y/O11y/O11Y across the tree Rename all SigNoz *branding* to O11y in file contents, file/dir names, package names, env vars, config keys, comments, docs, SDK code, and the ClickHouse schema identifiers the querier reads. Collector dependency: - Repoint github.com/hanzoai/signoz-otel-collector -> github.com/hanzoai/otel-collector and bump v0.144.6 -> v0.144.7 (go.mod + go.sum reconciled via go mod tidy). Internal package paths also debranded upstream: signozschemamigrator -> o11yschemamigrator, signozlogspipelineprocessor -> o11ylogspipelineprocessor. - Fix: v0.144.7 dropped otelconst.DistributedFieldKeysTable from the collector's public constants; pin FieldKeysTable = "distributed_field_keys" locally in pkg/telemetrymetadata/tables.go. Package/dir renames (package decl + all importers): pkg/apiserver/signozapiserver -> o11yapiserver, plus signozalertmanager, signozauthzapi, signozglobal, signozquerier, signozruler, and pkg/signoz -> pkg/o11y. Schema (read plane): signoz_traces/metrics/logs/metadata/analytics/meter and signoz_index_v3/index_v2/error_index_v2/spans (+ distributed_*) -> o11y_*. Data-preserving cutover migration added: deploy/clickhouse/migrations/0001_rename_signoz_to_o11y.sql (metadata-only RENAME DATABASE/TABLE, no drop/recreate). Preserved (attribution / external / wire contracts): - LICENSE + NOTICE verbatim (incl. "software from SigNoz", "Copyright ... SigNoz Inc."). - Upstream github.com/SigNoz/* repo URLs + @SigNoz/* CODEOWNERS teams. - Billing resource-attribute regex "signoz.workspace.*" (external wire contract). go build ./pkg/... ./cmd/... = 0; gofmt clean; renamed+schema pkg tests pass. * o11y: bump collector to v0.144.8 (o11y_* physical schema writer) + lockstep deploy plan Collector v0.144.8's schema-migrator + exporters now CREATE/WRITE the same o11y_* physical databases/tables the querier reads and the RENAME migration (0001_rename_signoz_to_o11y.sql) targets. Cross-checked byte-identical: writer DB set == migration target DB set (6); writer prefixed-table set == migration target table set (8); o11y querier reads and cloud reads are subsets of that set. Zero table-name mismatches between writer, readers, and migration. Collector go.mod unchanged between v0.144.7 and v0.144.8 (identical go.mod hash) — pure source rename, no module-graph change. Adds deploy/clickhouse/DEPLOY_signoz_to_o11y_cutover.md: the lockstep order (collector v0.144.8 -> RENAME migration -> o11y+cloud readers) with a fresh/scratch-ClickHouse pre-flight (create via migrator, emit trace+metric, query back) and rollback. Ships together or telemetry blackholes. go build ./pkg/... ./cmd/community = 0.
168 lines
5.2 KiB
Go
168 lines
5.2 KiB
Go
package instrumentation
|
|
|
|
import (
|
|
"context"
|
|
"log/slog"
|
|
|
|
"github.com/hanzoai/o11y/pkg/errors"
|
|
"github.com/hanzoai/o11y/pkg/factory"
|
|
"github.com/hanzoai/o11y/pkg/version"
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
"github.com/prometheus/client_golang/prometheus/collectors"
|
|
contribsdkconfig "go.opentelemetry.io/contrib/config"
|
|
"go.opentelemetry.io/otel"
|
|
sdkmetric "go.opentelemetry.io/otel/metric"
|
|
sdkmetricnoop "go.opentelemetry.io/otel/metric/noop"
|
|
sdkresource "go.opentelemetry.io/otel/sdk/resource"
|
|
semconv "go.opentelemetry.io/otel/semconv/v1.40.0"
|
|
sdktrace "go.opentelemetry.io/otel/trace"
|
|
)
|
|
|
|
var _ factory.Service = (*SDK)(nil)
|
|
var _ Instrumentation = (*SDK)(nil)
|
|
|
|
// SDK holds the core components for application instrumentation.
|
|
type SDK struct {
|
|
logger *slog.Logger
|
|
sdk contribsdkconfig.SDK
|
|
meterProvider sdkmetric.MeterProvider
|
|
prometheusRegistry *prometheus.Registry
|
|
meterProviderShutdownFunc func(context.Context) error
|
|
startCh chan struct{}
|
|
}
|
|
|
|
// New creates a new Instrumentation instance with configured providers.
|
|
// It sets up logging, tracing, and metrics based on the provided configuration.
|
|
func New(ctx context.Context, cfg Config, build version.Build, serviceName string) (*SDK, error) {
|
|
// Set default resource attributes if not provided
|
|
if cfg.Resource.Attributes == nil {
|
|
cfg.Resource.Attributes = map[string]any{
|
|
string(semconv.ServiceNameKey): serviceName,
|
|
string(semconv.ServiceVersionKey): build.Version(),
|
|
}
|
|
}
|
|
|
|
// Create a new resource with default detectors.
|
|
// The upstream contrib repository is not taking detectors into account.
|
|
// We are, therefore, using some sensible defaults here.
|
|
resource, err := sdkresource.New(
|
|
ctx,
|
|
sdkresource.WithContainer(),
|
|
sdkresource.WithFromEnv(),
|
|
sdkresource.WithHost(),
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Prepare the resource configuration by merging
|
|
// resource and attributes.
|
|
//
|
|
// Derive the schema URL from the detected resource itself rather than a
|
|
// hard-pinned semconv version: contrib's NewSDK merges this against
|
|
// resource.Default(), and OTEL rejects a merge of two non-empty, differing
|
|
// schema URLs. Pinning semconv/vX here silently conflicts with whatever
|
|
// schema the otel/sdk in go.mod ships (skewed by the O11y re-sync), which
|
|
// crashes New() with "conflicting Schema URL". Sourcing it from the resource
|
|
// we actually built keeps it correct across otel bumps.
|
|
sch := resource.SchemaURL()
|
|
configResource := contribsdkconfig.Resource{
|
|
Attributes: mergeAttributes(cfg.Resource.Attributes, resource),
|
|
Detectors: nil,
|
|
SchemaUrl: &sch,
|
|
}
|
|
|
|
prometheusRegistry := prometheus.NewRegistry()
|
|
prometheusRegistry.MustRegister(collectors.NewBuildInfoCollector())
|
|
|
|
var tracerProvider *contribsdkconfig.TracerProvider
|
|
if cfg.Traces.Enabled {
|
|
tracerProvider = &contribsdkconfig.TracerProvider{
|
|
Processors: []contribsdkconfig.SpanProcessor{
|
|
{Batch: &cfg.Traces.Processors.Batch},
|
|
},
|
|
Sampler: &cfg.Traces.Sampler,
|
|
}
|
|
}
|
|
|
|
// Use contrib config approach but with custom Prometheus registry
|
|
var meterProvider sdkmetric.MeterProvider
|
|
var meterProviderShutdownFunc func(context.Context) error
|
|
if cfg.Metrics.Enabled {
|
|
meterProviderConfig := &contribsdkconfig.MeterProvider{
|
|
Readers: []contribsdkconfig.MetricReader{
|
|
{Pull: &cfg.Metrics.Readers.Pull},
|
|
},
|
|
}
|
|
|
|
meterProvider, meterProviderShutdownFunc, err = meterProviderWithCustomRegistry(ctx, meterProviderConfig, resource, prometheusRegistry)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
} else {
|
|
meterProvider = sdkmetricnoop.NewMeterProvider()
|
|
meterProviderShutdownFunc = func(context.Context) error { return nil }
|
|
}
|
|
|
|
sdk, err := contribsdkconfig.NewSDK(
|
|
contribsdkconfig.WithContext(ctx),
|
|
contribsdkconfig.WithOpenTelemetryConfiguration(contribsdkconfig.OpenTelemetryConfiguration{
|
|
TracerProvider: tracerProvider,
|
|
Resource: &configResource,
|
|
}),
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Set the global tracer provider to the sdk tracer provider so that external packages can use this
|
|
otel.SetTracerProvider(sdk.TracerProvider())
|
|
|
|
return &SDK{
|
|
sdk: sdk,
|
|
meterProvider: meterProvider,
|
|
meterProviderShutdownFunc: meterProviderShutdownFunc,
|
|
prometheusRegistry: prometheusRegistry,
|
|
logger: NewLogger(cfg),
|
|
startCh: make(chan struct{}),
|
|
}, nil
|
|
}
|
|
|
|
func (i *SDK) Start(ctx context.Context) error {
|
|
<-i.startCh
|
|
return nil
|
|
}
|
|
|
|
func (i *SDK) Stop(ctx context.Context) error {
|
|
close(i.startCh)
|
|
return errors.Join(
|
|
i.sdk.Shutdown(ctx),
|
|
i.meterProviderShutdownFunc(ctx),
|
|
)
|
|
}
|
|
|
|
func (i *SDK) Logger() *slog.Logger {
|
|
return i.logger
|
|
}
|
|
|
|
func (i *SDK) MeterProvider() sdkmetric.MeterProvider {
|
|
return i.meterProvider
|
|
}
|
|
|
|
func (i *SDK) TracerProvider() sdktrace.TracerProvider {
|
|
return i.sdk.TracerProvider()
|
|
}
|
|
|
|
func (i *SDK) PrometheusRegisterer() prometheus.Registerer {
|
|
return i.prometheusRegistry
|
|
}
|
|
|
|
func (i *SDK) ToProviderSettings() factory.ProviderSettings {
|
|
return factory.ProviderSettings{
|
|
Logger: i.Logger(),
|
|
MeterProvider: i.MeterProvider(),
|
|
TracerProvider: i.TracerProvider(),
|
|
PrometheusRegisterer: i.PrometheusRegisterer(),
|
|
}
|
|
}
|