frostfs-observability/tracing/config.go

91 lines
2.2 KiB
Go
Raw Normal View History

package tracing
import (
"crypto/x509"
"fmt"
"maps"
)
// Exporter is type of tracing target.
type Exporter string
const (
StdoutExporter Exporter = "stdout"
OTLPgRPCExporter Exporter = "otlp_grpc"
NoOpExporter Exporter = "noop"
)
type Config struct {
// Enabled is true, if tracing enabled.
Enabled bool
// Exporter is collector type.
Exporter Exporter
// Endpoint is collector endpoint for OTLP exporters.
Endpoint string
// ServerCaCertPool is cert pool of the remote server CA certificate. Use for TLS setup.
ServerCaCertPool *x509.CertPool
// Service is service name that will be used in tracing.
// Mandatory.
Service string
// InstanceID is identity of service instance.
// Optional.
InstanceID string
// Version is version of service instance.
// Optional.
Version string
// Attributes is KV list of attributes.
// Optional.
Attributes map[string]string
}
func (c *Config) validate() error {
if !c.Enabled {
return nil
}
if c.Exporter != StdoutExporter && c.Exporter != OTLPgRPCExporter && c.Exporter != NoOpExporter {
return fmt.Errorf("tracing config error: unknown exporter '%s', valid values are %v",
c.Exporter, []string{string(StdoutExporter), string(OTLPgRPCExporter), string(NoOpExporter)})
}
if len(c.Service) == 0 {
return fmt.Errorf("tracing config error: service name must be specified")
}
if c.Exporter == OTLPgRPCExporter && len(c.Endpoint) == 0 {
return fmt.Errorf("tracing config error: exporter '%s' requires endpoint", c.Exporter)
}
return nil
}
func (c *Config) hasChange(other *Config) bool {
if !c.Enabled && !other.Enabled {
return false
}
if c.Enabled != other.Enabled {
return true
}
if (c.Exporter == StdoutExporter && other.Exporter == StdoutExporter) ||
(c.Exporter == NoOpExporter && other.Exporter == NoOpExporter) {
return !c.serviceInfoEqual(other)
}
if other.Exporter == OTLPgRPCExporter && !c.ServerCaCertPool.Equal(other.ServerCaCertPool) {
return true
}
return c.Exporter != other.Exporter ||
c.Endpoint != other.Endpoint ||
!c.serviceInfoEqual(other)
}
func (c *Config) serviceInfoEqual(other *Config) bool {
return c.Service == other.Service &&
c.InstanceID == other.InstanceID &&
c.Version == other.Version &&
maps.Equal(c.Attributes, other.Attributes)
}