irontelemetry-go/config.go

73 lines
1.6 KiB
Go

package irontelemetry
import (
"errors"
"net/url"
"strings"
"github.com/google/uuid"
)
// ParseDSN parses a DSN string into its components
// Format: https://pk_live_xxx@irontelemetry.com
func ParseDSN(dsn string) (*ParsedDSN, error) {
parsed, err := url.Parse(dsn)
if err != nil {
return nil, errors.New("invalid DSN format: " + dsn)
}
publicKey := parsed.User.Username()
if publicKey == "" || !strings.HasPrefix(publicKey, "pk_") {
return nil, errors.New("DSN must contain a valid public key starting with pk_")
}
return &ParsedDSN{
PublicKey: publicKey,
Host: parsed.Host,
Protocol: parsed.Scheme,
APIBaseURL: parsed.Scheme + "://" + parsed.Host,
}, nil
}
// GenerateEventID generates a unique event ID
func GenerateEventID() string {
return uuid.New().String()
}
// ResolveOptions validates and fills in defaults for options
func ResolveOptions(opts Options) (Options, *ParsedDSN, error) {
parsedDSN, err := ParseDSN(opts.DSN)
if err != nil {
return opts, nil, err
}
defaults := DefaultOptions()
if opts.Environment == "" {
opts.Environment = defaults.Environment
}
if opts.AppVersion == "" {
opts.AppVersion = defaults.AppVersion
}
if opts.SampleRate == 0 {
opts.SampleRate = defaults.SampleRate
}
if opts.SampleRate < 0 {
opts.SampleRate = 0
}
if opts.SampleRate > 1 {
opts.SampleRate = 1
}
if opts.MaxBreadcrumbs == 0 {
opts.MaxBreadcrumbs = defaults.MaxBreadcrumbs
}
if opts.MaxOfflineQueueSize == 0 {
opts.MaxOfflineQueueSize = defaults.MaxOfflineQueueSize
}
if opts.APIBaseURL == "" {
opts.APIBaseURL = parsedDSN.APIBaseURL
}
return opts, parsedDSN, nil
}