config.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. package otel
  2. import (
  3. "errors"
  4. "strings"
  5. "time"
  6. "github.com/imgproxy/imgproxy/v3/ensure"
  7. "github.com/imgproxy/imgproxy/v3/env"
  8. )
  9. var (
  10. IMGPROXY_OPEN_TELEMETRY_ENABLE = env.Describe("IMGPROXY_OPEN_TELEMETRY_ENABLE", "boolean")
  11. IMGPROXY_OPEN_TELEMETRY_ENABLE_METRICS = env.Describe("IMGPROXY_OPEN_TELEMETRY_ENABLE_METRICS", "boolean")
  12. IMGPROXY_OPEN_TELEMETRY_SERVER_CERT = env.Describe("IMGPROXY_OPEN_TELEMETRY_SERVER_CERT", "string")
  13. IMGPROXY_OPEN_TELEMETRY_CLIENT_CERT = env.Describe("IMGPROXY_OPEN_TELEMETRY_CLIENT_CERT", "string")
  14. IMGPROXY_OPEN_TELEMETRY_CLIENT_KEY = env.Describe("IMGPROXY_OPEN_TELEMETRY_CLIENT_KEY", "string")
  15. IMGPROXY_OPEN_TELEMETRY_TRACE_ID_GENERATOR = env.Describe("IMGPROXY_OPEN_TELEMETRY_TRACE_ID_GENERATOR", "xray|random")
  16. // Those are OpenTelemetry SDK environment variables
  17. OTEL_EXPORTER_OTLP_PROTOCOL = env.Describe("OTEL_EXPORTER_OTLP_PROTOCOL", "grpc|http/protobuf|http|https")
  18. OTEL_EXPORTER_OTLP_TIMEOUT = env.Describe("OTEL_EXPORTER_OTLP_TIMEOUT", "milliseconds")
  19. OTEL_EXPORTER_OTLP_TRACES_TIMEOUT = env.Describe("OTEL_EXPORTER_OTLP_TRACES_TIMEOUT", "milliseconds")
  20. OTEL_EXPORTER_OTLP_METRICS_TIMEOUT = env.Describe("OTEL_EXPORTER_OTLP_METRICS_TIMEOUT", "milliseconds")
  21. OTEL_PROPAGATORS = env.Describe("OTEL_PROPAGATORS", "comma-separated list of propagators")
  22. OTEL_SERVICE_NAME = env.Describe("OTEL_SERVICE_NAME", "string") // This is used during initialization
  23. )
  24. // Config holds the configuration for OpenTelemetry monitoring
  25. type Config struct {
  26. Enable bool // Enable OpenTelemetry tracing and metrics
  27. EnableMetrics bool // Enable OpenTelemetry metrics collection
  28. ServerCert []byte // Server certificate for TLS connection
  29. ClientCert []byte // Client certificate for TLS connection
  30. ClientKey []byte // Client key for TLS connection
  31. TraceIDGenerator string // Trace ID generator type (e.g., "xray", "random")
  32. Protocol string // Protocol to use for OTLP exporter (grpc, http/protobuf, http, https)
  33. ConnTimeout time.Duration // Connection timeout for OTLP exporter
  34. MetricsConnTimeout time.Duration // Connection timeout for metrics exporter
  35. TracesConnTimeout time.Duration // Connection timeout for traces exporter
  36. Propagators []string // List of propagators to use
  37. MetricsInterval time.Duration // Interval for sending metrics to OpenTelemetry collector
  38. }
  39. // NewDefaultConfig returns a new default configuration for OpenTelemetry monitoring
  40. func NewDefaultConfig() Config {
  41. return Config{
  42. Enable: false,
  43. EnableMetrics: false,
  44. ServerCert: nil,
  45. ClientCert: nil,
  46. ClientKey: nil,
  47. TraceIDGenerator: "xray",
  48. Protocol: "grpc",
  49. ConnTimeout: 10_000 * time.Millisecond,
  50. MetricsConnTimeout: 0,
  51. TracesConnTimeout: 0,
  52. Propagators: []string{},
  53. MetricsInterval: 10 * time.Second,
  54. }
  55. }
  56. // LoadConfigFromEnv loads configuration from environment variables
  57. func LoadConfigFromEnv(c *Config) (*Config, error) {
  58. c = ensure.Ensure(c, NewDefaultConfig)
  59. var serverCert, clientCert, clientKey string
  60. err := errors.Join(
  61. env.Bool(&c.Enable, IMGPROXY_OPEN_TELEMETRY_ENABLE),
  62. env.Bool(&c.EnableMetrics, IMGPROXY_OPEN_TELEMETRY_ENABLE_METRICS),
  63. env.String(&serverCert, IMGPROXY_OPEN_TELEMETRY_SERVER_CERT),
  64. env.String(&clientCert, IMGPROXY_OPEN_TELEMETRY_CLIENT_CERT),
  65. env.String(&clientKey, IMGPROXY_OPEN_TELEMETRY_CLIENT_KEY),
  66. env.String(&c.TraceIDGenerator, IMGPROXY_OPEN_TELEMETRY_TRACE_ID_GENERATOR),
  67. env.String(&c.Protocol, OTEL_EXPORTER_OTLP_PROTOCOL),
  68. env.DurationMils(&c.ConnTimeout, OTEL_EXPORTER_OTLP_TIMEOUT),
  69. env.DurationMils(&c.TracesConnTimeout, OTEL_EXPORTER_OTLP_TRACES_TIMEOUT),
  70. env.DurationMils(&c.MetricsConnTimeout, OTEL_EXPORTER_OTLP_METRICS_TIMEOUT),
  71. env.StringSlice(&c.Propagators, OTEL_PROPAGATORS),
  72. )
  73. c.ServerCert = prepareKeyCert(serverCert)
  74. c.ClientCert = prepareKeyCert(clientCert)
  75. c.ClientKey = prepareKeyCert(clientKey)
  76. return c, err
  77. }
  78. func (c *Config) Enabled() bool {
  79. return c.Enable
  80. }
  81. // Validate checks the configuration for errors
  82. func (c *Config) Validate() error {
  83. if !c.Enabled() {
  84. return nil
  85. }
  86. // Timeout should be valid
  87. if c.ConnTimeout <= 0 {
  88. return OTEL_EXPORTER_OTLP_TIMEOUT.ErrorZeroOrNegative()
  89. }
  90. return nil
  91. }
  92. func prepareKeyCert(str string) []byte {
  93. return []byte(strings.ReplaceAll(str, `\n`, "\n"))
  94. }