Documentation
¶
Index ¶
- Constants
- Variables
- func ContextWithSpanContext(ctx context.Context, sc SpanContext) context.Context
- func DefaultHistogramBuckets() []float64
- func IncCounter(m Meter, ctx context.Context, name string, delta int64, labels Labels) error
- func ObserveHistogram(m Meter, ctx context.Context, name string, value float64, buckets []float64, ...) error
- func SetGauge(m Meter, ctx context.Context, name string, value float64, labels Labels) error
- func ValidateBuckets(b []float64) error
- func ValidateFloat(value float64) error
- func ValidateMetricName(name string) error
- type Carrier
- type ComponentStatus
- type Event
- type Field
- type HealthSnapshot
- type HealthWarning
- type Labels
- type Level
- type Logger
- func (l *Logger) Debug(ctx context.Context, msg string, fields map[string]any)
- func (l *Logger) Error(ctx context.Context, msg string, fields map[string]any)
- func (l *Logger) Info(ctx context.Context, msg string, fields map[string]any)
- func (l *Logger) Warn(ctx context.Context, msg string, fields map[string]any)
- type Meter
- type NopMeter
- func (NopMeter) IncCounter(ctx context.Context, name string, delta int64, labels Labels) error
- func (NopMeter) ObserveHistogram(ctx context.Context, name string, value float64, buckets []float64, ...) error
- func (NopMeter) SetGauge(ctx context.Context, name string, value float64, labels Labels) error
- type NopPropagator
- type Options
- type Propagator
- type SpanContext
- type Status
Constants ¶
const ( MaxComponents = 64 MaxMessageLen = 256 MaxDetails = 32 MaxDetailKeyLen = 64 MaxDetailValLen = 256 MaxServiceLen = 64 MaxEnvLen = 32 MaxTenantLen = 64 // Bounded warnings to prevent report bloat. MaxWarnings = 32 )
const ( MaxFields = 64 MaxKeyLen = 64 MaxValLen = 512 // Bound conflict reporting MaxConflictKeys = 8 // Deterministic value encoding bound (before sanitize truncation) MaxDeterministicJSONBytes = 2048 )
const ( MaxLabelPairs = 32 MaxLabelKeyLen = 64 MaxLabelValLen = 256 )
Variables ¶
var ( ErrInvalidLabels = errors.New("telemetry: invalid labels") ErrInvalidValue = errors.New("telemetry: invalid metric value") )
var (
ErrInvalidHealth = errors.New("telemetry: invalid health")
)
var NopLogger = &Logger{w: io.Discard, opt: Options{Timestamp: true, Level: LevelError}}
NopLogger is a safe no-op logger.
var NopMeterInstance = NopMeter{}
NopMeterInstance is a convenience singleton.
Functions ¶
func ContextWithSpanContext ¶
func ContextWithSpanContext(ctx context.Context, sc SpanContext) context.Context
ContextWithSpanContext returns a context carrying the provided SpanContext.
func DefaultHistogramBuckets ¶
func DefaultHistogramBuckets() []float64
DefaultHistogramBuckets returns a shared recommended bucket set. These are similar in spirit to common latency buckets (seconds) used in practice. Callers may supply custom buckets; this is a safe default to reduce drift.
func IncCounter ¶
func ObserveHistogram ¶
func ValidateBuckets ¶
ValidateBuckets ensures histogram buckets are strictly increasing and finite.
func ValidateFloat ¶
func ValidateMetricName ¶
ValidateMetricName enforces a safe name charset. Pattern: [a-z][a-z0-9:_-]{0,127}
Types ¶
type ComponentStatus ¶
type ComponentStatus struct {
Name string `json:"name"`
Status Status `json:"status"`
CheckedAt time.Time `json:"checked_at"`
Message string `json:"message,omitempty"`
Details map[string]string `json:"details,omitempty"`
}
ComponentStatus describes a single subsystem check.
func (ComponentStatus) MarshalJSON ¶
func (c ComponentStatus) MarshalJSON() ([]byte, error)
type Event ¶
type Event struct {
Ts string `json:"ts"`
Level Level `json:"level"`
Service string `json:"service,omitempty"`
Msg string `json:"msg"`
Fields []Field `json:"fields,omitempty"`
}
Event is a single log record (JSON line).
type HealthSnapshot ¶
type HealthSnapshot struct {
Service string `json:"service"`
Env string `json:"env,omitempty"`
Tenant string `json:"tenant,omitempty"`
GeneratedAt time.Time `json:"generated_at"`
Overall Status `json:"overall"`
Components []ComponentStatus `json:"components"`
Hash string `json:"hash"`
// Optional warnings emitted during Normalize (e.g. truncation, dedupe).
Warnings []HealthWarning `json:"warnings,omitempty"`
}
HealthSnapshot is the full health document emitted by a service.
func NewHealthSnapshot ¶
func NewHealthSnapshot(service, env, tenant string, comps []ComponentStatus, now time.Time) (HealthSnapshot, error)
NewHealthSnapshot builds a normalized + validated snapshot. Hybrid time: if now is zero, uses time.Now().UTC().
func (HealthSnapshot) MarshalJSON ¶
func (s HealthSnapshot) MarshalJSON() ([]byte, error)
func (*HealthSnapshot) Normalize ¶
func (s *HealthSnapshot) Normalize() error
Normalize enforces deterministic ordering and bounds-friendly shaping, emitting warnings on: - truncations - dropped invalid detail entries - duplicate component names (deduped deterministically)
func (HealthSnapshot) StableHash ¶
func (s HealthSnapshot) StableHash() (string, error)
StableHash returns deterministic sha256 over normalized snapshot fields. Warnings are intentionally excluded (hash represents health state, not normalization artifacts).
func (HealthSnapshot) Validate ¶
func (s HealthSnapshot) Validate() error
type HealthWarning ¶
type HealthWarning struct {
Code string `json:"code"`
Subject string `json:"subject,omitempty"` // component name or field
Message string `json:"message"`
}
HealthWarning captures non-fatal normalization decisions (truncations, dedupe, drops).
type Labels ¶
func NormalizeLabels ¶
NormalizeLabels returns a bounded, normalized copy of labels.
- Lowercases and trims keys
- Trims values
- Enforces key/value charset (ASCII) to avoid downstream exporter rejections
- Drops invalid/empty/oversize keys
- Truncates oversize values
- Deterministically limits to MaxLabelPairs by sorted key order
func (Labels) Fingerprint ¶
Fingerprint returns a deterministic sha256 over normalized labels. If labels are nil/empty, returns empty string.
type Logger ¶
type Logger struct {
// contains filtered or unexported fields
}
Logger is a structured JSON-lines logger (stdlib-only).
func NewDefaultLogger ¶
NewDefaultLogger returns an info-level logger with timestamps enabled.
func NewInfoLogger ¶
NewInfoLogger is an alias of NewDefaultLogger (clarity).
type Meter ¶
type Meter interface {
IncCounter(ctx context.Context, name string, delta int64, labels Labels) error
SetGauge(ctx context.Context, name string, value float64, labels Labels) error
ObserveHistogram(ctx context.Context, name string, value float64, buckets []float64, labels Labels) error
}
Meter is the minimal metrics interface used across Chartly services. Implementations may export to Prometheus, OTel, logs, etc.
type NopMeter ¶
type NopMeter struct{}
NopMeter is a safe no-op meter.
func (NopMeter) IncCounter ¶
func (NopMeter) ObserveHistogram ¶
type NopPropagator ¶
type NopPropagator struct{}
NopPropagator is a no-op propagator.
func (NopPropagator) Inject ¶
func (NopPropagator) Inject(carrier Carrier, sc SpanContext) error
Inject performs no action and returns nil.
type Propagator ¶
type Propagator interface {
Inject(carrier Carrier, sc SpanContext) error
}
Propagator injects a SpanContext into a Carrier. Implementations are provider-neutral and deterministic.
type SpanContext ¶
SpanContext is a minimal tracing context used for log enrichment.
func SpanContextFromContext ¶
func SpanContextFromContext(ctx context.Context) (SpanContext, bool)
SpanContextFromContext extracts a SpanContext from ctx if present.