From 88894709b77f4d70886465eb54dd54636bfc4590 Mon Sep 17 00:00:00 2001 From: Jon Langevin Date: Sun, 24 May 2026 21:02:13 -0400 Subject: [PATCH 1/8] feat: add observability config model --- internal/model.go | 220 +++++++++++++++++++++++++++++++++++++++++ internal/model_test.go | 68 +++++++++++++ 2 files changed, 288 insertions(+) create mode 100644 internal/model.go create mode 100644 internal/model_test.go diff --git a/internal/model.go b/internal/model.go new file mode 100644 index 0000000..aae4cb6 --- /dev/null +++ b/internal/model.go @@ -0,0 +1,220 @@ +package internal + +import ( + "fmt" + "slices" + "strings" + "time" +) + +type Attrs map[string]string + +type TelemetryConfig struct { + ServiceName string `json:"serviceName" yaml:"serviceName"` + Environment string `json:"environment" yaml:"environment"` + ResourceAttributes map[string]string `json:"resource" yaml:"resource"` + MetricsInterval time.Duration `json:"metricsInterval" yaml:"metricsInterval"` + OTLPEndpoint string `json:"otlpEndpoint" yaml:"otlpEndpoint"` +} + +type CollectorConfig struct { + Name string `json:"name" yaml:"name"` + Distribution string `json:"distribution" yaml:"distribution"` + Topology string `json:"topology" yaml:"topology"` + Signals []string `json:"signals" yaml:"signals"` + Receivers map[string]ReceiverConfig `json:"receivers" yaml:"receivers"` + Processors map[string]ProcessorConfig `json:"processors" yaml:"processors"` + Exporters map[string]ExporterConfig `json:"exporters" yaml:"exporters"` + Routes []RouteConfig `json:"routes" yaml:"routes"` +} + +type ReceiverConfig struct { + Type string `json:"type" yaml:"type"` + Endpoint string `json:"endpoint,omitempty" yaml:"endpoint,omitempty"` + Protocols []string `json:"protocols,omitempty" yaml:"protocols,omitempty"` + Public bool `json:"public,omitempty" yaml:"public,omitempty"` + AuthRef string `json:"authRef,omitempty" yaml:"authRef,omitempty"` +} + +type ProcessorConfig struct { + Type string `json:"type" yaml:"type"` + Config map[string]any `json:"config,omitempty" yaml:"config,omitempty"` +} + +type ExporterConfig struct { + Type string `json:"type" yaml:"type"` + Endpoint string `json:"endpoint,omitempty" yaml:"endpoint,omitempty"` + Headers map[string]string `json:"headers,omitempty" yaml:"headers,omitempty"` + APIKeyRef string `json:"apiKeyRef,omitempty" yaml:"apiKeyRef,omitempty"` + AuthRef string `json:"authRef,omitempty" yaml:"authRef,omitempty"` + Public bool `json:"public,omitempty" yaml:"public,omitempty"` + TLS *TLSConfig `json:"tls,omitempty" yaml:"tls,omitempty"` + Compression string `json:"compression,omitempty" yaml:"compression,omitempty"` +} + +type TLSConfig struct { + Enabled bool `json:"enabled" yaml:"enabled"` + CARef string `json:"caRef,omitempty" yaml:"caRef,omitempty"` +} + +type RouteConfig struct { + Signals []string `json:"signals" yaml:"signals"` + Receivers []string `json:"receivers" yaml:"receivers"` + Processors []string `json:"processors,omitempty" yaml:"processors,omitempty"` + Exporters []string `json:"exporters" yaml:"exporters"` +} + +type ObservabilityPlan struct { + ServiceName string `json:"serviceName" yaml:"serviceName"` + Environment string `json:"environment" yaml:"environment"` + ResourceAttrs map[string]string `json:"resourceAttrs" yaml:"resourceAttrs"` + Collector CollectorPlan `json:"collector" yaml:"collector"` + Pipelines []TelemetryPipeline `json:"pipelines" yaml:"pipelines"` + AppEnv map[string]SecretValue `json:"appEnv" yaml:"appEnv"` + Resources []GeneratedResourceRef `json:"resources" yaml:"resources"` +} + +type CollectorPlan struct { + Name string `json:"name" yaml:"name"` + Distribution string `json:"distribution" yaml:"distribution"` + Topology string `json:"topology" yaml:"topology"` + Config string `json:"config,omitempty" yaml:"config,omitempty"` +} + +type TelemetryPipeline struct { + Signals []string `json:"signals" yaml:"signals"` + Receivers []string `json:"receivers" yaml:"receivers"` + Exporters []string `json:"exporters" yaml:"exporters"` +} + +type SecretValue struct { + Value string `json:"value,omitempty" yaml:"value,omitempty"` + SecretRef string `json:"secretRef,omitempty" yaml:"secretRef,omitempty"` +} + +type GeneratedResourceRef struct { + Kind string `json:"kind" yaml:"kind"` + Name string `json:"name" yaml:"name"` + Labels map[string]string `json:"labels" yaml:"labels"` +} + +var ( + validDistributions = []string{"otelcol", "alloy", "datadog-agent", "datadog-otlp", "external"} + validTopologies = []string{"sidecar", "service", "daemonset", "app-component", "external"} + validSignals = []string{"traces", "metrics", "logs"} +) + +var defaultSensitiveKeys = map[string]struct{}{ + "authorization": {}, + "cookie": {}, + "password": {}, + "secret": {}, + "set-cookie": {}, + "token": {}, +} + +func (c CollectorConfig) Validate() error { + distribution := defaultString(c.Distribution, "external") + if !slices.Contains(validDistributions, distribution) { + return fmt.Errorf("invalid collector distribution %q", c.Distribution) + } + topology := defaultString(c.Topology, "external") + if !slices.Contains(validTopologies, topology) { + return fmt.Errorf("invalid collector topology %q", c.Topology) + } + if len(c.Signals) == 0 { + return fmt.Errorf("collector signals are required") + } + for _, signal := range c.Signals { + if !slices.Contains(validSignals, signal) { + return fmt.Errorf("invalid collector signal %q", signal) + } + } + if len(c.Routes) == 0 { + return fmt.Errorf("at least one telemetry route is required") + } + + for name, receiver := range c.Receivers { + if receiver.Type == "" { + return fmt.Errorf("receiver %q type is required", name) + } + if receiver.Public && receiver.AuthRef == "" { + return fmt.Errorf("public receiver %q requires authRef", name) + } + } + for name, exporter := range c.Exporters { + if exporter.Type == "" { + return fmt.Errorf("exporter %q type is required", name) + } + if exporter.Public && exporter.APIKeyRef == "" && exporter.AuthRef == "" { + return fmt.Errorf("public exporter %q requires apiKeyRef or authRef", name) + } + } + for i, route := range c.Routes { + if err := c.validateRoute(i, route); err != nil { + return err + } + } + return nil +} + +func (c CollectorConfig) validateRoute(index int, route RouteConfig) error { + if len(route.Signals) == 0 { + return fmt.Errorf("route %d signals are required", index) + } + for _, signal := range route.Signals { + if !slices.Contains(validSignals, signal) { + return fmt.Errorf("route %d invalid signal %q", index, signal) + } + } + if len(route.Receivers) == 0 { + return fmt.Errorf("route %d receivers are required", index) + } + for _, name := range route.Receivers { + if _, ok := c.Receivers[name]; !ok { + return fmt.Errorf("route %d references unknown receiver %q", index, name) + } + } + for _, name := range route.Processors { + if _, ok := c.Processors[name]; !ok { + return fmt.Errorf("route %d references unknown processor %q", index, name) + } + } + if len(route.Exporters) == 0 { + return fmt.Errorf("route %d exporters are required", index) + } + for _, name := range route.Exporters { + if _, ok := c.Exporters[name]; !ok { + return fmt.Errorf("route %d references unknown exporter %q", index, name) + } + } + return nil +} + +func FilterSensitiveAttrs(attrs Attrs, allow []string) Attrs { + if len(attrs) == 0 { + return nil + } + allowed := make(map[string]struct{}, len(allow)) + for _, key := range allow { + allowed[strings.ToLower(key)] = struct{}{} + } + filtered := make(Attrs, len(attrs)) + for key, value := range attrs { + normalized := strings.ToLower(key) + if _, sensitive := defaultSensitiveKeys[normalized]; sensitive { + if _, ok := allowed[normalized]; !ok { + continue + } + } + filtered[key] = value + } + return filtered +} + +func defaultString(value, fallback string) string { + if value == "" { + return fallback + } + return value +} diff --git a/internal/model_test.go b/internal/model_test.go new file mode 100644 index 0000000..f44e6d0 --- /dev/null +++ b/internal/model_test.go @@ -0,0 +1,68 @@ +package internal + +import "testing" + +func TestCollectorConfigValidate(t *testing.T) { + cfg := minimalValidCollectorConfig() + if err := cfg.Validate(); err != nil { + t.Fatal(err) + } +} + +func TestCollectorConfigValidateRejectsUnknownRouteExporter(t *testing.T) { + cfg := minimalValidCollectorConfig() + cfg.Routes[0].Exporters = []string{"missing"} + if err := cfg.Validate(); err == nil { + t.Fatal("expected missing exporter error") + } +} + +func TestCollectorConfigValidateRejectsPublicEndpointWithoutAuth(t *testing.T) { + cfg := minimalValidCollectorConfig() + cfg.Exporters["public"] = ExporterConfig{ + Type: "otlphttp", + Endpoint: "https://collector.example.com:4318", + Public: true, + } + cfg.Routes[0].Exporters = append(cfg.Routes[0].Exporters, "public") + if err := cfg.Validate(); err == nil { + t.Fatal("expected public exporter auth error") + } +} + +func TestSensitiveAttributeFiltering(t *testing.T) { + attrs := Attrs{ + "tenant": "acme", + "authorization": "Bearer secret", + "cookie": "session=secret", + "token": "secret", + "secret": "value", + } + filtered := FilterSensitiveAttrs(attrs, nil) + if filtered["tenant"] != "acme" { + t.Fatalf("tenant attr = %q, want acme", filtered["tenant"]) + } + for _, key := range []string{"authorization", "cookie", "token", "secret"} { + if _, ok := filtered[key]; ok { + t.Fatalf("sensitive key %q was not filtered: %#v", key, filtered) + } + } +} + +func minimalValidCollectorConfig() CollectorConfig { + return CollectorConfig{ + Name: "collector", + Distribution: "otelcol", + Topology: "external", + Signals: []string{"traces", "metrics", "logs"}, + Receivers: map[string]ReceiverConfig{ + "otlp": {Type: "otlp", Protocols: []string{"grpc", "http"}}, + }, + Exporters: map[string]ExporterConfig{ + "debug": {Type: "debug"}, + }, + Routes: []RouteConfig{ + {Signals: []string{"traces", "metrics", "logs"}, Receivers: []string{"otlp"}, Exporters: []string{"debug"}}, + }, + } +} From 0b4a8f17924de3d8aa43163bc77268a806930417 Mon Sep 17 00:00:00 2001 From: Jon Langevin Date: Sun, 24 May 2026 21:04:25 -0400 Subject: [PATCH 2/8] feat: add telemetry sink module --- internal/module_telemetry.go | 275 ++++++++++++++++++++++++++++++ internal/module_telemetry_test.go | 79 +++++++++ internal/plugin.go | 6 +- plugin.contracts.json | 12 +- plugin.json | 12 +- 5 files changed, 378 insertions(+), 6 deletions(-) create mode 100644 internal/module_telemetry.go create mode 100644 internal/module_telemetry_test.go diff --git a/internal/module_telemetry.go b/internal/module_telemetry.go new file mode 100644 index 0000000..07df109 --- /dev/null +++ b/internal/module_telemetry.go @@ -0,0 +1,275 @@ +package internal + +import ( + "context" + "fmt" + "strconv" + "sync" + "time" +) + +type telemetryModule struct { + name string + config TelemetryConfig + + mu sync.RWMutex + snapshot TelemetrySnapshot +} + +type TelemetrySnapshot struct { + Metrics []MetricRecord `json:"metrics"` + Logs []LogRecord `json:"logs"` + SpanEvents []SpanEvent `json:"spanEvents"` +} + +type MetricRecord struct { + Name string `json:"name"` + Kind string `json:"kind"` + Value float64 `json:"value"` + Attrs Attrs `json:"attrs,omitempty"` + Timestamp time.Time `json:"timestamp,omitempty"` +} + +type LogRecord struct { + Timestamp time.Time `json:"timestamp,omitempty"` + Level string `json:"level"` + Message string `json:"message"` + Module string `json:"module,omitempty"` + Attrs Attrs `json:"attrs,omitempty"` +} + +type SpanEvent struct { + Name string `json:"name"` + Attrs Attrs `json:"attrs,omitempty"` + Timestamp time.Time `json:"timestamp,omitempty"` +} + +func newTelemetryModule(name string, cfg map[string]any) (*telemetryModule, error) { + mod := &telemetryModule{name: name} + if cfg != nil { + mod.config = TelemetryConfig{ + ServiceName: stringValue(cfg["serviceName"]), + Environment: stringValue(cfg["environment"]), + ResourceAttributes: attrsValue(cfg["resource"]), + OTLPEndpoint: stringValue(cfg["otlpEndpoint"]), + } + } + return mod, nil +} + +func (m *telemetryModule) Init() error { + return nil +} + +func (m *telemetryModule) Start(context.Context) error { + return nil +} + +func (m *telemetryModule) Stop(context.Context) error { + return nil +} + +func (m *telemetryModule) InvokeMethod(method string, args map[string]any) (map[string]any, error) { + return m.InvokeMethodContext(context.Background(), method, args) +} + +func (m *telemetryModule) InvokeMethodContext(_ context.Context, method string, args map[string]any) (map[string]any, error) { + switch method { + case "recordMetrics": + records, err := metricRecordsFromArgs(args["metrics"]) + if err != nil { + return nil, err + } + m.mu.Lock() + m.snapshot.Metrics = append(m.snapshot.Metrics, records...) + m.mu.Unlock() + return map[string]any{"accepted": true, "count": len(records)}, nil + case "recordLogs": + records, err := logRecordsFromArgs(args["logs"]) + if err != nil { + return nil, err + } + m.mu.Lock() + m.snapshot.Logs = append(m.snapshot.Logs, records...) + m.mu.Unlock() + return map[string]any{"accepted": true, "count": len(records)}, nil + case "recordSpanEvents": + records, err := spanEventsFromArgs(args["events"]) + if err != nil { + return nil, err + } + m.mu.Lock() + m.snapshot.SpanEvents = append(m.snapshot.SpanEvents, records...) + m.mu.Unlock() + return map[string]any{"accepted": true, "count": len(records)}, nil + case "snapshot": + return map[string]any{"snapshot": m.Snapshot()}, nil + default: + return nil, fmt.Errorf("observability.telemetry %q: unknown method %q", m.name, method) + } +} + +func (m *telemetryModule) Snapshot() TelemetrySnapshot { + m.mu.RLock() + defer m.mu.RUnlock() + out := TelemetrySnapshot{ + Metrics: make([]MetricRecord, len(m.snapshot.Metrics)), + Logs: make([]LogRecord, len(m.snapshot.Logs)), + SpanEvents: make([]SpanEvent, len(m.snapshot.SpanEvents)), + } + copy(out.Metrics, m.snapshot.Metrics) + copy(out.Logs, m.snapshot.Logs) + copy(out.SpanEvents, m.snapshot.SpanEvents) + for i := range out.Metrics { + out.Metrics[i].Attrs = FilterSensitiveAttrs(out.Metrics[i].Attrs, nil) + } + for i := range out.Logs { + out.Logs[i].Attrs = FilterSensitiveAttrs(out.Logs[i].Attrs, nil) + } + for i := range out.SpanEvents { + out.SpanEvents[i].Attrs = FilterSensitiveAttrs(out.SpanEvents[i].Attrs, nil) + } + return out +} + +func metricRecordsFromArgs(value any) ([]MetricRecord, error) { + items, err := sliceOfMaps(value) + if err != nil { + return nil, err + } + records := make([]MetricRecord, 0, len(items)) + for _, item := range items { + records = append(records, MetricRecord{ + Name: stringValue(item["name"]), + Kind: stringValue(item["kind"]), + Value: floatValue(item["value"]), + Attrs: FilterSensitiveAttrs(attrsValue(item["attrs"]), nil), + Timestamp: timeValue(item["timestamp"]), + }) + } + return records, nil +} + +func logRecordsFromArgs(value any) ([]LogRecord, error) { + items, err := sliceOfMaps(value) + if err != nil { + return nil, err + } + records := make([]LogRecord, 0, len(items)) + for _, item := range items { + records = append(records, LogRecord{ + Timestamp: timeValue(item["timestamp"]), + Level: stringValue(item["level"]), + Message: stringValue(item["message"]), + Module: stringValue(item["module"]), + Attrs: FilterSensitiveAttrs(attrsValue(item["attrs"]), nil), + }) + } + return records, nil +} + +func spanEventsFromArgs(value any) ([]SpanEvent, error) { + items, err := sliceOfMaps(value) + if err != nil { + return nil, err + } + records := make([]SpanEvent, 0, len(items)) + for _, item := range items { + records = append(records, SpanEvent{ + Name: stringValue(item["name"]), + Attrs: FilterSensitiveAttrs(attrsValue(item["attrs"]), nil), + Timestamp: timeValue(item["timestamp"]), + }) + } + return records, nil +} + +func sliceOfMaps(value any) ([]map[string]any, error) { + switch typed := value.(type) { + case nil: + return nil, nil + case []map[string]any: + return typed, nil + case []any: + out := make([]map[string]any, 0, len(typed)) + for _, item := range typed { + mapped, ok := item.(map[string]any) + if !ok { + return nil, fmt.Errorf("expected map item, got %T", item) + } + out = append(out, mapped) + } + return out, nil + default: + return nil, fmt.Errorf("expected records slice, got %T", value) + } +} + +func attrsValue(value any) Attrs { + switch typed := value.(type) { + case nil: + return nil + case Attrs: + return typed + case map[string]string: + out := make(Attrs, len(typed)) + for k, v := range typed { + out[k] = v + } + return out + case map[string]any: + out := make(Attrs, len(typed)) + for k, v := range typed { + out[k] = stringValue(v) + } + return out + default: + return nil + } +} + +func stringValue(value any) string { + switch typed := value.(type) { + case string: + return typed + case fmt.Stringer: + return typed.String() + case nil: + return "" + default: + return fmt.Sprint(value) + } +} + +func floatValue(value any) float64 { + switch typed := value.(type) { + case float64: + return typed + case float32: + return float64(typed) + case int: + return float64(typed) + case int64: + return float64(typed) + case string: + parsed, _ := strconv.ParseFloat(typed, 64) + return parsed + default: + return 0 + } +} + +func timeValue(value any) time.Time { + switch typed := value.(type) { + case time.Time: + return typed + case string: + if typed == "" { + return time.Time{} + } + parsed, _ := time.Parse(time.RFC3339Nano, typed) + return parsed + default: + return time.Time{} + } +} diff --git a/internal/module_telemetry_test.go b/internal/module_telemetry_test.go new file mode 100644 index 0000000..73de302 --- /dev/null +++ b/internal/module_telemetry_test.go @@ -0,0 +1,79 @@ +package internal + +import "testing" + +func TestTelemetryModuleRecordsMetrics(t *testing.T) { + mod, err := newTelemetryModule("telemetry", map[string]any{"serviceName": "checkout"}) + if err != nil { + t.Fatal(err) + } + out, err := mod.InvokeMethod("recordMetrics", map[string]any{ + "metrics": []any{map[string]any{"name": "requests_total", "kind": "counter", "value": 1.0}}, + }) + if err != nil { + t.Fatal(err) + } + if out["accepted"] != true { + t.Fatalf("accepted = %v, want true", out["accepted"]) + } + if len(mod.Snapshot().Metrics) != 1 { + t.Fatalf("snapshot metrics = %d, want 1", len(mod.Snapshot().Metrics)) + } +} + +func TestTelemetryModuleFiltersSensitiveAttrs(t *testing.T) { + mod, err := newTelemetryModule("telemetry", nil) + if err != nil { + t.Fatal(err) + } + _, err = mod.InvokeMethod("recordMetrics", map[string]any{ + "metrics": []any{map[string]any{ + "name": "requests_total", + "kind": "counter", + "value": 1.0, + "attrs": map[string]any{ + "tenant": "acme", + "authorization": "Bearer secret", + "cookie": "secret", + "token": "secret", + "secret": "secret", + }, + }}, + }) + if err != nil { + t.Fatal(err) + } + attrs := mod.Snapshot().Metrics[0].Attrs + if attrs["tenant"] != "acme" { + t.Fatalf("tenant attr = %q, want acme", attrs["tenant"]) + } + for _, key := range []string{"authorization", "cookie", "token", "secret"} { + if _, ok := attrs[key]; ok { + t.Fatalf("sensitive key %q was not filtered: %#v", key, attrs) + } + } +} + +func TestTelemetryModuleRecordsLogsAndSpanEvents(t *testing.T) { + mod, err := newTelemetryModule("telemetry", nil) + if err != nil { + t.Fatal(err) + } + if _, err := mod.InvokeMethod("recordLogs", map[string]any{ + "logs": []any{map[string]any{"level": "info", "message": "ok", "module": "cms"}}, + }); err != nil { + t.Fatal(err) + } + if _, err := mod.InvokeMethod("recordSpanEvents", map[string]any{ + "events": []any{map[string]any{"name": "cache.hit", "attrs": map[string]any{"tenant": "acme"}}}, + }); err != nil { + t.Fatal(err) + } + snapshot := mod.Snapshot() + if len(snapshot.Logs) != 1 { + t.Fatalf("snapshot logs = %d, want 1", len(snapshot.Logs)) + } + if len(snapshot.SpanEvents) != 1 { + t.Fatalf("snapshot span events = %d, want 1", len(snapshot.SpanEvents)) + } +} diff --git a/internal/plugin.go b/internal/plugin.go index 5aa0cac..096fc84 100644 --- a/internal/plugin.go +++ b/internal/plugin.go @@ -37,7 +37,7 @@ func (p *observabilityPlugin) Manifest() sdk.PluginManifest { // Remove this method if the plugin does not provide any modules. func (p *observabilityPlugin) ModuleTypes() []string { return []string{ - // "example.module_type", + "observability.telemetry", } } @@ -45,8 +45,8 @@ func (p *observabilityPlugin) ModuleTypes() []string { // Remove this method if the plugin does not provide any modules. func (p *observabilityPlugin) CreateModule(typeName, name string, config map[string]any) (sdk.ModuleInstance, error) { switch typeName { - // case "example.module_type": - // return newExampleModule(name, config) + case "observability.telemetry": + return newTelemetryModule(name, config) default: return nil, fmt.Errorf("observability: unknown module type %q", typeName) } diff --git a/plugin.contracts.json b/plugin.contracts.json index 34034d7..3173c2b 100644 --- a/plugin.contracts.json +++ b/plugin.contracts.json @@ -1,4 +1,14 @@ { "version": "1", - "contracts": [] + "contracts": [ + { + "moduleType": "observability.telemetry", + "methods": [ + "recordMetrics", + "recordLogs", + "recordSpanEvents", + "snapshot" + ] + } + ] } diff --git a/plugin.json b/plugin.json index 781c588..d5ab2cc 100644 --- a/plugin.json +++ b/plugin.json @@ -8,12 +8,20 @@ "tier": "community", "private": false, "minEngineVersion": "0.51.7", - "keywords": [], + "keywords": [ + "observability", + "opentelemetry", + "metrics", + "logs", + "traces" + ], "homepage": "https://github.com/GoCodeAlone/workflow-plugin-observability", "repository": "https://github.com/GoCodeAlone/workflow-plugin-observability", "capabilities": { "configProvider": false, - "moduleTypes": [], + "moduleTypes": [ + "observability.telemetry" + ], "stepTypes": [], "triggerTypes": [] }, From 57f31270d20e41701271ed6cf4d1d74d20f6808b Mon Sep 17 00:00:00 2001 From: Jon Langevin Date: Sun, 24 May 2026 21:07:28 -0400 Subject: [PATCH 3/8] feat: render otel collector plans --- internal/module_collector.go | 187 ++++++++++++++++++++++++++++++ internal/module_collector_test.go | 42 +++++++ internal/plugin.go | 3 + internal/render_otel.go | 89 ++++++++++++++ internal/render_otel_test.go | 26 +++++ plugin.contracts.json | 7 ++ plugin.json | 1 + 7 files changed, 355 insertions(+) create mode 100644 internal/module_collector.go create mode 100644 internal/module_collector_test.go create mode 100644 internal/render_otel.go create mode 100644 internal/render_otel_test.go diff --git a/internal/module_collector.go b/internal/module_collector.go new file mode 100644 index 0000000..21e2a71 --- /dev/null +++ b/internal/module_collector.go @@ -0,0 +1,187 @@ +package internal + +import ( + "context" + "fmt" + "sort" + "strings" +) + +const defaultOTLPEndpoint = "http://localhost:4318" + +type collectorModule struct { + name string + config CollectorConfig +} + +func newCollectorModule(name string, cfg map[string]any) (*collectorModule, error) { + collector := &collectorModule{ + name: name, + config: normalizeCollectorConfig(collectorConfigFromMap(name, cfg)), + } + if err := collector.config.Validate(); err != nil { + return nil, err + } + return collector, nil +} + +func (m *collectorModule) Init() error { + return nil +} + +func (m *collectorModule) Start(context.Context) error { + return nil +} + +func (m *collectorModule) Stop(context.Context) error { + return nil +} + +func (m *collectorModule) InvokeMethod(method string, args map[string]any) (map[string]any, error) { + return m.InvokeMethodContext(context.Background(), method, args) +} + +func (m *collectorModule) InvokeMethodContext(_ context.Context, method string, _ map[string]any) (map[string]any, error) { + switch method { + case "plan": + return m.plan() + case "renderConfig": + return m.renderConfig() + default: + return nil, fmt.Errorf("observability.collector %q: unknown method %q", m.name, method) + } +} + +func (m *collectorModule) plan() (map[string]any, error) { + rendered, err := RenderOTelCollectorYAML(m.config) + if err != nil { + return nil, err + } + return map[string]any{ + "collector": map[string]any{ + "name": m.name, + "distribution": m.config.Distribution, + "topology": m.config.Topology, + "config": rendered, + }, + "env": m.appEnv(), + "resources": m.generatedResources(), + }, nil +} + +func (m *collectorModule) renderConfig() (map[string]any, error) { + rendered, err := RenderOTelCollectorYAML(m.config) + if err != nil { + return nil, err + } + return map[string]any{"config": rendered}, nil +} + +func (m *collectorModule) appEnv() map[string]string { + env := map[string]string{ + "OTEL_EXPORTER_OTLP_ENDPOINT": defaultOTLPEndpoint, + "OTEL_TRACES_EXPORTER": "otlp", + "OTEL_METRICS_EXPORTER": "otlp", + "OTEL_LOGS_EXPORTER": "otlp", + } + if m.name != "" { + env["OTEL_SERVICE_NAME"] = m.name + } + for _, exporter := range m.config.Exporters { + if exporter.Endpoint != "" { + env["OTEL_EXPORTER_OTLP_ENDPOINT"] = exporter.Endpoint + break + } + } + return env +} + +func (m *collectorModule) generatedResources() []map[string]any { + return []map[string]any{ + { + "kind": "collector", + "name": m.name, + "labels": map[string]string{ + "workflow.gocodealone.io/managed-by": "workflow-plugin-observability", + "workflow.gocodealone.io/collector": m.name, + }, + }, + } +} + +func collectorConfigFromMap(name string, cfg map[string]any) CollectorConfig { + out := CollectorConfig{ + Name: name, + Distribution: stringValue(cfg["distribution"]), + Topology: stringValue(cfg["topology"]), + Signals: stringSliceValue(cfg["signals"]), + } + endpoint := stringValue(cfg["endpoint"]) + if endpoint == "" { + endpoint = stringValue(cfg["otlpEndpoint"]) + } + if endpoint != "" { + out.Exporters = map[string]ExporterConfig{ + "otlp": {Type: "otlphttp", Endpoint: endpoint}, + } + } + return out +} + +func normalizeCollectorConfig(cfg CollectorConfig) CollectorConfig { + if cfg.Name == "" { + cfg.Name = "collector" + } + cfg.Distribution = defaultString(cfg.Distribution, "external") + cfg.Topology = defaultString(cfg.Topology, "external") + if len(cfg.Signals) == 0 { + cfg.Signals = []string{"traces", "metrics", "logs"} + } + if len(cfg.Receivers) == 0 { + cfg.Receivers = map[string]ReceiverConfig{ + "otlp": {Type: "otlp", Protocols: []string{"grpc", "http"}}, + } + } + if len(cfg.Exporters) == 0 { + cfg.Exporters = map[string]ExporterConfig{ + "otlp": {Type: "otlphttp", Endpoint: defaultOTLPEndpoint}, + } + } + if len(cfg.Routes) == 0 { + cfg.Routes = []RouteConfig{ + {Signals: cfg.Signals, Receivers: sortedKeys(cfg.Receivers), Exporters: sortedKeys(cfg.Exporters)}, + } + } + return cfg +} + +func sortedKeys[T any](values map[string]T) []string { + keys := make([]string, 0, len(values)) + for key := range values { + keys = append(keys, key) + } + sort.Strings(keys) + return keys +} + +func stringSliceValue(value any) []string { + switch typed := value.(type) { + case nil: + return nil + case []string: + return typed + case []any: + out := make([]string, 0, len(typed)) + for _, item := range typed { + out = append(out, stringValue(item)) + } + return out + case string: + if typed == "" { + return nil + } + return strings.Split(typed, ",") + default: + return nil + } +} diff --git a/internal/module_collector_test.go b/internal/module_collector_test.go new file mode 100644 index 0000000..483ed26 --- /dev/null +++ b/internal/module_collector_test.go @@ -0,0 +1,42 @@ +package internal + +import "testing" + +func TestCollectorModulePlanExternal(t *testing.T) { + mod, err := newCollectorModule("collector", map[string]any{ + "distribution": "otelcol", + "topology": "external", + }) + if err != nil { + t.Fatal(err) + } + out, err := mod.InvokeMethod("plan", nil) + if err != nil { + t.Fatal(err) + } + env := out["env"].(map[string]string) + if env["OTEL_EXPORTER_OTLP_ENDPOINT"] == "" { + t.Fatal("missing OTEL_EXPORTER_OTLP_ENDPOINT") + } + if env["OTEL_TRACES_EXPORTER"] != "otlp" || env["OTEL_METRICS_EXPORTER"] != "otlp" || env["OTEL_LOGS_EXPORTER"] != "otlp" { + t.Fatalf("unexpected OTEL signal exporters: %#v", env) + } +} + +func TestCollectorModuleRenderConfig(t *testing.T) { + mod, err := newCollectorModule("collector", map[string]any{ + "distribution": "otelcol", + "topology": "external", + "signals": []any{"traces"}, + }) + if err != nil { + t.Fatal(err) + } + out, err := mod.InvokeMethod("renderConfig", nil) + if err != nil { + t.Fatal(err) + } + if out["config"] == "" { + t.Fatal("missing rendered config") + } +} diff --git a/internal/plugin.go b/internal/plugin.go index 096fc84..6326147 100644 --- a/internal/plugin.go +++ b/internal/plugin.go @@ -37,6 +37,7 @@ func (p *observabilityPlugin) Manifest() sdk.PluginManifest { // Remove this method if the plugin does not provide any modules. func (p *observabilityPlugin) ModuleTypes() []string { return []string{ + "observability.collector", "observability.telemetry", } } @@ -45,6 +46,8 @@ func (p *observabilityPlugin) ModuleTypes() []string { // Remove this method if the plugin does not provide any modules. func (p *observabilityPlugin) CreateModule(typeName, name string, config map[string]any) (sdk.ModuleInstance, error) { switch typeName { + case "observability.collector": + return newCollectorModule(name, config) case "observability.telemetry": return newTelemetryModule(name, config) default: diff --git a/internal/render_otel.go b/internal/render_otel.go new file mode 100644 index 0000000..9086e36 --- /dev/null +++ b/internal/render_otel.go @@ -0,0 +1,89 @@ +package internal + +import ( + "fmt" + + "gopkg.in/yaml.v3" +) + +func RenderOTelCollectorYAML(cfg CollectorConfig) (string, error) { + cfg = normalizeCollectorConfig(cfg) + if cfg.Distribution != "otelcol" && cfg.Distribution != "external" { + return "", fmt.Errorf("otel renderer does not support distribution %q", cfg.Distribution) + } + if err := cfg.Validate(); err != nil { + return "", err + } + + receivers := make(map[string]any, len(cfg.Receivers)) + for name, receiver := range cfg.Receivers { + rendered := map[string]any{} + if receiver.Type == "otlp" { + protocols := map[string]any{} + for _, protocol := range receiver.Protocols { + protocols[protocol] = map[string]any{} + } + if len(protocols) == 0 { + protocols["grpc"] = map[string]any{} + protocols["http"] = map[string]any{} + } + rendered["protocols"] = protocols + } + if receiver.Endpoint != "" { + rendered["endpoint"] = receiver.Endpoint + } + receivers[name] = rendered + } + + processors := map[string]any{} + for name, processor := range cfg.Processors { + processors[name] = processor.Config + } + if len(processors) == 0 { + processors["batch"] = map[string]any{} + } + + exporters := make(map[string]any, len(cfg.Exporters)) + for name, exporter := range cfg.Exporters { + rendered := map[string]any{} + if exporter.Endpoint != "" { + rendered["endpoint"] = exporter.Endpoint + } + if len(exporter.Headers) > 0 { + rendered["headers"] = exporter.Headers + } + if exporter.Compression != "" { + rendered["compression"] = exporter.Compression + } + exporters[name] = rendered + } + + pipelines := map[string]any{} + for _, route := range cfg.Routes { + processorsForRoute := route.Processors + if len(processorsForRoute) == 0 { + processorsForRoute = []string{"batch"} + } + for _, signal := range route.Signals { + pipelines[signal] = map[string]any{ + "receivers": route.Receivers, + "processors": processorsForRoute, + "exporters": route.Exporters, + } + } + } + + doc := map[string]any{ + "receivers": receivers, + "processors": processors, + "exporters": exporters, + "service": map[string]any{ + "pipelines": pipelines, + }, + } + data, err := yaml.Marshal(doc) + if err != nil { + return "", err + } + return string(data), nil +} diff --git a/internal/render_otel_test.go b/internal/render_otel_test.go new file mode 100644 index 0000000..e720c45 --- /dev/null +++ b/internal/render_otel_test.go @@ -0,0 +1,26 @@ +package internal + +import ( + "strings" + "testing" +) + +func TestRenderOTelCollectorYAML(t *testing.T) { + cfg := minimalValidCollectorConfig() + got, err := RenderOTelCollectorYAML(cfg) + if err != nil { + t.Fatal(err) + } + for _, want := range []string{ + "receivers:", + "otlp:", + "exporters:", + "service:", + "pipelines:", + "traces:", + } { + if !strings.Contains(got, want) { + t.Fatalf("rendered config missing %q:\n%s", want, got) + } + } +} diff --git a/plugin.contracts.json b/plugin.contracts.json index 3173c2b..14f9d12 100644 --- a/plugin.contracts.json +++ b/plugin.contracts.json @@ -1,6 +1,13 @@ { "version": "1", "contracts": [ + { + "moduleType": "observability.collector", + "methods": [ + "plan", + "renderConfig" + ] + }, { "moduleType": "observability.telemetry", "methods": [ diff --git a/plugin.json b/plugin.json index d5ab2cc..519ee9d 100644 --- a/plugin.json +++ b/plugin.json @@ -20,6 +20,7 @@ "capabilities": { "configProvider": false, "moduleTypes": [ + "observability.collector", "observability.telemetry" ], "stepTypes": [], From b77efc71e9ddfd7f723eb3934bf462e799273f88 Mon Sep 17 00:00:00 2001 From: Jon Langevin Date: Sun, 24 May 2026 21:16:50 -0400 Subject: [PATCH 4/8] docs: keep telemetry examples application-neutral --- docs/plans/2026-05-25-observability-plugin.md | 4 ++-- docs/plans/2026-05-25-observability-plugin.md.scope-lock | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/plans/2026-05-25-observability-plugin.md b/docs/plans/2026-05-25-observability-plugin.md index d922128..c9fe63e 100644 --- a/docs/plans/2026-05-25-observability-plugin.md +++ b/docs/plans/2026-05-25-observability-plugin.md @@ -687,8 +687,8 @@ func TestServerEmitMetrics_Parity(t *testing.T) { t.Fatal(err) } metrics := rec.Metrics() - assertMetric(t, metrics, "cms_requests_total", 1, telemetry.Attrs{"tenant": "acme"}) - assertMetric(t, metrics, "cms_requests_total", 1, telemetry.Attrs{"tenant": "_global"}) + assertMetric(t, metrics, "_requests_total", 1, telemetry.Attrs{"tenant": "acme"}) + assertMetric(t, metrics, "_requests_total", 1, telemetry.Attrs{"tenant": "_global"}) } ``` diff --git a/docs/plans/2026-05-25-observability-plugin.md.scope-lock b/docs/plans/2026-05-25-observability-plugin.md.scope-lock index fb8bfe4..6d56d55 100644 --- a/docs/plans/2026-05-25-observability-plugin.md.scope-lock +++ b/docs/plans/2026-05-25-observability-plugin.md.scope-lock @@ -1 +1 @@ -5f33804b15c228d3d041d2ccafcf4ae66f54eda498cc4eee0ef87fba068eb04c +847015c6f2092f57db3d05e4b44d44cc2a9913cfc78037754c291c2b044b8575 From 866588a393801ef6a10157597c2c52e374f7b460 Mon Sep 17 00:00:00 2001 From: Jon Langevin Date: Sun, 24 May 2026 21:25:26 -0400 Subject: [PATCH 5/8] fix: preserve configured collector pipelines --- internal/module_collector.go | 120 +++++++++++++++++++++++++++++- internal/module_collector_test.go | 33 +++++++- 2 files changed, 151 insertions(+), 2 deletions(-) diff --git a/internal/module_collector.go b/internal/module_collector.go index 21e2a71..b348125 100644 --- a/internal/module_collector.go +++ b/internal/module_collector.go @@ -115,12 +115,16 @@ func collectorConfigFromMap(name string, cfg map[string]any) CollectorConfig { Distribution: stringValue(cfg["distribution"]), Topology: stringValue(cfg["topology"]), Signals: stringSliceValue(cfg["signals"]), + Receivers: receiverConfigsValue(cfg["receivers"]), + Processors: processorConfigsValue(cfg["processors"]), + Exporters: exporterConfigsValue(cfg["exporters"]), + Routes: routeConfigsValue(cfg["routes"]), } endpoint := stringValue(cfg["endpoint"]) if endpoint == "" { endpoint = stringValue(cfg["otlpEndpoint"]) } - if endpoint != "" { + if endpoint != "" && len(out.Exporters) == 0 { out.Exporters = map[string]ExporterConfig{ "otlp": {Type: "otlphttp", Endpoint: endpoint}, } @@ -185,3 +189,117 @@ func stringSliceValue(value any) []string { return nil } } + +func receiverConfigsValue(value any) map[string]ReceiverConfig { + items := mapValue(value) + if len(items) == 0 { + return nil + } + out := make(map[string]ReceiverConfig, len(items)) + for name, raw := range items { + cfg := mapValue(raw) + out[name] = ReceiverConfig{ + Type: stringValue(cfg["type"]), + Endpoint: stringValue(cfg["endpoint"]), + Protocols: stringSliceValue(cfg["protocols"]), + Public: boolValue(cfg["public"]), + AuthRef: stringValue(cfg["authRef"]), + } + } + return out +} + +func processorConfigsValue(value any) map[string]ProcessorConfig { + items := mapValue(value) + if len(items) == 0 { + return nil + } + out := make(map[string]ProcessorConfig, len(items)) + for name, raw := range items { + cfg := mapValue(raw) + out[name] = ProcessorConfig{ + Type: stringValue(cfg["type"]), + Config: mapValue(cfg["config"]), + } + } + return out +} + +func exporterConfigsValue(value any) map[string]ExporterConfig { + items := mapValue(value) + if len(items) == 0 { + return nil + } + out := make(map[string]ExporterConfig, len(items)) + for name, raw := range items { + cfg := mapValue(raw) + out[name] = ExporterConfig{ + Type: stringValue(cfg["type"]), + Endpoint: stringValue(cfg["endpoint"]), + Headers: stringMapValue(cfg["headers"]), + APIKeyRef: stringValue(cfg["apiKeyRef"]), + AuthRef: stringValue(cfg["authRef"]), + Public: boolValue(cfg["public"]), + Compression: stringValue(cfg["compression"]), + } + } + return out +} + +func routeConfigsValue(value any) []RouteConfig { + items, err := sliceOfMaps(value) + if err != nil || len(items) == 0 { + return nil + } + out := make([]RouteConfig, 0, len(items)) + for _, item := range items { + out = append(out, RouteConfig{ + Signals: stringSliceValue(item["signals"]), + Receivers: stringSliceValue(item["receivers"]), + Processors: stringSliceValue(item["processors"]), + Exporters: stringSliceValue(item["exporters"]), + }) + } + return out +} + +func mapValue(value any) map[string]any { + switch typed := value.(type) { + case map[string]any: + return typed + case map[string]string: + out := make(map[string]any, len(typed)) + for k, v := range typed { + out[k] = v + } + return out + default: + return nil + } +} + +func stringMapValue(value any) map[string]string { + switch typed := value.(type) { + case map[string]string: + return typed + case map[string]any: + out := make(map[string]string, len(typed)) + for k, v := range typed { + out[k] = stringValue(v) + } + return out + default: + return nil + } +} + +func boolValue(value any) bool { + switch typed := value.(type) { + case bool: + return typed + case string: + return typed == "true" + default: + return false + } +} diff --git a/internal/module_collector_test.go b/internal/module_collector_test.go index 483ed26..a07d7da 100644 --- a/internal/module_collector_test.go +++ b/internal/module_collector_test.go @@ -1,6 +1,9 @@ package internal -import "testing" +import ( + "strings" + "testing" +) func TestCollectorModulePlanExternal(t *testing.T) { mod, err := newCollectorModule("collector", map[string]any{ @@ -40,3 +43,31 @@ func TestCollectorModuleRenderConfig(t *testing.T) { t.Fatal("missing rendered config") } } + +func TestCollectorModuleParsesConfiguredPipeline(t *testing.T) { + mod, err := newCollectorModule("collector", map[string]any{ + "distribution": "otelcol", + "topology": "external", + "signals": []any{"metrics"}, + "receivers": map[string]any{ + "otlp": map[string]any{"type": "otlp", "protocols": []any{"http"}}, + }, + "exporters": map[string]any{ + "mimir": map[string]any{"type": "prometheus_remote_write", "endpoint": "https://mimir.example/api/v1/push"}, + }, + "routes": []any{ + map[string]any{"signals": []any{"metrics"}, "receivers": []any{"otlp"}, "exporters": []any{"mimir"}}, + }, + }) + if err != nil { + t.Fatal(err) + } + out, err := mod.InvokeMethod("renderConfig", nil) + if err != nil { + t.Fatal(err) + } + rendered := out["config"].(string) + if !strings.Contains(rendered, "mimir:") || !strings.Contains(rendered, "https://mimir.example/api/v1/push") { + t.Fatalf("rendered config did not preserve configured exporter:\n%s", rendered) + } +} From d76753407bcb4db18d0f6b8d2bffa0f7727291fe Mon Sep 17 00:00:00 2001 From: Jon Langevin Date: Sun, 24 May 2026 21:52:55 -0400 Subject: [PATCH 6/8] chore: depend on workflow v0.64.1 --- go.mod | 70 ++++++------------------ go.sum | 164 ++++++++++++--------------------------------------------- 2 files changed, 51 insertions(+), 183 deletions(-) diff --git a/go.mod b/go.mod index 622808b..1b1dcd3 100644 --- a/go.mod +++ b/go.mod @@ -2,20 +2,12 @@ module github.com/GoCodeAlone/workflow-plugin-observability go 1.26.0 -require github.com/GoCodeAlone/workflow v0.51.7 +require ( + github.com/GoCodeAlone/workflow v0.64.1 + gopkg.in/yaml.v3 v3.0.1 +) require ( - cel.dev/expr v0.25.1 // indirect - cloud.google.com/go v0.123.0 // indirect - cloud.google.com/go/auth v0.19.0 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect - cloud.google.com/go/compute/metadata v0.9.0 // indirect - cloud.google.com/go/iam v1.5.3 // indirect - cloud.google.com/go/monitoring v1.24.3 // indirect - cloud.google.com/go/storage v1.61.3 // indirect - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 // indirect - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4 // indirect github.com/BurntSushi/toml v1.6.0 // indirect github.com/DataDog/datadog-go/v5 v5.8.3 // indirect github.com/GoCodeAlone/go-plugin v1.7.0 // indirect @@ -23,9 +15,6 @@ require ( github.com/GoCodeAlone/modular/modules/auth v1.15.0 // indirect github.com/GoCodeAlone/modular/modules/eventbus/v2 v2.8.0 // indirect github.com/GoCodeAlone/yaegi v0.17.2 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 // indirect github.com/IBM/sarama v1.47.0 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/aws/aws-sdk-go-v2 v1.41.6 // indirect @@ -36,19 +25,9 @@ require ( github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.22 // indirect github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.22 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.23 // indirect - github.com/aws/aws-sdk-go-v2/service/apigatewayv2 v1.33.8 // indirect - github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.41.13 // indirect - github.com/aws/aws-sdk-go-v2/service/codebuild v1.68.12 // indirect - github.com/aws/aws-sdk-go-v2/service/ec2 v1.296.0 // indirect - github.com/aws/aws-sdk-go-v2/service/ecs v1.76.0 // indirect - github.com/aws/aws-sdk-go-v2/service/eks v1.81.2 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.8 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.22 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 // indirect github.com/aws/aws-sdk-go-v2/service/kinesis v1.43.4 // indirect - github.com/aws/aws-sdk-go-v2/service/route53 v1.62.5 // indirect - github.com/aws/aws-sdk-go-v2/service/s3 v1.97.2 // indirect github.com/aws/aws-sdk-go-v2/service/signin v1.0.10 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.30.16 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.20 // indirect @@ -59,13 +38,11 @@ require ( github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudevents/sdk-go/v2 v2.16.2 // indirect - github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect github.com/containerd/errdefs v1.0.0 // indirect github.com/containerd/errdefs/pkg v0.3.0 // indirect github.com/containerd/log v0.1.0 // indirect github.com/danieljoos/wincred v1.2.3 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/distribution/reference v0.6.0 // indirect github.com/docker/docker v28.5.2+incompatible // indirect github.com/docker/go-connections v0.7.0 // indirect @@ -73,8 +50,6 @@ require ( github.com/dustin/go-humanize v1.0.1 // indirect github.com/eapache/go-resiliency v1.7.0 // indirect github.com/eapache/queue v1.1.0 // indirect - github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect - github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect github.com/expr-lang/expr v1.17.8 // indirect github.com/fatih/color v1.19.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect @@ -85,10 +60,7 @@ require ( github.com/godbus/dbus/v5 v5.2.2 // indirect github.com/golang-jwt/jwt/v5 v5.3.1 // indirect github.com/golobby/cast v1.3.3 // indirect - github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.14 // indirect - github.com/googleapis/gax-go/v2 v2.19.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -116,9 +88,9 @@ require ( github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12 // indirect - github.com/klauspost/compress v1.18.5 // indirect + github.com/klauspost/compress v1.18.6 // indirect github.com/mattn/go-colorable v0.1.14 // indirect - github.com/mattn/go-isatty v0.0.21 // indirect + github.com/mattn/go-isatty v0.0.22 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -128,7 +100,7 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/nats-io/nats.go v1.51.0 // indirect + github.com/nats-io/nats.go v1.52.0 // indirect github.com/nats-io/nkeys v0.4.15 // indirect github.com/nats-io/nuid v1.0.1 // indirect github.com/ncruces/go-strftime v1.0.0 // indirect @@ -137,50 +109,42 @@ require ( github.com/opencontainers/image-spec v1.1.1 // indirect github.com/pierrec/lz4/v4 v4.1.26 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/prometheus/client_golang v1.23.2 // indirect github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.67.5 // indirect github.com/prometheus/procfs v0.20.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 // indirect - github.com/redis/go-redis/v9 v9.18.0 // indirect + github.com/redis/go-redis/v9 v9.19.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/ryanuber/go-glob v1.0.0 // indirect - github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.2.0 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect github.com/zalando/go-keyring v0.2.8 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.43.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 // indirect go.opentelemetry.io/otel v1.43.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 // indirect go.opentelemetry.io/otel/metric v1.43.0 // indirect go.opentelemetry.io/otel/sdk v1.43.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.43.0 // indirect go.opentelemetry.io/otel/trace v1.43.0 // indirect go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.27.1 // indirect + go.uber.org/zap v1.28.0 // indirect go.yaml.in/yaml/v2 v2.4.4 // indirect - golang.org/x/crypto v0.50.0 // indirect - golang.org/x/net v0.53.0 // indirect + golang.org/x/crypto v0.51.0 // indirect + golang.org/x/net v0.54.0 // indirect golang.org/x/oauth2 v0.36.0 // indirect golang.org/x/sync v0.20.0 // indirect - golang.org/x/sys v0.43.0 // indirect - golang.org/x/text v0.36.0 // indirect + golang.org/x/sys v0.44.0 // indirect + golang.org/x/text v0.37.0 // indirect golang.org/x/time v0.15.0 // indirect - google.golang.org/api v0.272.0 // indirect - google.golang.org/genproto v0.0.0-20260319201613-d00831a3d3e7 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260420184626-e10c466a9529 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260420184626-e10c466a9529 // indirect - google.golang.org/grpc v1.80.0 // indirect - google.golang.org/protobuf v1.36.11 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260511170946-3700d4141b60 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260511170946-3700d4141b60 // indirect + google.golang.org/grpc v1.81.1 // indirect + google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af // indirect modernc.org/libc v1.70.0 // indirect modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.11.0 // indirect diff --git a/go.sum b/go.sum index e35aa71..0c78e50 100644 --- a/go.sum +++ b/go.sum @@ -1,39 +1,5 @@ -cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= -cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= -cloud.google.com/go v0.123.0 h1:2NAUJwPR47q+E35uaJeYoNhuNEM9kM8SjgRgdeOJUSE= -cloud.google.com/go v0.123.0/go.mod h1:xBoMV08QcqUGuPW65Qfm1o9Y4zKZBpGS+7bImXLTAZU= -cloud.google.com/go/auth v0.19.0 h1:DGYwtbcsGsT1ywuxsIoWi1u/vlks0moIblQHgSDgQkQ= -cloud.google.com/go/auth v0.19.0/go.mod h1:2Aph7BT2KnaSFOM0JDPyiYgNh6PL9vGMiP8CUIXZ+IY= -cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= -cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= -cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= -cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= -cloud.google.com/go/iam v1.5.3 h1:+vMINPiDF2ognBJ97ABAYYwRgsaqxPbQDlMnbHMjolc= -cloud.google.com/go/iam v1.5.3/go.mod h1:MR3v9oLkZCTlaqljW6Eb2d3HGDGK5/bDv93jhfISFvU= -cloud.google.com/go/logging v1.13.2 h1:qqlHCBvieJT9Cdq4QqYx1KPadCQ2noD4FK02eNqHAjA= -cloud.google.com/go/logging v1.13.2/go.mod h1:zaybliM3yun1J8mU2dVQ1/qDzjbOqEijZCn6hSBtKak= -cloud.google.com/go/longrunning v0.8.0 h1:LiKK77J3bx5gDLi4SMViHixjD2ohlkwBi+mKA7EhfW8= -cloud.google.com/go/longrunning v0.8.0/go.mod h1:UmErU2Onzi+fKDg2gR7dusz11Pe26aknR4kHmJJqIfk= -cloud.google.com/go/monitoring v1.24.3 h1:dde+gMNc0UhPZD1Azu6at2e79bfdztVDS5lvhOdsgaE= -cloud.google.com/go/monitoring v1.24.3/go.mod h1:nYP6W0tm3N9H/bOw8am7t62YTzZY+zUeQ+Bi6+2eonI= -cloud.google.com/go/storage v1.61.3 h1:VS//ZfBuPGDvakfD9xyPW1RGF1Vy3BWUoVZXgW1KMOg= -cloud.google.com/go/storage v1.61.3/go.mod h1:JtqK8BBB7TWv0HVGHubtUdzYYrakOQIsMLffZ2Z/HWk= -cloud.google.com/go/trace v1.11.7 h1:kDNDX8JkaAG3R2nq1lIdkb7FCSi1rCmsEtKVsty7p+U= -cloud.google.com/go/trace v1.11.7/go.mod h1:TNn9d5V3fQVf6s4SCveVMIBS2LJUqo73GACmq/Tky0s= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0 h1:fou+2+WFTib47nS+nz/ozhEBnvU96bKHy6LjRsY4E28= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.21.0/go.mod h1:t76Ruy8AHvUAC8GfMWJMa0ElSbuIcO03NLpynfbgsPA= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1 h1:Hk5QBxZQC1jb2Fwj6mpzme37xbCDdNTxU7O9eb5+LB4= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1/go.mod h1:IYus9qsFobWIc2YVwe/WPjcnyCkPKtnHAqUYeebc8z0= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 h1:9iefClla7iYpfYWdzPCRDozdmndjTm8DXdpCzPajMgA= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2/go.mod h1:XtLgD3ZD34DAaVIIAyG3objl5DynM3CQ/vMcbBNJZGI= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1 h1:/Zt+cDPnpC3OVDm/JKLOs7M2DKmLRIIp3XIx9pHHiig= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1/go.mod h1:Ng3urmn6dYe8gnbCMoHHVl5APYz2txho3koEkV2o2HA= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4 h1:jWQK1GI+LeGGUKBADtcH2rRqPxYB1Ljwms5gFA2LqrM= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4/go.mod h1:8mwH4klAm9DUgR2EEHyEEAQlRDvLPyg5fQry3y+cDew= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0 h1:XRzhVemXdgvJqCH0sFfrBUTnUJSBrBf7++ypk+twtRs= -github.com/AzureAD/microsoft-authentication-library-for-go v1.6.0/go.mod h1:HKpQxkWaGLJ+D/5H8QRpyQXA1eKjxkFlOMwck5+33Jk= github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/DataDog/datadog-go/v5 v5.8.3 h1:s58CUJ9s8lezjhTNJO/SxkPBv2qZjS3ktpRSqGF5n0s= @@ -46,18 +12,10 @@ github.com/GoCodeAlone/modular/modules/auth v1.15.0 h1:pBSkPSf4k4GLSbUQFLuPa+nFb github.com/GoCodeAlone/modular/modules/auth v1.15.0/go.mod h1:vmIm/LQrcURS2p02YwaELb+CZoHPtT0XB0v1i+sj9i4= github.com/GoCodeAlone/modular/modules/eventbus/v2 v2.8.0 h1:buYs0TGNbAZgtTq1Qb+dfmTv3+ZOBIN0HbvVBLyNqxE= github.com/GoCodeAlone/modular/modules/eventbus/v2 v2.8.0/go.mod h1:329flAKmwrPq2JEwu9iltWv6A83H/Di82Xze+kvdKDw= -github.com/GoCodeAlone/workflow v0.51.7 h1:+81UNlLQPfnB6hwncWM6DPHHmonLoiqBL0YGQ6OW9g4= -github.com/GoCodeAlone/workflow v0.51.7/go.mod h1:5dh9esKq48kH4zKWjccXmyOirWL+T+YzfLclzhdRIV4= +github.com/GoCodeAlone/workflow v0.64.1 h1:8Coad9KQavBJpcLMzFiEk7xtfTOjIt3QSJSZ239MeR4= +github.com/GoCodeAlone/workflow v0.64.1/go.mod h1:659GGDrw3QJ7b625y9rf8QhKIpt1VCoEG0MxKu5tGQs= github.com/GoCodeAlone/yaegi v0.17.2 h1:WK6Y6e0t1a6U7r+S2dN3CGWW1PizYD3zO0zneToZPxM= github.com/GoCodeAlone/yaegi v0.17.2/go.mod h1:z5Pr6Wse6QJcQvpgxTxzMAevFarH0N37TG88Y9dprx0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0 h1:rIkQfkCOVKc1OiRCNcSDD8ml5RJlZbH/Xsq7lbpynwc= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.32.0/go.mod h1:RD2SsorTmYhF6HkTmDw7KmPYQk8OBYwTkuasChwv7R4= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0 h1:UnDZ/zFfG1JhH/DqxIZYU/1CUAlTUScoXD/LcM2Ykk8= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.55.0/go.mod h1:IA1C1U7jO/ENqm/vhi7V9YYpBsp+IMyqNrEN94N7tVc= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0 h1:7t/qx5Ost0s0wbA/VDrByOooURhp+ikYwv20i9Y07TQ= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.55.0/go.mod h1:vB2GH9GAYYJTO3mEn8oYwzEdhlayZIdQz6zdzgUIRvA= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0 h1:0s6TxfCu2KHkkZPnBfsQ2y5qia0jl3MMrmBhu3nCOYk= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.55.0/go.mod h1:Mf6O40IAyB9zR/1J8nGDDPirZQQPbYJni8Yisy7NTMc= github.com/IBM/sarama v1.47.0 h1:GcQFEd12+KzfPYeLgN69Fh7vLCtYRhVIx0rO4TZO318= github.com/IBM/sarama v1.47.0/go.mod h1:7gLLIU97nznOmA6TX++Qds+DRxH89P2XICY2KAQUzAY= github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= @@ -83,32 +41,12 @@ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.22 h1:dY4kWZiSaXIzxnKlj1 github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.22/go.mod h1:KIpEUx0JuRZLO7U6cbV204cWAEco2iC3l061IxlwLtI= github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.23 h1:FPXsW9+gMuIeKmz7j6ENWcWtBGTe1kH8r9thNt5Uxx4= github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.23/go.mod h1:7J8iGMdRKk6lw2C+cMIphgAnT8uTwBwNOsGkyOCm80U= -github.com/aws/aws-sdk-go-v2/service/apigatewayv2 v1.33.8 h1:I0AMtyv5tqQ/VNDDalbbujALCWl64TP3F61bBw4U8Qs= -github.com/aws/aws-sdk-go-v2/service/apigatewayv2 v1.33.8/go.mod h1:qnrKR+Jzg9NbZqy+YusE7frSZUaYQ7EPJvki4+SwS3U= -github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.41.13 h1:juPaAcploym78WhVwleVHNLPmgURO6gkObC442Hal1s= -github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.41.13/go.mod h1:HjgDVqI6lGR0azGz1GKmZTzGHkXuzhKzRUfG/p5Ug8s= -github.com/aws/aws-sdk-go-v2/service/codebuild v1.68.12 h1:lQTVEv/YAk8Rw1Yf4XZS/jNNxF9klCN10WcSR3xlMtU= -github.com/aws/aws-sdk-go-v2/service/codebuild v1.68.12/go.mod h1:yoa0R6Xku788EmJYkFiARzJBxt4A3hgFjQPRmMAttr0= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.296.0 h1:98Miqj16un1WLNyM1RjVDhXYumhqZrQfAeG8i4jPG6o= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.296.0/go.mod h1:T6ndRfdhnXLIY5oKBHjYZDVj706los2zGdpThppquvA= -github.com/aws/aws-sdk-go-v2/service/ecs v1.76.0 h1:a5G/TgJNrpuCjZBTf8/PTN0C2B0do/ylaYVynxPSbUQ= -github.com/aws/aws-sdk-go-v2/service/ecs v1.76.0/go.mod h1:QkWmubOYmjj3cHn7A4CoUU7BKJhVeo39Gp6NH7IyhZw= -github.com/aws/aws-sdk-go-v2/service/eks v1.81.2 h1:6c/Jkyx1gYLiZGl6VPjApViaoPiYo7TDWXCMk/ZBq6c= -github.com/aws/aws-sdk-go-v2/service/eks v1.81.2/go.mod h1:xdUh6tdF9A8hc+PE84kmHbF/zsVPNiKnc6oLgulq1Eo= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.8 h1:HtOTYcbVcGABLOVuPYaIihj6IlkqubBwFj10K5fxRek= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.8/go.mod h1:VsK9abqQeGlzPgUr+isNWzPlK2vKe9INMLWnY65f5Xs= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12 h1:qtJZ70afD3ISKWnoX3xB0J2otEqu3LqicRcDBqsj0hQ= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.12/go.mod h1:v2pNpJbRNl4vEUWEh5ytQok0zACAKfdmKS51Hotc3pQ= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.22 h1:PUmZeJU6Y1Lbvt9WFuJ0ugUK2xn6hIWUBBbKuOWF30s= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.22/go.mod h1:nO6egFBoAaoXze24a2C0NjQCvdpk8OueRoYimvEB9jo= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20 h1:siU1A6xjUZ2N8zjTHSXFhB9L/2OY8Dqs0xXiLjF30jA= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.20/go.mod h1:4TLZCmVJDM3FOu5P5TJP0zOlu9zWgDWU7aUxWbr+rcw= github.com/aws/aws-sdk-go-v2/service/kinesis v1.43.4 h1:3m9iJtMtLq75jKRAfw0kapoHUlbzi0CRVigysBN/FHA= github.com/aws/aws-sdk-go-v2/service/kinesis v1.43.4/go.mod h1:O2L6vGm4xacEuN2otHFMgn7yXXlgzFKzxrba0fy/yk8= -github.com/aws/aws-sdk-go-v2/service/route53 v1.62.5 h1:Z+/OLsb85Kpq7TVLCspskqePaf68Tdv6GfmJP4kH6i0= -github.com/aws/aws-sdk-go-v2/service/route53 v1.62.5/go.mod h1:TmxGowuBYwjmHFOsEDxaZdsQE62JJzOmtiWafTi/czg= -github.com/aws/aws-sdk-go-v2/service/s3 v1.97.2 h1:MRNiP6nqa20aEl8fQ6PJpEq11b2d40b16sm4WD7QgMU= -github.com/aws/aws-sdk-go-v2/service/s3 v1.97.2/go.mod h1:FrNA56srbsr3WShiaelyWYEo70x80mXnVZ17ZZfbeqg= github.com/aws/aws-sdk-go-v2/service/signin v1.0.10 h1:a1Fq/KXn75wSzoJaPQTgZO0wHGqE9mjFnylnqEPTchA= github.com/aws/aws-sdk-go-v2/service/signin v1.0.10/go.mod h1:p6+MXNxW7IA6dMgHfTAzljuwSKD0NCm/4lbS4t6+7vI= github.com/aws/aws-sdk-go-v2/service/sso v1.30.16 h1:x6bKbmDhsgSZwv6q19wY/u3rLk/3FGjJWyqKcIRufpE= @@ -135,8 +73,6 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cloudevents/sdk-go/v2 v2.16.2 h1:ZYDFrYke4FD+jM8TZTJJO6JhKHzOQl2oqpFK1D+NnQM= github.com/cloudevents/sdk-go/v2 v2.16.2/go.mod h1:laOcGImm4nVJEU+PHnUrKL56CKmRL65RlQF0kRmW/kg= -github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os8IaYg++6uMOdKK83QtkkvJik= -github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= @@ -156,8 +92,6 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM= @@ -172,14 +106,6 @@ github.com/eapache/go-resiliency v1.7.0 h1:n3NRTnBn5N0Cbi/IeOHuQn9s2UwVUH7Ga0ZWc github.com/eapache/go-resiliency v1.7.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA= -github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU= -github.com/envoyproxy/go-control-plane/envoy v1.37.0 h1:u3riX6BoYRfF4Dr7dwSOroNfdSbEPe9Yyl09/B6wBrQ= -github.com/envoyproxy/go-control-plane/envoy v1.37.0/go.mod h1:DReE9MMrmecPy+YvQOAOHNYMALuowAnbjjEMkkWOi6A= -github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= -github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= -github.com/envoyproxy/protoc-gen-validate v1.3.3 h1:MVQghNeW+LZcmXe7SY1V36Z+WFMDjpqGAGacLe2T0ds= -github.com/envoyproxy/protoc-gen-validate v1.3.3/go.mod h1:TsndJ/ngyIdQRhMcVVGDDHINPLWB7C82oDArY51KfB0= github.com/expr-lang/expr v1.17.8 h1:W1loDTT+0PQf5YteHSTpju2qfUfNoBt4yw9+wOEU9VM= github.com/expr-lang/expr v1.17.8/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= @@ -216,18 +142,10 @@ github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX github.com/google/go-tpm v0.9.8 h1:slArAR9Ft+1ybZu0lBwpSmpwhRXaa85hWtMinMyRAWo= github.com/google/go-tpm v0.9.8/go.mod h1:h9jEsEECg7gtLis0upRBQU+GhYVH6jMjrFxI8u6bVUY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= -github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs= github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= -github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= -github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.14 h1:yh8ncqsbUY4shRD5dA6RlzjJaT4hi3kII+zYw8wmLb8= -github.com/googleapis/enterprise-certificate-proxy v0.3.14/go.mod h1:vqVt9yG9480NtzREnTlmGSBmFrA+bzb0yl0TxoBQXOg= -github.com/googleapis/gax-go/v2 v2.19.0 h1:fYQaUOiGwll0cGj7jmHT/0nPlcrZDFPrZRhTsoCr8hE= -github.com/googleapis/gax-go/v2 v2.19.0/go.mod h1:w2ROXVdfGEVFXzmlciUU4EdjHgWvB5h2n6x/8XSTTJA= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk= @@ -296,8 +214,8 @@ github.com/jhump/protoreflect v1.16.0 h1:54fZg+49widqXYQ0b+usAFHbMkBGR4PpXrsHc8+ github.com/jhump/protoreflect v1.16.0/go.mod h1:oYPd7nPvcBw/5wlDfm/AVmU9zH9BgqGCI469pGxfj/8= github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12 h1:9Nu54bhS/H/Kgo2/7xNSUuC5G28VR8ljfrLKU2G4IjU= github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12/go.mod h1:TBzl5BIHNXfS9+C35ZyJaklL7mLDbgUkcgXzSLa8Tk0= -github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= -github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao= +github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -315,8 +233,8 @@ github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHP github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.21 h1:xYae+lCNBP7QuW4PUnNG61ffM4hVIfm+zUzDuSzYLGs= -github.com/mattn/go-isatty v0.0.21/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= +github.com/mattn/go-isatty v0.0.22 h1:j8l17JJ9i6VGPUFUYoTUKPSgKe/83EYU2zBC7YNKMw4= +github.com/mattn/go-isatty v0.0.22/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= github.com/minio/highwayhash v1.0.4-0.20251030100505-070ab1a87a76 h1:KGuD/pM2JpL9FAYvBrnBBeENKZNh6eNtjqytV6TYjnk= github.com/minio/highwayhash v1.0.4-0.20251030100505-070ab1a87a76/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= @@ -347,8 +265,8 @@ github.com/nats-io/jwt/v2 v2.8.0 h1:K7uzyz50+yGZDO5o772eRE7atlcSEENpL7P+b74JV1g= github.com/nats-io/jwt/v2 v2.8.0/go.mod h1:me11pOkwObtcBNR8AiMrUbtVOUGkqYjMQZ6jnSdVUIA= github.com/nats-io/nats-server/v2 v2.12.4 h1:ZnT10v2LU2Xcoiy8ek9X6Se4YG8EuMfIfvAEuFVx1Ts= github.com/nats-io/nats-server/v2 v2.12.4/go.mod h1:5MCp/pqm5SEfsvVZ31ll1088ZTwEUdvRX1Hmh/mTTDg= -github.com/nats-io/nats.go v1.51.0 h1:ByW84XTz6W03GSSsygsZcA+xgKK8vPGaa/FCAAEHnAI= -github.com/nats-io/nats.go v1.51.0/go.mod h1:26HypzazeOkyO3/mqd1zZd53STJN0EjCYF9Uy2ZOBno= +github.com/nats-io/nats.go v1.52.0 h1:n3avV4VBsCgsdwh71TppsTwtv+QdPs7ntSKM8qJLGsc= +github.com/nats-io/nats.go v1.52.0/go.mod h1:26HypzazeOkyO3/mqd1zZd53STJN0EjCYF9Uy2ZOBno= github.com/nats-io/nkeys v0.4.15 h1:JACV5jRVO9V856KOapQ7x+EY8Jo3qw1vJt/9Jpwzkk4= github.com/nats-io/nkeys v0.4.15/go.mod h1:CpMchTXC9fxA5zrMo4KpySxNjiDVvr8ANOSZdiNfUrs= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= @@ -363,13 +281,9 @@ github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJw github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= github.com/pierrec/lz4/v4 v4.1.26 h1:GrpZw1gZttORinvzBdXPUXATeqlJjqUG/D87TKMnhjY= github.com/pierrec/lz4/v4 v4.1.26/go.mod h1:EoQMVJgeeEOMsCqCzqFm2O0cJvljX2nGZjcRIPL34O4= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= -github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -383,8 +297,8 @@ github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEy github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 h1:bsUq1dX0N8AOIL7EB/X911+m4EHsnWEHeJ0c+3TTBrg= github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/redis/go-redis/v9 v9.18.0 h1:pMkxYPkEbMPwRdenAzUNyFNrDgHx9U+DrBabWNfSRQs= -github.com/redis/go-redis/v9 v9.18.0/go.mod h1:k3ufPphLU5YXwNTUcCRXGxUoF1fqxnhFQmscfkCoDA0= +github.com/redis/go-redis/v9 v9.19.0 h1:XPVaaPSnG6RhYf7p+rmSa9zZfeVAnWsH5h3lxthOm/k= +github.com/redis/go-redis/v9 v9.19.0/go.mod h1:v/M13XI1PVCDcm01VtPFOADfZtHf8YW3baQf57KlIkA= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= @@ -399,8 +313,6 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spiffe/go-spiffe/v2 v2.6.0 h1:l+DolpxNWYgruGQVV0xsfeya3CsC7m8iBzDnMpsbLuo= -github.com/spiffe/go-spiffe/v2 v2.6.0/go.mod h1:gm2SeUoMZEtpnzPNs2Csc0D/gX33k1xIx7lEzqblHEs= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -434,10 +346,6 @@ github.com/zeebo/xxh3 v1.1.0 h1:s7DLGDK45Dyfg7++yxI0khrfwq9661w9EN78eP/UZVs= github.com/zeebo/xxh3 v1.1.0/go.mod h1:IisAie1LELR4xhVinxWS5+zf1lA4p0MW4T+w+W07F5s= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/detectors/gcp v1.43.0 h1:62yY3dT7/ShwOxzA0RsKRgshBmfElKI4d/Myu2OxDFU= -go.opentelemetry.io/contrib/detectors/gcp v1.43.0/go.mod h1:RyaZMFY7yi1kAs45S6mbFGz8O8rqB0dTY14uzvG4LCs= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 h1:0Qx7VGBacMm9ZENQ7TnNObTYI4ShC+lHI16seduaxZo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0/go.mod h1:Sje3i3MjSPKTSPvVWCaL8ugBzJwik3u4smCjUeuupqg= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 h1:CqXxU8VOmDefoh0+ztfGaymYbhdB/tT3zs79QaZTNGY= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0/go.mod h1:BuhAPThV8PBHBvg8ZzZ/Ok3idOdhWIodywz2xEcRbJo= go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= @@ -446,8 +354,6 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 h1:88Y4s2C8oTui1LGM6bT go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0/go.mod h1:Vl1/iaggsuRlrHf/hfPJPvVag77kKyvrLeD10kpMl+A= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 h1:3iZJKlCZufyRzPzlQhUIWVmfltrXuGyfjREgGP3UUjc= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0/go.mod h1:/G+nUPfhq2e+qiXMGxMwumDrP5jtzU+mWN7/sjT2rak= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0 h1:TC+BewnDpeiAmcscXbGMfxkO+mwYUwE/VySwvw88PfA= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.43.0/go.mod h1:J/ZyF4vfPwsSr9xJSPyQ4LqtcTPULFR64KwTikGLe+A= go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= @@ -466,20 +372,22 @@ go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= -go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.uber.org/zap v1.28.0 h1:IZzaP1Fv73/T/pBMLk4VutPl36uNC+OSUh3JLG3FIjo= +go.uber.org/zap v1.28.0/go.mod h1:rDLpOi171uODNm/mxFcuYWxDsqWSAVkFdX4XojSKg/Q= go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= -golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= +golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= +golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= -golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= +golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4= +golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -488,8 +396,8 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= -golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= +golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= +golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -513,8 +421,8 @@ golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= -golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= +golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -523,33 +431,29 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= -golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= +golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= -golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= +golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8= +golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= -google.golang.org/api v0.272.0 h1:eLUQZGnAS3OHn31URRf9sAmRk3w2JjMx37d2k8AjJmA= -google.golang.org/api v0.272.0/go.mod h1:wKjowi5LNJc5qarNvDCvNQBn3rVK8nSy6jg2SwRwzIA= -google.golang.org/genproto v0.0.0-20260319201613-d00831a3d3e7 h1:XzmzkmB14QhVhgnawEVsOn6OFsnpyxNPRY9QV01dNB0= -google.golang.org/genproto v0.0.0-20260319201613-d00831a3d3e7/go.mod h1:L43LFes82YgSonw6iTXTxXUX1OlULt4AQtkik4ULL/I= -google.golang.org/genproto/googleapis/api v0.0.0-20260420184626-e10c466a9529 h1:zUWMZsvo/IJcD1t6MNCPO/azZTwz0TvwCBqr5aifoVY= -google.golang.org/genproto/googleapis/api v0.0.0-20260420184626-e10c466a9529/go.mod h1:a5OGAgyRr4lqco7AG9hQM9Fwh0N2ZV4grR0eXFEsXQg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260420184626-e10c466a9529 h1:XF8+t6QQiS0o9ArVan/HW8Q7cycNPGsJf6GA2nXxYAg= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260420184626-e10c466a9529/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= -google.golang.org/grpc v1.80.0 h1:Xr6m2WmWZLETvUNvIUmeD5OAagMw3FiKmMlTdViWsHM= -google.golang.org/grpc v1.80.0/go.mod h1:ho/dLnxwi3EDJA4Zghp7k2Ec1+c2jqup0bFkw07bwF4= -google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= -google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +google.golang.org/genproto/googleapis/api v0.0.0-20260511170946-3700d4141b60 h1:3WsB1FAbiRIf2tOxscWKs3pQBD9he1NsrnbhMuWfekc= +google.golang.org/genproto/googleapis/api v0.0.0-20260511170946-3700d4141b60/go.mod h1:7yoXV7RIh5gblj/xVYoogxAWvA9wUeVbpsK/M694l00= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260511170946-3700d4141b60 h1:seT2EwLWM78plQ7wcDfuWBc/4FAEAXDDiaSol4ku4qo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260511170946-3700d4141b60/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= +google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= +google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af h1:+5/Sw3GsDNlEmu7TfklWKPdQ0Ykja5VEmq2i817+jbI= +google.golang.org/protobuf v1.36.12-0.20260120151049-f2248ac996af/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= From 2acc03a7319f6e7cbabbbc066561ee3b6cbeb9b6 Mon Sep 17 00:00:00 2001 From: Jon Langevin Date: Sun, 24 May 2026 22:07:02 -0400 Subject: [PATCH 7/8] chore: depend on workflow v0.64.2 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1b1dcd3..750e6c1 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/GoCodeAlone/workflow-plugin-observability go 1.26.0 require ( - github.com/GoCodeAlone/workflow v0.64.1 + github.com/GoCodeAlone/workflow v0.64.2 gopkg.in/yaml.v3 v3.0.1 ) diff --git a/go.sum b/go.sum index 0c78e50..e8b8092 100644 --- a/go.sum +++ b/go.sum @@ -12,8 +12,8 @@ github.com/GoCodeAlone/modular/modules/auth v1.15.0 h1:pBSkPSf4k4GLSbUQFLuPa+nFb github.com/GoCodeAlone/modular/modules/auth v1.15.0/go.mod h1:vmIm/LQrcURS2p02YwaELb+CZoHPtT0XB0v1i+sj9i4= github.com/GoCodeAlone/modular/modules/eventbus/v2 v2.8.0 h1:buYs0TGNbAZgtTq1Qb+dfmTv3+ZOBIN0HbvVBLyNqxE= github.com/GoCodeAlone/modular/modules/eventbus/v2 v2.8.0/go.mod h1:329flAKmwrPq2JEwu9iltWv6A83H/Di82Xze+kvdKDw= -github.com/GoCodeAlone/workflow v0.64.1 h1:8Coad9KQavBJpcLMzFiEk7xtfTOjIt3QSJSZ239MeR4= -github.com/GoCodeAlone/workflow v0.64.1/go.mod h1:659GGDrw3QJ7b625y9rf8QhKIpt1VCoEG0MxKu5tGQs= +github.com/GoCodeAlone/workflow v0.64.2 h1:h7EnTL1DcFxMEs0NHA2APS1mSAuf5edqAwdYcuowuGE= +github.com/GoCodeAlone/workflow v0.64.2/go.mod h1:659GGDrw3QJ7b625y9rf8QhKIpt1VCoEG0MxKu5tGQs= github.com/GoCodeAlone/yaegi v0.17.2 h1:WK6Y6e0t1a6U7r+S2dN3CGWW1PizYD3zO0zneToZPxM= github.com/GoCodeAlone/yaegi v0.17.2/go.mod h1:z5Pr6Wse6QJcQvpgxTxzMAevFarH0N37TG88Y9dprx0= github.com/IBM/sarama v1.47.0 h1:GcQFEd12+KzfPYeLgN69Fh7vLCtYRhVIx0rO4TZO318= From 7667a39b12374da0eff949238854b528b508b02b Mon Sep 17 00:00:00 2001 From: Jon Langevin Date: Sun, 24 May 2026 22:43:01 -0400 Subject: [PATCH 8/8] chore: require workflow 0.64.2 --- plugin.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin.json b/plugin.json index 519ee9d..6bcf316 100644 --- a/plugin.json +++ b/plugin.json @@ -7,7 +7,7 @@ "type": "external", "tier": "community", "private": false, - "minEngineVersion": "0.51.7", + "minEngineVersion": "0.64.2", "keywords": [ "observability", "opentelemetry",