90 lines
2.2 KiB
Go
90 lines
2.2 KiB
Go
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)
|
|
}
|