From 8c5f1cb2a95417d8b91c8fc1ff367c8ec612940c Mon Sep 17 00:00:00 2001 From: Rodrigo Arguello Date: Tue, 24 Sep 2024 11:42:51 +0200 Subject: [PATCH 01/18] wip: feat: support segmentio/kafka.go.v0 --- _integration-tests/go.mod | 1 + _integration-tests/go.sum | 2 + .../tests/segmentio_kafka.v0/gen_test.go | 19 +++ .../segmentio_kafka.v0/segmentio_kafka.go | 143 ++++++++++++++++++ 4 files changed, 165 insertions(+) create mode 100644 _integration-tests/tests/segmentio_kafka.v0/gen_test.go create mode 100644 _integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go diff --git a/_integration-tests/go.mod b/_integration-tests/go.mod index e593fae3..c8fdfc7b 100644 --- a/_integration-tests/go.mod +++ b/_integration-tests/go.mod @@ -30,6 +30,7 @@ require ( github.com/labstack/echo/v4 v4.12.0 github.com/mattn/go-sqlite3 v1.14.22 github.com/redis/go-redis/v9 v9.6.1 + github.com/segmentio/kafka-go v0.4.42 github.com/stretchr/testify v1.9.0 github.com/testcontainers/testcontainers-go v0.33.0 github.com/testcontainers/testcontainers-go/modules/cassandra v0.33.0 diff --git a/_integration-tests/go.sum b/_integration-tests/go.sum index 276c38e8..65fa0fc6 100644 --- a/_integration-tests/go.sum +++ b/_integration-tests/go.sum @@ -1510,6 +1510,8 @@ github.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQ github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= github.com/secure-systems-lab/go-securesystemslib v0.8.0 h1:mr5An6X45Kb2nddcFlbmfHkLguCE9laoZCUzEEpIZXA= github.com/secure-systems-lab/go-securesystemslib v0.8.0/go.mod h1:UH2VZVuJfCYR8WgMlCU1uFsOUU+KeyrTWcSS73NBOzU= +github.com/segmentio/kafka-go v0.4.42 h1:qffhBZCz4WcWyNuHEclHjIMLs2slp6mZO8px+5W5tfU= +github.com/segmentio/kafka-go v0.4.42/go.mod h1:d0g15xPMqoUookug0OU75DhGZxXwCFxSLeJ4uphwJzg= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= diff --git a/_integration-tests/tests/segmentio_kafka.v0/gen_test.go b/_integration-tests/tests/segmentio_kafka.v0/gen_test.go new file mode 100644 index 00000000..3cca9237 --- /dev/null +++ b/_integration-tests/tests/segmentio_kafka.v0/gen_test.go @@ -0,0 +1,19 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build integration + +package segmentio_kafka_v0 + +import ( + utils "orchestrion/integration/utils" + "testing" +) + +func TestIntegration_segmentio_kafka_v0(t *testing.T) { + utils.RunTest(t, new(TestCase)) +} diff --git a/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go b/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go new file mode 100644 index 00000000..ec501048 --- /dev/null +++ b/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go @@ -0,0 +1,143 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package segmentio_kafka_v0 + +import ( + "context" + "net" + "strconv" + "testing" + "time" + + "github.com/segmentio/kafka-go" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + kafkatest "github.com/testcontainers/testcontainers-go/modules/kafka" + + "orchestrion/integration/utils" + "orchestrion/integration/validator/trace" +) + +const ( + topic = "topic-A" + consumerGroup = "group-A" +) + +type TestCase struct { + kafka *kafkatest.KafkaContainer + addr string + writer *kafka.Writer + reader *kafka.Reader +} + +func (tc *TestCase) Setup(t *testing.T) { + tc.kafka, tc.addr = utils.StartKafkaTestContainer(t) + + tc.writer = &kafka.Writer{ + Addr: kafka.TCP(tc.addr), + Topic: topic, + Balancer: &kafka.LeastBytes{}, + } + tc.reader = kafka.NewReader(kafka.ReaderConfig{ + Brokers: []string{tc.addr}, + GroupID: consumerGroup, + Topic: topic, + MaxBytes: 10e6, // 10MB + }) + + tc.createTopic(t) +} + +func (tc *TestCase) createTopic(t *testing.T) { + conn, err := kafka.Dial("tcp", tc.addr) + require.NoError(t, err) + defer conn.Close() + + controller, err := conn.Controller() + require.NoError(t, err) + + controllerConn, err := kafka.Dial("tcp", net.JoinHostPort(controller.Host, strconv.Itoa(controller.Port))) + require.NoError(t, err) + defer controllerConn.Close() + + topicConfigs := []kafka.TopicConfig{ + { + Topic: topic, + NumPartitions: 1, + ReplicationFactor: 1, + }, + } + err = controllerConn.CreateTopics(topicConfigs...) + require.NoError(t, err) +} + +func (tc *TestCase) Run(t *testing.T) { + tc.produce(t) + tc.consume(t) +} + +func (tc *TestCase) produce(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + err := tc.writer.WriteMessages(ctx, + kafka.Message{ + Key: []byte("Key-A"), + Value: []byte("Hello World!"), + }, + ) + require.NoError(t, err) +} + +func (tc *TestCase) consume(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + m, err := tc.reader.ReadMessage(ctx) + require.NoError(t, err) + assert.Equal(t, "Hello World!", string(m.Value)) + assert.Equal(t, "Key-A", string(m.Key)) +} + +func (tc *TestCase) Teardown(t *testing.T) { + require.NoError(t, tc.writer.Close()) + require.NoError(t, tc.reader.Close()) + + ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) + defer cancel() + require.NoError(t, tc.kafka.Terminate(ctx)) +} + +func (tc *TestCase) ExpectedTraces() trace.Spans { + return trace.Spans{ + { + Tags: map[string]any{ + "name": "kafka.produce", + "type": "queue", + "service": "kafka", + "resource": "Produce Topic topic-A", + }, + Meta: map[string]any{ + "span.kind": "producer", + "component": "segmentio/kafka.go.v0", + }, + Children: trace.Spans{ + { + Tags: map[string]any{ + "name": "kafka.consume", + "type": "queue", + "service": "kafka", + "resource": "Consume Topic topic-A", + }, + Meta: map[string]any{ + "span.kind": "consumer", + "component": "segmentio/kafka.go.v0", + }, + }, + }, + }, + } +} From 24b275b89fd5b0a200633736707059d3fcbd6386 Mon Sep 17 00:00:00 2001 From: Rodrigo Arguello Date: Wed, 25 Sep 2024 11:51:14 +0200 Subject: [PATCH 02/18] wip: segmentio/kafka-go implementation --- _integration-tests/go.mod | 9 +- _integration-tests/go.sum | 16 +- .../segmentio_kafka.v0/segmentio_kafka.go | 18 +- _integration-tests/utils/agent/agent.go | 1 + _integration-tests/utils/suite.go | 6 +- go.mod | 9 +- go.sum | 16 +- internal/injector/builtin/generated.go | 92 ++++++- internal/injector/builtin/generated_deps.go | 1 + .../yaml/datastreams/segmentio_kafka_v0.yml | 239 ++++++++++++++++++ samples/go.mod | 6 +- samples/go.sum | 3 + 12 files changed, 383 insertions(+), 33 deletions(-) create mode 100644 internal/injector/builtin/yaml/datastreams/segmentio_kafka_v0.yml diff --git a/_integration-tests/go.mod b/_integration-tests/go.mod index c8fdfc7b..c4d3d6b9 100644 --- a/_integration-tests/go.mod +++ b/_integration-tests/go.mod @@ -4,6 +4,9 @@ go 1.22.6 replace github.com/DataDog/orchestrion => ../ +// TODO: remove +replace gopkg.in/DataDog/dd-trace-go.v1 => gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240924150618-477c7b2be37a + require ( cloud.google.com/go/pubsub v1.42.0 github.com/DataDog/orchestrion v0.7.4 @@ -72,9 +75,9 @@ require ( github.com/BurntSushi/locker v0.0.0-20171006230638-a6e239ea1c69 // indirect github.com/DataDog/appsec-internal-go v1.7.0 // indirect github.com/DataDog/datadog-agent/pkg/obfuscate v0.56.0 // indirect - github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.56.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0 // indirect github.com/DataDog/datadog-go/v5 v5.5.0 // indirect - github.com/DataDog/go-libddwaf/v3 v3.3.0 // indirect + github.com/DataDog/go-libddwaf/v3 v3.4.0 // indirect github.com/DataDog/go-sqllexer v0.0.14 // indirect github.com/DataDog/go-tuf v1.1.0-0.5.2 // indirect github.com/DataDog/gostackparse v0.7.0 // indirect @@ -306,7 +309,7 @@ require ( github.com/tdewolff/minify/v2 v2.20.37 // indirect github.com/tdewolff/parse/v2 v2.7.15 // indirect github.com/tetratelabs/wazero v1.8.0 // indirect - github.com/tinylib/msgp v1.2.0 // indirect + github.com/tinylib/msgp v1.2.1 // indirect github.com/tklauser/go-sysconf v0.3.14 // indirect github.com/tklauser/numcpus v0.8.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect diff --git a/_integration-tests/go.sum b/_integration-tests/go.sum index 65fa0fc6..1c9f05c6 100644 --- a/_integration-tests/go.sum +++ b/_integration-tests/go.sum @@ -661,12 +661,12 @@ github.com/DataDog/appsec-internal-go v1.7.0 h1:iKRNLih83dJeVya3IoUfK+6HLD/hQsIb github.com/DataDog/appsec-internal-go v1.7.0/go.mod h1:wW0cRfWBo4C044jHGwYiyh5moQV2x0AhnwqMuiX7O/g= github.com/DataDog/datadog-agent/pkg/obfuscate v0.56.0 h1:UdBCkJ1a4uxQNzggUEEbPylagIUaCWvFDxuf9QKWMXE= github.com/DataDog/datadog-agent/pkg/obfuscate v0.56.0/go.mod h1:NHgTieB5DpTc4AZrzx1xE+tPCWTJ7Hw3TVRiWuK505U= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.56.0 h1:haidBqVzNjVdzPE27eu8RjgXhDbHpvbxFSeNMHp0QXI= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.56.0/go.mod h1:If8HaT8MFPv9NdWDtaQfEy1OUB6RiMFeQwLSay7G91U= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0 h1:LplNAmMgZvGU7kKA0+4c1xWOjz828xweW5TCi8Mw9Q0= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0/go.mod h1:4Vo3SJ24uzfKHUHLoFa8t8o+LH+7TCQ7sPcZDtOpSP4= github.com/DataDog/datadog-go/v5 v5.5.0 h1:G5KHeB8pWBNXT4Jtw0zAkhdxEAWSpWH00geHI6LDrKU= github.com/DataDog/datadog-go/v5 v5.5.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= -github.com/DataDog/go-libddwaf/v3 v3.3.0 h1:jS72fuQpFgJZEdEJDmHJCPAgNTEMZoz1EUvimPUOiJ4= -github.com/DataDog/go-libddwaf/v3 v3.3.0/go.mod h1:Bz/0JkpGf689mzbUjKJeheJINqsyyhM8p9PDuHdK2Ec= +github.com/DataDog/go-libddwaf/v3 v3.4.0 h1:NJ2W2vhYaOm1OWr1LJCbdgp7ezG/XLJcQKBmjFwhSuM= +github.com/DataDog/go-libddwaf/v3 v3.4.0/go.mod h1:n98d9nZ1gzenRSk53wz8l6d34ikxS+hs62A31Fqmyi4= github.com/DataDog/go-sqllexer v0.0.14 h1:xUQh2tLr/95LGxDzLmttLgTo/1gzFeOyuwrQa/Iig4Q= github.com/DataDog/go-sqllexer v0.0.14/go.mod h1:KwkYhpFEVIq+BfobkTC1vfqm4gTi65skV/DpDBXtexc= github.com/DataDog/go-tuf v1.1.0-0.5.2 h1:4CagiIekonLSfL8GMHRHcHudo1fQnxELS9g4tiAupQ4= @@ -1587,8 +1587,8 @@ github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tinylib/msgp v1.2.0 h1:0uKB/662twsVBpYUPbokj4sTSKhWFKB7LopO2kWK8lY= -github.com/tinylib/msgp v1.2.0/go.mod h1:2vIGs3lcUo8izAATNobrCHevYZC/LMsJtw4JPiYPHro= +github.com/tinylib/msgp v1.2.1 h1:6ypy2qcCznxpP4hpORzhtXyTqrBs7cfM9MCCWY8zsmU= +github.com/tinylib/msgp v1.2.1/go.mod h1:2vIGs3lcUo8izAATNobrCHevYZC/LMsJtw4JPiYPHro= github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= @@ -2370,8 +2370,8 @@ google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= -gopkg.in/DataDog/dd-trace-go.v1 v1.68.0 h1:8WPoOHJcMAtcxTVKM0DYnFweBjxxfNit3Sjo/rf+Hkw= -gopkg.in/DataDog/dd-trace-go.v1 v1.68.0/go.mod h1:mkZpWVLO/ERW5NqlW+w5d8waQKNvMSTUQLJfoI0vlvw= +gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240924150618-477c7b2be37a h1:c/hbde6aFVocMEe+jdKKqOYvHKjJqV0BHO1sS5zIAg4= +gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240924150618-477c7b2be37a/go.mod h1:fpMxtqDZZSI6QiZiZlaYP7eQdSlP+sLSmGd3ibTNr9U= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go b/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go index ec501048..2bee9384 100644 --- a/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go +++ b/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go @@ -88,8 +88,13 @@ func (tc *TestCase) produce(t *testing.T) { Key: []byte("Key-A"), Value: []byte("Hello World!"), }, + //kafka.Message{ + // Key: []byte("Key-A"), + // Value: []byte("Second message"), + //}, ) require.NoError(t, err) + require.NoError(t, tc.writer.Close()) } func (tc *TestCase) consume(t *testing.T) { @@ -100,12 +105,19 @@ func (tc *TestCase) consume(t *testing.T) { require.NoError(t, err) assert.Equal(t, "Hello World!", string(m.Value)) assert.Equal(t, "Key-A", string(m.Key)) -} -func (tc *TestCase) Teardown(t *testing.T) { - require.NoError(t, tc.writer.Close()) + //m, err = tc.reader.FetchMessage(ctx) + //require.NoError(t, err) + //assert.Equal(t, "Second message", string(m.Value)) + //assert.Equal(t, "Key-A", string(m.Key)) + //err = tc.reader.CommitMessages(ctx, m) + //require.NoError(t, err) + require.NoError(t, tc.reader.Close()) + time.Sleep(10 * time.Second) +} +func (tc *TestCase) Teardown(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) defer cancel() require.NoError(t, tc.kafka.Terminate(ctx)) diff --git a/_integration-tests/utils/agent/agent.go b/_integration-tests/utils/agent/agent.go index 24687ca0..2de6ec32 100644 --- a/_integration-tests/utils/agent/agent.go +++ b/_integration-tests/utils/agent/agent.go @@ -136,6 +136,7 @@ func (a *MockAgent) NewSession(t *testing.T) (session *Session, err error) { tracer.WithLogStartup(false), tracer.WithLogger(testLogger{t}), ) + t.Cleanup(tracer.Stop) return session, nil } diff --git a/_integration-tests/utils/suite.go b/_integration-tests/utils/suite.go index a53dde9e..c7b7ea41 100644 --- a/_integration-tests/utils/suite.go +++ b/_integration-tests/utils/suite.go @@ -69,12 +69,10 @@ func RunTest(t *testing.T, tc TestCase) { sess, err := mockAgent.NewSession(t) require.NoError(t, err) - // Defer this, so it runs even if the test panics (e.g, as the result of a failed assertion). - // If this does not happen, the test session will remain open; which is undesirable. - defer checkTrace(t, tc, sess) - t.Log("Running test") tc.Run(t) + + checkTrace(t, tc, sess) } func checkTrace(t *testing.T, tc TestCase, sess *agent.Session) { diff --git a/go.mod b/go.mod index 98850a17..417da0e6 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,9 @@ module github.com/DataDog/orchestrion go 1.22.6 +// TODO: remove +replace gopkg.in/DataDog/dd-trace-go.v1 => gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240924150618-477c7b2be37a + require ( github.com/charmbracelet/lipgloss v0.13.0 github.com/dave/dst v0.27.3 @@ -46,9 +49,9 @@ require ( github.com/BurntSushi/locker v0.0.0-20171006230638-a6e239ea1c69 // indirect github.com/DataDog/appsec-internal-go v1.7.0 // indirect github.com/DataDog/datadog-agent/pkg/obfuscate v0.56.0 // indirect - github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.56.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0 // indirect github.com/DataDog/datadog-go/v5 v5.5.0 // indirect - github.com/DataDog/go-libddwaf/v3 v3.3.0 // indirect + github.com/DataDog/go-libddwaf/v3 v3.4.0 // indirect github.com/DataDog/go-sqllexer v0.0.14 // indirect github.com/DataDog/go-tuf v1.1.0-0.5.2 // indirect github.com/DataDog/gostackparse v0.7.0 // indirect @@ -257,7 +260,7 @@ require ( github.com/tdewolff/minify/v2 v2.20.37 // indirect github.com/tdewolff/parse/v2 v2.7.15 // indirect github.com/tetratelabs/wazero v1.8.0 // indirect - github.com/tinylib/msgp v1.2.0 // indirect + github.com/tinylib/msgp v1.2.1 // indirect github.com/tklauser/go-sysconf v0.3.14 // indirect github.com/tklauser/numcpus v0.8.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect diff --git a/go.sum b/go.sum index 8fbb00da..e748fdfe 100644 --- a/go.sum +++ b/go.sum @@ -78,12 +78,12 @@ github.com/DataDog/appsec-internal-go v1.7.0 h1:iKRNLih83dJeVya3IoUfK+6HLD/hQsIb github.com/DataDog/appsec-internal-go v1.7.0/go.mod h1:wW0cRfWBo4C044jHGwYiyh5moQV2x0AhnwqMuiX7O/g= github.com/DataDog/datadog-agent/pkg/obfuscate v0.56.0 h1:UdBCkJ1a4uxQNzggUEEbPylagIUaCWvFDxuf9QKWMXE= github.com/DataDog/datadog-agent/pkg/obfuscate v0.56.0/go.mod h1:NHgTieB5DpTc4AZrzx1xE+tPCWTJ7Hw3TVRiWuK505U= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.56.0 h1:haidBqVzNjVdzPE27eu8RjgXhDbHpvbxFSeNMHp0QXI= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.56.0/go.mod h1:If8HaT8MFPv9NdWDtaQfEy1OUB6RiMFeQwLSay7G91U= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0 h1:LplNAmMgZvGU7kKA0+4c1xWOjz828xweW5TCi8Mw9Q0= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0/go.mod h1:4Vo3SJ24uzfKHUHLoFa8t8o+LH+7TCQ7sPcZDtOpSP4= github.com/DataDog/datadog-go/v5 v5.5.0 h1:G5KHeB8pWBNXT4Jtw0zAkhdxEAWSpWH00geHI6LDrKU= github.com/DataDog/datadog-go/v5 v5.5.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= -github.com/DataDog/go-libddwaf/v3 v3.3.0 h1:jS72fuQpFgJZEdEJDmHJCPAgNTEMZoz1EUvimPUOiJ4= -github.com/DataDog/go-libddwaf/v3 v3.3.0/go.mod h1:Bz/0JkpGf689mzbUjKJeheJINqsyyhM8p9PDuHdK2Ec= +github.com/DataDog/go-libddwaf/v3 v3.4.0 h1:NJ2W2vhYaOm1OWr1LJCbdgp7ezG/XLJcQKBmjFwhSuM= +github.com/DataDog/go-libddwaf/v3 v3.4.0/go.mod h1:n98d9nZ1gzenRSk53wz8l6d34ikxS+hs62A31Fqmyi4= github.com/DataDog/go-sqllexer v0.0.14 h1:xUQh2tLr/95LGxDzLmttLgTo/1gzFeOyuwrQa/Iig4Q= github.com/DataDog/go-sqllexer v0.0.14/go.mod h1:KwkYhpFEVIq+BfobkTC1vfqm4gTi65skV/DpDBXtexc= github.com/DataDog/go-tuf v1.1.0-0.5.2 h1:4CagiIekonLSfL8GMHRHcHudo1fQnxELS9g4tiAupQ4= @@ -813,8 +813,8 @@ github.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739 h1:IkjBCtQOOjIn03 github.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8= github.com/tetratelabs/wazero v1.8.0 h1:iEKu0d4c2Pd+QSRieYbnQC9yiFlMS9D+Jr0LsRmcF4g= github.com/tetratelabs/wazero v1.8.0/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs= -github.com/tinylib/msgp v1.2.0 h1:0uKB/662twsVBpYUPbokj4sTSKhWFKB7LopO2kWK8lY= -github.com/tinylib/msgp v1.2.0/go.mod h1:2vIGs3lcUo8izAATNobrCHevYZC/LMsJtw4JPiYPHro= +github.com/tinylib/msgp v1.2.1 h1:6ypy2qcCznxpP4hpORzhtXyTqrBs7cfM9MCCWY8zsmU= +github.com/tinylib/msgp v1.2.1/go.mod h1:2vIGs3lcUo8izAATNobrCHevYZC/LMsJtw4JPiYPHro= github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= @@ -1268,8 +1268,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= -gopkg.in/DataDog/dd-trace-go.v1 v1.68.0 h1:8WPoOHJcMAtcxTVKM0DYnFweBjxxfNit3Sjo/rf+Hkw= -gopkg.in/DataDog/dd-trace-go.v1 v1.68.0/go.mod h1:mkZpWVLO/ERW5NqlW+w5d8waQKNvMSTUQLJfoI0vlvw= +gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240924150618-477c7b2be37a h1:c/hbde6aFVocMEe+jdKKqOYvHKjJqV0BHO1sS5zIAg4= +gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240924150618-477c7b2be37a/go.mod h1:fpMxtqDZZSI6QiZiZlaYP7eQdSlP+sLSmGd3ibTNr9U= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/internal/injector/builtin/generated.go b/internal/injector/builtin/generated.go index 6aca04b2..ede19291 100644 --- a/internal/injector/builtin/generated.go +++ b/internal/injector/builtin/generated.go @@ -297,6 +297,95 @@ var Aspects = [...]aspect.Aspect{ )), }, }, + // From datastreams/segmentio_kafka_v0.yml + { + JoinPoint: join.StructDefinition(join.MustTypeName("github.com/segmentio/kafka-go.Reader")), + Advice: []advice.Advice{ + advice.InjectDeclarations(code.MustTemplate( + "func __dd_tracingMessage(msg *Message) *tracing.KafkaMessage {\n setHeaders := func(newHeaders []tracing.KafkaHeader) {\n hs := make([]Header, len(newHeaders))\n for _, h := range newHeaders {\n hs = append(hs, Header{\n Key: h.Key,\n Value: h.Value,\n })\n }\n msg.Headers = hs\n }\n return &tracing.KafkaMessage{\n Topic: msg.Topic,\n Partition: msg.Partition,\n Offset: msg.Offset,\n Headers: __dd_tracingKafkaHeaders(msg.Headers),\n SetHeaders: setHeaders,\n Value: msg.Value,\n Key: msg.Key,\n }\n}\n \nfunc __dd_tracingKafkaHeaders(headers []Header) []tracing.KafkaHeader {\n hs := make([]tracing.KafkaHeader, len(headers))\n for _, h := range headers {\n hs = append(hs, tracing.KafkaHeader{\n Key: h.Key,\n Value: h.Value,\n })\n }\n return hs\n}\n\nfunc __dd_tracingWriter(w *Writer) *tracing.KafkaWriter {\n return &tracing.KafkaWriter{\n Topic: w.Topic,\n }\n}\n\nfunc __dd_kafkaConfigFromReader(r *Reader) *tracing.KafkaConfig {\n kafkaCfg := new(tracing.KafkaConfig)\n if r.Config().Brokers != nil {\n kafkaCfg.BootstrapServers = strings.Join(r.Config().Brokers, \",\")\n }\n if r.Config().GroupID != \"\" {\n kafkaCfg.ConsumerGroupID = r.Config().GroupID\n }\n return kafkaCfg\n}\n\nfunc __dd_initReader(r *Reader) {\n if r.__dd_cfg == nil {\n r.__dd_cfg = tracing.NewConfig()\n }\n if r.__dd_kafkaCfg == nil {\n r.__dd_kafkaCfg = __dd_kafkaConfigFromReader(r)\n }\n}\n\ntype __dd_Span = ddtrace.Span", + map[string]string{ + "ddtrace": "gopkg.in/DataDog/dd-trace-go.v1/ddtrace", + "strings": "strings", + "tracing": "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing", + }, + ), []string{}), + advice.AddStructField("__dd_cfg", join.MustTypeName("*gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing.Config")), + advice.AddStructField("__dd_kafkaCfg", join.MustTypeName("*gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing.KafkaConfig")), + advice.AddStructField("__dd_prev", join.MustTypeName("__dd_Span")), + }, + }, + { + JoinPoint: join.FunctionBody(join.Function( + join.Receiver(join.MustTypeName("*github.com/segmentio/kafka-go.Reader")), + join.Name("ReadMessage"), + )), + Advice: []advice.Advice{ + advice.PrependStmts(code.MustTemplate( + "{{- $r := .Function.Receiver -}}\n{{- $ctx := .Function.Argument 0 -}}\n{{- $msg := .Function.Result 0 -}}\n{{- $err := .Function.Result 1 -}}\n__dd_initReader(r)\n\nif {{ $r }}.__dd_prev != nil {\n fmt.Println(\"ReadMessage: Closing previous span\")\n {{ $r }}.__dd_prev.Finish()\n {{ $r }}.__dd_prev = nil\n}\n\ndefer func() {\n if {{ $err }} != nil {\n return\n }\n fmt.Println(\"ReadMessage: tracing.StartConsumeSpan\")\n tMsg := __dd_tracingMessage(&{{ $msg }})\n {{ $r }}.__dd_prev = tracing.StartConsumeSpan({{ $ctx }}, {{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, tMsg)\n tracing.SetConsumeDSMCheckpoint({{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, tMsg)\n}()", + map[string]string{ + "fmt": "fmt", + "tracing": "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing", + }, + )), + }, + }, + { + JoinPoint: join.FunctionBody(join.Function( + join.Receiver(join.MustTypeName("*github.com/segmentio/kafka-go.Reader")), + join.Name("FetchMessage"), + )), + Advice: []advice.Advice{ + advice.PrependStmts(code.MustTemplate( + "{{- $r := .Function.Receiver -}}\n{{- $ctx := .Function.Argument 0 -}}\n{{- $msg := .Function.Result 0 -}}\n{{- $err := .Function.Result 1 -}}\n__dd_initReader(r)\n\nif {{ $r }}.__dd_prev != nil {\n fmt.Println(\"FetchMessage: Closing previous span\")\n {{ $r }}.__dd_prev.Finish()\n {{ $r }}.__dd_prev = nil\n}\n\ndefer func() {\n if {{ $err }} != nil {\n return\n }\n {{ $r }}.__dd_prev = tracing.StartConsumeSpan({{ $ctx }}, {{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, __dd_tracingMessage(&{{ $msg }}))\n tracing.SetConsumeDSMCheckpoint({{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, __dd_tracingMessage(&{{ $msg }}))\n}()", + map[string]string{ + "fmt": "fmt", + "tracing": "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing", + }, + )), + }, + }, + { + JoinPoint: join.FunctionBody(join.Function( + join.Receiver(join.MustTypeName("*github.com/segmentio/kafka-go.Reader")), + join.Name("Close"), + )), + Advice: []advice.Advice{ + advice.PrependStmts(code.MustTemplate( + "{{- $r := .Function.Receiver -}}\nif {{ $r }}.__dd_prev != nil {\n fmt.Println(\"Close: Closing previous span\")\n {{ $r }}.__dd_prev.Finish()\n {{ $r }}.__dd_prev = nil\n}", + map[string]string{ + "fmt": "fmt", + }, + )), + }, + }, + { + JoinPoint: join.StructDefinition(join.MustTypeName("github.com/segmentio/kafka-go.Writer")), + Advice: []advice.Advice{ + advice.InjectDeclarations(code.MustTemplate( + "func __dd_initWriter(w *Writer) {\n if w.__dd_cfg == nil {\n w.__dd_cfg = tracing.NewConfig()\n }\n if w.__dd_kafkaCfg == nil {\n w.__dd_kafkaCfg = &tracing.KafkaConfig{\n BootstrapServers: w.Addr.String(),\n }\n }\n}", + map[string]string{ + "tracing": "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing", + }, + ), []string{}), + advice.AddStructField("__dd_cfg", join.MustTypeName("*gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing.Config")), + advice.AddStructField("__dd_kafkaCfg", join.MustTypeName("*gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing.KafkaConfig")), + }, + }, + { + JoinPoint: join.FunctionBody(join.Function( + join.Receiver(join.MustTypeName("*github.com/segmentio/kafka-go.Writer")), + join.Name("WriteMessages"), + )), + Advice: []advice.Advice{ + advice.PrependStmts(code.MustTemplate( + "{{- $w := .Function.Receiver -}}\n{{- $ctx := .Function.Argument 0 -}}\n{{- $msgs := .Function.Argument 1 -}}\n{{- $err := .Function.Result 0 -}}\nspans := make([]ddtrace.Span, len(msgs))\n__dd_initWriter(w)\n\nfor i := range msgs {\n tMsg := __dd_tracingMessage(&{{ $msgs }}[i])\n tWriter := __dd_tracingWriter({{ $w }})\n spans[i] = tracing.StartProduceSpan({{ $ctx }}, {{ $w }}.__dd_cfg, {{ $w }}.__dd_kafkaCfg, tWriter, tMsg)\n tracing.SetProduceDSMCheckpoint({{ $w }}.__dd_cfg, tMsg, tWriter)\n}\n\ndefer func() {\n for i, span := range spans {\n tracing.FinishProduceSpan(span, {{ $msgs }}[i].Partition, {{ $msgs }}[i].Offset, {{ $err }})\n }\n}()", + map[string]string{ + "ddtrace": "gopkg.in/DataDog/dd-trace-go.v1/ddtrace", + "tracing": "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing", + }, + )), + }, + }, // From datastreams/shopify_sarama.yml { JoinPoint: join.OneOf( @@ -866,6 +955,7 @@ var InjectedPaths = [...]string{ "gopkg.in/DataDog/dd-trace-go.v1/contrib/log/slog", "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http", "gopkg.in/DataDog/dd-trace-go.v1/contrib/redis/go-redis.v9", + "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing", "gopkg.in/DataDog/dd-trace-go.v1/ddtrace", "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext", "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer", @@ -886,4 +976,4 @@ var InjectedPaths = [...]string{ } // Checksum is a checksum of the built-in configuration which can be used to invalidate caches. -const Checksum = "sha512:NB8IV3fYeE+6FMXZtx2EFoeSWlhraYLzuBmH4f6iLZCxGjDHc4CZrVByuV1jHjJFyLR8e5qzIabizGeIVQVLnA==" +const Checksum = "sha512:/GhM4ejVCra1GRcmjhh9pkMapex+iptg3P6n8qjJtnEvn4v2qiy8lyRX1Koj0ObY2/4m/3HB9iSNZfN/od/fTA==" diff --git a/internal/injector/builtin/generated_deps.go b/internal/injector/builtin/generated_deps.go index 1d0278f7..1b2e6605 100644 --- a/internal/injector/builtin/generated_deps.go +++ b/internal/injector/builtin/generated_deps.go @@ -42,6 +42,7 @@ import ( _ "gopkg.in/DataDog/dd-trace-go.v1/contrib/log/slog" _ "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" _ "gopkg.in/DataDog/dd-trace-go.v1/contrib/redis/go-redis.v9" + _ "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing" _ "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" _ "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" _ "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" diff --git a/internal/injector/builtin/yaml/datastreams/segmentio_kafka_v0.yml b/internal/injector/builtin/yaml/datastreams/segmentio_kafka_v0.yml new file mode 100644 index 00000000..95e92b11 --- /dev/null +++ b/internal/injector/builtin/yaml/datastreams/segmentio_kafka_v0.yml @@ -0,0 +1,239 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=../../../../../docs/static/schema.json +meta: + name: github.com/segmentio/kafka-go + description: Kafka library in Go + icon: fast-forward + +aspects: + + ## Trace Consume ## + + - id: Add struct fields to kafka.Reader + join-point: + struct-definition: github.com/segmentio/kafka-go.Reader + advice: + - inject-declarations: + imports: + tracing: gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing + ddtrace: gopkg.in/DataDog/dd-trace-go.v1/ddtrace + strings: strings + template: |- + func __dd_tracingMessage(msg *Message) *tracing.KafkaMessage { + setHeaders := func(newHeaders []tracing.KafkaHeader) { + hs := make([]Header, len(newHeaders)) + for _, h := range newHeaders { + hs = append(hs, Header{ + Key: h.Key, + Value: h.Value, + }) + } + msg.Headers = hs + } + return &tracing.KafkaMessage{ + Topic: msg.Topic, + Partition: msg.Partition, + Offset: msg.Offset, + Headers: __dd_tracingKafkaHeaders(msg.Headers), + SetHeaders: setHeaders, + Value: msg.Value, + Key: msg.Key, + } + } + + func __dd_tracingKafkaHeaders(headers []Header) []tracing.KafkaHeader { + hs := make([]tracing.KafkaHeader, len(headers)) + for _, h := range headers { + hs = append(hs, tracing.KafkaHeader{ + Key: h.Key, + Value: h.Value, + }) + } + return hs + } + + func __dd_tracingWriter(w *Writer) *tracing.KafkaWriter { + return &tracing.KafkaWriter{ + Topic: w.Topic, + } + } + + func __dd_kafkaConfigFromReader(r *Reader) *tracing.KafkaConfig { + kafkaCfg := new(tracing.KafkaConfig) + if r.Config().Brokers != nil { + kafkaCfg.BootstrapServers = strings.Join(r.Config().Brokers, ",") + } + if r.Config().GroupID != "" { + kafkaCfg.ConsumerGroupID = r.Config().GroupID + } + return kafkaCfg + } + + func __dd_initReader(r *Reader) { + if r.__dd_cfg == nil { + r.__dd_cfg = tracing.NewConfig() + } + if r.__dd_kafkaCfg == nil { + r.__dd_kafkaCfg = __dd_kafkaConfigFromReader(r) + } + } + + type __dd_Span = ddtrace.Span + + - add-struct-field: + name: __dd_cfg + type: "*gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing.Config" + - add-struct-field: + name: __dd_kafkaCfg + type: "*gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing.KafkaConfig" + - add-struct-field: + name: __dd_prev + type: "__dd_Span" + + - id: Modify kafka.Reader.ReadMessage to call tracing functions + join-point: + function-body: + function: + - receiver: '*github.com/segmentio/kafka-go.Reader' + - name: ReadMessage + advice: + - prepend-statements: + imports: + tracing: gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing + fmt: fmt + template: |- + {{- $r := .Function.Receiver -}} + {{- $ctx := .Function.Argument 0 -}} + {{- $msg := .Function.Result 0 -}} + {{- $err := .Function.Result 1 -}} + __dd_initReader(r) + + if {{ $r }}.__dd_prev != nil { + fmt.Println("ReadMessage: Closing previous span") + {{ $r }}.__dd_prev.Finish() + {{ $r }}.__dd_prev = nil + } + + defer func() { + if {{ $err }} != nil { + return + } + fmt.Println("ReadMessage: tracing.StartConsumeSpan") + tMsg := __dd_tracingMessage(&{{ $msg }}) + {{ $r }}.__dd_prev = tracing.StartConsumeSpan({{ $ctx }}, {{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, tMsg) + tracing.SetConsumeDSMCheckpoint({{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, tMsg) + }() + + - id: Modify kafka.Reader.FetchMessage to call tracing functions + join-point: + function-body: + function: + - receiver: '*github.com/segmentio/kafka-go.Reader' + - name: FetchMessage + advice: + - prepend-statements: + imports: + tracing: gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing + fmt: fmt + template: |- + {{- $r := .Function.Receiver -}} + {{- $ctx := .Function.Argument 0 -}} + {{- $msg := .Function.Result 0 -}} + {{- $err := .Function.Result 1 -}} + __dd_initReader(r) + + if {{ $r }}.__dd_prev != nil { + fmt.Println("FetchMessage: Closing previous span") + {{ $r }}.__dd_prev.Finish() + {{ $r }}.__dd_prev = nil + } + + defer func() { + if {{ $err }} != nil { + return + } + {{ $r }}.__dd_prev = tracing.StartConsumeSpan({{ $ctx }}, {{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, __dd_tracingMessage(&{{ $msg }})) + tracing.SetConsumeDSMCheckpoint({{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, __dd_tracingMessage(&{{ $msg }})) + }() + + - id: Modify kafka.Reader.Close to call tracing functions + join-point: + function-body: + function: + - receiver: '*github.com/segmentio/kafka-go.Reader' + - name: Close + advice: + - prepend-statements: + imports: + fmt: fmt + template: |- + {{- $r := .Function.Receiver -}} + if {{ $r }}.__dd_prev != nil { + fmt.Println("Close: Closing previous span") + {{ $r }}.__dd_prev.Finish() + {{ $r }}.__dd_prev = nil + } + + ## Trace Produce ## + + - id: Add struct fields to kafka.Writer + join-point: + struct-definition: github.com/segmentio/kafka-go.Writer + advice: + - inject-declarations: + imports: + tracing: gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing + template: |- + func __dd_initWriter(w *Writer) { + if w.__dd_cfg == nil { + w.__dd_cfg = tracing.NewConfig() + } + if w.__dd_kafkaCfg == nil { + w.__dd_kafkaCfg = &tracing.KafkaConfig{ + BootstrapServers: w.Addr.String(), + } + } + } + + - add-struct-field: + name: __dd_cfg + type: "*gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing.Config" + - add-struct-field: + name: __dd_kafkaCfg + type: "*gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing.KafkaConfig" + + - id: Modify kafka.Writer.WriteMessages to call tracing functions + join-point: + function-body: + function: + - receiver: '*github.com/segmentio/kafka-go.Writer' + - name: WriteMessages + advice: + - prepend-statements: + imports: + ddtrace: gopkg.in/DataDog/dd-trace-go.v1/ddtrace + tracing: gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing + template: |- + {{- $w := .Function.Receiver -}} + {{- $ctx := .Function.Argument 0 -}} + {{- $msgs := .Function.Argument 1 -}} + {{- $err := .Function.Result 0 -}} + spans := make([]ddtrace.Span, len(msgs)) + __dd_initWriter(w) + + for i := range msgs { + tMsg := __dd_tracingMessage(&{{ $msgs }}[i]) + tWriter := __dd_tracingWriter({{ $w }}) + spans[i] = tracing.StartProduceSpan({{ $ctx }}, {{ $w }}.__dd_cfg, {{ $w }}.__dd_kafkaCfg, tWriter, tMsg) + tracing.SetProduceDSMCheckpoint({{ $w }}.__dd_cfg, tMsg, tWriter) + } + + defer func() { + for i, span := range spans { + tracing.FinishProduceSpan(span, {{ $msgs }}[i].Partition, {{ $msgs }}[i].Offset, {{ $err }}) + } + }() diff --git a/samples/go.mod b/samples/go.mod index 503d7255..1877f6fe 100644 --- a/samples/go.mod +++ b/samples/go.mod @@ -47,9 +47,9 @@ require ( github.com/BurntSushi/locker v0.0.0-20171006230638-a6e239ea1c69 // indirect github.com/DataDog/appsec-internal-go v1.7.0 // indirect github.com/DataDog/datadog-agent/pkg/obfuscate v0.56.0 // indirect - github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.56.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0 // indirect github.com/DataDog/datadog-go/v5 v5.5.0 // indirect - github.com/DataDog/go-libddwaf/v3 v3.3.0 // indirect + github.com/DataDog/go-libddwaf/v3 v3.4.0 // indirect github.com/DataDog/go-sqllexer v0.0.14 // indirect github.com/DataDog/go-tuf v1.1.0-0.5.2 // indirect github.com/DataDog/gostackparse v0.7.0 // indirect @@ -260,7 +260,7 @@ require ( github.com/tdewolff/minify/v2 v2.20.37 // indirect github.com/tdewolff/parse/v2 v2.7.15 // indirect github.com/tetratelabs/wazero v1.8.0 // indirect - github.com/tinylib/msgp v1.2.0 // indirect + github.com/tinylib/msgp v1.2.1 // indirect github.com/tklauser/go-sysconf v0.3.14 // indirect github.com/tklauser/numcpus v0.8.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect diff --git a/samples/go.sum b/samples/go.sum index 657f99f9..074cd268 100644 --- a/samples/go.sum +++ b/samples/go.sum @@ -80,10 +80,12 @@ github.com/DataDog/datadog-agent/pkg/obfuscate v0.56.0 h1:UdBCkJ1a4uxQNzggUEEbPy github.com/DataDog/datadog-agent/pkg/obfuscate v0.56.0/go.mod h1:NHgTieB5DpTc4AZrzx1xE+tPCWTJ7Hw3TVRiWuK505U= github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.56.0 h1:haidBqVzNjVdzPE27eu8RjgXhDbHpvbxFSeNMHp0QXI= github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.56.0/go.mod h1:If8HaT8MFPv9NdWDtaQfEy1OUB6RiMFeQwLSay7G91U= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0/go.mod h1:4Vo3SJ24uzfKHUHLoFa8t8o+LH+7TCQ7sPcZDtOpSP4= github.com/DataDog/datadog-go/v5 v5.5.0 h1:G5KHeB8pWBNXT4Jtw0zAkhdxEAWSpWH00geHI6LDrKU= github.com/DataDog/datadog-go/v5 v5.5.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= github.com/DataDog/go-libddwaf/v3 v3.3.0 h1:jS72fuQpFgJZEdEJDmHJCPAgNTEMZoz1EUvimPUOiJ4= github.com/DataDog/go-libddwaf/v3 v3.3.0/go.mod h1:Bz/0JkpGf689mzbUjKJeheJINqsyyhM8p9PDuHdK2Ec= +github.com/DataDog/go-libddwaf/v3 v3.4.0/go.mod h1:n98d9nZ1gzenRSk53wz8l6d34ikxS+hs62A31Fqmyi4= github.com/DataDog/go-sqllexer v0.0.14 h1:xUQh2tLr/95LGxDzLmttLgTo/1gzFeOyuwrQa/Iig4Q= github.com/DataDog/go-sqllexer v0.0.14/go.mod h1:KwkYhpFEVIq+BfobkTC1vfqm4gTi65skV/DpDBXtexc= github.com/DataDog/go-tuf v1.1.0-0.5.2 h1:4CagiIekonLSfL8GMHRHcHudo1fQnxELS9g4tiAupQ4= @@ -807,6 +809,7 @@ github.com/tetratelabs/wazero v1.8.0 h1:iEKu0d4c2Pd+QSRieYbnQC9yiFlMS9D+Jr0LsRmc github.com/tetratelabs/wazero v1.8.0/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs= github.com/tinylib/msgp v1.2.0 h1:0uKB/662twsVBpYUPbokj4sTSKhWFKB7LopO2kWK8lY= github.com/tinylib/msgp v1.2.0/go.mod h1:2vIGs3lcUo8izAATNobrCHevYZC/LMsJtw4JPiYPHro= +github.com/tinylib/msgp v1.2.1/go.mod h1:2vIGs3lcUo8izAATNobrCHevYZC/LMsJtw4JPiYPHro= github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= From 56c948ea367132898fe2207109073f434c2bf5e3 Mon Sep 17 00:00:00 2001 From: Romain Marcadier Date: Wed, 25 Sep 2024 11:54:13 +0200 Subject: [PATCH 03/18] chore: update generated files --- internal/injector/builtin/generated.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/injector/builtin/generated.go b/internal/injector/builtin/generated.go index ede19291..1a03c2e9 100644 --- a/internal/injector/builtin/generated.go +++ b/internal/injector/builtin/generated.go @@ -321,7 +321,7 @@ var Aspects = [...]aspect.Aspect{ )), Advice: []advice.Advice{ advice.PrependStmts(code.MustTemplate( - "{{- $r := .Function.Receiver -}}\n{{- $ctx := .Function.Argument 0 -}}\n{{- $msg := .Function.Result 0 -}}\n{{- $err := .Function.Result 1 -}}\n__dd_initReader(r)\n\nif {{ $r }}.__dd_prev != nil {\n fmt.Println(\"ReadMessage: Closing previous span\")\n {{ $r }}.__dd_prev.Finish()\n {{ $r }}.__dd_prev = nil\n}\n\ndefer func() {\n if {{ $err }} != nil {\n return\n }\n fmt.Println(\"ReadMessage: tracing.StartConsumeSpan\")\n tMsg := __dd_tracingMessage(&{{ $msg }})\n {{ $r }}.__dd_prev = tracing.StartConsumeSpan({{ $ctx }}, {{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, tMsg)\n tracing.SetConsumeDSMCheckpoint({{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, tMsg)\n}()", + "{{- $r := .Function.Receiver -}}\n{{- $ctx := .Function.Argument 0 -}}\n{{- $msg := .Function.Result 0 -}}\n{{- $err := .Function.Result 1 -}}\n__dd_initReader(r)\n\nif {{ $r }}.__dd_prev != nil {\nfmt.Println(\"ReadMessage: Closing previous span\")\n {{ $r }}.__dd_prev.Finish()\n {{ $r }}.__dd_prev = nil\n}\n\ndefer func() {\n if {{ $err }} != nil {\n return\n }\n fmt.Println(\"ReadMessage: tracing.StartConsumeSpan\")\n tMsg := __dd_tracingMessage(&{{ $msg }})\n {{ $r }}.__dd_prev = tracing.StartConsumeSpan({{ $ctx }}, {{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, tMsg)\n tracing.SetConsumeDSMCheckpoint({{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, tMsg)\n}()", map[string]string{ "fmt": "fmt", "tracing": "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing", @@ -976,4 +976,4 @@ var InjectedPaths = [...]string{ } // Checksum is a checksum of the built-in configuration which can be used to invalidate caches. -const Checksum = "sha512:/GhM4ejVCra1GRcmjhh9pkMapex+iptg3P6n8qjJtnEvn4v2qiy8lyRX1Koj0ObY2/4m/3HB9iSNZfN/od/fTA==" +const Checksum = "sha512:uBQEyyjzZZlDBdnvVKHkgaE1WZVQg+sYGAnqwaAUWyDRIN23EmXtKXwS0tAocZgasbKm1CdKJj2ycTfMoiqfmw==" From 2150d79f605a0d2ae88b63e8c06c78ccbf63353a Mon Sep 17 00:00:00 2001 From: Rodrigo Arguello Date: Wed, 25 Sep 2024 14:56:42 +0200 Subject: [PATCH 04/18] add metrics and change type of meta to map[string]string --- _integration-tests/tests/aws.v1/aws.go | 2 +- _integration-tests/tests/aws.v2/base.go | 4 +- _integration-tests/tests/chi.v5/chi.go | 4 +- _integration-tests/tests/dd-span/no-tag.go | 4 +- _integration-tests/tests/dd-span/tag.go | 4 +- _integration-tests/tests/echo.v4/echo.go | 2 +- _integration-tests/tests/fiber.v2/fiber.go | 4 +- .../tests/gcp_pubsub/gcp_pubsub.go | 4 +- _integration-tests/tests/gin/gin.go | 4 +- .../tests/go-redis.v7/go-redis.go | 4 +- .../tests/go-redis.v8/go-redis.go | 4 +- .../tests/go-redis.v9/go-redis.go | 4 +- _integration-tests/tests/gocql/base.go | 6 +-- _integration-tests/tests/gorm.jinzhu/gorm.go | 2 +- _integration-tests/tests/gorm/gorm.go | 2 +- .../tests/ibm_sarama/ibm_sarama.go | 4 +- .../tests/k8s_client_go/base.go | 6 +-- _integration-tests/tests/mongo/mongo.go | 4 +- _integration-tests/tests/mux/mux.go | 4 +- _integration-tests/tests/net_http/net_http.go | 8 +-- _integration-tests/tests/os/lfi.go | 4 +- _integration-tests/tests/redigo/redigo.go | 4 +- .../segmentio_kafka.v0/segmentio_kafka.go | 51 +++++++++++++------ .../tests/shopify_sarama/shopify_sarama.go | 4 +- _integration-tests/tests/sql/sql.go | 2 +- _integration-tests/tests/vault/vault.go | 2 +- _integration-tests/utils/suite.go | 11 ++-- _integration-tests/validator/trace/diff.go | 8 ++- _integration-tests/validator/trace/raw.go | 2 + _integration-tests/validator/trace/span.go | 46 ++++++++++++----- .../trace/testdata/matching/expected.json | 8 +++ 31 files changed, 139 insertions(+), 83 deletions(-) diff --git a/_integration-tests/tests/aws.v1/aws.go b/_integration-tests/tests/aws.v1/aws.go index 665d9946..a866c984 100644 --- a/_integration-tests/tests/aws.v1/aws.go +++ b/_integration-tests/tests/aws.v1/aws.go @@ -61,7 +61,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "resource": "dynamodb.ListTables", "type": "http", }, - Meta: map[string]any{ + Meta: map[string]string{ "aws.operation": "ListTables", "aws.region": "test-region-1337", "aws_service": "dynamodb", diff --git a/_integration-tests/tests/aws.v2/base.go b/_integration-tests/tests/aws.v2/base.go index 88fb3d00..fe64f781 100644 --- a/_integration-tests/tests/aws.v2/base.go +++ b/_integration-tests/tests/aws.v2/base.go @@ -56,7 +56,7 @@ func (b *base) expectedSpans() trace.Spans { "resource": "DynamoDB.ListTables", "type": "http", }, - Meta: map[string]any{ + Meta: map[string]string{ "aws.operation": "ListTables", "aws.region": "test-region-1337", "aws_service": "DynamoDB", @@ -72,7 +72,7 @@ func (b *base) expectedSpans() trace.Spans { "resource": "POST /", "type": "http", }, - Meta: map[string]any{ + Meta: map[string]string{ "http.method": "POST", "http.status_code": "200", "http.url": fmt.Sprintf("http://localhost:%s/", b.port), diff --git a/_integration-tests/tests/chi.v5/chi.go b/_integration-tests/tests/chi.v5/chi.go index 5b076583..267a2b0f 100644 --- a/_integration-tests/tests/chi.v5/chi.go +++ b/_integration-tests/tests/chi.v5/chi.go @@ -64,7 +64,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "resource": "GET /", "type": "http", }, - Meta: map[string]any{ + Meta: map[string]string{ "http.url": fmt.Sprintf("http://%s/", tc.Server.Addr), }, Children: trace.Spans{ @@ -75,7 +75,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "service": "chi.router", "type": "web", }, - Meta: map[string]any{ + Meta: map[string]string{ "http.url": fmt.Sprintf("http://%s/", tc.Server.Addr), }, }, diff --git a/_integration-tests/tests/dd-span/no-tag.go b/_integration-tests/tests/dd-span/no-tag.go index 54140492..c793dad4 100644 --- a/_integration-tests/tests/dd-span/no-tag.go +++ b/_integration-tests/tests/dd-span/no-tag.go @@ -22,7 +22,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { Tags: map[string]any{ "name": "spanFromHTTPRequest", }, - Meta: map[string]any{ + Meta: map[string]string{ "function-name": "spanFromHTTPRequest", "foo": "bar", }, @@ -31,7 +31,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { Tags: map[string]any{ "name": "tagSpecificSpan", }, - Meta: map[string]any{ + Meta: map[string]string{ "function-name": "tagSpecificSpan", "variant": "notag", }, diff --git a/_integration-tests/tests/dd-span/tag.go b/_integration-tests/tests/dd-span/tag.go index 0cc9396c..be2e7010 100644 --- a/_integration-tests/tests/dd-span/tag.go +++ b/_integration-tests/tests/dd-span/tag.go @@ -23,7 +23,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { Tags: map[string]any{ "name": "spanFromHTTPRequest", }, - Meta: map[string]any{ + Meta: map[string]string{ "function-name": "spanFromHTTPRequest", "foo": "bar", }, @@ -32,7 +32,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { Tags: map[string]any{ "name": "functionWithBuildTag", }, - Meta: map[string]any{ + Meta: map[string]string{ "function-name": "tagSpecificSpan", "variant": "tag", "error.message": "Artificial error for testing!", diff --git a/_integration-tests/tests/echo.v4/echo.go b/_integration-tests/tests/echo.v4/echo.go index 97245d5a..5471fc0c 100644 --- a/_integration-tests/tests/echo.v4/echo.go +++ b/_integration-tests/tests/echo.v4/echo.go @@ -69,7 +69,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "resource": "GET /ping", "type": "web", }, - Meta: map[string]any{ + Meta: map[string]string{ "http.url": "http://" + tc.addr + "/ping", }, }, diff --git a/_integration-tests/tests/fiber.v2/fiber.go b/_integration-tests/tests/fiber.v2/fiber.go index 50d11d9d..decc8994 100644 --- a/_integration-tests/tests/fiber.v2/fiber.go +++ b/_integration-tests/tests/fiber.v2/fiber.go @@ -52,7 +52,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "resource": "GET /ping", "type": "http", }, - Meta: map[string]any{ + Meta: map[string]string{ "http.url": "http://" + tc.addr + "/ping", }, Children: trace.Spans{ @@ -63,7 +63,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "resource": "GET /ping", "type": "web", }, - Meta: map[string]any{ + Meta: map[string]string{ "http.url": "/ping", }, }, diff --git a/_integration-tests/tests/gcp_pubsub/gcp_pubsub.go b/_integration-tests/tests/gcp_pubsub/gcp_pubsub.go index 95d4f4e8..7a933f4f 100644 --- a/_integration-tests/tests/gcp_pubsub/gcp_pubsub.go +++ b/_integration-tests/tests/gcp_pubsub/gcp_pubsub.go @@ -127,7 +127,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "resource": "projects/pstest-orchestrion/topics/pstest-orchestrion-topic", "service": "gcp_pubsub.test", }, - Meta: map[string]any{ + Meta: map[string]string{ "span.kind": "producer", "component": "cloud.google.com/go/pubsub.v1", "ordering_key": "ordering-key", @@ -140,7 +140,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "resource": "projects/pstest-orchestrion/subscriptions/pstest-orchestrion-subscription", "service": "gcp_pubsub.test", }, - Meta: map[string]any{ + Meta: map[string]string{ "span.kind": "consumer", "component": "cloud.google.com/go/pubsub.v1", "messaging.system": "googlepubsub", diff --git a/_integration-tests/tests/gin/gin.go b/_integration-tests/tests/gin/gin.go index 7a8274f2..df9ead88 100644 --- a/_integration-tests/tests/gin/gin.go +++ b/_integration-tests/tests/gin/gin.go @@ -61,7 +61,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "resource": "GET /ping", "type": "http", }, - Meta: map[string]any{ + Meta: map[string]string{ "http.url": "http://" + tc.Server.Addr + "/ping", }, Children: trace.Spans{ @@ -71,7 +71,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "resource": "GET /ping", "type": "web", }, - Meta: map[string]any{ + Meta: map[string]string{ "http.url": "http://" + tc.Server.Addr + "/ping", }, }, diff --git a/_integration-tests/tests/go-redis.v7/go-redis.go b/_integration-tests/tests/go-redis.v7/go-redis.go index eb965873..e3e1b490 100644 --- a/_integration-tests/tests/go-redis.v7/go-redis.go +++ b/_integration-tests/tests/go-redis.v7/go-redis.go @@ -91,7 +91,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "resource": "set", "type": "redis", }, - Meta: map[string]any{ + Meta: map[string]string{ "redis.args_length": "3", "component": "go-redis/redis.v7", "out.db": "0", @@ -108,7 +108,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "resource": "get", "type": "redis", }, - Meta: map[string]any{ + Meta: map[string]string{ "redis.args_length": "2", "component": "go-redis/redis.v7", "out.db": "0", diff --git a/_integration-tests/tests/go-redis.v8/go-redis.go b/_integration-tests/tests/go-redis.v8/go-redis.go index dbed6606..950e89af 100644 --- a/_integration-tests/tests/go-redis.v8/go-redis.go +++ b/_integration-tests/tests/go-redis.v8/go-redis.go @@ -91,7 +91,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "resource": "set", "type": "redis", }, - Meta: map[string]any{ + Meta: map[string]string{ "redis.args_length": "3", "component": "go-redis/redis.v8", "out.db": "0", @@ -108,7 +108,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "resource": "get", "type": "redis", }, - Meta: map[string]any{ + Meta: map[string]string{ "redis.args_length": "2", "component": "go-redis/redis.v8", "out.db": "0", diff --git a/_integration-tests/tests/go-redis.v9/go-redis.go b/_integration-tests/tests/go-redis.v9/go-redis.go index 7df5ca5e..8a1f0226 100644 --- a/_integration-tests/tests/go-redis.v9/go-redis.go +++ b/_integration-tests/tests/go-redis.v9/go-redis.go @@ -92,7 +92,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "resource": "set", "type": "redis", }, - Meta: map[string]any{ + Meta: map[string]string{ "redis.args_length": "3", "component": "redis/go-redis.v9", "out.db": "0", @@ -109,7 +109,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "resource": "get", "type": "redis", }, - Meta: map[string]any{ + Meta: map[string]string{ "redis.args_length": "2", "component": "redis/go-redis.v9", "out.db": "0", diff --git a/_integration-tests/tests/gocql/base.go b/_integration-tests/tests/gocql/base.go index 64f545b0..5360a562 100644 --- a/_integration-tests/tests/gocql/base.go +++ b/_integration-tests/tests/gocql/base.go @@ -94,7 +94,7 @@ func (b *base) expectedSpans() trace.Spans { "resource": "CREATE KEYSPACE if not exists trace WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor': 1}", "type": "cassandra", }, - Meta: map[string]any{ + Meta: map[string]string{ "component": "gocql/gocql", "span.kind": "client", "db.system": "cassandra", @@ -110,7 +110,7 @@ func (b *base) expectedSpans() trace.Spans { "resource": "CREATE TABLE if not exists trace.person (name text PRIMARY KEY, age int, description text)", "type": "cassandra", }, - Meta: map[string]any{ + Meta: map[string]string{ "component": "gocql/gocql", "span.kind": "client", "db.system": "cassandra", @@ -126,7 +126,7 @@ func (b *base) expectedSpans() trace.Spans { "resource": "INSERT INTO trace.person (name, age, description) VALUES ('Cassandra', 100, 'A cruel mistress')", "type": "cassandra", }, - Meta: map[string]any{ + Meta: map[string]string{ "component": "gocql/gocql", "span.kind": "client", "db.system": "cassandra", diff --git a/_integration-tests/tests/gorm.jinzhu/gorm.go b/_integration-tests/tests/gorm.jinzhu/gorm.go index b6d67a77..21c90b0b 100644 --- a/_integration-tests/tests/gorm.jinzhu/gorm.go +++ b/_integration-tests/tests/gorm.jinzhu/gorm.go @@ -68,7 +68,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "name": "gorm.query", "service": "gorm.db", }, - Meta: map[string]any{ + Meta: map[string]string{ "component": "jinzhu/gorm", }, }, diff --git a/_integration-tests/tests/gorm/gorm.go b/_integration-tests/tests/gorm/gorm.go index 14dc969f..89ad600d 100644 --- a/_integration-tests/tests/gorm/gorm.go +++ b/_integration-tests/tests/gorm/gorm.go @@ -64,7 +64,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "name": "gorm.query", "service": "gorm.db", }, - Meta: map[string]any{ + Meta: map[string]string{ "component": "gorm.io/gorm.v1", }, }, diff --git a/_integration-tests/tests/ibm_sarama/ibm_sarama.go b/_integration-tests/tests/ibm_sarama/ibm_sarama.go index e120a3e9..55281e48 100644 --- a/_integration-tests/tests/ibm_sarama/ibm_sarama.go +++ b/_integration-tests/tests/ibm_sarama/ibm_sarama.go @@ -129,7 +129,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "type": "queue", "service": "kafka", }, - Meta: map[string]any{ + Meta: map[string]string{ "span.kind": "producer", "component": "IBM/sarama", }, @@ -140,7 +140,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "type": "queue", "service": "kafka", }, - Meta: map[string]any{ + Meta: map[string]string{ "span.kind": "consumer", "component": "IBM/sarama", }, diff --git a/_integration-tests/tests/k8s_client_go/base.go b/_integration-tests/tests/k8s_client_go/base.go index 00dcb8ca..3cd30340 100644 --- a/_integration-tests/tests/k8s_client_go/base.go +++ b/_integration-tests/tests/k8s_client_go/base.go @@ -59,7 +59,7 @@ func (b *base) expectedSpans() trace.Spans { "resource": "GET /api/v1/namespaces", "type": "web", }, - Meta: map[string]any{ + Meta: map[string]string{ "component": "net/http", "span.kind": "server", "http.useragent": rest.DefaultKubernetesUserAgent(), @@ -75,7 +75,7 @@ func (b *base) expectedSpans() trace.Spans { "resource": "GET /api/v1/namespaces", "type": "http", }, - Meta: map[string]any{ + Meta: map[string]string{ "component": "net/http", "span.kind": "client", "network.destination.name": "127.0.0.1", @@ -91,7 +91,7 @@ func (b *base) expectedSpans() trace.Spans { "resource": "GET namespaces", "type": "http", }, - Meta: map[string]any{ + Meta: map[string]string{ "component": "k8s.io/client-go/kubernetes", "span.kind": "client", }, diff --git a/_integration-tests/tests/mongo/mongo.go b/_integration-tests/tests/mongo/mongo.go index e6d8b3cb..4e42f399 100644 --- a/_integration-tests/tests/mongo/mongo.go +++ b/_integration-tests/tests/mongo/mongo.go @@ -96,7 +96,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "resource": "mongo.insert", "type": "mongodb", }, - Meta: map[string]any{ + Meta: map[string]string{ "component": "go.mongodb.org/mongo-driver/mongo", "span.kind": "client", "db.system": "mongodb", @@ -109,7 +109,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "resource": "mongo.find", "type": "mongodb", }, - Meta: map[string]any{ + Meta: map[string]string{ "component": "go.mongodb.org/mongo-driver/mongo", "span.kind": "client", "db.system": "mongodb", diff --git a/_integration-tests/tests/mux/mux.go b/_integration-tests/tests/mux/mux.go index 53f8c60f..161511e5 100644 --- a/_integration-tests/tests/mux/mux.go +++ b/_integration-tests/tests/mux/mux.go @@ -67,7 +67,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "resource": "GET /ping", "type": "http", }, - Meta: map[string]any{ + Meta: map[string]string{ "http.url": url, }, Children: trace.Spans{ @@ -77,7 +77,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "resource": "GET /ping", "type": "web", }, - Meta: map[string]any{ + Meta: map[string]string{ "http.url": url, }, }, diff --git a/_integration-tests/tests/net_http/net_http.go b/_integration-tests/tests/net_http/net_http.go index c9aba7f3..59e28938 100644 --- a/_integration-tests/tests/net_http/net_http.go +++ b/_integration-tests/tests/net_http/net_http.go @@ -60,7 +60,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "resource": "GET /", "type": "http", }, - Meta: map[string]any{ + Meta: map[string]string{ "component": "net/http", "span.kind": "client", }, @@ -71,7 +71,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "resource": "GET /", "type": "web", }, - Meta: map[string]any{ + Meta: map[string]string{ "component": "net/http", "span.kind": "server", }, @@ -82,7 +82,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "resource": "POST /hit", "type": "http", }, - Meta: map[string]any{ + Meta: map[string]string{ "http.url": fmt.Sprintf("http://%s/hit", tc.Server.Addr), "component": "net/http", "span.kind": "client", @@ -97,7 +97,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "resource": "POST /hit", "type": "web", }, - Meta: map[string]any{ + Meta: map[string]string{ "http.useragent": "Go-http-client/1.1", "http.status_code": "200", "http.host": tc.Server.Addr, diff --git a/_integration-tests/tests/os/lfi.go b/_integration-tests/tests/os/lfi.go index 32f3c039..b1a83ca4 100644 --- a/_integration-tests/tests/os/lfi.go +++ b/_integration-tests/tests/os/lfi.go @@ -73,7 +73,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "resource": "GET /", "type": "http", }, - Meta: map[string]any{ + Meta: map[string]string{ "component": "net/http", "span.kind": "client", }, @@ -84,7 +84,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "resource": "GET /", "type": "web", }, - Meta: map[string]any{ + Meta: map[string]string{ "component": "net/http", "span.kind": "server", "appsec.blocked": "true", diff --git a/_integration-tests/tests/redigo/redigo.go b/_integration-tests/tests/redigo/redigo.go index cb38d22e..15214741 100644 --- a/_integration-tests/tests/redigo/redigo.go +++ b/_integration-tests/tests/redigo/redigo.go @@ -110,7 +110,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "name": "redis.command", "service": "redis.conn", }, - Meta: map[string]any{ + Meta: map[string]string{ "redis.raw_command": "GET test_key", "db.system": "redis", "component": "gomodule/redigo", @@ -127,7 +127,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "name": "redis.command", "service": "redis.conn", }, - Meta: map[string]any{ + Meta: map[string]string{ "redis.raw_command": "", "db.system": "redis", "component": "gomodule/redigo", diff --git a/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go b/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go index 2bee9384..b388f497 100644 --- a/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go +++ b/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go @@ -7,6 +7,7 @@ package segmentio_kafka_v0 import ( "context" + "errors" "net" "strconv" "testing" @@ -83,16 +84,37 @@ func (tc *TestCase) produce(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() - err := tc.writer.WriteMessages(ctx, - kafka.Message{ + messages := []kafka.Message{ + { Key: []byte("Key-A"), Value: []byte("Hello World!"), }, - //kafka.Message{ - // Key: []byte("Key-A"), - // Value: []byte("Second message"), - //}, + { + Key: []byte("Key-A"), + Value: []byte("Second message"), + }, + } + const ( + maxRetries = 10 + retryDelay = 100 * time.Millisecond ) + var ( + retryCount int + err error + ) + for retryCount < maxRetries { + err = tc.writer.WriteMessages(ctx, messages...) + if err == nil { + break + } + // This error happens sometimes with brand-new topics, as there is a delay between when the topic is created + // on the broker, and when the topic can actually be written to. + if errors.Is(err, kafka.UnknownTopicOrPartition) { + retryCount++ + t.Logf("failed to produce kafka messages, will retry in %s (retryCount: %d)", retryDelay, retryCount) + time.Sleep(retryDelay) + } + } require.NoError(t, err) require.NoError(t, tc.writer.Close()) } @@ -106,15 +128,14 @@ func (tc *TestCase) consume(t *testing.T) { assert.Equal(t, "Hello World!", string(m.Value)) assert.Equal(t, "Key-A", string(m.Key)) - //m, err = tc.reader.FetchMessage(ctx) - //require.NoError(t, err) - //assert.Equal(t, "Second message", string(m.Value)) - //assert.Equal(t, "Key-A", string(m.Key)) - //err = tc.reader.CommitMessages(ctx, m) - //require.NoError(t, err) + m, err = tc.reader.FetchMessage(ctx) + require.NoError(t, err) + assert.Equal(t, "Second message", string(m.Value)) + assert.Equal(t, "Key-A", string(m.Key)) + err = tc.reader.CommitMessages(ctx, m) + require.NoError(t, err) require.NoError(t, tc.reader.Close()) - time.Sleep(10 * time.Second) } func (tc *TestCase) Teardown(t *testing.T) { @@ -132,7 +153,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "service": "kafka", "resource": "Produce Topic topic-A", }, - Meta: map[string]any{ + Meta: map[string]string{ "span.kind": "producer", "component": "segmentio/kafka.go.v0", }, @@ -144,7 +165,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "service": "kafka", "resource": "Consume Topic topic-A", }, - Meta: map[string]any{ + Meta: map[string]string{ "span.kind": "consumer", "component": "segmentio/kafka.go.v0", }, diff --git a/_integration-tests/tests/shopify_sarama/shopify_sarama.go b/_integration-tests/tests/shopify_sarama/shopify_sarama.go index cd72fc2e..3632a366 100644 --- a/_integration-tests/tests/shopify_sarama/shopify_sarama.go +++ b/_integration-tests/tests/shopify_sarama/shopify_sarama.go @@ -105,7 +105,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "type": "queue", "service": "kafka", }, - Meta: map[string]any{ + Meta: map[string]string{ "span.kind": "producer", "component": "Shopify/sarama", }, @@ -116,7 +116,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "type": "queue", "service": "kafka", }, - Meta: map[string]any{ + Meta: map[string]string{ "span.kind": "consumer", "component": "Shopify/sarama", }, diff --git a/_integration-tests/tests/sql/sql.go b/_integration-tests/tests/sql/sql.go index fd66362a..85161d74 100644 --- a/_integration-tests/tests/sql/sql.go +++ b/_integration-tests/tests/sql/sql.go @@ -67,7 +67,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "name": "sqlite3.query", "service": "sqlite3.db", }, - Meta: map[string]any{ + Meta: map[string]string{ "component": "database/sql", "span.kind": "client", "sql.query_type": "Exec", diff --git a/_integration-tests/tests/vault/vault.go b/_integration-tests/tests/vault/vault.go index 60a6502e..f2b9a9c9 100644 --- a/_integration-tests/tests/vault/vault.go +++ b/_integration-tests/tests/vault/vault.go @@ -84,7 +84,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "resource": "GET /v1/secret/key", "type": "http", }, - Meta: map[string]any{ + Meta: map[string]string{ "http.method": "GET", "http.url": "/v1/secret/key", "span.kind": "client", diff --git a/_integration-tests/utils/suite.go b/_integration-tests/utils/suite.go index c7b7ea41..27c5951d 100644 --- a/_integration-tests/utils/suite.go +++ b/_integration-tests/utils/suite.go @@ -81,11 +81,14 @@ func checkTrace(t *testing.T, tc TestCase, sess *agent.Session) { jsonTraces, err := sess.Close(t) require.NoError(t, err) - var traces trace.Spans - require.NoError(t, trace.ParseRaw(jsonTraces, &traces)) - t.Logf("Received %d traces", len(traces)) + var spans trace.Spans + require.NoError(t, trace.ParseRaw(jsonTraces, &spans)) + t.Logf("Received %d spans", len(spans)) + for i, span := range spans { + t.Logf("[%d]: %v", i, span) + } for _, expected := range tc.ExpectedTraces() { - expected.RequireAnyMatch(t, traces) + expected.RequireAnyMatch(t, spans) } } diff --git a/_integration-tests/validator/trace/diff.go b/_integration-tests/validator/trace/diff.go index de4776c3..ca24ce0f 100644 --- a/_integration-tests/validator/trace/diff.go +++ b/_integration-tests/validator/trace/diff.go @@ -90,14 +90,18 @@ func (span *Span) matches(other *Span, diff treeprint.Tree) (matches bool) { var metaNode treeprint.Tree for _, key := range keys { expected := span.Meta[key] - actual := other.Meta[key] + actual, actualExists := other.Meta[key] if metaNode == nil { metaNode = diff.AddBranch("meta") } if expected != actual { branch := metaNode.AddMetaBranch(markerChanged, key) branch.AddMetaNode(markerRemoved, expected) - branch.AddMetaNode(markerAdded, actual) + if actualExists { + branch.AddMetaNode(markerAdded, actual) + } else { + branch.AddMetaNode(markerAdded, nil) + } matches = false } else { metaNode.AddMetaNode(markerEqual, fmt.Sprintf("%-*s = %q", maxLen, key, expected)) diff --git a/_integration-tests/validator/trace/raw.go b/_integration-tests/validator/trace/raw.go index 6e93d513..88070eea 100644 --- a/_integration-tests/validator/trace/raw.go +++ b/_integration-tests/validator/trace/raw.go @@ -88,6 +88,8 @@ func (span *RawSpan) UnmarshalJSON(data []byte) error { err = json.Unmarshal(value, &span.Children) case "meta": err = json.Unmarshal(value, &span.Meta) + case "metrics": + err = json.Unmarshal(value, &span.Metrics) default: var val any dec := json.NewDecoder(bytes.NewReader(value)) diff --git a/_integration-tests/validator/trace/span.go b/_integration-tests/validator/trace/span.go index c66bb5d8..6a22a11c 100644 --- a/_integration-tests/validator/trace/span.go +++ b/_integration-tests/validator/trace/span.go @@ -9,6 +9,7 @@ import ( "encoding/json" "fmt" "sort" + "strconv" "github.com/xlab/treeprint" ) @@ -19,7 +20,8 @@ type SpanID uint64 // via the Children property. type Span struct { ID SpanID `json:"span_id"` - Meta map[string]any + Meta map[string]string + Metrics map[string]float64 Tags map[string]any Children []*Span } @@ -45,6 +47,8 @@ func (span *Span) UnmarshalJSON(data []byte) error { err = json.Unmarshal(value, &span.Children) case "meta": err = json.Unmarshal(value, &span.Meta) + case "metrics": + err = json.Unmarshal(value, &span.Metrics) case "span_id": err = json.Unmarshal(value, &span.ID) if err == nil { @@ -83,25 +87,39 @@ func (span *Span) into(tree treeprint.Tree) { tree.AddNode(fmt.Sprintf("%-*s = %q", maxLen, tag, span.Tags[tag])) } - if len(span.Meta) > 0 { - keys = make([]string, 0, len(span.Meta)) + addMapBranch(tree, span.Meta, "meta") + addMapBranch(tree, span.Metrics, "metrics") + + if len(span.Children) > 0 { + children := tree.AddBranch("_children") + for i, child := range span.Children { + child.into(children.AddBranch(fmt.Sprintf("#%d", i))) + } + } +} + +func addMapBranch[T string | float64](tree treeprint.Tree, m map[string]T, name string) { + if len(m) > 0 { + keys := make([]string, 0, len(m)) maxLen := 1 - for key := range span.Meta { + for key := range m { keys = append(keys, key) - if len := len(key); len > maxLen { - maxLen = len + if l := len(key); l > maxLen { + maxLen = l } } sort.Strings(keys) - meta := tree.AddBranch("meta") + br := tree.AddBranch(name) for _, key := range keys { - meta.AddNode(fmt.Sprintf("%-*s = %q", maxLen, key, span.Meta[key])) - } - } - if len(span.Children) > 0 { - children := tree.AddBranch("_children") - for i, child := range span.Children { - child.into(children.AddBranch(fmt.Sprintf("#%d", i))) + val := m[key] + printVal := "" + switch v := any(val).(type) { + case string: + printVal = fmt.Sprintf("%q", v) + case float64: + printVal = strconv.FormatFloat(v, 'f', -1, 64) + } + br.AddNode(fmt.Sprintf("%-*s = %s", maxLen, key, printVal)) } } } diff --git a/_integration-tests/validator/trace/testdata/matching/expected.json b/_integration-tests/validator/trace/testdata/matching/expected.json index 96a2072f..c312cff6 100644 --- a/_integration-tests/validator/trace/testdata/matching/expected.json +++ b/_integration-tests/validator/trace/testdata/matching/expected.json @@ -21,6 +21,14 @@ "meta": { "component": "database/sql", "span.kind": "client" + }, + "metrics": { + "_dd.agent_psr": 1.0, + "_dd.profiling.enabled": 0.0, + "_dd.top_level": 1.0, + "_dd.trace_span_attribute_schema": 0.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 } } ] From cd797bc412d8f77ccf2422d7eb802fb938d81939 Mon Sep 17 00:00:00 2001 From: Rodrigo Arguello Date: Wed, 25 Sep 2024 15:56:44 +0200 Subject: [PATCH 05/18] do not trace ReadMessage --- internal/injector/builtin/generated.go | 26 ++---------- .../yaml/datastreams/segmentio_kafka_v0.yml | 41 +------------------ 2 files changed, 5 insertions(+), 62 deletions(-) diff --git a/internal/injector/builtin/generated.go b/internal/injector/builtin/generated.go index 1a03c2e9..1f91c6c4 100644 --- a/internal/injector/builtin/generated.go +++ b/internal/injector/builtin/generated.go @@ -314,21 +314,6 @@ var Aspects = [...]aspect.Aspect{ advice.AddStructField("__dd_prev", join.MustTypeName("__dd_Span")), }, }, - { - JoinPoint: join.FunctionBody(join.Function( - join.Receiver(join.MustTypeName("*github.com/segmentio/kafka-go.Reader")), - join.Name("ReadMessage"), - )), - Advice: []advice.Advice{ - advice.PrependStmts(code.MustTemplate( - "{{- $r := .Function.Receiver -}}\n{{- $ctx := .Function.Argument 0 -}}\n{{- $msg := .Function.Result 0 -}}\n{{- $err := .Function.Result 1 -}}\n__dd_initReader(r)\n\nif {{ $r }}.__dd_prev != nil {\nfmt.Println(\"ReadMessage: Closing previous span\")\n {{ $r }}.__dd_prev.Finish()\n {{ $r }}.__dd_prev = nil\n}\n\ndefer func() {\n if {{ $err }} != nil {\n return\n }\n fmt.Println(\"ReadMessage: tracing.StartConsumeSpan\")\n tMsg := __dd_tracingMessage(&{{ $msg }})\n {{ $r }}.__dd_prev = tracing.StartConsumeSpan({{ $ctx }}, {{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, tMsg)\n tracing.SetConsumeDSMCheckpoint({{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, tMsg)\n}()", - map[string]string{ - "fmt": "fmt", - "tracing": "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing", - }, - )), - }, - }, { JoinPoint: join.FunctionBody(join.Function( join.Receiver(join.MustTypeName("*github.com/segmentio/kafka-go.Reader")), @@ -336,9 +321,8 @@ var Aspects = [...]aspect.Aspect{ )), Advice: []advice.Advice{ advice.PrependStmts(code.MustTemplate( - "{{- $r := .Function.Receiver -}}\n{{- $ctx := .Function.Argument 0 -}}\n{{- $msg := .Function.Result 0 -}}\n{{- $err := .Function.Result 1 -}}\n__dd_initReader(r)\n\nif {{ $r }}.__dd_prev != nil {\n fmt.Println(\"FetchMessage: Closing previous span\")\n {{ $r }}.__dd_prev.Finish()\n {{ $r }}.__dd_prev = nil\n}\n\ndefer func() {\n if {{ $err }} != nil {\n return\n }\n {{ $r }}.__dd_prev = tracing.StartConsumeSpan({{ $ctx }}, {{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, __dd_tracingMessage(&{{ $msg }}))\n tracing.SetConsumeDSMCheckpoint({{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, __dd_tracingMessage(&{{ $msg }}))\n}()", + "{{- $r := .Function.Receiver -}}\n{{- $ctx := .Function.Argument 0 -}}\n{{- $msg := .Function.Result 0 -}}\n{{- $err := .Function.Result 1 -}}\n__dd_initReader(r)\n\nif {{ $r }}.__dd_prev != nil {\n {{ $r }}.__dd_prev.Finish()\n {{ $r }}.__dd_prev = nil\n}\n\ndefer func() {\n if {{ $err }} != nil {\n return\n }\n {{ $r }}.__dd_prev = tracing.StartConsumeSpan({{ $ctx }}, {{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, __dd_tracingMessage(&{{ $msg }}))\n tracing.SetConsumeDSMCheckpoint({{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, __dd_tracingMessage(&{{ $msg }}))\n}()", map[string]string{ - "fmt": "fmt", "tracing": "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing", }, )), @@ -351,10 +335,8 @@ var Aspects = [...]aspect.Aspect{ )), Advice: []advice.Advice{ advice.PrependStmts(code.MustTemplate( - "{{- $r := .Function.Receiver -}}\nif {{ $r }}.__dd_prev != nil {\n fmt.Println(\"Close: Closing previous span\")\n {{ $r }}.__dd_prev.Finish()\n {{ $r }}.__dd_prev = nil\n}", - map[string]string{ - "fmt": "fmt", - }, + "{{- $r := .Function.Receiver -}}\nif {{ $r }}.__dd_prev != nil {\n {{ $r }}.__dd_prev.Finish()\n {{ $r }}.__dd_prev = nil\n}", + map[string]string{}, )), }, }, @@ -976,4 +958,4 @@ var InjectedPaths = [...]string{ } // Checksum is a checksum of the built-in configuration which can be used to invalidate caches. -const Checksum = "sha512:uBQEyyjzZZlDBdnvVKHkgaE1WZVQg+sYGAnqwaAUWyDRIN23EmXtKXwS0tAocZgasbKm1CdKJj2ycTfMoiqfmw==" +const Checksum = "sha512:4Hu53xQ6PKVLJ8IvhlKZAlf6D8Foh5KNI/NZyv0p3wr027JdXfVmABDn68V1eSiZCsGoQHCPrJldOveh4MJWaw==" diff --git a/internal/injector/builtin/yaml/datastreams/segmentio_kafka_v0.yml b/internal/injector/builtin/yaml/datastreams/segmentio_kafka_v0.yml index 95e92b11..b044ed62 100644 --- a/internal/injector/builtin/yaml/datastreams/segmentio_kafka_v0.yml +++ b/internal/injector/builtin/yaml/datastreams/segmentio_kafka_v0.yml @@ -94,51 +94,16 @@ aspects: name: __dd_prev type: "__dd_Span" - - id: Modify kafka.Reader.ReadMessage to call tracing functions - join-point: - function-body: - function: - - receiver: '*github.com/segmentio/kafka-go.Reader' - - name: ReadMessage - advice: - - prepend-statements: - imports: - tracing: gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing - fmt: fmt - template: |- - {{- $r := .Function.Receiver -}} - {{- $ctx := .Function.Argument 0 -}} - {{- $msg := .Function.Result 0 -}} - {{- $err := .Function.Result 1 -}} - __dd_initReader(r) - - if {{ $r }}.__dd_prev != nil { - fmt.Println("ReadMessage: Closing previous span") - {{ $r }}.__dd_prev.Finish() - {{ $r }}.__dd_prev = nil - } - - defer func() { - if {{ $err }} != nil { - return - } - fmt.Println("ReadMessage: tracing.StartConsumeSpan") - tMsg := __dd_tracingMessage(&{{ $msg }}) - {{ $r }}.__dd_prev = tracing.StartConsumeSpan({{ $ctx }}, {{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, tMsg) - tracing.SetConsumeDSMCheckpoint({{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, tMsg) - }() - - id: Modify kafka.Reader.FetchMessage to call tracing functions join-point: function-body: function: - receiver: '*github.com/segmentio/kafka-go.Reader' - - name: FetchMessage + - name: FetchMessage # ReadMessage calls FetchMessage internally, so tracing this should be enough. advice: - prepend-statements: imports: tracing: gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing - fmt: fmt template: |- {{- $r := .Function.Receiver -}} {{- $ctx := .Function.Argument 0 -}} @@ -147,7 +112,6 @@ aspects: __dd_initReader(r) if {{ $r }}.__dd_prev != nil { - fmt.Println("FetchMessage: Closing previous span") {{ $r }}.__dd_prev.Finish() {{ $r }}.__dd_prev = nil } @@ -168,12 +132,9 @@ aspects: - name: Close advice: - prepend-statements: - imports: - fmt: fmt template: |- {{- $r := .Function.Receiver -}} if {{ $r }}.__dd_prev != nil { - fmt.Println("Close: Closing previous span") {{ $r }}.__dd_prev.Finish() {{ $r }}.__dd_prev = nil } From 4d9cd6340385865597711ac4df6cfc11f31421d7 Mon Sep 17 00:00:00 2001 From: Rodrigo Arguello Date: Wed, 25 Sep 2024 16:56:50 +0200 Subject: [PATCH 06/18] rename trace.Span to trace.Trace --- .github/workflows/workflow_call.yml | 2 +- _integration-tests/tests/aws.v1/aws.go | 4 +- _integration-tests/tests/aws.v2/base.go | 6 +- .../tests/aws.v2/load_default_config.go | 4 +- _integration-tests/tests/aws.v2/new_config.go | 4 +- .../tests/aws.v2/struct_literal.go | 4 +- .../tests/aws.v2/struct_literal_ptr.go | 4 +- _integration-tests/tests/chi.v5/chi.go | 6 +- _integration-tests/tests/dd-span/no-tag.go | 8 +-- _integration-tests/tests/dd-span/tag.go | 8 +-- _integration-tests/tests/echo.v4/echo.go | 6 +- _integration-tests/tests/fiber.v2/fiber.go | 6 +- .../tests/gcp_pubsub/gcp_pubsub.go | 6 +- _integration-tests/tests/gin/gin.go | 6 +- .../tests/go-redis.v7/go-redis.go | 6 +- .../tests/go-redis.v8/go-redis.go | 6 +- .../tests/go-redis.v9/go-redis.go | 6 +- _integration-tests/tests/gocql/base.go | 6 +- _integration-tests/tests/gocql/new_cluster.go | 4 +- .../tests/gocql/struct_literal.go | 4 +- .../tests/gocql/struct_literal_ptr.go | 4 +- _integration-tests/tests/gorm.jinzhu/gorm.go | 6 +- _integration-tests/tests/gorm/gorm.go | 6 +- _integration-tests/tests/grpc/grpc.go | 6 +- .../tests/ibm_sarama/ibm_sarama.go | 6 +- .../tests/k8s_client_go/base.go | 14 ++--- .../tests/k8s_client_go/new_cfg_func.go | 4 +- .../struct_literal_with_param.go | 4 +- .../struct_literal_without_param.go | 4 +- _integration-tests/tests/mongo/mongo.go | 6 +- _integration-tests/tests/mux/mux.go | 6 +- _integration-tests/tests/net_http/net_http.go | 10 ++-- _integration-tests/tests/os/lfi.go | 6 +- _integration-tests/tests/redigo/redigo.go | 6 +- .../segmentio_kafka.v0/segmentio_kafka.go | 7 ++- .../tests/shopify_sarama/shopify_sarama.go | 6 +- _integration-tests/tests/slog/slog.go | 2 +- _integration-tests/tests/sql/sql.go | 4 +- _integration-tests/tests/vault/vault.go | 6 +- _integration-tests/utils/suite.go | 23 ++++---- _integration-tests/validator/trace/diff.go | 32 +++++----- _integration-tests/validator/trace/raw.go | 12 ++-- _integration-tests/validator/trace/span.go | 58 +++++++++++-------- .../validator/trace/span_test.go | 4 +- 44 files changed, 179 insertions(+), 169 deletions(-) diff --git a/.github/workflows/workflow_call.yml b/.github/workflows/workflow_call.yml index 1a155b6f..601be6eb 100644 --- a/.github/workflows/workflow_call.yml +++ b/.github/workflows/workflow_call.yml @@ -68,4 +68,4 @@ jobs: cd orchestrion/_integration-tests ./orchestrion.exe go mod edit -replace=gopkg.in/DataDog/dd-trace-go.v1=../../dd-trace-go ./orchestrion.exe go mod tidy - ./orchestrion.exe go test -v -tags=integration,buildtag -shuffle=on ./... + ./orchestrion.exe go test -tags=integration,buildtag -shuffle=on ./... diff --git a/_integration-tests/tests/aws.v1/aws.go b/_integration-tests/tests/aws.v1/aws.go index a866c984..ab726814 100644 --- a/_integration-tests/tests/aws.v1/aws.go +++ b/_integration-tests/tests/aws.v1/aws.go @@ -52,8 +52,8 @@ func (tc *TestCase) Teardown(t *testing.T) { require.NoError(t, tc.server.Terminate(ctx)) } -func (*TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { Tags: map[string]any{ "name": "dynamodb.command", diff --git a/_integration-tests/tests/aws.v2/base.go b/_integration-tests/tests/aws.v2/base.go index fe64f781..b17b3b59 100644 --- a/_integration-tests/tests/aws.v2/base.go +++ b/_integration-tests/tests/aws.v2/base.go @@ -47,8 +47,8 @@ func (b *base) run(t *testing.T) { require.NoError(t, err) } -func (b *base) expectedSpans() trace.Spans { - return trace.Spans{ +func (b *base) expectedTraces() trace.Traces { + return trace.Traces{ { Tags: map[string]any{ "name": "DynamoDB.request", @@ -64,7 +64,7 @@ func (b *base) expectedSpans() trace.Spans { "component": "aws/aws-sdk-go-v2/aws", "span.kind": "client", }, - Children: []*trace.Span{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "http.request", diff --git a/_integration-tests/tests/aws.v2/load_default_config.go b/_integration-tests/tests/aws.v2/load_default_config.go index 6599ee92..a0add0b2 100644 --- a/_integration-tests/tests/aws.v2/load_default_config.go +++ b/_integration-tests/tests/aws.v2/load_default_config.go @@ -44,6 +44,6 @@ func (tc *TestCaseLoadDefaultConfig) Teardown(t *testing.T) { tc.base.teardown(t) } -func (tc *TestCaseLoadDefaultConfig) ExpectedTraces() trace.Spans { - return tc.base.expectedSpans() +func (tc *TestCaseLoadDefaultConfig) ExpectedTraces() trace.Traces { + return tc.base.expectedTraces() } diff --git a/_integration-tests/tests/aws.v2/new_config.go b/_integration-tests/tests/aws.v2/new_config.go index 7928ce6b..f4e8ad23 100644 --- a/_integration-tests/tests/aws.v2/new_config.go +++ b/_integration-tests/tests/aws.v2/new_config.go @@ -39,6 +39,6 @@ func (tc *TestCaseNewConfig) Teardown(t *testing.T) { tc.base.teardown(t) } -func (tc *TestCaseNewConfig) ExpectedTraces() trace.Spans { - return tc.base.expectedSpans() +func (tc *TestCaseNewConfig) ExpectedTraces() trace.Traces { + return tc.base.expectedTraces() } diff --git a/_integration-tests/tests/aws.v2/struct_literal.go b/_integration-tests/tests/aws.v2/struct_literal.go index dcb5fb5a..b9190e30 100644 --- a/_integration-tests/tests/aws.v2/struct_literal.go +++ b/_integration-tests/tests/aws.v2/struct_literal.go @@ -39,6 +39,6 @@ func (tc *TestCaseStructLiteral) Teardown(t *testing.T) { tc.base.teardown(t) } -func (tc *TestCaseStructLiteral) ExpectedTraces() trace.Spans { - return tc.base.expectedSpans() +func (tc *TestCaseStructLiteral) ExpectedTraces() trace.Traces { + return tc.base.expectedTraces() } diff --git a/_integration-tests/tests/aws.v2/struct_literal_ptr.go b/_integration-tests/tests/aws.v2/struct_literal_ptr.go index 0cdeac55..06bdcc13 100644 --- a/_integration-tests/tests/aws.v2/struct_literal_ptr.go +++ b/_integration-tests/tests/aws.v2/struct_literal_ptr.go @@ -40,6 +40,6 @@ func (tc *TestCaseStructLiteralPtr) Teardown(t *testing.T) { tc.base.teardown(t) } -func (tc *TestCaseStructLiteralPtr) ExpectedTraces() trace.Spans { - return tc.base.expectedSpans() +func (tc *TestCaseStructLiteralPtr) ExpectedTraces() trace.Traces { + return tc.base.expectedTraces() } diff --git a/_integration-tests/tests/chi.v5/chi.go b/_integration-tests/tests/chi.v5/chi.go index 267a2b0f..079259da 100644 --- a/_integration-tests/tests/chi.v5/chi.go +++ b/_integration-tests/tests/chi.v5/chi.go @@ -55,8 +55,8 @@ func (tc *TestCase) Teardown(t *testing.T) { require.NoError(t, tc.Server.Shutdown(ctx)) } -func (tc *TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (tc *TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { // NB: Top-level span is from the HTTP Client, which is library-side instrumented. Tags: map[string]any{ @@ -67,7 +67,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { Meta: map[string]string{ "http.url": fmt.Sprintf("http://%s/", tc.Server.Addr), }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "http.request", diff --git a/_integration-tests/tests/dd-span/no-tag.go b/_integration-tests/tests/dd-span/no-tag.go index c793dad4..104e94a6 100644 --- a/_integration-tests/tests/dd-span/no-tag.go +++ b/_integration-tests/tests/dd-span/no-tag.go @@ -11,13 +11,13 @@ import ( "orchestrion/integration/validator/trace" ) -func (*TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { Tags: map[string]any{ "name": "test.root", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "spanFromHTTPRequest", @@ -26,7 +26,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "function-name": "spanFromHTTPRequest", "foo": "bar", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "tagSpecificSpan", diff --git a/_integration-tests/tests/dd-span/tag.go b/_integration-tests/tests/dd-span/tag.go index be2e7010..43bbed86 100644 --- a/_integration-tests/tests/dd-span/tag.go +++ b/_integration-tests/tests/dd-span/tag.go @@ -12,13 +12,13 @@ import ( "orchestrion/integration/validator/trace" ) -func (tc *TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (tc *TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { Tags: map[string]any{ "name": "test.root", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "spanFromHTTPRequest", @@ -27,7 +27,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "function-name": "spanFromHTTPRequest", "foo": "bar", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "functionWithBuildTag", diff --git a/_integration-tests/tests/echo.v4/echo.go b/_integration-tests/tests/echo.v4/echo.go index 5471fc0c..405c934f 100644 --- a/_integration-tests/tests/echo.v4/echo.go +++ b/_integration-tests/tests/echo.v4/echo.go @@ -52,8 +52,8 @@ func (tc *TestCase) Teardown(t *testing.T) { require.NoError(t, tc.Echo.Shutdown(ctx)) } -func (tc *TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (tc *TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { // NB: Top-level span is from the HTTP Client, which is library-side instrumented. Tags: map[string]any{ @@ -61,7 +61,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "resource": "GET /ping", "type": "http", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "http.request", diff --git a/_integration-tests/tests/fiber.v2/fiber.go b/_integration-tests/tests/fiber.v2/fiber.go index decc8994..14259a20 100644 --- a/_integration-tests/tests/fiber.v2/fiber.go +++ b/_integration-tests/tests/fiber.v2/fiber.go @@ -43,8 +43,8 @@ func (tc *TestCase) Teardown(t *testing.T) { require.NoError(t, tc.App.ShutdownWithTimeout(time.Second)) } -func (tc *TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (tc *TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { // NB: Top-level span is from the HTTP Client, which is library-side instrumented. Tags: map[string]any{ @@ -55,7 +55,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { Meta: map[string]string{ "http.url": "http://" + tc.addr + "/ping", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "http.request", diff --git a/_integration-tests/tests/gcp_pubsub/gcp_pubsub.go b/_integration-tests/tests/gcp_pubsub/gcp_pubsub.go index 7a933f4f..b7041173 100644 --- a/_integration-tests/tests/gcp_pubsub/gcp_pubsub.go +++ b/_integration-tests/tests/gcp_pubsub/gcp_pubsub.go @@ -118,8 +118,8 @@ func (tc *TestCase) Teardown(t *testing.T) { require.NoError(t, tc.container.Terminate(ctx)) } -func (tc *TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (tc *TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { Tags: map[string]any{ "name": "pubsub.publish", @@ -132,7 +132,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "component": "cloud.google.com/go/pubsub.v1", "ordering_key": "ordering-key", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "pubsub.receive", diff --git a/_integration-tests/tests/gin/gin.go b/_integration-tests/tests/gin/gin.go index df9ead88..5203f0fb 100644 --- a/_integration-tests/tests/gin/gin.go +++ b/_integration-tests/tests/gin/gin.go @@ -52,8 +52,8 @@ func (tc *TestCase) Teardown(t *testing.T) { require.NoError(t, tc.Server.Shutdown(ctx)) } -func (tc *TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (tc *TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { // NB: Top-level span is from the HTTP Client, which is library-side instrumented. Tags: map[string]any{ @@ -64,7 +64,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { Meta: map[string]string{ "http.url": "http://" + tc.Server.Addr + "/ping", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "http.request", diff --git a/_integration-tests/tests/go-redis.v7/go-redis.go b/_integration-tests/tests/go-redis.v7/go-redis.go index e3e1b490..fbdb528f 100644 --- a/_integration-tests/tests/go-redis.v7/go-redis.go +++ b/_integration-tests/tests/go-redis.v7/go-redis.go @@ -77,13 +77,13 @@ func (tc *TestCase) Teardown(t *testing.T) { assert.NoError(t, tc.server.Terminate(ctx)) } -func (*TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { Tags: map[string]any{ "name": "test.root", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "redis.command", diff --git a/_integration-tests/tests/go-redis.v8/go-redis.go b/_integration-tests/tests/go-redis.v8/go-redis.go index 950e89af..16ae3126 100644 --- a/_integration-tests/tests/go-redis.v8/go-redis.go +++ b/_integration-tests/tests/go-redis.v8/go-redis.go @@ -77,13 +77,13 @@ func (tc *TestCase) Teardown(t *testing.T) { assert.NoError(t, tc.server.Terminate(ctx)) } -func (*TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { Tags: map[string]any{ "name": "test.root", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "redis.command", diff --git a/_integration-tests/tests/go-redis.v9/go-redis.go b/_integration-tests/tests/go-redis.v9/go-redis.go index 8a1f0226..9acc2341 100644 --- a/_integration-tests/tests/go-redis.v9/go-redis.go +++ b/_integration-tests/tests/go-redis.v9/go-redis.go @@ -78,13 +78,13 @@ func (tc *TestCase) Teardown(t *testing.T) { assert.NoError(t, tc.server.Terminate(ctx)) } -func (*TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { Tags: map[string]any{ "name": "test.root", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "redis.command", diff --git a/_integration-tests/tests/gocql/base.go b/_integration-tests/tests/gocql/base.go index 5360a562..09f3a396 100644 --- a/_integration-tests/tests/gocql/base.go +++ b/_integration-tests/tests/gocql/base.go @@ -80,13 +80,13 @@ func (b *base) run(t *testing.T) { require.NoError(t, err) } -func (b *base) expectedSpans() trace.Spans { - return trace.Spans{ +func (b *base) expectedTraces() trace.Traces { + return trace.Traces{ { Tags: map[string]any{ "name": "test.root", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "cassandra.query", diff --git a/_integration-tests/tests/gocql/new_cluster.go b/_integration-tests/tests/gocql/new_cluster.go index 65788b40..17daa55f 100644 --- a/_integration-tests/tests/gocql/new_cluster.go +++ b/_integration-tests/tests/gocql/new_cluster.go @@ -37,6 +37,6 @@ func (tc *TestCaseNewCluster) Teardown(t *testing.T) { tc.base.teardown(t) } -func (tc *TestCaseNewCluster) ExpectedTraces() trace.Spans { - return tc.base.expectedSpans() +func (tc *TestCaseNewCluster) ExpectedTraces() trace.Traces { + return tc.base.expectedTraces() } diff --git a/_integration-tests/tests/gocql/struct_literal.go b/_integration-tests/tests/gocql/struct_literal.go index 39906741..9185e2a3 100644 --- a/_integration-tests/tests/gocql/struct_literal.go +++ b/_integration-tests/tests/gocql/struct_literal.go @@ -54,6 +54,6 @@ func (tc *TestCaseStructLiteral) Teardown(t *testing.T) { tc.base.teardown(t) } -func (tc *TestCaseStructLiteral) ExpectedTraces() trace.Spans { - return tc.base.expectedSpans() +func (tc *TestCaseStructLiteral) ExpectedTraces() trace.Traces { + return tc.base.expectedTraces() } diff --git a/_integration-tests/tests/gocql/struct_literal_ptr.go b/_integration-tests/tests/gocql/struct_literal_ptr.go index 56012601..8219d6fd 100644 --- a/_integration-tests/tests/gocql/struct_literal_ptr.go +++ b/_integration-tests/tests/gocql/struct_literal_ptr.go @@ -54,6 +54,6 @@ func (tc *TestCaseStructLiteralPtr) Teardown(t *testing.T) { tc.base.teardown(t) } -func (tc *TestCaseStructLiteralPtr) ExpectedTraces() trace.Spans { - return tc.base.expectedSpans() +func (tc *TestCaseStructLiteralPtr) ExpectedTraces() trace.Traces { + return tc.base.expectedTraces() } diff --git a/_integration-tests/tests/gorm.jinzhu/gorm.go b/_integration-tests/tests/gorm.jinzhu/gorm.go index 21c90b0b..fca9cecc 100644 --- a/_integration-tests/tests/gorm.jinzhu/gorm.go +++ b/_integration-tests/tests/gorm.jinzhu/gorm.go @@ -54,13 +54,13 @@ func (tc *TestCase) Teardown(t *testing.T) { assert.NoError(t, tc.DB.Close()) } -func (*TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { Tags: map[string]any{ "name": "test.root", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "resource": "SELECT * FROM \"notes\" WHERE \"notes\".\"deleted_at\" IS NULL AND ((user_id = ?)) ORDER BY \"notes\".\"id\" ASC LIMIT 1", diff --git a/_integration-tests/tests/gorm/gorm.go b/_integration-tests/tests/gorm/gorm.go index 89ad600d..d18a4efb 100644 --- a/_integration-tests/tests/gorm/gorm.go +++ b/_integration-tests/tests/gorm/gorm.go @@ -50,13 +50,13 @@ func (tc *TestCase) Run(t *testing.T) { func (*TestCase) Teardown(*testing.T) {} -func (*TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { Tags: map[string]any{ "name": "test.root", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "resource": "SELECT * FROM `notes` WHERE user_id = ? AND `notes`.`deleted_at` IS NULL ORDER BY `notes`.`id` LIMIT 1", diff --git a/_integration-tests/tests/grpc/grpc.go b/_integration-tests/tests/grpc/grpc.go index ba49b167..ae41b7af 100644 --- a/_integration-tests/tests/grpc/grpc.go +++ b/_integration-tests/tests/grpc/grpc.go @@ -55,8 +55,8 @@ func (tc *TestCase) Teardown(*testing.T) { tc.Server.GracefulStop() } -func (*TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { Tags: map[string]any{ "name": "grpc.client", @@ -64,7 +64,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "resource": "/helloworld.Greeter/SayHello", "type": "rpc", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "grpc.server", diff --git a/_integration-tests/tests/ibm_sarama/ibm_sarama.go b/_integration-tests/tests/ibm_sarama/ibm_sarama.go index 55281e48..03f4a36e 100644 --- a/_integration-tests/tests/ibm_sarama/ibm_sarama.go +++ b/_integration-tests/tests/ibm_sarama/ibm_sarama.go @@ -121,8 +121,8 @@ func (tc *TestCase) Teardown(t *testing.T) { require.NoError(t, tc.server.Terminate(ctx)) } -func (*TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { Tags: map[string]any{ "name": "kafka.produce", @@ -133,7 +133,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "span.kind": "producer", "component": "IBM/sarama", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "kafka.consume", diff --git a/_integration-tests/tests/k8s_client_go/base.go b/_integration-tests/tests/k8s_client_go/base.go index 3cd30340..5dc12f3a 100644 --- a/_integration-tests/tests/k8s_client_go/base.go +++ b/_integration-tests/tests/k8s_client_go/base.go @@ -52,8 +52,8 @@ func (b *base) run(t *testing.T) { require.EqualError(t, err, "serializer for text/plain; charset=utf-8 doesn't exist") } -func (b *base) expectedSpans() trace.Spans { - httpServerSpan := &trace.Span{ +func (b *base) expectedTraces() trace.Traces { + httpServerSpan := &trace.Trace{ Tags: map[string]any{ "name": "http.request", "resource": "GET /api/v1/namespaces", @@ -69,7 +69,7 @@ func (b *base) expectedSpans() trace.Spans { "http.method": "GET", }, } - httpClientSpan := &trace.Span{ + httpClientSpan := &trace.Trace{ Tags: map[string]any{ "name": "http.request", "resource": "GET /api/v1/namespaces", @@ -83,9 +83,9 @@ func (b *base) expectedSpans() trace.Spans { "http.method": "GET", "http.url": fmt.Sprintf("%s/api/v1/namespaces", b.server.URL), }, - Children: trace.Spans{httpServerSpan}, + Children: trace.Traces{httpServerSpan}, } - k8sClientSpan := &trace.Span{ + k8sClientSpan := &trace.Trace{ Tags: map[string]any{ "name": "http.request", "resource": "GET namespaces", @@ -95,7 +95,7 @@ func (b *base) expectedSpans() trace.Spans { "component": "k8s.io/client-go/kubernetes", "span.kind": "client", }, - Children: trace.Spans{httpClientSpan}, + Children: trace.Traces{httpClientSpan}, } - return trace.Spans{k8sClientSpan} + return trace.Traces{k8sClientSpan} } diff --git a/_integration-tests/tests/k8s_client_go/new_cfg_func.go b/_integration-tests/tests/k8s_client_go/new_cfg_func.go index d3925857..e3e1690c 100644 --- a/_integration-tests/tests/k8s_client_go/new_cfg_func.go +++ b/_integration-tests/tests/k8s_client_go/new_cfg_func.go @@ -44,6 +44,6 @@ func (tc *TestCaseNewCfgFunc) Teardown(t *testing.T) { tc.base.teardown(t) } -func (tc *TestCaseNewCfgFunc) ExpectedTraces() trace.Spans { - return tc.base.expectedSpans() +func (tc *TestCaseNewCfgFunc) ExpectedTraces() trace.Traces { + return tc.base.expectedTraces() } diff --git a/_integration-tests/tests/k8s_client_go/struct_literal_with_param.go b/_integration-tests/tests/k8s_client_go/struct_literal_with_param.go index 897d8c00..d66d5038 100644 --- a/_integration-tests/tests/k8s_client_go/struct_literal_with_param.go +++ b/_integration-tests/tests/k8s_client_go/struct_literal_with_param.go @@ -49,6 +49,6 @@ func (tc *TestCaseStructLiteralWithParam) Teardown(t *testing.T) { tc.base.teardown(t) } -func (tc *TestCaseStructLiteralWithParam) ExpectedTraces() trace.Spans { - return tc.base.expectedSpans() +func (tc *TestCaseStructLiteralWithParam) ExpectedTraces() trace.Traces { + return tc.base.expectedTraces() } diff --git a/_integration-tests/tests/k8s_client_go/struct_literal_without_param.go b/_integration-tests/tests/k8s_client_go/struct_literal_without_param.go index 5593e93d..37b5064e 100644 --- a/_integration-tests/tests/k8s_client_go/struct_literal_without_param.go +++ b/_integration-tests/tests/k8s_client_go/struct_literal_without_param.go @@ -42,6 +42,6 @@ func (tc *TestCaseStructLiteralWithoutParam) Teardown(t *testing.T) { tc.base.teardown(t) } -func (tc *TestCaseStructLiteralWithoutParam) ExpectedTraces() trace.Spans { - return tc.base.expectedSpans() +func (tc *TestCaseStructLiteralWithoutParam) ExpectedTraces() trace.Traces { + return tc.base.expectedTraces() } diff --git a/_integration-tests/tests/mongo/mongo.go b/_integration-tests/tests/mongo/mongo.go index 4e42f399..7b6cb2cb 100644 --- a/_integration-tests/tests/mongo/mongo.go +++ b/_integration-tests/tests/mongo/mongo.go @@ -82,13 +82,13 @@ func (tc *TestCase) Teardown(t *testing.T) { assert.NoError(t, tc.server.Terminate(ctx)) } -func (*TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { Tags: map[string]any{ "name": "test.root", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "mongodb.query", diff --git a/_integration-tests/tests/mux/mux.go b/_integration-tests/tests/mux/mux.go index 161511e5..a377c4d7 100644 --- a/_integration-tests/tests/mux/mux.go +++ b/_integration-tests/tests/mux/mux.go @@ -57,9 +57,9 @@ func (tc *TestCase) Teardown(t *testing.T) { require.NoError(t, tc.Server.Shutdown(ctx)) } -func (tc *TestCase) ExpectedTraces() trace.Spans { +func (tc *TestCase) ExpectedTraces() trace.Traces { url := fmt.Sprintf("http://%s/ping", tc.Server.Addr) - return trace.Spans{ + return trace.Traces{ { // NB: Top-level span is from the HTTP Client, which is library-side instrumented. Tags: map[string]any{ @@ -70,7 +70,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { Meta: map[string]string{ "http.url": url, }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "http.request", diff --git a/_integration-tests/tests/net_http/net_http.go b/_integration-tests/tests/net_http/net_http.go index 59e28938..fe443888 100644 --- a/_integration-tests/tests/net_http/net_http.go +++ b/_integration-tests/tests/net_http/net_http.go @@ -52,8 +52,8 @@ func (tc *TestCase) Teardown(t *testing.T) { require.NoError(t, tc.Server.Shutdown(ctx)) } -func (tc *TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (tc *TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { Tags: map[string]any{ "name": "http.request", @@ -64,7 +64,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "component": "net/http", "span.kind": "client", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "http.request", @@ -75,7 +75,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "component": "net/http", "span.kind": "server", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "http.request", @@ -90,7 +90,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "http.status_code": "200", "http.method": "POST", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "http.request", diff --git a/_integration-tests/tests/os/lfi.go b/_integration-tests/tests/os/lfi.go index b1a83ca4..e1635b5e 100644 --- a/_integration-tests/tests/os/lfi.go +++ b/_integration-tests/tests/os/lfi.go @@ -65,8 +65,8 @@ func (tc *TestCase) Teardown(t *testing.T) { require.NoError(t, tc.Server.Shutdown(ctx)) } -func (*TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { Tags: map[string]any{ "name": "http.request", @@ -77,7 +77,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "component": "net/http", "span.kind": "client", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "http.request", diff --git a/_integration-tests/tests/redigo/redigo.go b/_integration-tests/tests/redigo/redigo.go index 15214741..f7405a34 100644 --- a/_integration-tests/tests/redigo/redigo.go +++ b/_integration-tests/tests/redigo/redigo.go @@ -96,13 +96,13 @@ func (tc *TestCase) Teardown(t *testing.T) { assert.NoError(t, tc.server.Terminate(ctx)) } -func (*TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { Tags: map[string]any{ "name": "test.root", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "resource": "GET", diff --git a/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go b/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go index b388f497..e8f2aa4c 100644 --- a/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go +++ b/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go @@ -46,6 +46,7 @@ func (tc *TestCase) Setup(t *testing.T) { Brokers: []string{tc.addr}, GroupID: consumerGroup, Topic: topic, + MaxWait: 10 * time.Millisecond, MaxBytes: 10e6, // 10MB }) @@ -144,8 +145,8 @@ func (tc *TestCase) Teardown(t *testing.T) { require.NoError(t, tc.kafka.Terminate(ctx)) } -func (tc *TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { Tags: map[string]any{ "name": "kafka.produce", @@ -157,7 +158,7 @@ func (tc *TestCase) ExpectedTraces() trace.Spans { "span.kind": "producer", "component": "segmentio/kafka.go.v0", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "kafka.consume", diff --git a/_integration-tests/tests/shopify_sarama/shopify_sarama.go b/_integration-tests/tests/shopify_sarama/shopify_sarama.go index 3632a366..2edba615 100644 --- a/_integration-tests/tests/shopify_sarama/shopify_sarama.go +++ b/_integration-tests/tests/shopify_sarama/shopify_sarama.go @@ -97,8 +97,8 @@ func (tc *TestCase) Teardown(t *testing.T) { require.NoError(t, tc.server.Terminate(ctx)) } -func (*TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { Tags: map[string]any{ "name": "kafka.produce", @@ -109,7 +109,7 @@ func (*TestCase) ExpectedTraces() trace.Spans { "span.kind": "producer", "component": "Shopify/sarama", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "kafka.consume", diff --git a/_integration-tests/tests/slog/slog.go b/_integration-tests/tests/slog/slog.go index 7c7cb73a..64b5d616 100644 --- a/_integration-tests/tests/slog/slog.go +++ b/_integration-tests/tests/slog/slog.go @@ -72,4 +72,4 @@ func (tc *TestCase) Run(t *testing.T) { func (*TestCase) Teardown(*testing.T) {} -func (*TestCase) ExpectedTraces() trace.Spans { return trace.Spans{} } +func (*TestCase) ExpectedTraces() trace.Traces { return trace.Traces{} } diff --git a/_integration-tests/tests/sql/sql.go b/_integration-tests/tests/sql/sql.go index 85161d74..c567bcee 100644 --- a/_integration-tests/tests/sql/sql.go +++ b/_integration-tests/tests/sql/sql.go @@ -58,8 +58,8 @@ func (tc *TestCase) Teardown(t *testing.T) { require.NoError(t, tc.DB.Close()) } -func (*TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { Tags: map[string]any{ "resource": "INSERT INTO notes (userid, content, created) VALUES (?, ?, datetime('now'));", diff --git a/_integration-tests/tests/vault/vault.go b/_integration-tests/tests/vault/vault.go index f2b9a9c9..2fa5a7e5 100644 --- a/_integration-tests/tests/vault/vault.go +++ b/_integration-tests/tests/vault/vault.go @@ -70,13 +70,13 @@ func (tc *TestCase) Teardown(t *testing.T) { require.NoError(t, tc.server.Terminate(ctx)) } -func (*TestCase) ExpectedTraces() trace.Spans { - return trace.Spans{ +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ { Tags: map[string]any{ "name": "test.root", }, - Children: trace.Spans{ + Children: trace.Traces{ { Tags: map[string]any{ "name": "http.request", diff --git a/_integration-tests/utils/suite.go b/_integration-tests/utils/suite.go index 27c5951d..d6b662d2 100644 --- a/_integration-tests/utils/suite.go +++ b/_integration-tests/utils/suite.go @@ -43,11 +43,11 @@ type TestCase interface { // Setup, such as stopping services or deleting test data. Teardown(*testing.T) - // ExpectedTraces returns a trace.Spans object describing all traces expected + // ExpectedTraces returns a trace.Traces object describing all traces expected // to be produced by the `Run` function. There should be one entry per trace - // root span expected to be produced. Every item in the returned `trace.Spans` + // root span expected to be produced. Every item in the returned `trace.Traces` // must match at least one trace received by the agent during the test run. - ExpectedTraces() trace.Spans + ExpectedTraces() trace.Traces } func RunTest(t *testing.T, tc TestCase) { @@ -72,23 +72,24 @@ func RunTest(t *testing.T, tc TestCase) { t.Log("Running test") tc.Run(t) - checkTrace(t, tc, sess) + checkTraces(t, tc, sess) } -func checkTrace(t *testing.T, tc TestCase, sess *agent.Session) { +func checkTraces(t *testing.T, tc TestCase, sess *agent.Session) { t.Helper() jsonTraces, err := sess.Close(t) require.NoError(t, err) - var spans trace.Spans - require.NoError(t, trace.ParseRaw(jsonTraces, &spans)) - t.Logf("Received %d spans", len(spans)) - for i, span := range spans { - t.Logf("[%d]: %v", i, span) + var traces trace.Traces + require.NoError(t, trace.ParseRaw(jsonTraces, &traces)) + t.Logf("Received %d traces", len(traces)) + for i, tr := range traces { + t.Logf("[%d] Trace contains a total of %d spans", i, tr.NumSpans()) + t.Logf("[%d]: %v", i, tr) } for _, expected := range tc.ExpectedTraces() { - expected.RequireAnyMatch(t, spans) + expected.RequireAnyMatch(t, traces) } } diff --git a/_integration-tests/validator/trace/diff.go b/_integration-tests/validator/trace/diff.go index ca24ce0f..ea894716 100644 --- a/_integration-tests/validator/trace/diff.go +++ b/_integration-tests/validator/trace/diff.go @@ -24,27 +24,27 @@ const ( ) // RequireAnyMatch asserts that any of the traces in `others` corresponds to the receiver. -func (span *Span) RequireAnyMatch(t *testing.T, others []*Span) { +func (tr *Trace) RequireAnyMatch(t *testing.T, others []*Trace) { t.Helper() - span, diff := span.matchesAny(others, treeprint.NewWithRoot("Root")) - require.NotNil(t, span, "no match found for trace:\n%s", diff) - t.Logf("Found matching trace:\n%s", span) + tr, diff := tr.matchesAny(others, treeprint.NewWithRoot("Root")) + require.NotNil(t, t, "no match found for trace:\n%s", diff) + t.Logf("Found matching trace:\n%s", tr) } -func (span *Span) matchesAny(others []*Span, diff treeprint.Tree) (*Span, Diff) { +func (tr *Trace) matchesAny(others []*Trace, diff treeprint.Tree) (*Trace, Diff) { if len(others) == 0 { - span.into(diff.AddMetaBranch(markerRemoved, "No spans to match against")) + tr.into(diff.AddMetaBranch(markerRemoved, "No spans to match against")) return nil, diff } for idx, other := range others { - id := fmt.Sprintf("Span at index %d", idx) + id := fmt.Sprintf("Trace at index %d", idx) if other.ID != 0 { id = fmt.Sprintf("Span ID %d", other.ID) } branch := diff.AddMetaBranch(markerChanged, id) - if span.matches(other, branch) { + if tr.matches(other, branch) { return other, nil } } @@ -53,12 +53,12 @@ func (span *Span) matchesAny(others []*Span, diff treeprint.Tree) (*Span, Diff) // macthes determines whether the receiving span matches the other span, and // adds difference information to the provided diff tree. -func (span *Span) matches(other *Span, diff treeprint.Tree) (matches bool) { +func (tr *Trace) matches(other *Trace, diff treeprint.Tree) (matches bool) { matches = true - keys := make([]string, 0, len(span.Tags)) + keys := make([]string, 0, len(tr.Tags)) maxLen := 1 - for key := range span.Tags { + for key := range tr.Tags { keys = append(keys, key) if len := len(key); len > maxLen { maxLen = len @@ -66,7 +66,7 @@ func (span *Span) matches(other *Span, diff treeprint.Tree) (matches bool) { } sort.Strings(keys) for _, tag := range keys { - expected := span.Tags[tag] + expected := tr.Tags[tag] actual := other.Tags[tag] if expected != actual && (tag != "service" || fmt.Sprintf("%s.exe", expected) != actual) { branch := diff.AddMetaBranch(markerChanged, tag) @@ -78,9 +78,9 @@ func (span *Span) matches(other *Span, diff treeprint.Tree) (matches bool) { } } - keys = make([]string, 0, len(span.Meta)) + keys = make([]string, 0, len(tr.Meta)) maxLen = 1 - for key := range span.Meta { + for key := range tr.Meta { keys = append(keys, key) if len := len(key); len > maxLen { maxLen = len @@ -89,7 +89,7 @@ func (span *Span) matches(other *Span, diff treeprint.Tree) (matches bool) { sort.Strings(keys) var metaNode treeprint.Tree for _, key := range keys { - expected := span.Meta[key] + expected := tr.Meta[key] actual, actualExists := other.Meta[key] if metaNode == nil { metaNode = diff.AddBranch("meta") @@ -109,7 +109,7 @@ func (span *Span) matches(other *Span, diff treeprint.Tree) (matches bool) { } var childrenNode treeprint.Tree - for idx, child := range span.Children { + for idx, child := range tr.Children { if childrenNode == nil { childrenNode = diff.AddBranch("_children") } diff --git a/_integration-tests/validator/trace/raw.go b/_integration-tests/validator/trace/raw.go index 88070eea..37b1ff89 100644 --- a/_integration-tests/validator/trace/raw.go +++ b/_integration-tests/validator/trace/raw.go @@ -17,12 +17,12 @@ import ( // field that can be used to reconstruct the hierarchy. type RawSpan struct { ParentID SpanID `json:"parent_id"` - Span + Trace } var _ json.Unmarshaler = &RawSpan{} -func ParseRaw(data []byte, traces *[]*Span) error { +func ParseRaw(data []byte, traces *[]*Trace) error { var rawSpanGroups [][]*RawSpan if err := json.Unmarshal(data, &rawSpanGroups); err != nil { return err @@ -40,11 +40,11 @@ func ParseRaw(data []byte, traces *[]*Span) error { } // Second pass: build up parent-child relationships - roots := make([]*Span, 0, len(spans)) + roots := make([]*Trace, 0, len(spans)) for _, span := range spans { if span.ParentID == 0 { // This is a root span - roots = append(roots, &span.Span) + roots = append(roots, &span.Trace) continue } @@ -53,7 +53,7 @@ func ParseRaw(data []byte, traces *[]*Span) error { if !found { return fmt.Errorf("span %d has unknown parent %d", span.ID, span.ParentID) } - parent.Children = append(parent.Children, &span.Span) + parent.Children = append(parent.Children, &span.Trace) } // We're done here! @@ -64,7 +64,7 @@ func ParseRaw(data []byte, traces *[]*Span) error { func (span *RawSpan) UnmarshalJSON(data []byte) error { span.ID = 0 span.ParentID = 0 - span.Span = Span{Tags: make(map[string]any)} + span.Trace = Trace{Tags: make(map[string]any)} var raw map[string]json.RawMessage if err := json.Unmarshal(data, &raw); err != nil { diff --git a/_integration-tests/validator/trace/span.go b/_integration-tests/validator/trace/span.go index 6a22a11c..506403a5 100644 --- a/_integration-tests/validator/trace/span.go +++ b/_integration-tests/validator/trace/span.go @@ -16,24 +16,32 @@ import ( type SpanID uint64 -// Span represents a span within a trace, which is hierarchically organized +// Trace represents the root span of a trace, which is hierarchically organized // via the Children property. -type Span struct { +type Trace struct { ID SpanID `json:"span_id"` Meta map[string]string Metrics map[string]float64 Tags map[string]any - Children []*Span + Children []*Trace } -type Spans = []*Span +type Traces = []*Trace -var _ json.Unmarshaler = &Span{} +func (tr *Trace) NumSpans() int { + count := 1 + for _, tr := range tr.Children { + count += tr.NumSpans() + } + return count +} + +var _ json.Unmarshaler = &Trace{} -func (span *Span) UnmarshalJSON(data []byte) error { - span.Meta = nil - span.Tags = make(map[string]any) - span.Children = nil +func (tr *Trace) UnmarshalJSON(data []byte) error { + tr.Meta = nil + tr.Tags = make(map[string]any) + tr.Children = nil var raw map[string]json.RawMessage if err := json.Unmarshal(data, &raw); err != nil { @@ -44,20 +52,20 @@ func (span *Span) UnmarshalJSON(data []byte) error { var err error switch key { case "_children": - err = json.Unmarshal(value, &span.Children) + err = json.Unmarshal(value, &tr.Children) case "meta": - err = json.Unmarshal(value, &span.Meta) + err = json.Unmarshal(value, &tr.Meta) case "metrics": - err = json.Unmarshal(value, &span.Metrics) + err = json.Unmarshal(value, &tr.Metrics) case "span_id": - err = json.Unmarshal(value, &span.ID) + err = json.Unmarshal(value, &tr.ID) if err == nil { - span.Tags["span_id"] = json.Number(fmt.Sprintf("%d", span.ID)) + tr.Tags["span_id"] = json.Number(fmt.Sprintf("%d", tr.ID)) } default: var val any err = json.Unmarshal(value, &val) - span.Tags[key] = val + tr.Tags[key] = val } if err != nil { return err @@ -67,16 +75,16 @@ func (span *Span) UnmarshalJSON(data []byte) error { return nil } -func (span *Span) String() string { +func (tr *Trace) String() string { tree := treeprint.NewWithRoot("Root") - span.into(tree) + tr.into(tree) return tree.String() } -func (span *Span) into(tree treeprint.Tree) { - keys := make([]string, 0, len(span.Tags)) +func (tr *Trace) into(tree treeprint.Tree) { + keys := make([]string, 0, len(tr.Tags)) maxLen := 1 - for key := range span.Tags { + for key := range tr.Tags { keys = append(keys, key) if len := len(key); len > maxLen { maxLen = len @@ -84,15 +92,15 @@ func (span *Span) into(tree treeprint.Tree) { } sort.Strings(keys) for _, tag := range keys { - tree.AddNode(fmt.Sprintf("%-*s = %q", maxLen, tag, span.Tags[tag])) + tree.AddNode(fmt.Sprintf("%-*s = %q", maxLen, tag, tr.Tags[tag])) } - addMapBranch(tree, span.Meta, "meta") - addMapBranch(tree, span.Metrics, "metrics") + addMapBranch(tree, tr.Meta, "meta") + addMapBranch(tree, tr.Metrics, "metrics") - if len(span.Children) > 0 { + if len(tr.Children) > 0 { children := tree.AddBranch("_children") - for i, child := range span.Children { + for i, child := range tr.Children { child.into(children.AddBranch(fmt.Sprintf("#%d", i))) } } diff --git a/_integration-tests/validator/trace/span_test.go b/_integration-tests/validator/trace/span_test.go index 4b03d673..5677ad0c 100644 --- a/_integration-tests/validator/trace/span_test.go +++ b/_integration-tests/validator/trace/span_test.go @@ -33,8 +33,8 @@ func TestMatchesAny(t *testing.T) { t.Parallel() var ( - expected *Span - actual []*Span + expected *Trace + actual []*Trace ) { data, err := os.ReadFile(filepath.Join(testdata, name, "expected.json")) From c7658a94702e21bcfb50ff9cabc7e956ac3e88f0 Mon Sep 17 00:00:00 2001 From: Rodrigo Arguello Date: Thu, 26 Sep 2024 15:10:35 +0200 Subject: [PATCH 07/18] fix RequireAnyMatch --- .../segmentio_kafka.v0/segmentio_kafka.go | 60 ++++++-- _integration-tests/utils/suite.go | 10 +- _integration-tests/validator/trace/diff.go | 15 +- .../validator/trace/diff_test.go | 145 ++++++++++++++++++ 4 files changed, 207 insertions(+), 23 deletions(-) create mode 100644 _integration-tests/validator/trace/diff_test.go diff --git a/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go b/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go index e8f2aa4c..3f299396 100644 --- a/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go +++ b/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go @@ -23,7 +23,8 @@ import ( ) const ( - topic = "topic-A" + topicA = "topic-A" + topicB = "topic-B" consumerGroup = "group-A" ) @@ -31,7 +32,6 @@ type TestCase struct { kafka *kafkatest.KafkaContainer addr string writer *kafka.Writer - reader *kafka.Reader } func (tc *TestCase) Setup(t *testing.T) { @@ -39,18 +39,19 @@ func (tc *TestCase) Setup(t *testing.T) { tc.writer = &kafka.Writer{ Addr: kafka.TCP(tc.addr), - Topic: topic, Balancer: &kafka.LeastBytes{}, } - tc.reader = kafka.NewReader(kafka.ReaderConfig{ + tc.createTopic(t) +} + +func (tc *TestCase) newReader(topic string) *kafka.Reader { + return kafka.NewReader(kafka.ReaderConfig{ Brokers: []string{tc.addr}, GroupID: consumerGroup, Topic: topic, MaxWait: 10 * time.Millisecond, MaxBytes: 10e6, // 10MB }) - - tc.createTopic(t) } func (tc *TestCase) createTopic(t *testing.T) { @@ -67,7 +68,12 @@ func (tc *TestCase) createTopic(t *testing.T) { topicConfigs := []kafka.TopicConfig{ { - Topic: topic, + Topic: topicA, + NumPartitions: 1, + ReplicationFactor: 1, + }, + { + Topic: topicB, NumPartitions: 1, ReplicationFactor: 1, }, @@ -87,10 +93,12 @@ func (tc *TestCase) produce(t *testing.T) { messages := []kafka.Message{ { + Topic: topicA, Key: []byte("Key-A"), Value: []byte("Hello World!"), }, { + Topic: topicB, Key: []byte("Key-A"), Value: []byte("Second message"), }, @@ -124,19 +132,21 @@ func (tc *TestCase) consume(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() - m, err := tc.reader.ReadMessage(ctx) + readerA := tc.newReader(topicA) + m, err := readerA.ReadMessage(ctx) require.NoError(t, err) assert.Equal(t, "Hello World!", string(m.Value)) assert.Equal(t, "Key-A", string(m.Key)) + require.NoError(t, readerA.Close()) - m, err = tc.reader.FetchMessage(ctx) + readerB := tc.newReader(topicB) + m, err = readerB.FetchMessage(ctx) require.NoError(t, err) assert.Equal(t, "Second message", string(m.Value)) assert.Equal(t, "Key-A", string(m.Key)) - err = tc.reader.CommitMessages(ctx, m) + err = readerB.CommitMessages(ctx, m) require.NoError(t, err) - - require.NoError(t, tc.reader.Close()) + require.NoError(t, readerB.Close()) } func (tc *TestCase) Teardown(t *testing.T) { @@ -173,5 +183,31 @@ func (*TestCase) ExpectedTraces() trace.Traces { }, }, }, + { + Tags: map[string]any{ + "name": "kafka.produce", + "type": "queue", + "service": "kafka", + "resource": "Produce Topic topic-B", + }, + Meta: map[string]string{ + "span.kind": "producer", + "component": "segmentio/kafka.go.v0", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "kafka.consume", + "type": "queue", + "service": "kafka", + "resource": "Consume Topic topic-B", + }, + Meta: map[string]string{ + "span.kind": "consumer", + "component": "segmentio/kafka.go.v0", + }, + }, + }, + }, } } diff --git a/_integration-tests/utils/suite.go b/_integration-tests/utils/suite.go index d6b662d2..a14289c6 100644 --- a/_integration-tests/utils/suite.go +++ b/_integration-tests/utils/suite.go @@ -81,15 +81,15 @@ func checkTraces(t *testing.T, tc TestCase, sess *agent.Session) { jsonTraces, err := sess.Close(t) require.NoError(t, err) - var traces trace.Traces - require.NoError(t, trace.ParseRaw(jsonTraces, &traces)) - t.Logf("Received %d traces", len(traces)) - for i, tr := range traces { + var got trace.Traces + require.NoError(t, trace.ParseRaw(jsonTraces, &got)) + t.Logf("Received %d traces", len(got)) + for i, tr := range got { t.Logf("[%d] Trace contains a total of %d spans", i, tr.NumSpans()) t.Logf("[%d]: %v", i, tr) } for _, expected := range tc.ExpectedTraces() { - expected.RequireAnyMatch(t, traces) + expected.RequireAnyMatch(t, got) } } diff --git a/_integration-tests/validator/trace/diff.go b/_integration-tests/validator/trace/diff.go index ea894716..bf1c58d9 100644 --- a/_integration-tests/validator/trace/diff.go +++ b/_integration-tests/validator/trace/diff.go @@ -10,7 +10,7 @@ import ( "sort" "testing" - "github.com/stretchr/testify/require" + "github.com/stretchr/testify/assert" "github.com/xlab/treeprint" ) @@ -23,13 +23,16 @@ const ( markerEqual = "=" ) -// RequireAnyMatch asserts that any of the traces in `others` corresponds to the receiver. -func (tr *Trace) RequireAnyMatch(t *testing.T, others []*Trace) { +// RequireAnyMatch asserts that any of the traces in `got` corresponds to the receiver. +func (tr *Trace) RequireAnyMatch(t *testing.T, got []*Trace) { t.Helper() - tr, diff := tr.matchesAny(others, treeprint.NewWithRoot("Root")) - require.NotNil(t, t, "no match found for trace:\n%s", diff) - t.Logf("Found matching trace:\n%s", tr) + foundTrace, diff := tr.matchesAny(got, treeprint.NewWithRoot("Root")) + if foundTrace == nil { + assert.Fail(t, "no match found for trace", diff) + } else { + t.Logf("Found matching trace:\n%s", foundTrace) + } } func (tr *Trace) matchesAny(others []*Trace, diff treeprint.Tree) (*Trace, Diff) { diff --git a/_integration-tests/validator/trace/diff_test.go b/_integration-tests/validator/trace/diff_test.go new file mode 100644 index 00000000..9c11b741 --- /dev/null +++ b/_integration-tests/validator/trace/diff_test.go @@ -0,0 +1,145 @@ +package trace + +import ( + "github.com/stretchr/testify/assert" + "github.com/xlab/treeprint" + "testing" +) + +func TestTrace_matchesAny(t *testing.T) { + // 2 producer root spans with 1 consumer child span respectively + want := Traces{ + { + Meta: map[string]string{ + "component": "segmentio/kafka.go.v0", + "span.kind": "producer", + }, + Tags: map[string]any{ + "name": "kafka.produce", + "resource": "Produce Topic topic-A", + "service": "kafka", + "type": "queue", + }, + Children: Traces{ + { + Meta: map[string]string{ + "component": "segmentio/kafka.go.v0", + "span.kind": "consumer", + }, + Tags: map[string]any{ + "name": "kafka.consume", + "resource": "Consume Topic topic-A", + "service": "kafka", + "type": "queue", + }, + }, + }, + }, + { + Meta: map[string]string{ + "component": "segmentio/kafka.go.v0", + "span.kind": "producer", + }, + Tags: map[string]any{ + "name": "kafka.produce", + "resource": "Produce Topic topic-B", + "service": "kafka", + "type": "queue", + }, + Children: Traces{ + { + Meta: map[string]string{ + "component": "segmentio/kafka.go.v0", + "span.kind": "consumer", + }, + Tags: map[string]any{ + "name": "kafka.consume", + "resource": "Consume Topic topic-B", + "service": "kafka", + "type": "queue", + }, + }, + }, + }, + } + // got the same 4 spans, but the parent-child relationships are different + got := Traces{ + { + ID: 6461804313269386728, + Meta: map[string]string{ + "messaging.system": "kafka", + "span.kind": "producer", + "component": "segmentio/kafka.go.v0", + }, + Tags: map[string]any{ + "name": "kafka.produce", + "resource": "Produce Topic topic-A", + "service": "kafka", + "type": "queue", + }, + Children: Traces{ + { + ID: 1242110709011053063, + Meta: map[string]string{ + "messaging.system": "kafka", + "span.kind": "producer", + "component": "segmentio/kafka.go.v0", + }, + Tags: map[string]any{ + "name": "kafka.produce", + "resource": "Produce Topic topic-B", + "service": "kafka", + "type": "queue", + }, + Children: Traces{ + { + ID: 7873578434319770271, + Meta: map[string]string{ + "messaging.system": "kafka", + "span.kind": "consumer", + "component": "segmentio/kafka.go.v0", + }, + Tags: map[string]any{ + "name": "kafka.consume", + "resource": "Consume Topic topic-B", + "service": "kafka", + "type": "queue", + }, + Children: nil, + }, + }, + }, + { + ID: 6458862152963979372, + Meta: map[string]string{ + "messaging.system": "kafka", + "span.kind": "consumer", + "component": "segmentio/kafka.go.v0", + }, + Tags: map[string]any{ + "name": "kafka.consume", + "resource": "Consume Topic topic-A", + "service": "kafka", + "type": "queue", + }, + Children: nil, + }, + }, + }, + } + + { + // the first one should be ok, since there is a root span produce-A with a child consume-A + w := want[0] + foundTrace, diff := w.matchesAny(got, treeprint.NewWithRoot("Root")) + assert.NotNil(t, foundTrace, "trace was not found") + assert.Empty(t, diff) + } + { + // the second should not be ok, as it's not a root span. + w := want[1] + foundTrace, diff := w.matchesAny(got, treeprint.NewWithRoot("Root")) + assert.Nil(t, foundTrace) + assert.NotEmpty(t, diff) + } +} From 5b0af0dcd5ce4a14325f055c7324777e0ffdec3d Mon Sep 17 00:00:00 2001 From: Rodrigo Arguello Date: Thu, 26 Sep 2024 16:48:01 +0200 Subject: [PATCH 08/18] ctx gets modified --- .../tests/segmentio_kafka.v0/segmentio_kafka.go | 5 +++++ internal/injector/builtin/generated.go | 6 ++++-- .../builtin/yaml/datastreams/segmentio_kafka_v0.yml | 10 ++++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go b/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go index 3f299396..d8fac07d 100644 --- a/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go +++ b/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go @@ -102,6 +102,11 @@ func (tc *TestCase) produce(t *testing.T) { Key: []byte("Key-A"), Value: []byte("Second message"), }, + { + Topic: topicB, + Key: []byte("Key-A"), + Value: []byte("Third message"), + }, } const ( maxRetries = 10 diff --git a/internal/injector/builtin/generated.go b/internal/injector/builtin/generated.go index 1f91c6c4..3169cbf0 100644 --- a/internal/injector/builtin/generated.go +++ b/internal/injector/builtin/generated.go @@ -360,9 +360,11 @@ var Aspects = [...]aspect.Aspect{ )), Advice: []advice.Advice{ advice.PrependStmts(code.MustTemplate( - "{{- $w := .Function.Receiver -}}\n{{- $ctx := .Function.Argument 0 -}}\n{{- $msgs := .Function.Argument 1 -}}\n{{- $err := .Function.Result 0 -}}\nspans := make([]ddtrace.Span, len(msgs))\n__dd_initWriter(w)\n\nfor i := range msgs {\n tMsg := __dd_tracingMessage(&{{ $msgs }}[i])\n tWriter := __dd_tracingWriter({{ $w }})\n spans[i] = tracing.StartProduceSpan({{ $ctx }}, {{ $w }}.__dd_cfg, {{ $w }}.__dd_kafkaCfg, tWriter, tMsg)\n tracing.SetProduceDSMCheckpoint({{ $w }}.__dd_cfg, tMsg, tWriter)\n}\n\ndefer func() {\n for i, span := range spans {\n tracing.FinishProduceSpan(span, {{ $msgs }}[i].Partition, {{ $msgs }}[i].Offset, {{ $err }})\n }\n}()", + "{{- $w := .Function.Receiver -}}\n{{- $ctx := .Function.Argument 0 -}}\n{{- $msgs := .Function.Argument 1 -}}\n{{- $err := .Function.Result 0 -}}\nspans := make([]ddtrace.Span, len(msgs))\n__dd_initWriter(w)\n\nfor i := range msgs {\n // TODO: remove this\n prevSpan, ok := tracer.SpanFromContext({{ $ctx }})\n if ok {\n fmt.Printf(\"[msg %d] found a span in the context: %v\\n\", i, prevSpan)\n } else {\n fmt.Printf(\"[msg %d] didn't find a span in the context\\n\", i)\n }\n //\n tMsg := __dd_tracingMessage(&{{ $msgs }}[i])\n tWriter := __dd_tracingWriter({{ $w }})\n spans[i] = tracing.StartProduceSpan({{ $ctx }}, {{ $w }}.__dd_cfg, {{ $w }}.__dd_kafkaCfg, tWriter, tMsg)\n tracing.SetProduceDSMCheckpoint({{ $w }}.__dd_cfg, tMsg, tWriter)\n}\n\ndefer func() {\n for i, span := range spans {\n tracing.FinishProduceSpan(span, {{ $msgs }}[i].Partition, {{ $msgs }}[i].Offset, {{ $err }})\n }\n}()", map[string]string{ "ddtrace": "gopkg.in/DataDog/dd-trace-go.v1/ddtrace", + "fmt": "fmt", + "tracer": "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer", "tracing": "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing", }, )), @@ -958,4 +960,4 @@ var InjectedPaths = [...]string{ } // Checksum is a checksum of the built-in configuration which can be used to invalidate caches. -const Checksum = "sha512:4Hu53xQ6PKVLJ8IvhlKZAlf6D8Foh5KNI/NZyv0p3wr027JdXfVmABDn68V1eSiZCsGoQHCPrJldOveh4MJWaw==" +const Checksum = "sha512:IDBM8NK7FcyWTa6ytmFVd6LLqdsbgE+E2cDYbXWKSmqSquHnTPijIXAcTC59XXdQaHckHzofCUulG0ijJ8ty7Q==" diff --git a/internal/injector/builtin/yaml/datastreams/segmentio_kafka_v0.yml b/internal/injector/builtin/yaml/datastreams/segmentio_kafka_v0.yml index b044ed62..b55a66c9 100644 --- a/internal/injector/builtin/yaml/datastreams/segmentio_kafka_v0.yml +++ b/internal/injector/builtin/yaml/datastreams/segmentio_kafka_v0.yml @@ -178,6 +178,8 @@ aspects: imports: ddtrace: gopkg.in/DataDog/dd-trace-go.v1/ddtrace tracing: gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing + tracer: gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer + fmt: fmt template: |- {{- $w := .Function.Receiver -}} {{- $ctx := .Function.Argument 0 -}} @@ -187,6 +189,14 @@ aspects: __dd_initWriter(w) for i := range msgs { + // TODO: remove this + prevSpan, ok := tracer.SpanFromContext({{ $ctx }}) + if ok { + fmt.Printf("[msg %d] found a span in the context: %v\n", i, prevSpan) + } else { + fmt.Printf("[msg %d] didn't find a span in the context\n", i) + } + // tMsg := __dd_tracingMessage(&{{ $msgs }}[i]) tWriter := __dd_tracingWriter({{ $w }}) spans[i] = tracing.StartProduceSpan({{ $ctx }}, {{ $w }}.__dd_cfg, {{ $w }}.__dd_kafkaCfg, tWriter, tMsg) From 57571fad3f5859bd7027af235c60ead8b20ebbac Mon Sep 17 00:00:00 2001 From: Rodrigo Arguello Date: Thu, 26 Sep 2024 17:58:33 +0200 Subject: [PATCH 09/18] fix sibling spans issue --- _integration-tests/go.mod | 2 +- _integration-tests/go.sum | 4 ++-- .../segmentio_kafka.v0/segmentio_kafka.go | 13 ++++++++++++ _integration-tests/utils/suite.go | 3 +-- go.mod | 2 +- go.sum | 4 ++-- internal/injector/builtin/generated.go | 4 ++-- .../yaml/datastreams/segmentio_kafka_v0.yml | 20 +++++++++---------- 8 files changed, 32 insertions(+), 20 deletions(-) diff --git a/_integration-tests/go.mod b/_integration-tests/go.mod index c4d3d6b9..94a11766 100644 --- a/_integration-tests/go.mod +++ b/_integration-tests/go.mod @@ -5,7 +5,7 @@ go 1.22.6 replace github.com/DataDog/orchestrion => ../ // TODO: remove -replace gopkg.in/DataDog/dd-trace-go.v1 => gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240924150618-477c7b2be37a +replace gopkg.in/DataDog/dd-trace-go.v1 => gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240926152443-e7a15d17544d require ( cloud.google.com/go/pubsub v1.42.0 diff --git a/_integration-tests/go.sum b/_integration-tests/go.sum index 1c9f05c6..ce4eef34 100644 --- a/_integration-tests/go.sum +++ b/_integration-tests/go.sum @@ -2370,8 +2370,8 @@ google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= -gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240924150618-477c7b2be37a h1:c/hbde6aFVocMEe+jdKKqOYvHKjJqV0BHO1sS5zIAg4= -gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240924150618-477c7b2be37a/go.mod h1:fpMxtqDZZSI6QiZiZlaYP7eQdSlP+sLSmGd3ibTNr9U= +gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240926152443-e7a15d17544d h1:UZdBUaVd9zTXZmPZNl3Dypf9m8ZlpAqQqh+IFFTlhCg= +gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240926152443-e7a15d17544d/go.mod h1:fpMxtqDZZSI6QiZiZlaYP7eQdSlP+sLSmGd3ibTNr9U= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go b/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go index d8fac07d..d4f3051a 100644 --- a/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go +++ b/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go @@ -214,5 +214,18 @@ func (*TestCase) ExpectedTraces() trace.Traces { }, }, }, + { + Tags: map[string]any{ + "name": "kafka.produce", + "type": "queue", + "service": "kafka", + "resource": "Produce Topic topic-B", + }, + Meta: map[string]string{ + "span.kind": "producer", + "component": "segmentio/kafka.go.v0", + }, + Children: nil, + }, } } diff --git a/_integration-tests/utils/suite.go b/_integration-tests/utils/suite.go index a14289c6..342a3c2d 100644 --- a/_integration-tests/utils/suite.go +++ b/_integration-tests/utils/suite.go @@ -85,8 +85,7 @@ func checkTraces(t *testing.T, tc TestCase, sess *agent.Session) { require.NoError(t, trace.ParseRaw(jsonTraces, &got)) t.Logf("Received %d traces", len(got)) for i, tr := range got { - t.Logf("[%d] Trace contains a total of %d spans", i, tr.NumSpans()) - t.Logf("[%d]: %v", i, tr) + t.Logf("[%d] Trace contains a total of %d spans:\n%v", i, tr.NumSpans(), tr) } for _, expected := range tc.ExpectedTraces() { diff --git a/go.mod b/go.mod index 417da0e6..27dddff7 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/DataDog/orchestrion go 1.22.6 // TODO: remove -replace gopkg.in/DataDog/dd-trace-go.v1 => gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240924150618-477c7b2be37a +replace gopkg.in/DataDog/dd-trace-go.v1 => gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240926152443-e7a15d17544d require ( github.com/charmbracelet/lipgloss v0.13.0 diff --git a/go.sum b/go.sum index e748fdfe..76c9d029 100644 --- a/go.sum +++ b/go.sum @@ -1268,8 +1268,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= -gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240924150618-477c7b2be37a h1:c/hbde6aFVocMEe+jdKKqOYvHKjJqV0BHO1sS5zIAg4= -gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240924150618-477c7b2be37a/go.mod h1:fpMxtqDZZSI6QiZiZlaYP7eQdSlP+sLSmGd3ibTNr9U= +gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240926152443-e7a15d17544d h1:UZdBUaVd9zTXZmPZNl3Dypf9m8ZlpAqQqh+IFFTlhCg= +gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240926152443-e7a15d17544d/go.mod h1:fpMxtqDZZSI6QiZiZlaYP7eQdSlP+sLSmGd3ibTNr9U= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/internal/injector/builtin/generated.go b/internal/injector/builtin/generated.go index 3169cbf0..1a196409 100644 --- a/internal/injector/builtin/generated.go +++ b/internal/injector/builtin/generated.go @@ -360,7 +360,7 @@ var Aspects = [...]aspect.Aspect{ )), Advice: []advice.Advice{ advice.PrependStmts(code.MustTemplate( - "{{- $w := .Function.Receiver -}}\n{{- $ctx := .Function.Argument 0 -}}\n{{- $msgs := .Function.Argument 1 -}}\n{{- $err := .Function.Result 0 -}}\nspans := make([]ddtrace.Span, len(msgs))\n__dd_initWriter(w)\n\nfor i := range msgs {\n // TODO: remove this\n prevSpan, ok := tracer.SpanFromContext({{ $ctx }})\n if ok {\n fmt.Printf(\"[msg %d] found a span in the context: %v\\n\", i, prevSpan)\n } else {\n fmt.Printf(\"[msg %d] didn't find a span in the context\\n\", i)\n }\n //\n tMsg := __dd_tracingMessage(&{{ $msgs }}[i])\n tWriter := __dd_tracingWriter({{ $w }})\n spans[i] = tracing.StartProduceSpan({{ $ctx }}, {{ $w }}.__dd_cfg, {{ $w }}.__dd_kafkaCfg, tWriter, tMsg)\n tracing.SetProduceDSMCheckpoint({{ $w }}.__dd_cfg, tMsg, tWriter)\n}\n\ndefer func() {\n for i, span := range spans {\n tracing.FinishProduceSpan(span, {{ $msgs }}[i].Partition, {{ $msgs }}[i].Offset, {{ $err }})\n }\n}()", + "{{- $w := .Function.Receiver -}}\n{{- $ctx := .Function.Argument 0 -}}\n{{- $msgs := .Function.Argument 1 -}}\n{{- $err := .Function.Result 0 -}}\nspans := make([]ddtrace.Span, len(msgs))\n__dd_initWriter(w)\nvar spanOpts []tracer.StartSpanOption\nprevSpan, ok := tracer.SpanFromContext({{ $ctx }})\nif ok {\n spanOpts = append(spanOpts, tracer.ChildOf(prevSpan.Context()))\n}\nfor i := range msgs {\n // TODO: remove this\n p, ok := tracer.SpanFromContext({{ $ctx }})\n if ok {\n fmt.Printf(\"[msg %d] found a span in the context: %v\\n\", i, p)\n } else {\n fmt.Printf(\"[msg %d] didn't find a span in the context\\n\", i)\n }\n //\n tMsg := __dd_tracingMessage(&{{ $msgs }}[i])\n tWriter := __dd_tracingWriter({{ $w }})\n spans[i] = tracing.StartProduceSpan(nil, {{ $w }}.__dd_cfg, {{ $w }}.__dd_kafkaCfg, tWriter, tMsg, spanOpts...)\n tracing.SetProduceDSMCheckpoint({{ $w }}.__dd_cfg, tMsg, tWriter)\n}\n\ndefer func() {\n for i, span := range spans {\n tracing.FinishProduceSpan(span, {{ $msgs }}[i].Partition, {{ $msgs }}[i].Offset, {{ $err }})\n }\n}()", map[string]string{ "ddtrace": "gopkg.in/DataDog/dd-trace-go.v1/ddtrace", "fmt": "fmt", @@ -960,4 +960,4 @@ var InjectedPaths = [...]string{ } // Checksum is a checksum of the built-in configuration which can be used to invalidate caches. -const Checksum = "sha512:IDBM8NK7FcyWTa6ytmFVd6LLqdsbgE+E2cDYbXWKSmqSquHnTPijIXAcTC59XXdQaHckHzofCUulG0ijJ8ty7Q==" +const Checksum = "sha512:rVXR0iiL/DKa3O3SXjHPYDIgUbO1gafijlKtBPRg3xwQvQD6vck2BJBo9OzUytGkp3mlZn0+zz4vlOIDwAAxcQ==" diff --git a/internal/injector/builtin/yaml/datastreams/segmentio_kafka_v0.yml b/internal/injector/builtin/yaml/datastreams/segmentio_kafka_v0.yml index b55a66c9..06cb58c9 100644 --- a/internal/injector/builtin/yaml/datastreams/segmentio_kafka_v0.yml +++ b/internal/injector/builtin/yaml/datastreams/segmentio_kafka_v0.yml @@ -179,7 +179,9 @@ aspects: ddtrace: gopkg.in/DataDog/dd-trace-go.v1/ddtrace tracing: gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing tracer: gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer - fmt: fmt + # Here we pass a nil context to tracing.StartProduceSpan as the GLS modifies the context and makes the + # spans started in the for loop child of the previous ones instead of being sibling spans (which is the + # desired behavior). Until GLS supports starting sibling spans, we set the parent span manually as a workaround. template: |- {{- $w := .Function.Receiver -}} {{- $ctx := .Function.Argument 0 -}} @@ -188,18 +190,16 @@ aspects: spans := make([]ddtrace.Span, len(msgs)) __dd_initWriter(w) + var spanOpts []tracer.StartSpanOption + prevSpan, ok := tracer.SpanFromContext({{ $ctx }}) + if ok { + spanOpts = append(spanOpts, tracer.ChildOf(prevSpan.Context())) + } + for i := range msgs { - // TODO: remove this - prevSpan, ok := tracer.SpanFromContext({{ $ctx }}) - if ok { - fmt.Printf("[msg %d] found a span in the context: %v\n", i, prevSpan) - } else { - fmt.Printf("[msg %d] didn't find a span in the context\n", i) - } - // tMsg := __dd_tracingMessage(&{{ $msgs }}[i]) tWriter := __dd_tracingWriter({{ $w }}) - spans[i] = tracing.StartProduceSpan({{ $ctx }}, {{ $w }}.__dd_cfg, {{ $w }}.__dd_kafkaCfg, tWriter, tMsg) + spans[i] = tracing.StartProduceSpan(nil, {{ $w }}.__dd_cfg, {{ $w }}.__dd_kafkaCfg, tWriter, tMsg, spanOpts...) tracing.SetProduceDSMCheckpoint({{ $w }}.__dd_cfg, tMsg, tWriter) } From 8e2924790b348a12e8844cbe54fd3c104eda2fe9 Mon Sep 17 00:00:00 2001 From: Romain Marcadier Date: Thu, 26 Sep 2024 18:01:24 +0200 Subject: [PATCH 10/18] chore: update generated files --- internal/injector/builtin/generated.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/internal/injector/builtin/generated.go b/internal/injector/builtin/generated.go index 1a196409..c4ad420c 100644 --- a/internal/injector/builtin/generated.go +++ b/internal/injector/builtin/generated.go @@ -360,10 +360,9 @@ var Aspects = [...]aspect.Aspect{ )), Advice: []advice.Advice{ advice.PrependStmts(code.MustTemplate( - "{{- $w := .Function.Receiver -}}\n{{- $ctx := .Function.Argument 0 -}}\n{{- $msgs := .Function.Argument 1 -}}\n{{- $err := .Function.Result 0 -}}\nspans := make([]ddtrace.Span, len(msgs))\n__dd_initWriter(w)\nvar spanOpts []tracer.StartSpanOption\nprevSpan, ok := tracer.SpanFromContext({{ $ctx }})\nif ok {\n spanOpts = append(spanOpts, tracer.ChildOf(prevSpan.Context()))\n}\nfor i := range msgs {\n // TODO: remove this\n p, ok := tracer.SpanFromContext({{ $ctx }})\n if ok {\n fmt.Printf(\"[msg %d] found a span in the context: %v\\n\", i, p)\n } else {\n fmt.Printf(\"[msg %d] didn't find a span in the context\\n\", i)\n }\n //\n tMsg := __dd_tracingMessage(&{{ $msgs }}[i])\n tWriter := __dd_tracingWriter({{ $w }})\n spans[i] = tracing.StartProduceSpan(nil, {{ $w }}.__dd_cfg, {{ $w }}.__dd_kafkaCfg, tWriter, tMsg, spanOpts...)\n tracing.SetProduceDSMCheckpoint({{ $w }}.__dd_cfg, tMsg, tWriter)\n}\n\ndefer func() {\n for i, span := range spans {\n tracing.FinishProduceSpan(span, {{ $msgs }}[i].Partition, {{ $msgs }}[i].Offset, {{ $err }})\n }\n}()", + "{{- $w := .Function.Receiver -}}\n{{- $ctx := .Function.Argument 0 -}}\n{{- $msgs := .Function.Argument 1 -}}\n{{- $err := .Function.Result 0 -}}\nspans := make([]ddtrace.Span, len(msgs))\n__dd_initWriter(w)\n\nvar spanOpts []tracer.StartSpanOption\nprevSpan, ok := tracer.SpanFromContext({{ $ctx }})\nif ok {\n spanOpts = append(spanOpts, tracer.ChildOf(prevSpan.Context()))\n}\n\nfor i := range msgs {\n tMsg := __dd_tracingMessage(&{{ $msgs }}[i])\n tWriter := __dd_tracingWriter({{ $w }})\n spans[i] = tracing.StartProduceSpan(nil, {{ $w }}.__dd_cfg, {{ $w }}.__dd_kafkaCfg, tWriter, tMsg, spanOpts...)\n tracing.SetProduceDSMCheckpoint({{ $w }}.__dd_cfg, tMsg, tWriter)\n}\n\ndefer func() {\n for i, span := range spans {\n tracing.FinishProduceSpan(span, {{ $msgs }}[i].Partition, {{ $msgs }}[i].Offset, {{ $err }})\n }\n}()", map[string]string{ "ddtrace": "gopkg.in/DataDog/dd-trace-go.v1/ddtrace", - "fmt": "fmt", "tracer": "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer", "tracing": "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing", }, @@ -960,4 +959,4 @@ var InjectedPaths = [...]string{ } // Checksum is a checksum of the built-in configuration which can be used to invalidate caches. -const Checksum = "sha512:rVXR0iiL/DKa3O3SXjHPYDIgUbO1gafijlKtBPRg3xwQvQD6vck2BJBo9OzUytGkp3mlZn0+zz4vlOIDwAAxcQ==" +const Checksum = "sha512:VBU0ziZitiB/Rh8RWnB35f90rBoVhnoEUD3gUVuIlptdFAP2FN4HDRVe3F/j91RXhTHrKupQmJhk6EnGvU9JRw==" From 2ddefb64046b3df572dc9a92f3652e457bf5411b Mon Sep 17 00:00:00 2001 From: Rodrigo Arguello Date: Mon, 30 Sep 2024 17:12:01 +0200 Subject: [PATCH 11/18] update go.mod --- samples/go.mod | 3 + samples/go.sum | 1357 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1360 insertions(+) create mode 100644 samples/go.sum diff --git a/samples/go.mod b/samples/go.mod index 953d8ee0..f145952f 100644 --- a/samples/go.mod +++ b/samples/go.mod @@ -4,6 +4,9 @@ go 1.22.6 replace github.com/DataDog/orchestrion => ../ +// TODO: remove +replace gopkg.in/DataDog/dd-trace-go.v1 => gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240926152443-e7a15d17544d + require ( github.com/DataDog/orchestrion v0.0.0-00010101000000-000000000000 github.com/IBM/sarama v1.43.3 diff --git a/samples/go.sum b/samples/go.sum new file mode 100644 index 00000000..c617495e --- /dev/null +++ b/samples/go.sum @@ -0,0 +1,1357 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.115.1 h1:Jo0SM9cQnSkYfp44+v+NQXHpcHqlnRJk2qxh6yvxxxQ= +cloud.google.com/go v0.115.1/go.mod h1:DuujITeaufu3gL68/lOFIirVNJwQeyf5UXyi+Wbgknc= +cloud.google.com/go/auth v0.9.1 h1:+pMtLEV2k0AXKvs/tGZojuj6QaioxfUjOpMsG5Gtx+w= +cloud.google.com/go/auth v0.9.1/go.mod h1:Sw8ocT5mhhXxFklyhT12Eiy0ed6tTrPMCJjSI8KhYLk= +cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY= +cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= +cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/iam v1.2.0 h1:kZKMKVNk/IsSSc/udOb83K0hL/Yh/Gcqpz+oAkoIFN8= +cloud.google.com/go/iam v1.2.0/go.mod h1:zITGuWgsLZxd8OwAlX+eMFgZDXzBm7icj1PVTYG766Q= +cloud.google.com/go/longrunning v0.5.12 h1:5LqSIdERr71CqfUsFlJdBpOkBH8FBCFD7P1nTWy3TYE= +cloud.google.com/go/longrunning v0.5.12/go.mod h1:S5hMV8CDJ6r50t2ubVJSKQVv5u0rmik5//KgLO3k4lU= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs= +cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 h1:nyQWyZvwGTvunIMxi1Y9uXkcyr+I7TeNrr/foo4Kpk8= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0 h1:PiSrjRPpkQNjrM8H0WwKMnZUdu1RGMtd/LdGKUrOo+c= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.6.0/go.mod h1:oDrbWx4ewMylP7xHivfgixbfGBT6APAwsSoHRKotnIc= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.4.0 h1:Be6KInmFEKV81c0pOAEbRYehLMwmmGI1exuFj248AMk= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.4.0/go.mod h1:WCPBHsOXfBVnivScjs2ypRfimjEW0qPVLGgJkZlrIOA= +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+XA683u8EctwboHk= +github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= +github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/BurntSushi/locker v0.0.0-20171006230638-a6e239ea1c69 h1:+tu3HOoMXB7RXEINRVIpxJCT+KdYiI7LAEAUrOw3dIU= +github.com/BurntSushi/locker v0.0.0-20171006230638-a6e239ea1c69/go.mod h1:L1AbZdiDllfyYH5l5OkAaZtk7VkWe89bPJFmnDBNHxg= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= +github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/appsec-internal-go v1.7.0 h1:iKRNLih83dJeVya3IoUfK+6HLD/hQsIbyBlfvLmAeb0= +github.com/DataDog/appsec-internal-go v1.7.0/go.mod h1:wW0cRfWBo4C044jHGwYiyh5moQV2x0AhnwqMuiX7O/g= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.56.0 h1:UdBCkJ1a4uxQNzggUEEbPylagIUaCWvFDxuf9QKWMXE= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.56.0/go.mod h1:NHgTieB5DpTc4AZrzx1xE+tPCWTJ7Hw3TVRiWuK505U= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0 h1:LplNAmMgZvGU7kKA0+4c1xWOjz828xweW5TCi8Mw9Q0= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0/go.mod h1:4Vo3SJ24uzfKHUHLoFa8t8o+LH+7TCQ7sPcZDtOpSP4= +github.com/DataDog/datadog-go/v5 v5.5.0 h1:G5KHeB8pWBNXT4Jtw0zAkhdxEAWSpWH00geHI6LDrKU= +github.com/DataDog/datadog-go/v5 v5.5.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v3 v3.4.0 h1:NJ2W2vhYaOm1OWr1LJCbdgp7ezG/XLJcQKBmjFwhSuM= +github.com/DataDog/go-libddwaf/v3 v3.4.0/go.mod h1:n98d9nZ1gzenRSk53wz8l6d34ikxS+hs62A31Fqmyi4= +github.com/DataDog/go-sqllexer v0.0.14 h1:xUQh2tLr/95LGxDzLmttLgTo/1gzFeOyuwrQa/Iig4Q= +github.com/DataDog/go-sqllexer v0.0.14/go.mod h1:KwkYhpFEVIq+BfobkTC1vfqm4gTi65skV/DpDBXtexc= +github.com/DataDog/go-tuf v1.1.0-0.5.2 h1:4CagiIekonLSfL8GMHRHcHudo1fQnxELS9g4tiAupQ4= +github.com/DataDog/go-tuf v1.1.0-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.6 h1:acd5fb+QdUzGrosfNLwrIhqyrbMORpvBy7mE+vHlT3I= +github.com/DataDog/sketches-go v1.4.6/go.mod h1:7Y8GN8Jf66DLyDhc94zuWA3uHEt/7ttt8jHOBWWrSOg= +github.com/IBM/sarama v1.43.3 h1:Yj6L2IaNvb2mRBop39N7mmJAHBVY3dTPncr3qGVkxPA= +github.com/IBM/sarama v1.43.3/go.mod h1:FVIRaLrhK3Cla/9FfRF5X9Zua2KpS3SYIXxhac1H+FQ= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= +github.com/Shopify/sarama v1.38.1 h1:lqqPUPQZ7zPqYlWpTh+LQ9bhYNu2xJL6k1SJN4WVe2A= +github.com/Shopify/sarama v1.38.1/go.mod h1:iwv9a67Ha8VNa+TifujYoWGxWnu2kNVAQdSdZ4X2o5g= +github.com/Shopify/toxiproxy/v2 v2.5.0 h1:i4LPT+qrSlKNtQf5QliVjdP08GyAH8+BUIc9gT0eahc= +github.com/Shopify/toxiproxy/v2 v2.5.0/go.mod h1:yhM2epWtAmel9CB8r2+L+PCmhH6yH2pITaPAo7jxJl0= +github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794 h1:xlwdaKcTNVW4PtpQb8aKA4Pjy0CdJHEqvFbAnvR5m2g= +github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= +github.com/alecthomas/assert/v2 v2.7.0 h1:QtqSACNS3tF7oasA8CU6A6sXZSBDqnm7RfpLl9bZqbE= +github.com/alecthomas/assert/v2 v2.7.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= +github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E= +github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I= +github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= +github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= +github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= +github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/armon/go-radix v1.0.1-0.20221118154546-54df44f2176c h1:651/eoCRnQ7YtSjAnSzRucrJz+3iGEFt+ysraELS81M= +github.com/armon/go-radix v1.0.1-0.20221118154546-54df44f2176c/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go-v2 v1.30.4 h1:frhcagrVNrzmT95RJImMHgabt99vkXGslubDaDagTk8= +github.com/aws/aws-sdk-go-v2 v1.30.4/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 h1:70PVAiL15/aBMh5LThwgXdSQorVr91L127ttckI9QQU= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4/go.mod h1:/MQxMqci8tlqDH+pjmoLu1i0tbWCUP1hhyMRuFxpQCw= +github.com/aws/aws-sdk-go-v2/config v1.27.30 h1:AQF3/+rOgeJBQP3iI4vojlPib5X6eeOYoa/af7OxAYg= +github.com/aws/aws-sdk-go-v2/config v1.27.30/go.mod h1:yxqvuubha9Vw8stEgNiStO+yZpP68Wm9hLmcm+R/Qk4= +github.com/aws/aws-sdk-go-v2/credentials v1.17.29 h1:CwGsupsXIlAFYuDVHv1nnK0wnxO0wZ/g1L8DSK/xiIw= +github.com/aws/aws-sdk-go-v2/credentials v1.17.29/go.mod h1:BPJ/yXV92ZVq6G8uYvbU0gSl8q94UB63nMT5ctNO38g= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.12 h1:yjwoSyDZF8Jth+mUk5lSPJCkMC0lMy6FaCD51jm6ayE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.12/go.mod h1:fuR57fAgMk7ot3WcNQfb6rSEn+SUffl7ri+aa8uKysI= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.14 h1:dQa4KkoEVgk3oLL9IeoW9qrXijyQ6lWa+DX6Vn32Lhw= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.14/go.mod h1:aRKW0B+zH8J6cz3FFiQ9JbUQc7UroLx6lwfvNqIsPOs= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.16 h1:TNyt/+X43KJ9IJJMjKfa3bNTiZbUP7DeCxfbTROESwY= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.16/go.mod h1:2DwJF39FlNAUiX5pAc0UNeiz16lK2t7IaFcm0LFHEgc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.16 h1:jYfy8UPmd+6kJW5YhY0L1/KftReOGxI/4NtVSTh9O/I= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.16/go.mod h1:7ZfEPZxkW42Afq4uQB8H2E2e6ebh6mXTueEpYzjCzcs= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.16 h1:mimdLQkIX1zr8GIPY1ZtALdBQGxcASiBd2MOp8m/dMc= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.16/go.mod h1:YHk6owoSwrIsok+cAH9PENCOGoH5PU2EllX4vLtSrsY= +github.com/aws/aws-sdk-go-v2/service/cloudfront v1.38.5 h1:t7ZIhyAbD9zDH7rzEuUIagnPz6dJRB8HesgygHUbpsc= +github.com/aws/aws-sdk-go-v2/service/cloudfront v1.38.5/go.mod h1:Jnkkf+olxCcacqhQIjY8BlG4JL2/ZsPLsiBh6xnNsu4= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.34.6 h1:LKZuRTlh8RszjuWcUwEDvCGwjx5olHPp6ZOepyZV5p8= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.34.6/go.mod h1:s2fYaueBuCnwv1XQn6T8TfShxJWusv5tWPMcL+GY6+g= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.176.0 h1:fWhkSvaQqa5eWiRwBw10FUnk1YatAQ9We4GdGxKiCtg= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.176.0/go.mod h1:ISODge3zgdwOEa4Ou6WM9PKbxJWJ15DYKnr2bfmCAIA= +github.com/aws/aws-sdk-go-v2/service/eventbridge v1.33.5 h1:wL8V4pdudr0mHbZ/tj9YacfRak5klKz9omV0uXBt5Sk= +github.com/aws/aws-sdk-go-v2/service/eventbridge v1.33.5/go.mod h1:AudiowtxywCESLsT3fvGcAEEcN4l7nusiW2nZMaCo+g= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.18 h1:GckUnpm4EJOAio1c8o25a+b3lVfwVzC9gnSBqiiNmZM= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.18/go.mod h1:Br6+bxfG33Dk3ynmkhsW2Z/t9D4+lRqdLDNCKi85w0U= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.17 h1:HDJGz1jlV7RokVgTPfx1UHBHANC0N5Uk++xgyYgz5E0= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.17/go.mod h1:5szDu6TWdRDytfDxUQVv2OYfpTQMKApVFyqpm+TcA98= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.18 h1:tJ5RnkHCiSH0jyd6gROjlJtNwov0eGYNz8s8nFcR0jQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.18/go.mod h1:++NHzT+nAF7ZPrHPsA+ENvsXkOO8wEu+C6RXltAG4/c= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.16 h1:jg16PhLPUiHIj8zYIW6bqzeQSuHVEiWnGA0Brz5Xv2I= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.16/go.mod h1:Uyk1zE1VVdsHSU7096h/rwnXDzOzYQVl+FNPhPw7ShY= +github.com/aws/aws-sdk-go-v2/service/kinesis v1.29.5 h1:iirGMva2IXw4kcqsvuF+uc8ARweuVqoQJjzRZGaiV1E= +github.com/aws/aws-sdk-go-v2/service/kinesis v1.29.5/go.mod h1:pKTvEQz1PcNd+gKArVyeHpVM63AWnFqYyg07WAQQANQ= +github.com/aws/aws-sdk-go-v2/service/s3 v1.60.1 h1:mx2ucgtv+MWzJesJY9Ig/8AFHgoE5FwLXwUVgW/FGdI= +github.com/aws/aws-sdk-go-v2/service/s3 v1.60.1/go.mod h1:BSPI0EfnYUuNHPS0uqIo5VrRwzie+Fp+YhQOUs16sKI= +github.com/aws/aws-sdk-go-v2/service/sfn v1.30.2 h1:FO9wG1mXg1tb8iizrN5+t5NR2Tu5Mo+KJ7u2TlhWxPI= +github.com/aws/aws-sdk-go-v2/service/sfn v1.30.2/go.mod h1:jIKXvGI0iFk5QXBW8FntPO/tqdmfC3OS0Z38twH9a08= +github.com/aws/aws-sdk-go-v2/service/sns v1.31.5 h1:q8R1hxwOHE4e6TInafToa8AHTLQpJrxWXYk7GINJoyw= +github.com/aws/aws-sdk-go-v2/service/sns v1.31.5/go.mod h1:wDacBq+NshhM8KhdysbM4wRFxVyghyj7AAI+l8+o9f0= +github.com/aws/aws-sdk-go-v2/service/sqs v1.34.5 h1:HYyVDOC2/PIg+3oBX1q0wtDU5kONki6lrgIG0afrBkY= +github.com/aws/aws-sdk-go-v2/service/sqs v1.34.5/go.mod h1:7idt3XszF6sE9WPS1GqZRiDJOxw4oPtlRBXodWnCGjU= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.5 h1:zCsFCKvbj25i7p1u94imVoO447I/sFv8qq+lGJhRN0c= +github.com/aws/aws-sdk-go-v2/service/sso v1.22.5/go.mod h1:ZeDX1SnKsVlejeuz41GiajjZpRSWR7/42q/EyA/QEiM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.5 h1:SKvPgvdvmiTWoi0GAJ7AsJfOz3ngVkD/ERbs5pUnHNI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.5/go.mod h1:20sz31hv/WsPa3HhU3hfrIet2kxM4Pe0r20eBZ20Tac= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.5 h1:OMsEmCyz2i89XwRwPouAJvhj81wINh+4UK+k/0Yo/q8= +github.com/aws/aws-sdk-go-v2/service/sts v1.30.5/go.mod h1:vmSqFK+BVIwVpDAGZB3CoCXHzurt4qBE8lf+I/kRTh0= +github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4= +github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= +github.com/bep/clocks v0.5.0 h1:hhvKVGLPQWRVsBP/UB7ErrHYIO42gINVbvqxvYTPVps= +github.com/bep/clocks v0.5.0/go.mod h1:SUq3q+OOq41y2lRQqH5fsOoxN8GbxSiT6jvoVVLCVhU= +github.com/bep/debounce v1.2.0/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= +github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= +github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= +github.com/bep/gitmap v1.6.0 h1:sDuQMm9HoTL0LtlrfxjbjgAg2wHQd4nkMup2FInYzhA= +github.com/bep/gitmap v1.6.0/go.mod h1:n+3W1f/rot2hynsqEGxGMErPRgT41n9CkGuzPvz9cIw= +github.com/bep/goat v0.5.0 h1:S8jLXHCVy/EHIoCY+btKkmcxcXFd34a0Q63/0D4TKeA= +github.com/bep/goat v0.5.0/go.mod h1:Md9x7gRxiWKs85yHlVTvHQw9rg86Bm+Y4SuYE8CTH7c= +github.com/bep/godartsass v1.2.0 h1:E2VvQrxAHAFwbjyOIExAMmogTItSKodoKuijNrGm5yU= +github.com/bep/godartsass v1.2.0/go.mod h1:6LvK9RftsXMxGfsA0LDV12AGc4Jylnu6NgHL+Q5/pE8= +github.com/bep/godartsass/v2 v2.1.0 h1:fq5Y1xYf4diu4tXABiekZUCA+5l/dmNjGKCeQwdy+s0= +github.com/bep/godartsass/v2 v2.1.0/go.mod h1:AcP8QgC+OwOXEq6im0WgDRYK7scDsmZCEW62o1prQLo= +github.com/bep/golibsass v1.1.1 h1:xkaet75ygImMYjM+FnHIT3xJn7H0xBA9UxSOJjk8Khw= +github.com/bep/golibsass v1.1.1/go.mod h1:DL87K8Un/+pWUS75ggYv41bliGiolxzDKWJAq3eJ1MA= +github.com/bep/gowebp v0.4.0 h1:QihuVnvIKbRoeBNQkN0JPMM8ClLmD6V2jMftTFwSK3Q= +github.com/bep/gowebp v0.4.0/go.mod h1:95gtYkAA8iIn1t3HkAPurRCVGV/6NhgaHJ1urz0iIwc= +github.com/bep/helpers v0.4.0 h1:ab9veaAiWY4ST48Oxp5usaqivDmYdB744fz+tcZ3Ifs= +github.com/bep/helpers v0.4.0/go.mod h1:/QpHdmcPagDw7+RjkLFCvnlUc8lQ5kg4KDrEkb2Yyco= +github.com/bep/imagemeta v0.8.1 h1:tjZLPRftjxU7PTI87o5e5WKOFQ4S9S0engiP1OTpJTI= +github.com/bep/imagemeta v0.8.1/go.mod h1:5piPAq5Qomh07m/dPPCLN3mDJyFusvUG7VwdRD/vX0s= +github.com/bep/lazycache v0.5.0 h1:9FJRrEp/s3BUpGEfTvLhmv50N4dXzoZnyRPU6NOUv0w= +github.com/bep/lazycache v0.5.0/go.mod h1:NmRm7Dexh3pmR1EignYR8PjO2cWybFQ68+QgY3VMCSc= +github.com/bep/logg v0.4.0 h1:luAo5mO4ZkhA5M1iDVDqDqnBBnlHjmtZF6VAyTp+nCQ= +github.com/bep/logg v0.4.0/go.mod h1:Ccp9yP3wbR1mm++Kpxet91hAZBEQgmWgFgnXX3GkIV0= +github.com/bep/mclib v1.20400.20402 h1:olpCE2WSPpOAbFE1R4hnftSEmQ34+xzy2HRzd0m69rA= +github.com/bep/mclib v1.20400.20402/go.mod h1:pkrk9Kyfqg34Uj6XlDq9tdEFJBiL1FvCoCgVKRzw1EY= +github.com/bep/overlayfs v0.9.2 h1:qJEmFInsW12L7WW7dOTUhnMfyk/fN9OCDEO5Gr8HSDs= +github.com/bep/overlayfs v0.9.2/go.mod h1:aYY9W7aXQsGcA7V9x/pzeR8LjEgIxbtisZm8Q7zPz40= +github.com/bep/simplecobra v0.4.0 h1:ufX/6WcOtEVJdCd7hsztTWURlZkOaWYOD+zCqrM8qUE= +github.com/bep/simplecobra v0.4.0/go.mod h1:evSM6iQqRwqpV7W4H4DlYFfe9mZ0x6Hj5GEOnIV7dI4= +github.com/bep/tmc v0.5.1 h1:CsQnSC6MsomH64gw0cT5f+EwQDcvZz4AazKunFwTpuI= +github.com/bep/tmc v0.5.1/go.mod h1:tGYHN8fS85aJPhDLgXETVKp+PR382OvFi2+q2GkGsq0= +github.com/bep/workers v1.0.0 h1:U+H8YmEaBCEaFZBst7GcRVEoqeRC9dzH2dWOwGmOchg= +github.com/bep/workers v1.0.0/go.mod h1:7kIESOB86HfR2379pwoMWNy8B50D7r99fRLUyPSNyCs= +github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= +github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= +github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/bytedance/sonic v1.12.1 h1:jWl5Qz1fy7X1ioY74WqO0KjAMtAGQs4sYnjiEBiyX24= +github.com/bytedance/sonic v1.12.1/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM= +github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/cenkalti/backoff/v3 v3.2.2 h1:cfUAAO3yvKMYKPrvhDuHSwQnhZNk/RMHKdZqKTxfm6M= +github.com/cenkalti/backoff/v3 v3.2.2/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charmbracelet/lipgloss v0.13.0 h1:4X3PPeoWEDCMvzDvGmTajSyYPcZM4+y8sCA/SsA3cjw= +github.com/charmbracelet/lipgloss v0.13.0/go.mod h1:nw4zy0SBX/F/eAO1cWdcvy6qnkDUxr8Lw7dvFrAIbbY= +github.com/charmbracelet/x/ansi v0.2.3 h1:VfFN0NUpcjBRd4DnKfRaIRo53KRgey/nhOoEqosGDEY= +github.com/charmbracelet/x/ansi v0.2.3/go.mod h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME= +github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s= +github.com/cli/safeexec v1.0.0/go.mod h1:Z/D4tTN8Vs5gXYHDCbaM1S/anmEDnJb1iW0+EJ5zx3Q= +github.com/cli/safeexec v1.0.1 h1:e/C79PbXF4yYTN/wauC4tviMxEV13BwljGj0N9j+N00= +github.com/cli/safeexec v1.0.1/go.mod h1:Z/D4tTN8Vs5gXYHDCbaM1S/anmEDnJb1iW0+EJ5zx3Q= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/dave/dst v0.27.3 h1:P1HPoMza3cMEquVf9kKy8yXsFirry4zEnWOdYPOoIzY= +github.com/dave/dst v0.27.3/go.mod h1:jHh6EOibnHgcUW3WjKHisiooEkYwqpHLBSX1iOBhEyc= +github.com/dave/jennifer v1.7.0 h1:uRbSBH9UTS64yXbh4FrMHfgfY762RD+C7bUPKODpSJE= +github.com/dave/jennifer v1.7.0/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +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/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/denisenkom/go-mssqldb v0.11.0 h1:9rHa233rhdOyrz2GcP9NM+gi2psgJZ4GWDpL/7ND8HI= +github.com/denisenkom/go-mssqldb v0.11.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +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/disintegration/gift v1.2.1 h1:Y005a1X4Z7Uc+0gLpSAsKhWi4qLtsdEcMIbbdvdZ6pc= +github.com/disintegration/gift v1.2.1/go.mod h1:Jh2i7f7Q2BM7Ezno3PhfezbR1xpUg9dUg3/RlKGr4HI= +github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo= +github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/eapache/go-resiliency v1.7.0 h1:n3NRTnBn5N0Cbi/IeOHuQn9s2UwVUH7Ga0ZWcP+9JTA= +github.com/eapache/go-resiliency v1.7.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= +github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4ALJ04o5Qqpdz8XLIpNA3WM/iSIXqxtqo7UGVws= +github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= +github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/eapache/queue/v2 v2.0.0-20230407133247-75960ed334e4 h1:8EXxF+tCLqaVk8AOC29zl2mnhQjwyLxxOTuhUazWRsg= +github.com/eapache/queue/v2 v2.0.0-20230407133247-75960ed334e4/go.mod h1:I5sHm0Y0T1u5YjlyqC5GVArM7aNZRUYtTjmJ8mPJFds= +github.com/ebitengine/purego v0.7.1 h1:6/55d26lG3o9VCZX8lping+bZcmShseiqlh2bnUDiPA= +github.com/ebitengine/purego v0.7.1/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= +github.com/emicklei/go-restful v2.16.0+incompatible h1:rgqiKNjTnFQA6kkhFe16D8epTksy9HQ1MyrbDXSdYhM= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= +github.com/evanw/esbuild v0.23.1 h1:ociewhY6arjTarKLdrXfDTgy25oxhTZmzP8pfuBTfTA= +github.com/evanw/esbuild v0.23.1/go.mod h1:D2vIQZqV/vIf/VRHtViaUtViZmG7o+kKmlBfVQuRi48= +github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= +github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/frankban/quicktest v1.4.1/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= +github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= +github.com/frankban/quicktest v1.13.0/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/r/VLSOOIySU= +github.com/frankban/quicktest v1.14.2/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/gabriel-vasile/mimetype v1.4.5 h1:J7wGKdGu33ocBOhGy0z653k/lFKLFDPJMG8Gql0kxn4= +github.com/gabriel-vasile/mimetype v1.4.5/go.mod h1:ibHel+/kbxn9x2407k1izTA1S81ku1z/DlgOW2QE0M4= +github.com/getkin/kin-openapi v0.127.0 h1:Mghqi3Dhryf3F8vR370nN67pAERW+3a95vomb3MAREY= +github.com/getkin/kin-openapi v0.127.0/go.mod h1:OZrfXzUfGrNbsKj+xmFBx6E5c6yH3At/tAKSc2UszXM= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.10.0 h1:nTuyha1TYqgedzytsKYqna+DfLos46nTv2ygFy86HFU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/go-chi/chi v1.5.5 h1:vOB/HbEMt9QqBqErz07QehcOKHaWFtuj87tTDVz2qXE= +github.com/go-chi/chi v1.5.5/go.mod h1:C9JqLr3tIYjDOZpzn+BCuxY8z8vmca43EeMgyZt7irw= +github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= +github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-jose/go-jose/v4 v4.0.4 h1:VsjPI33J0SB9vQM6PLmNjoHqMQNGPiZ0rHL7Ni7Q6/E= +github.com/go-jose/go-jose/v4 v4.0.4/go.mod h1:NKb5HO1EZccyMpiZNbdUw/14tiXNyUJh188dfnMCAfc= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.22.0 h1:k6HsTZ0sTnROkhS//R0O+55JgM8C4Bx7ia+JlgcnOao= +github.com/go-playground/validator/v10 v10.22.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-redis/redis/v7 v7.4.1 h1:PASvf36gyUpr2zdOUS/9Zqc80GbM+9BDyiJSJDDOrTI= +github.com/go-redis/redis/v7 v7.4.1/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= +github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/gobuffalo/flect v1.0.2 h1:eqjPGSo2WmjgY2XlpGwo2NXgL3RucAKo4k4qQMNA5sA= +github.com/gobuffalo/flect v1.0.2/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU= +github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= +github.com/gofiber/fiber/v2 v2.52.5 h1:tWoP1MJQjGEe4GB5TUGOi7P2E0ZMMRx5ZTG4rT+yGMo= +github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/gohugoio/go-i18n/v2 v2.1.3-0.20230805085216-e63c13218d0e h1:QArsSubW7eDh8APMXkByjQWvuljwPGAGQpJEFn0F0wY= +github.com/gohugoio/go-i18n/v2 v2.1.3-0.20230805085216-e63c13218d0e/go.mod h1:3Ltoo9Banwq0gOtcOwxuHG6omk+AwsQPADyw2vQYOJQ= +github.com/gohugoio/hashstructure v0.1.0 h1:kBSTMLMyTXbrJVAxaKI+wv30MMJJxn9Q8kfQtJaZ400= +github.com/gohugoio/hashstructure v0.1.0/go.mod h1:8ohPTAfQLTs2WdzB6k9etmQYclDUeNsIHGPAFejbsEA= +github.com/gohugoio/httpcache v0.7.0 h1:ukPnn04Rgvx48JIinZvZetBfHaWE7I01JR2Q2RrQ3Vs= +github.com/gohugoio/httpcache v0.7.0/go.mod h1:fMlPrdY/vVJhAriLZnrF5QpN3BNAcoBClgAyQd+lGFI= +github.com/gohugoio/hugo v0.133.0 h1:1xjHfWI3EkJT77vZbRpqVlBtU3SPKsYdUfYZiipAuSM= +github.com/gohugoio/hugo v0.133.0/go.mod h1:3RW3N2f3lqkpjIWKoKYeyKgIe+z6UdU5uVCJpYJH08k= +github.com/gohugoio/hugo-goldmark-extensions/extras v0.2.0 h1:MNdY6hYCTQEekY0oAfsxWZU1CDt6iH+tMLgyMJQh/sg= +github.com/gohugoio/hugo-goldmark-extensions/extras v0.2.0/go.mod h1:oBdBVuiZ0fv9xd8xflUgt53QxW5jOCb1S+xntcN4SKo= +github.com/gohugoio/hugo-goldmark-extensions/passthrough v0.3.0 h1:7PY5PIJ2mck7v6R52yCFvvYHvsPMEbulgRviw3I9lP4= +github.com/gohugoio/hugo-goldmark-extensions/passthrough v0.3.0/go.mod h1:r8g5S7bHfdj0+9ShBog864ufCsVODKQZNjYYY8OnJpM= +github.com/gohugoio/locales v0.14.0 h1:Q0gpsZwfv7ATHMbcTNepFd59H7GoykzWJIxi113XGDc= +github.com/gohugoio/locales v0.14.0/go.mod h1:ip8cCAv/cnmVLzzXtiTpPwgJ4xhKZranqNqtoIu0b/4= +github.com/gohugoio/localescompressed v1.0.1 h1:KTYMi8fCWYLswFyJAeOtuk/EkXR/KPTHHNN9OS+RTxo= +github.com/gohugoio/localescompressed v1.0.1/go.mod h1:jBF6q8D7a0vaEmcWPNcAjUZLJaIVNiwvM3WlmTvooB0= +github.com/gohugoio/testmodBuilder/mods v0.0.0-20190520184928-c56af20f2e95 h1:sgew0XCnZwnzpWxTt3V8LLiCO7OQi3C6dycaE67wfkU= +github.com/gohugoio/testmodBuilder/mods v0.0.0-20190520184928-c56af20f2e95/go.mod h1:bOlVlCa1/RajcHpXkrUXPSHB/Re1UnlXxD1Qp8SKOd8= +github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v1.9.2 h1:HrutZBLhSIU8abiSfW8pj8mPhOyMYjZT/wcA4/L9L9s= +github.com/gomodule/redigo v1.9.2/go.mod h1:KsU3hiK/Ay8U42qpaJk+kuNa3C+spxapWpM+ywhcgtw= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-licenses/v2 v2.0.0-alpha.1 h1:2EMzW/1PWYvgOxBXsWl7b350vI0c/kf5Fh7z4AR1skM= +github.com/google/go-licenses/v2 v2.0.0-alpha.1/go.mod h1:HlMUpsa+mbs8EqdlY0BDfCn0ZK7Y7NQoRCGYhNoox64= +github.com/google/go-replayers/grpcreplay v1.3.0 h1:1Keyy0m1sIpqstQmgz307zhiJ1pV4uIlFds5weTmxbo= +github.com/google/go-replayers/grpcreplay v1.3.0/go.mod h1:v6NgKtkijC0d3e3RW8il6Sy5sqRVUwoQa4mHOGEy8DI= +github.com/google/go-replayers/httpreplay v1.2.0 h1:VM1wEyyjaoU53BwrOnaf9VhAyQQEEioJvFYxYcLRKzk= +github.com/google/go-replayers/httpreplay v1.2.0/go.mod h1:WahEFFZZ7a1P4VM1qEeHy+tME4bwyqPcwWbNlUI1Mcg= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/licenseclassifier/v2 v2.0.0 h1:1Y57HHILNf4m0ABuMVb6xk4vAJYEUO0gDxNpog0pyeA= +github.com/google/licenseclassifier/v2 v2.0.0/go.mod h1:cOjbdH0kyC9R22sdQbYsFkto4NGCAc+ZSwbeThazEtM= +github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +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-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k= +github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= +github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +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/google/wire v0.6.0 h1:HBkoIh4BdSxoyo9PveV8giw7ZsaBOvzWKfcg/6MrVwI= +github.com/google/wire v0.6.0/go.mod h1:F4QhpQ9EDIdJ1Mbop/NZBRB+5yrR6qg3BnctaoUk6NA= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= +github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +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/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= +github.com/hairyhenderson/go-codeowners v0.5.0 h1:dpQB+hVHiRc2VVvc2BHxkuM+tmu9Qej/as3apqUbsWc= +github.com/hairyhenderson/go-codeowners v0.5.0/go.mod h1:R3uW1OQXEj2Gu6/OvZ7bt6hr0qdkLvUWPiqNaWnexpo= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= +github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= +github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-secure-stdlib/parseutil v0.1.8 h1:iBt4Ew4XEGLfh6/bPk4rSYmuZJGizr6/x/AEizP0CQc= +github.com/hashicorp/go-secure-stdlib/parseutil v0.1.8/go.mod h1:aiJI+PIApBRQG7FZTEBx5GiiX+HbOHilUdNxUZi4eV0= +github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts= +github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= +github.com/hashicorp/go-sockaddr v1.0.6 h1:RSG8rKU28VTUTvEKghe5gIhIQpv8evvNpnDEyqO4u9I= +github.com/hashicorp/go-sockaddr v1.0.6/go.mod h1:uoUUmtwU7n9Dv3O4SNLeFvg0SxQ3lyjsj6+CCykpaxI= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM= +github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= +github.com/hashicorp/vault/api v1.14.0 h1:Ah3CFLixD5jmjusOgm8grfN9M0d+Y8fVR2SW0K6pJLU= +github.com/hashicorp/vault/api v1.14.0/go.mod h1:pV9YLxBGSz+cItFDd8Ii4G17waWOQ32zVjMWHe/cOqk= +github.com/hashicorp/vault/sdk v0.13.0 h1:UmcLF+7r70gy1igU44Suflgio30P2GOL4MkHPhJuiP8= +github.com/hashicorp/vault/sdk v0.13.0/go.mod h1:LxhNTWRG99mXg9xijBCnCnIus+brLC5uFsQUQ4zgOnU= +github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/invopop/yaml v0.3.1 h1:f0+ZpmhfBSS4MhG+4HYseMdJhoeeopbSKbq5Rpeelso= +github.com/invopop/yaml v0.3.1/go.mod h1:PMOp3nn4/12yEZUFfmOuNHJsZToEEOwoWsT+D81KkeA= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY= +github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jdkato/prose v1.2.1 h1:Fp3UnJmLVISmlc57BgKUzdjr0lOtjqTZicL3PaYy6cU= +github.com/jdkato/prose v1.2.1/go.mod h1:AiRHgVagnEx2JbQRQowVBKjG0bcs/vtkGCH1dYAL1rA= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jinzhu/gorm v1.9.16 h1:+IyIjPEABKRpsu/F8OvDPy9fyQlgsg2luMV2ZIH5i5o= +github.com/jinzhu/gorm v1.9.16/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/kyokomi/emoji/v2 v2.2.13 h1:GhTfQa67venUUvmleTNFnb+bi7S3aocF7ZCXU9fSO7U= +github.com/kyokomi/emoji/v2 v2.2.13/go.mod h1:JUcn42DTdsXJo1SWanHh4HKDEyPaR5CqkmoirZZP9qE= +github.com/labstack/echo/v4 v4.12.0 h1:IKpw49IMryVB2p1a4dzwlhP1O2Tf2E0Ir/450lH+kI0= +github.com/labstack/echo/v4 v4.12.0/go.mod h1:UP9Cr2DJXbOK3Kr9ONYzNowSh7HP0aG0ShAyycHSJvM= +github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= +github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lufia/plan9stats v0.0.0-20240819163618-b1d8f4d146e7 h1:5RK988zAqB3/AN3opGfRpoQgAVqr6/A5+qRTi67VUZY= +github.com/lufia/plan9stats v0.0.0-20240819163618-b1d8f4d146e7/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= +github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= +github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/makeworld-the-better-one/dither/v2 v2.4.0 h1:Az/dYXiTcwcRSe59Hzw4RI1rSnAZns+1msaCXetrMFE= +github.com/makeworld-the-better-one/dither/v2 v2.4.0/go.mod h1:VBtN8DXO7SNtyGmLiGA7IsFeKrBkQPze1/iAeM95arc= +github.com/marekm4/color-extractor v1.2.1 h1:3Zb2tQsn6bITZ8MBVhc33Qn1k5/SEuZ18mrXGUqIwn0= +github.com/marekm4/color-extractor v1.2.1/go.mod h1:90VjmiHI6M8ez9eYUaXLdcKnS+BAOp7w+NpwBdkJmpA= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/microsoft/go-mssqldb v0.21.0 h1:p2rpHIL7TlSv1QrbXJUAcbyRKnIT0C9rRkH2E4OjLn8= +github.com/microsoft/go-mssqldb v0.21.0/go.mod h1:+4wZTUnz/SV6nffv+RRRB/ss8jPng5Sho2SmM1l2ts4= +github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= +github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= +github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/montanaflynn/stats v0.6.3/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= +github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/muesli/smartcrop v0.3.0 h1:JTlSkmxWg/oQ1TcLDoypuirdE8Y/jzNirQeLkxpA6Oc= +github.com/muesli/smartcrop v0.3.0/go.mod h1:i2fCI/UorTfgEpPPLWiFBv4pye+YAG78RwcQLUkocpI= +github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo= +github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/nats-io/jwt/v2 v2.5.8 h1:uvdSzwWiEGWGXf+0Q+70qv6AQdvcvxrv9hPM0RiPamE= +github.com/nats-io/jwt/v2 v2.5.8/go.mod h1:ZdWS1nZa6WMZfFwwgpEaqBV8EPGVgOTDHN/wTbz0Y5A= +github.com/nats-io/nats-server/v2 v2.10.18 h1:tRdZmBuWKVAFYtayqlBB2BuCHNGAQPvoQIXOKwU3WSM= +github.com/nats-io/nats-server/v2 v2.10.18/go.mod h1:97Qyg7YydD8blKlR8yBsUlPlWyZKjA7Bp5cl3MUE9K8= +github.com/nats-io/nats.go v1.37.0 h1:07rauXbVnnJvv1gfIyghFEo6lUcYRY0WXc3x7x0vUxE= +github.com/nats-io/nats.go v1.37.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8= +github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI= +github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/neurosnap/sentences v1.0.6/go.mod h1:pg1IapvYpWCJJm/Etxeh0+gtMf1rI1STY9S7eUCPbDc= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= +github.com/niklasfasching/go-org v1.7.0 h1:vyMdcMWWTe/XmANk19F4k8XGBYg0GQ/gJGMimOjGMek= +github.com/niklasfasching/go-org v1.7.0/go.mod h1:WuVm4d45oePiE0eX25GqTDQIt/qPW1T9DGkRscqLW5o= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.31.0 h1:54UJxxj6cPInHS3a35wm6BK/F9nHYueZ1NVujHDrnXE= +github.com/onsi/gomega v1.31.0/go.mod h1:DW9aCi7U6Yi40wNVAvT6kzFnEVEI5n3DloYBiKiT6zk= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= +github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= +github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks= +github.com/otiai10/mint v1.5.1/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= +github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= +github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= +github.com/philhofer/fwd v1.1.3-0.20240612014219-fbbf4953d986 h1:jYi87L8j62qkXzaYHAQAhEapgukhenIMZRBKTNRLHJ4= +github.com/philhofer/fwd v1.1.3-0.20240612014219-fbbf4953d986/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +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/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +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= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= +github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/redis/go-redis/v9 v9.6.1 h1:HHDteefn6ZkTtY5fGUE8tj8uy85AHk6zP7CpzIAM0y4= +github.com/redis/go-redis/v9 v9.6.1/go.mod h1:0C0c6ycQsdpVNQpxb1njEQIqkx5UcsM8FJCQLgE9+RA= +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/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd h1:CmH9+J6ZSsIjUK3dcGsnCnO41eRBOnY12zwkn5qVwgc= +github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= +github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= +github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo= +github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U= +github.com/secure-systems-lab/go-securesystemslib v0.8.0 h1:mr5An6X45Kb2nddcFlbmfHkLguCE9laoZCUzEEpIZXA= +github.com/secure-systems-lab/go-securesystemslib v0.8.0/go.mod h1:UH2VZVuJfCYR8WgMlCU1uFsOUU+KeyrTWcSS73NBOzU= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= +github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= +github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= +github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= +github.com/shogo82148/go-shuffle v0.0.0-20180218125048-27e6095f230d/go.mod h1:2htx6lmL0NGLHlO8ZCf+lQBGBHIbEujyywxJArf+2Yc= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w= +github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= +github.com/spf13/fsync v0.10.1 h1:JRnB7G72b+gIBaBcpn5ibJSd7ww1iEahXSX2B8G6dSE= +github.com/spf13/fsync v0.10.1/go.mod h1:y+B41vYq5i6Boa3Z+BVoPbDeOvxVkNU5OBXhoT8i4TQ= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +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= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tdewolff/minify/v2 v2.20.37 h1:Q97cx4STXCh1dlWDlNHZniE8BJ2EBL0+2b0n92BJQhw= +github.com/tdewolff/minify/v2 v2.20.37/go.mod h1:L1VYef/jwKw6Wwyk5A+T0mBjjn3mMPgmjjA688RNsxU= +github.com/tdewolff/parse/v2 v2.7.15 h1:hysDXtdGZIRF5UZXwpfn3ZWRbm+ru4l53/ajBRGpCTw= +github.com/tdewolff/parse/v2 v2.7.15/go.mod h1:3FbJWZp3XT9OWVN3Hmfp0p/a08v4h8J9W1aghka0soA= +github.com/tdewolff/test v1.0.11-0.20231101010635-f1265d231d52/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= +github.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739 h1:IkjBCtQOOjIn03u/dMQK9g+Iw9ewps4mCl1nB8Sscbo= +github.com/tdewolff/test v1.0.11-0.20240106005702-7de5f7df4739/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8= +github.com/tetratelabs/wazero v1.8.0 h1:iEKu0d4c2Pd+QSRieYbnQC9yiFlMS9D+Jr0LsRmcF4g= +github.com/tetratelabs/wazero v1.8.0/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs= +github.com/tinylib/msgp v1.2.1 h1:6ypy2qcCznxpP4hpORzhtXyTqrBs7cfM9MCCWY8zsmU= +github.com/tinylib/msgp v1.2.1/go.mod h1:2vIGs3lcUo8izAATNobrCHevYZC/LMsJtw4JPiYPHro= +github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= +github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= +github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= +github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/urfave/cli/v2 v2.27.4 h1:o1owoI+02Eb+K107p27wEX9Bb8eqIoZCfLXloLUSWJ8= +github.com/urfave/cli/v2 v2.27.4/go.mod h1:m4QzxcD2qpra4z7WhzEGn74WZLViBnMpb1ToCAKdGRQ= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.55.0 h1:Zkefzgt6a7+bVKHnu/YaYSOPfNYNisSVBo/unVCf8k8= +github.com/valyala/fasthttp v1.55.0/go.mod h1:NkY9JtkrpPKmgwV3HTaS2HWaJss9RSIsRVfcxxoHiOM= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4= +github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= +github.com/yuin/goldmark v1.7.4 h1:BDXOHExt+A7gwPCJgPIIq7ENvceR7we7rOS9TNoLZeg= +github.com/yuin/goldmark v1.7.4/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= +github.com/yuin/goldmark-emoji v1.0.3 h1:aLRkLHOuBR2czCY4R8olwMjID+tENfhyFDMCRhbIQY4= +github.com/yuin/goldmark-emoji v1.0.3/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.mongodb.org/mongo-driver v1.16.1 h1:rIVLL3q0IHM39dvE+z2ulZLp9ENZKThVfuvN/IiN4l8= +go.mongodb.org/mongo-driver v1.16.1/go.mod h1:oB6AhJQvFQL4LEHyXi6aJzQJtBiTQHiAd83l0GdFaiw= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= +go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= +go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= +go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= +go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= +go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= +go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= +go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= +go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= +go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +gocloud.dev v0.39.0 h1:EYABYGhAalPUaMrbSKOr5lejxoxvXj99nE8XFtsDgds= +gocloud.dev v0.39.0/go.mod h1:drz+VyYNBvrMTW0KZiBAYEdl8lbNZx+OQ7oQvdrFmSQ= +golang.org/x/arch v0.9.0 h1:ub9TgUInamJ8mrZIGlBG6/4TqWeMszd4N8lNorbrr6k= +golang.org/x/arch v0.9.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= +golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 h1:kx6Ds3MlpiUHKj7syVnbp57++8WpuKPcR5yjLBjvLEA= +golang.org/x/exp v0.0.0-20240823005443-9b4947da3948/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.20.0 h1:7cVCUjQwfL18gyBJOmYvptfSHS8Fb3YUDtfLIZ7Nbpw= +golang.org/x/image v0.20.0/go.mod h1:0a88To4CYVBAHp5FXJm8o7QbUl37Vd85ply1vyD8auM= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +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.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= +golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +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.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/perf v0.0.0-20240910214617-f1a715d501dd h1:l5GKMQRDraD2wt8CE86tdfOd39FdQM8T+yaElVLQle8= +golang.org/x/perf v0.0.0-20240910214617-f1a715d501dd/go.mod h1:m63Bhbt9hBaCdTpgrZsBjV9hgEtT7i55ernIePKse5o= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +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= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= +golang.org/x/term v0.24.0/go.mod h1:lOBK/LVxemqiMij05LGJ0tzNr8xlmwBRJ81PX6wVLH8= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/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.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= +golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= +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-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 h1:LLhsEBxRTBLuKlQxFBYUOU8xyFgXv6cOTp2HASDlsDk= +golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.194.0 h1:dztZKG9HgtIpbI35FhfuSNR/zmaMVdxNlntHj1sIS4s= +google.golang.org/api v0.194.0/go.mod h1:AgvUFdojGANh3vI+P7EVnxj3AISHllxGCJSFmggmnd0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20240823204242-4ba0660f739c h1:TYOEhrQMrNDTAd2rX9m+WgGr8Ku6YNuj1D7OX6rWSok= +google.golang.org/genproto v0.0.0-20240823204242-4ba0660f739c/go.mod h1:2rC5OendXvZ8wGEo/cSLheztrZDZaSoHanUcd1xtZnw= +google.golang.org/genproto/googleapis/api v0.0.0-20240823204242-4ba0660f739c h1:e0zB268kOca6FbuJkYUGxfwG4DKFZG/8DLyv9Zv66cE= +google.golang.org/genproto/googleapis/api v0.0.0-20240823204242-4ba0660f739c/go.mod h1:fO8wJzT2zbQbAjbIoos1285VfEIYKDDY+Dt+WpTkh6g= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240823204242-4ba0660f739c h1:Kqjm4WpoWvwhMPcrAczoTyMySQmYa9Wy2iL6Con4zn8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240823204242-4ba0660f739c/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= +google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240926152443-e7a15d17544d h1:UZdBUaVd9zTXZmPZNl3Dypf9m8ZlpAqQqh+IFFTlhCg= +gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240926152443-e7a15d17544d/go.mod h1:fpMxtqDZZSI6QiZiZlaYP7eQdSlP+sLSmGd3ibTNr9U= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/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= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/neurosnap/sentences.v1 v1.0.6/go.mod h1:YlK+SN+fLQZj+kY3r8DkGDhDr91+S3JmTb5LSxFRQo0= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.0.1 h1:omJoilUzyrAp0xNoio88lGJCroGdIOen9hq2A/+3ifw= +gorm.io/driver/mysql v1.0.1/go.mod h1:KtqSthtg55lFp3S5kUXqlGaelnWpKitn4k1xZTnoiPw= +gorm.io/driver/postgres v1.5.9 h1:DkegyItji119OlcaLjqN11kHoUgZ/j13E0jkJZgD6A8= +gorm.io/driver/postgres v1.5.9/go.mod h1:DX3GReXH+3FPWGrrgffdvCk3DQ1dwDPdmbenSkweRGI= +gorm.io/driver/sqlserver v1.4.2 h1:nMtEeKqv2R/vv9FoHUFWfXfP6SskAgRar0TPlZV1stk= +gorm.io/driver/sqlserver v1.4.2/go.mod h1:XHwBuB4Tlh7DqO0x7Ema8dmyWsQW7wi38VQOAFkrbXY= +gorm.io/gorm v1.25.11 h1:/Wfyg1B/je1hnDx3sMkX+gAlxrlZpn6X0BXRlwXlvHg= +gorm.io/gorm v1.25.11/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +howett.net/plist v1.0.1 h1:37GdZ8tP09Q35o9ych3ehygcsL+HqKSwzctveSlarvM= +howett.net/plist v1.0.1/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= +k8s.io/api v0.31.0 h1:b9LiSjR2ym/SzTOlfMHm1tr7/21aD7fSkqgD/CVJBCo= +k8s.io/api v0.31.0/go.mod h1:0YiFF+JfFxMM6+1hQei8FY8M7s1Mth+z/q7eF1aJkTE= +k8s.io/apimachinery v0.31.0 h1:m9jOiSr3FoSSL5WO9bjm1n6B9KROYYgNZOb4tyZ1lBc= +k8s.io/apimachinery v0.31.0/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= +k8s.io/client-go v0.31.0 h1:QqEJzNjbN2Yv1H79SsS+SWnXkBgVu4Pj3CJQgbx0gI8= +k8s.io/client-go v0.31.0/go.mod h1:Y9wvC76g4fLjmU0BA+rV+h2cncoadjvjjkkIGoTLcGU= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= +k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= +k8s.io/utils v0.0.0-20240821151609-f90d01438635 h1:2wThSvJoW/Ncn9TmQEYXRnevZXi2duqHWf5OX9S3zjI= +k8s.io/utils v0.0.0-20240821151609-f90d01438635/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= +lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q= +modernc.org/cc/v3 v3.41.0/go.mod h1:Ni4zjJYJ04CDOhG7dn640WGfwBzfE0ecX8TyMB0Fv0Y= +modernc.org/ccgo/v3 v3.16.15 h1:KbDR3ZAVU+wiLyMESPtbtE/Add4elztFyfsWoNTgxS0= +modernc.org/ccgo/v3 v3.16.15/go.mod h1:yT7B+/E2m43tmMOT51GMoM98/MtHIcQQSleGnddkUNI= +modernc.org/libc v1.37.6 h1:orZH3c5wmhIQFTXF+Nt+eeauyd+ZIt2BX6ARe+kD+aw= +modernc.org/libc v1.37.6/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.28.0 h1:Zx+LyDDmXczNnEQdvPuEfcFVA2ZPyaD7UCZDjef3BHQ= +modernc.org/sqlite v1.28.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +software.sslmate.com/src/go-pkcs12 v0.4.0 h1:H2g08FrTvSFKUj+D309j1DPfk5APnIdAQAB8aEykJ5k= +software.sslmate.com/src/go-pkcs12 v0.4.0/go.mod h1:Qiz0EyvDRJjjxGyUQa2cCNZn/wMyzrRJ/qcDXOQazLI= From 901c6fbbae93ddf82e8fa19e26802ca132910e9b Mon Sep 17 00:00:00 2001 From: Rodrigo Arguello Date: Tue, 8 Oct 2024 16:13:38 -0400 Subject: [PATCH 12/18] refactor --- _integration-tests/go.mod | 4 +- _integration-tests/go.sum | 8 +- .../segmentio_kafka.v0/segmentio_kafka.go | 93 +++++---- go.mod | 4 +- go.sum | 8 +- internal/injector/builtin/generated.go | 20 +- .../yaml/datastreams/segmentio_kafka_v0.yml | 187 ++++++++++-------- samples/go.mod | 4 +- samples/go.sum | 8 +- 9 files changed, 184 insertions(+), 152 deletions(-) diff --git a/_integration-tests/go.mod b/_integration-tests/go.mod index a32bc698..b45bc267 100644 --- a/_integration-tests/go.mod +++ b/_integration-tests/go.mod @@ -5,7 +5,7 @@ go 1.22.6 replace github.com/DataDog/orchestrion => ../ // TODO: remove -replace gopkg.in/DataDog/dd-trace-go.v1 => gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240926152443-e7a15d17544d +replace gopkg.in/DataDog/dd-trace-go.v1 => gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20241008195158-49ec2955c1d0 require ( cloud.google.com/go/pubsub v1.42.0 @@ -73,7 +73,7 @@ require ( github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect github.com/BurntSushi/locker v0.0.0-20171006230638-a6e239ea1c69 // indirect - github.com/DataDog/appsec-internal-go v1.7.0 // indirect + github.com/DataDog/appsec-internal-go v1.8.0 // indirect github.com/DataDog/datadog-agent/pkg/obfuscate v0.56.0 // indirect github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0 // indirect github.com/DataDog/datadog-go/v5 v5.5.0 // indirect diff --git a/_integration-tests/go.sum b/_integration-tests/go.sum index a860df99..3eac3131 100644 --- a/_integration-tests/go.sum +++ b/_integration-tests/go.sum @@ -657,8 +657,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/appsec-internal-go v1.7.0 h1:iKRNLih83dJeVya3IoUfK+6HLD/hQsIbyBlfvLmAeb0= -github.com/DataDog/appsec-internal-go v1.7.0/go.mod h1:wW0cRfWBo4C044jHGwYiyh5moQV2x0AhnwqMuiX7O/g= +github.com/DataDog/appsec-internal-go v1.8.0 h1:1Tfn3LEogntRqZtf88twSApOCAAO3V+NILYhuQIo4J4= +github.com/DataDog/appsec-internal-go v1.8.0/go.mod h1:wW0cRfWBo4C044jHGwYiyh5moQV2x0AhnwqMuiX7O/g= github.com/DataDog/datadog-agent/pkg/obfuscate v0.56.0 h1:UdBCkJ1a4uxQNzggUEEbPylagIUaCWvFDxuf9QKWMXE= github.com/DataDog/datadog-agent/pkg/obfuscate v0.56.0/go.mod h1:NHgTieB5DpTc4AZrzx1xE+tPCWTJ7Hw3TVRiWuK505U= github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0 h1:LplNAmMgZvGU7kKA0+4c1xWOjz828xweW5TCi8Mw9Q0= @@ -2374,8 +2374,8 @@ google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= -gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240926152443-e7a15d17544d h1:UZdBUaVd9zTXZmPZNl3Dypf9m8ZlpAqQqh+IFFTlhCg= -gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240926152443-e7a15d17544d/go.mod h1:fpMxtqDZZSI6QiZiZlaYP7eQdSlP+sLSmGd3ibTNr9U= +gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20241008195158-49ec2955c1d0 h1:rRceEz0Vi5laWcU1xcn7X8Mgo9vHOGgAsKQN5HfA1vk= +gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20241008195158-49ec2955c1d0/go.mod h1:U9AOeBHNAL95JXcd/SPf4a7O5GNeF/yD13sJtli/yaU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go b/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go index d4f3051a..8b8fb60d 100644 --- a/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go +++ b/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go @@ -17,6 +17,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" kafkatest "github.com/testcontainers/testcontainers-go/modules/kafka" + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" "orchestrion/integration/utils" "orchestrion/integration/validator/trace" @@ -91,6 +92,9 @@ func (tc *TestCase) produce(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() + span, ctx := tracer.StartSpanFromContext(ctx, "test.root") + defer span.Finish() + messages := []kafka.Message{ { Topic: topicA, @@ -164,68 +168,75 @@ func (*TestCase) ExpectedTraces() trace.Traces { return trace.Traces{ { Tags: map[string]any{ - "name": "kafka.produce", - "type": "queue", - "service": "kafka", - "resource": "Produce Topic topic-A", - }, - Meta: map[string]string{ - "span.kind": "producer", - "component": "segmentio/kafka.go.v0", + "name": "test.root", }, Children: trace.Traces{ { Tags: map[string]any{ - "name": "kafka.consume", + "name": "kafka.produce", "type": "queue", "service": "kafka", - "resource": "Consume Topic topic-A", + "resource": "Produce Topic topic-A", }, Meta: map[string]string{ - "span.kind": "consumer", + "span.kind": "producer", "component": "segmentio/kafka.go.v0", }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "kafka.consume", + "type": "queue", + "service": "kafka", + "resource": "Consume Topic topic-A", + }, + Meta: map[string]string{ + "span.kind": "consumer", + "component": "segmentio/kafka.go.v0", + }, + }, + }, }, - }, - }, - { - Tags: map[string]any{ - "name": "kafka.produce", - "type": "queue", - "service": "kafka", - "resource": "Produce Topic topic-B", - }, - Meta: map[string]string{ - "span.kind": "producer", - "component": "segmentio/kafka.go.v0", - }, - Children: trace.Traces{ { Tags: map[string]any{ - "name": "kafka.consume", + "name": "kafka.produce", "type": "queue", "service": "kafka", - "resource": "Consume Topic topic-B", + "resource": "Produce Topic topic-B", }, Meta: map[string]string{ - "span.kind": "consumer", + "span.kind": "producer", "component": "segmentio/kafka.go.v0", }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "kafka.consume", + "type": "queue", + "service": "kafka", + "resource": "Consume Topic topic-B", + }, + Meta: map[string]string{ + "span.kind": "consumer", + "component": "segmentio/kafka.go.v0", + }, + }, + }, + }, + { + Tags: map[string]any{ + "name": "kafka.produce", + "type": "queue", + "service": "kafka", + "resource": "Produce Topic topic-B", + }, + Meta: map[string]string{ + "span.kind": "producer", + "component": "segmentio/kafka.go.v0", + }, + Children: nil, }, }, }, - { - Tags: map[string]any{ - "name": "kafka.produce", - "type": "queue", - "service": "kafka", - "resource": "Produce Topic topic-B", - }, - Meta: map[string]string{ - "span.kind": "producer", - "component": "segmentio/kafka.go.v0", - }, - Children: nil, - }, } } diff --git a/go.mod b/go.mod index a00ccb94..07bba9dc 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/DataDog/orchestrion go 1.22.6 // TODO: remove -replace gopkg.in/DataDog/dd-trace-go.v1 => gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240926152443-e7a15d17544d +replace gopkg.in/DataDog/dd-trace-go.v1 => gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20241008195158-49ec2955c1d0 require ( github.com/charmbracelet/lipgloss v0.13.0 @@ -48,7 +48,7 @@ require ( github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect github.com/BurntSushi/locker v0.0.0-20171006230638-a6e239ea1c69 // indirect - github.com/DataDog/appsec-internal-go v1.7.0 // indirect + github.com/DataDog/appsec-internal-go v1.8.0 // indirect github.com/DataDog/datadog-agent/pkg/obfuscate v0.56.0 // indirect github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0 // indirect github.com/DataDog/datadog-go/v5 v5.5.0 // indirect diff --git a/go.sum b/go.sum index 48834573..b6c74f35 100644 --- a/go.sum +++ b/go.sum @@ -74,8 +74,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/appsec-internal-go v1.7.0 h1:iKRNLih83dJeVya3IoUfK+6HLD/hQsIbyBlfvLmAeb0= -github.com/DataDog/appsec-internal-go v1.7.0/go.mod h1:wW0cRfWBo4C044jHGwYiyh5moQV2x0AhnwqMuiX7O/g= +github.com/DataDog/appsec-internal-go v1.8.0 h1:1Tfn3LEogntRqZtf88twSApOCAAO3V+NILYhuQIo4J4= +github.com/DataDog/appsec-internal-go v1.8.0/go.mod h1:wW0cRfWBo4C044jHGwYiyh5moQV2x0AhnwqMuiX7O/g= github.com/DataDog/datadog-agent/pkg/obfuscate v0.56.0 h1:UdBCkJ1a4uxQNzggUEEbPylagIUaCWvFDxuf9QKWMXE= github.com/DataDog/datadog-agent/pkg/obfuscate v0.56.0/go.mod h1:NHgTieB5DpTc4AZrzx1xE+tPCWTJ7Hw3TVRiWuK505U= github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0 h1:LplNAmMgZvGU7kKA0+4c1xWOjz828xweW5TCi8Mw9Q0= @@ -1272,8 +1272,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= -gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240926152443-e7a15d17544d h1:UZdBUaVd9zTXZmPZNl3Dypf9m8ZlpAqQqh+IFFTlhCg= -gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240926152443-e7a15d17544d/go.mod h1:fpMxtqDZZSI6QiZiZlaYP7eQdSlP+sLSmGd3ibTNr9U= +gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20241008195158-49ec2955c1d0 h1:rRceEz0Vi5laWcU1xcn7X8Mgo9vHOGgAsKQN5HfA1vk= +gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20241008195158-49ec2955c1d0/go.mod h1:U9AOeBHNAL95JXcd/SPf4a7O5GNeF/yD13sJtli/yaU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/internal/injector/builtin/generated.go b/internal/injector/builtin/generated.go index c4ad420c..46f4ba24 100644 --- a/internal/injector/builtin/generated.go +++ b/internal/injector/builtin/generated.go @@ -302,16 +302,15 @@ var Aspects = [...]aspect.Aspect{ JoinPoint: join.StructDefinition(join.MustTypeName("github.com/segmentio/kafka-go.Reader")), Advice: []advice.Advice{ advice.InjectDeclarations(code.MustTemplate( - "func __dd_tracingMessage(msg *Message) *tracing.KafkaMessage {\n setHeaders := func(newHeaders []tracing.KafkaHeader) {\n hs := make([]Header, len(newHeaders))\n for _, h := range newHeaders {\n hs = append(hs, Header{\n Key: h.Key,\n Value: h.Value,\n })\n }\n msg.Headers = hs\n }\n return &tracing.KafkaMessage{\n Topic: msg.Topic,\n Partition: msg.Partition,\n Offset: msg.Offset,\n Headers: __dd_tracingKafkaHeaders(msg.Headers),\n SetHeaders: setHeaders,\n Value: msg.Value,\n Key: msg.Key,\n }\n}\n \nfunc __dd_tracingKafkaHeaders(headers []Header) []tracing.KafkaHeader {\n hs := make([]tracing.KafkaHeader, len(headers))\n for _, h := range headers {\n hs = append(hs, tracing.KafkaHeader{\n Key: h.Key,\n Value: h.Value,\n })\n }\n return hs\n}\n\nfunc __dd_tracingWriter(w *Writer) *tracing.KafkaWriter {\n return &tracing.KafkaWriter{\n Topic: w.Topic,\n }\n}\n\nfunc __dd_kafkaConfigFromReader(r *Reader) *tracing.KafkaConfig {\n kafkaCfg := new(tracing.KafkaConfig)\n if r.Config().Brokers != nil {\n kafkaCfg.BootstrapServers = strings.Join(r.Config().Brokers, \",\")\n }\n if r.Config().GroupID != \"\" {\n kafkaCfg.ConsumerGroupID = r.Config().GroupID\n }\n return kafkaCfg\n}\n\nfunc __dd_initReader(r *Reader) {\n if r.__dd_cfg == nil {\n r.__dd_cfg = tracing.NewConfig()\n }\n if r.__dd_kafkaCfg == nil {\n r.__dd_kafkaCfg = __dd_kafkaConfigFromReader(r)\n }\n}\n\ntype __dd_Span = ddtrace.Span", + "type __dd_wMessage struct {\n *Message\n}\n \nfunc __dd_wrapMessage(msg *Message) tracing.Message {\n if msg == nil {\n return nil\n }\n return &__dd_wMessage{msg}\n}\n \nfunc (w *__dd_wMessage) GetValue() []byte {\n return w.Value\n}\n \nfunc (w *__dd_wMessage) GetKey() []byte {\n return w.Key\n}\n \nfunc (w *__dd_wMessage) GetHeaders() []tracing.Header {\n hs := make([]tracing.Header, 0, len(w.Headers))\n for _, h := range w.Headers {\n hs = append(hs, __dd_wrapHeader(h))\n }\n return hs\n}\n \nfunc (w *__dd_wMessage) SetHeaders(headers []tracing.Header) {\n hs := make([]Header, 0, len(headers))\n for _, h := range headers {\n hs = append(hs, Header{\n Key: h.GetKey(),\n Value: h.GetValue(),\n })\n }\n w.Message.Headers = hs\n}\n \nfunc (w *__dd_wMessage) GetTopic() string {\n return w.Topic\n}\n \nfunc (w *__dd_wMessage) GetPartition() int {\n return w.Partition\n}\n \nfunc (w *__dd_wMessage) GetOffset() int64 {\n return w.Offset\n}\n \ntype __dd_wHeader struct {\n Header\n}\n \nfunc __dd_wrapHeader(h Header) tracing.Header {\n return &__dd_wHeader{h}\n}\n \nfunc (w __dd_wHeader) GetKey() string {\n return w.Key\n}\n \nfunc (w __dd_wHeader) GetValue() []byte {\n return w.Value\n}\n \ntype __dd_wWriter struct {\n *Writer\n}\n \nfunc (w *__dd_wWriter) GetTopic() string {\n return w.Topic\n}\n \nfunc __dd_wrapTracingWriter(w *Writer) tracing.Writer {\n return &__dd_wWriter{w}\n}\n\nfunc __dd_initReader(r *Reader) {\n if r.__dd_tracer != nil {\n return\n }\n kafkaCfg := tracing.KafkaConfig{}\n if r.Config().Brokers != nil {\n kafkaCfg.BootstrapServers = strings.Join(r.Config().Brokers, \",\")\n }\n if r.Config().GroupID != \"\" {\n kafkaCfg.ConsumerGroupID = r.Config().GroupID\n }\n r.__dd_tracer = tracing.NewTracer(kafkaCfg)\n}\n\ntype __dd_span = ddtrace.Span", map[string]string{ "ddtrace": "gopkg.in/DataDog/dd-trace-go.v1/ddtrace", "strings": "strings", "tracing": "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing", }, ), []string{}), - advice.AddStructField("__dd_cfg", join.MustTypeName("*gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing.Config")), - advice.AddStructField("__dd_kafkaCfg", join.MustTypeName("*gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing.KafkaConfig")), - advice.AddStructField("__dd_prev", join.MustTypeName("__dd_Span")), + advice.AddStructField("__dd_tracer", join.MustTypeName("*gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing.Tracer")), + advice.AddStructField("__dd_prevSpan", join.MustTypeName("__dd_span")), }, }, { @@ -321,7 +320,7 @@ var Aspects = [...]aspect.Aspect{ )), Advice: []advice.Advice{ advice.PrependStmts(code.MustTemplate( - "{{- $r := .Function.Receiver -}}\n{{- $ctx := .Function.Argument 0 -}}\n{{- $msg := .Function.Result 0 -}}\n{{- $err := .Function.Result 1 -}}\n__dd_initReader(r)\n\nif {{ $r }}.__dd_prev != nil {\n {{ $r }}.__dd_prev.Finish()\n {{ $r }}.__dd_prev = nil\n}\n\ndefer func() {\n if {{ $err }} != nil {\n return\n }\n {{ $r }}.__dd_prev = tracing.StartConsumeSpan({{ $ctx }}, {{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, __dd_tracingMessage(&{{ $msg }}))\n tracing.SetConsumeDSMCheckpoint({{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, __dd_tracingMessage(&{{ $msg }}))\n}()", + "{{- $r := .Function.Receiver -}}\n{{- $ctx := .Function.Argument 0 -}}\n{{- $msg := .Function.Result 0 -}}\n{{- $err := .Function.Result 1 -}}\n__dd_initReader(r)\nif {{ $r }}.__dd_prevSpan != nil {\n {{ $r }}.__dd_prevSpan.Finish()\n {{ $r }}.__dd_prevSpan = nil\n}\ndefer func() {\n if {{ $err }} != nil {\n return\n }\n tMsg := __dd_wrapMessage(&{{ $msg }})\n {{ $r }}.__dd_prevSpan = {{ $r }}.__dd_tracer.StartConsumeSpan({{ $ctx }}, tMsg)\n {{ $r }}.__dd_tracer.SetConsumeDSMCheckpoint(tMsg)\n}()", map[string]string{ "tracing": "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing", }, @@ -335,7 +334,7 @@ var Aspects = [...]aspect.Aspect{ )), Advice: []advice.Advice{ advice.PrependStmts(code.MustTemplate( - "{{- $r := .Function.Receiver -}}\nif {{ $r }}.__dd_prev != nil {\n {{ $r }}.__dd_prev.Finish()\n {{ $r }}.__dd_prev = nil\n}", + "{{- $r := .Function.Receiver -}}\nif {{ $r }}.__dd_prevSpan != nil {\n {{ $r }}.__dd_prevSpan.Finish()\n {{ $r }}.__dd_prevSpan = nil\n}", map[string]string{}, )), }, @@ -344,13 +343,12 @@ var Aspects = [...]aspect.Aspect{ JoinPoint: join.StructDefinition(join.MustTypeName("github.com/segmentio/kafka-go.Writer")), Advice: []advice.Advice{ advice.InjectDeclarations(code.MustTemplate( - "func __dd_initWriter(w *Writer) {\n if w.__dd_cfg == nil {\n w.__dd_cfg = tracing.NewConfig()\n }\n if w.__dd_kafkaCfg == nil {\n w.__dd_kafkaCfg = &tracing.KafkaConfig{\n BootstrapServers: w.Addr.String(),\n }\n }\n}", + "func __dd_initWriter(w *Writer) {\n if w.__dd_tracer != nil {\n return\n }\n kafkaCfg := tracing.KafkaConfig{\n BootstrapServers: w.Addr.String(),\n }\n w.__dd_tracer = tracing.NewTracer(kafkaCfg)\n}", map[string]string{ "tracing": "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing", }, ), []string{}), - advice.AddStructField("__dd_cfg", join.MustTypeName("*gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing.Config")), - advice.AddStructField("__dd_kafkaCfg", join.MustTypeName("*gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing.KafkaConfig")), + advice.AddStructField("__dd_tracer", join.MustTypeName("*gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing.Tracer")), }, }, { @@ -360,7 +358,7 @@ var Aspects = [...]aspect.Aspect{ )), Advice: []advice.Advice{ advice.PrependStmts(code.MustTemplate( - "{{- $w := .Function.Receiver -}}\n{{- $ctx := .Function.Argument 0 -}}\n{{- $msgs := .Function.Argument 1 -}}\n{{- $err := .Function.Result 0 -}}\nspans := make([]ddtrace.Span, len(msgs))\n__dd_initWriter(w)\n\nvar spanOpts []tracer.StartSpanOption\nprevSpan, ok := tracer.SpanFromContext({{ $ctx }})\nif ok {\n spanOpts = append(spanOpts, tracer.ChildOf(prevSpan.Context()))\n}\n\nfor i := range msgs {\n tMsg := __dd_tracingMessage(&{{ $msgs }}[i])\n tWriter := __dd_tracingWriter({{ $w }})\n spans[i] = tracing.StartProduceSpan(nil, {{ $w }}.__dd_cfg, {{ $w }}.__dd_kafkaCfg, tWriter, tMsg, spanOpts...)\n tracing.SetProduceDSMCheckpoint({{ $w }}.__dd_cfg, tMsg, tWriter)\n}\n\ndefer func() {\n for i, span := range spans {\n tracing.FinishProduceSpan(span, {{ $msgs }}[i].Partition, {{ $msgs }}[i].Offset, {{ $err }})\n }\n}()", + "{{- $w := .Function.Receiver -}}\n{{- $ctx := .Function.Argument 0 -}}\n{{- $msgs := .Function.Argument 1 -}}\n{{- $err := .Function.Result 0 -}}\nspans := make([]ddtrace.Span, len({{ $msgs }}))\n__dd_initWriter(w)\n\nvar spanOpts []tracer.StartSpanOption\nprevSpan, ok := tracer.SpanFromContext({{ $ctx }})\nif ok {\n spanOpts = append(spanOpts, tracer.ChildOf(prevSpan.Context()))\n}\n\nfor i := range {{ $msgs }} {\n tMsg := __dd_wrapMessage(&{{ $msgs }}[i])\n tWriter := __dd_wrapTracingWriter({{ $w }})\n spans[i] = {{ $w }}.__dd_tracer.StartProduceSpan(nil, tWriter, tMsg, spanOpts...)\n {{ $w }}.__dd_tracer.SetProduceDSMCheckpoint(tMsg, tWriter)\n}\n\ndefer func() {\n for i, span := range spans {\n {{ $w }}.__dd_tracer.FinishProduceSpan(span, {{ $msgs }}[i].Partition, {{ $msgs }}[i].Offset, {{ $err }})\n }\n}()", map[string]string{ "ddtrace": "gopkg.in/DataDog/dd-trace-go.v1/ddtrace", "tracer": "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer", @@ -959,4 +957,4 @@ var InjectedPaths = [...]string{ } // Checksum is a checksum of the built-in configuration which can be used to invalidate caches. -const Checksum = "sha512:VBU0ziZitiB/Rh8RWnB35f90rBoVhnoEUD3gUVuIlptdFAP2FN4HDRVe3F/j91RXhTHrKupQmJhk6EnGvU9JRw==" +const Checksum = "sha512:Hk/DgVC5Z9/WPC8QBfusuQRoxRIZ0APEKZXw/n6fK87/fEq/6akt3KV4cYGbTrNfW9nBRoTZGXcHPqB5+3NPzg==" diff --git a/internal/injector/builtin/yaml/datastreams/segmentio_kafka_v0.yml b/internal/injector/builtin/yaml/datastreams/segmentio_kafka_v0.yml index 06cb58c9..0e2865fb 100644 --- a/internal/injector/builtin/yaml/datastreams/segmentio_kafka_v0.yml +++ b/internal/injector/builtin/yaml/datastreams/segmentio_kafka_v0.yml @@ -23,78 +23,107 @@ aspects: ddtrace: gopkg.in/DataDog/dd-trace-go.v1/ddtrace strings: strings template: |- - func __dd_tracingMessage(msg *Message) *tracing.KafkaMessage { - setHeaders := func(newHeaders []tracing.KafkaHeader) { - hs := make([]Header, len(newHeaders)) - for _, h := range newHeaders { - hs = append(hs, Header{ - Key: h.Key, - Value: h.Value, - }) - } - msg.Headers = hs + type __dd_wMessage struct { + *Message + } + + func __dd_wrapMessage(msg *Message) tracing.Message { + if msg == nil { + return nil } - return &tracing.KafkaMessage{ - Topic: msg.Topic, - Partition: msg.Partition, - Offset: msg.Offset, - Headers: __dd_tracingKafkaHeaders(msg.Headers), - SetHeaders: setHeaders, - Value: msg.Value, - Key: msg.Key, + return &__dd_wMessage{msg} + } + + func (w *__dd_wMessage) GetValue() []byte { + return w.Value + } + + func (w *__dd_wMessage) GetKey() []byte { + return w.Key + } + + func (w *__dd_wMessage) GetHeaders() []tracing.Header { + hs := make([]tracing.Header, 0, len(w.Headers)) + for _, h := range w.Headers { + hs = append(hs, __dd_wrapHeader(h)) } + return hs } - func __dd_tracingKafkaHeaders(headers []Header) []tracing.KafkaHeader { - hs := make([]tracing.KafkaHeader, len(headers)) + func (w *__dd_wMessage) SetHeaders(headers []tracing.Header) { + hs := make([]Header, 0, len(headers)) for _, h := range headers { - hs = append(hs, tracing.KafkaHeader{ - Key: h.Key, - Value: h.Value, + hs = append(hs, Header{ + Key: h.GetKey(), + Value: h.GetValue(), }) } - return hs + w.Message.Headers = hs + } + + func (w *__dd_wMessage) GetTopic() string { + return w.Topic + } + + func (w *__dd_wMessage) GetPartition() int { + return w.Partition + } + + func (w *__dd_wMessage) GetOffset() int64 { + return w.Offset + } + + type __dd_wHeader struct { + Header + } + + func __dd_wrapHeader(h Header) tracing.Header { + return &__dd_wHeader{h} + } + + func (w __dd_wHeader) GetKey() string { + return w.Key + } + + func (w __dd_wHeader) GetValue() []byte { + return w.Value + } + + type __dd_wWriter struct { + *Writer + } + + func (w *__dd_wWriter) GetTopic() string { + return w.Topic + } + + func __dd_wrapTracingWriter(w *Writer) tracing.Writer { + return &__dd_wWriter{w} } - func __dd_tracingWriter(w *Writer) *tracing.KafkaWriter { - return &tracing.KafkaWriter{ - Topic: w.Topic, + func __dd_initReader(r *Reader) { + if r.__dd_tracer != nil { + return } - } - - func __dd_kafkaConfigFromReader(r *Reader) *tracing.KafkaConfig { - kafkaCfg := new(tracing.KafkaConfig) + kafkaCfg := tracing.KafkaConfig{} if r.Config().Brokers != nil { kafkaCfg.BootstrapServers = strings.Join(r.Config().Brokers, ",") } if r.Config().GroupID != "" { kafkaCfg.ConsumerGroupID = r.Config().GroupID } - return kafkaCfg + r.__dd_tracer = tracing.NewTracer(kafkaCfg) } - func __dd_initReader(r *Reader) { - if r.__dd_cfg == nil { - r.__dd_cfg = tracing.NewConfig() - } - if r.__dd_kafkaCfg == nil { - r.__dd_kafkaCfg = __dd_kafkaConfigFromReader(r) - } - } - - type __dd_Span = ddtrace.Span - - - add-struct-field: - name: __dd_cfg - type: "*gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing.Config" + type __dd_span = ddtrace.Span - add-struct-field: - name: __dd_kafkaCfg - type: "*gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing.KafkaConfig" + name: __dd_tracer + type: "*gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing.Tracer" - add-struct-field: - name: __dd_prev - type: "__dd_Span" + name: __dd_prevSpan + type: "__dd_span" - - id: Modify kafka.Reader.FetchMessage to call tracing functions + - id: Trace kafka.Reader#FetchMessage join-point: function-body: function: @@ -110,21 +139,20 @@ aspects: {{- $msg := .Function.Result 0 -}} {{- $err := .Function.Result 1 -}} __dd_initReader(r) - - if {{ $r }}.__dd_prev != nil { - {{ $r }}.__dd_prev.Finish() - {{ $r }}.__dd_prev = nil + if {{ $r }}.__dd_prevSpan != nil { + {{ $r }}.__dd_prevSpan.Finish() + {{ $r }}.__dd_prevSpan = nil } - defer func() { if {{ $err }} != nil { return } - {{ $r }}.__dd_prev = tracing.StartConsumeSpan({{ $ctx }}, {{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, __dd_tracingMessage(&{{ $msg }})) - tracing.SetConsumeDSMCheckpoint({{ $r }}.__dd_cfg, {{ $r }}.__dd_kafkaCfg, __dd_tracingMessage(&{{ $msg }})) + tMsg := __dd_wrapMessage(&{{ $msg }}) + {{ $r }}.__dd_prevSpan = {{ $r }}.__dd_tracer.StartConsumeSpan({{ $ctx }}, tMsg) + {{ $r }}.__dd_tracer.SetConsumeDSMCheckpoint(tMsg) }() - - id: Modify kafka.Reader.Close to call tracing functions + - id: Trace kafka.Reader#Close join-point: function-body: function: @@ -134,9 +162,9 @@ aspects: - prepend-statements: template: |- {{- $r := .Function.Receiver -}} - if {{ $r }}.__dd_prev != nil { - {{ $r }}.__dd_prev.Finish() - {{ $r }}.__dd_prev = nil + if {{ $r }}.__dd_prevSpan != nil { + {{ $r }}.__dd_prevSpan.Finish() + {{ $r }}.__dd_prevSpan = nil } ## Trace Produce ## @@ -150,24 +178,19 @@ aspects: tracing: gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing template: |- func __dd_initWriter(w *Writer) { - if w.__dd_cfg == nil { - w.__dd_cfg = tracing.NewConfig() + if w.__dd_tracer != nil { + return } - if w.__dd_kafkaCfg == nil { - w.__dd_kafkaCfg = &tracing.KafkaConfig{ - BootstrapServers: w.Addr.String(), - } + kafkaCfg := tracing.KafkaConfig{ + BootstrapServers: w.Addr.String(), } + w.__dd_tracer = tracing.NewTracer(kafkaCfg) } - - - add-struct-field: - name: __dd_cfg - type: "*gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing.Config" - add-struct-field: - name: __dd_kafkaCfg - type: "*gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing.KafkaConfig" + name: __dd_tracer + type: "*gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing.Tracer" - - id: Modify kafka.Writer.WriteMessages to call tracing functions + - id: Trace kafka.Writer#WriteMessages join-point: function-body: function: @@ -187,7 +210,7 @@ aspects: {{- $ctx := .Function.Argument 0 -}} {{- $msgs := .Function.Argument 1 -}} {{- $err := .Function.Result 0 -}} - spans := make([]ddtrace.Span, len(msgs)) + spans := make([]ddtrace.Span, len({{ $msgs }})) __dd_initWriter(w) var spanOpts []tracer.StartSpanOption @@ -196,15 +219,15 @@ aspects: spanOpts = append(spanOpts, tracer.ChildOf(prevSpan.Context())) } - for i := range msgs { - tMsg := __dd_tracingMessage(&{{ $msgs }}[i]) - tWriter := __dd_tracingWriter({{ $w }}) - spans[i] = tracing.StartProduceSpan(nil, {{ $w }}.__dd_cfg, {{ $w }}.__dd_kafkaCfg, tWriter, tMsg, spanOpts...) - tracing.SetProduceDSMCheckpoint({{ $w }}.__dd_cfg, tMsg, tWriter) + for i := range {{ $msgs }} { + tMsg := __dd_wrapMessage(&{{ $msgs }}[i]) + tWriter := __dd_wrapTracingWriter({{ $w }}) + spans[i] = {{ $w }}.__dd_tracer.StartProduceSpan(nil, tWriter, tMsg, spanOpts...) + {{ $w }}.__dd_tracer.SetProduceDSMCheckpoint(tMsg, tWriter) } defer func() { for i, span := range spans { - tracing.FinishProduceSpan(span, {{ $msgs }}[i].Partition, {{ $msgs }}[i].Offset, {{ $err }}) + {{ $w }}.__dd_tracer.FinishProduceSpan(span, {{ $msgs }}[i].Partition, {{ $msgs }}[i].Offset, {{ $err }}) } }() diff --git a/samples/go.mod b/samples/go.mod index f145952f..bb7b7de6 100644 --- a/samples/go.mod +++ b/samples/go.mod @@ -5,7 +5,7 @@ go 1.22.6 replace github.com/DataDog/orchestrion => ../ // TODO: remove -replace gopkg.in/DataDog/dd-trace-go.v1 => gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240926152443-e7a15d17544d +replace gopkg.in/DataDog/dd-trace-go.v1 => gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20241008195158-49ec2955c1d0 require ( github.com/DataDog/orchestrion v0.0.0-00010101000000-000000000000 @@ -48,7 +48,7 @@ require ( github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect github.com/BurntSushi/locker v0.0.0-20171006230638-a6e239ea1c69 // indirect - github.com/DataDog/appsec-internal-go v1.7.0 // indirect + github.com/DataDog/appsec-internal-go v1.8.0 // indirect github.com/DataDog/datadog-agent/pkg/obfuscate v0.56.0 // indirect github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0 // indirect github.com/DataDog/datadog-go/v5 v5.5.0 // indirect diff --git a/samples/go.sum b/samples/go.sum index c617495e..ea5c0da5 100644 --- a/samples/go.sum +++ b/samples/go.sum @@ -74,8 +74,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/appsec-internal-go v1.7.0 h1:iKRNLih83dJeVya3IoUfK+6HLD/hQsIbyBlfvLmAeb0= -github.com/DataDog/appsec-internal-go v1.7.0/go.mod h1:wW0cRfWBo4C044jHGwYiyh5moQV2x0AhnwqMuiX7O/g= +github.com/DataDog/appsec-internal-go v1.8.0 h1:1Tfn3LEogntRqZtf88twSApOCAAO3V+NILYhuQIo4J4= +github.com/DataDog/appsec-internal-go v1.8.0/go.mod h1:wW0cRfWBo4C044jHGwYiyh5moQV2x0AhnwqMuiX7O/g= github.com/DataDog/datadog-agent/pkg/obfuscate v0.56.0 h1:UdBCkJ1a4uxQNzggUEEbPylagIUaCWvFDxuf9QKWMXE= github.com/DataDog/datadog-agent/pkg/obfuscate v0.56.0/go.mod h1:NHgTieB5DpTc4AZrzx1xE+tPCWTJ7Hw3TVRiWuK505U= github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0 h1:LplNAmMgZvGU7kKA0+4c1xWOjz828xweW5TCi8Mw9Q0= @@ -1265,8 +1265,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= -gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240926152443-e7a15d17544d h1:UZdBUaVd9zTXZmPZNl3Dypf9m8ZlpAqQqh+IFFTlhCg= -gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20240926152443-e7a15d17544d/go.mod h1:fpMxtqDZZSI6QiZiZlaYP7eQdSlP+sLSmGd3ibTNr9U= +gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20241008195158-49ec2955c1d0 h1:rRceEz0Vi5laWcU1xcn7X8Mgo9vHOGgAsKQN5HfA1vk= +gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20241008195158-49ec2955c1d0/go.mod h1:U9AOeBHNAL95JXcd/SPf4a7O5GNeF/yD13sJtli/yaU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From eeea7fcd9661330cdd33c34fdb729c6e9367cc6f Mon Sep 17 00:00:00 2001 From: Rodrigo Arguello Date: Wed, 23 Oct 2024 14:14:37 +0200 Subject: [PATCH 13/18] used tagged version --- _integration-tests/go.mod | 5 +---- _integration-tests/go.sum | 4 ++-- go.mod | 5 +---- go.sum | 4 ++-- samples/go.mod | 5 +---- samples/go.sum | 4 ++-- 6 files changed, 9 insertions(+), 18 deletions(-) diff --git a/_integration-tests/go.mod b/_integration-tests/go.mod index 0772a72e..59b8ef40 100644 --- a/_integration-tests/go.mod +++ b/_integration-tests/go.mod @@ -4,9 +4,6 @@ go 1.22.8 replace github.com/DataDog/orchestrion => ../ -// TODO: remove -replace gopkg.in/DataDog/dd-trace-go.v1 => gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20241008195158-49ec2955c1d0 - require ( cloud.google.com/go/pubsub v1.44.0 github.com/99designs/gqlgen v0.17.55 @@ -54,7 +51,7 @@ require ( google.golang.org/api v0.201.0 google.golang.org/grpc v1.67.1 google.golang.org/grpc/examples v0.0.0-20240816220358-f8d98a477c22 - gopkg.in/DataDog/dd-trace-go.v1 v1.69.0 + gopkg.in/DataDog/dd-trace-go.v1 v1.69.1-rc.4 gorm.io/driver/sqlite v1.5.6 gorm.io/gorm v1.25.12 gotest.tools/v3 v3.5.1 diff --git a/_integration-tests/go.sum b/_integration-tests/go.sum index ea25a8f0..f37a5159 100644 --- a/_integration-tests/go.sum +++ b/_integration-tests/go.sum @@ -2422,8 +2422,8 @@ google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqw google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= -gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20241008195158-49ec2955c1d0 h1:rRceEz0Vi5laWcU1xcn7X8Mgo9vHOGgAsKQN5HfA1vk= -gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20241008195158-49ec2955c1d0/go.mod h1:U9AOeBHNAL95JXcd/SPf4a7O5GNeF/yD13sJtli/yaU= +gopkg.in/DataDog/dd-trace-go.v1 v1.69.1-rc.4 h1:WxbmK9/DjQ0p4cICkbPQ6MfEnsESZGqeZQN6LB5lZfo= +gopkg.in/DataDog/dd-trace-go.v1 v1.69.1-rc.4/go.mod h1:U9AOeBHNAL95JXcd/SPf4a7O5GNeF/yD13sJtli/yaU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/go.mod b/go.mod index 23892c76..45bff1c1 100644 --- a/go.mod +++ b/go.mod @@ -2,9 +2,6 @@ module github.com/DataDog/orchestrion go 1.22.8 -// TODO: remove -replace gopkg.in/DataDog/dd-trace-go.v1 => gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20241008195158-49ec2955c1d0 - require ( github.com/Masterminds/sprig v2.22.0+incompatible github.com/charmbracelet/lipgloss v0.13.0 @@ -28,7 +25,7 @@ require ( golang.org/x/sys v0.26.0 golang.org/x/term v0.25.0 golang.org/x/tools v0.26.0 - gopkg.in/DataDog/dd-trace-go.v1 v1.69.0 + gopkg.in/DataDog/dd-trace-go.v1 v1.69.1-rc.4 gopkg.in/yaml.v3 v3.0.1 gotest.tools/v3 v3.5.1 k8s.io/client-go v0.31.1 diff --git a/go.sum b/go.sum index 91460716..8d12baa0 100644 --- a/go.sum +++ b/go.sum @@ -1338,8 +1338,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= -gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20241008195158-49ec2955c1d0 h1:rRceEz0Vi5laWcU1xcn7X8Mgo9vHOGgAsKQN5HfA1vk= -gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20241008195158-49ec2955c1d0/go.mod h1:U9AOeBHNAL95JXcd/SPf4a7O5GNeF/yD13sJtli/yaU= +gopkg.in/DataDog/dd-trace-go.v1 v1.69.1-rc.4 h1:WxbmK9/DjQ0p4cICkbPQ6MfEnsESZGqeZQN6LB5lZfo= +gopkg.in/DataDog/dd-trace-go.v1 v1.69.1-rc.4/go.mod h1:U9AOeBHNAL95JXcd/SPf4a7O5GNeF/yD13sJtli/yaU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/samples/go.mod b/samples/go.mod index eec1ac14..02488997 100644 --- a/samples/go.mod +++ b/samples/go.mod @@ -4,9 +4,6 @@ go 1.22.8 replace github.com/DataDog/orchestrion => ../ -// TODO: remove -replace gopkg.in/DataDog/dd-trace-go.v1 => gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20241008195158-49ec2955c1d0 - require ( github.com/99designs/gqlgen v0.17.55 github.com/DataDog/orchestrion v0.0.0-00010101000000-000000000000 @@ -332,7 +329,7 @@ require ( google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53 // indirect google.golang.org/grpc/stats/opentelemetry v0.0.0-20241018153737-98959d9a4904 // indirect google.golang.org/protobuf v1.35.1 // indirect - gopkg.in/DataDog/dd-trace-go.v1 v1.69.0 // indirect + gopkg.in/DataDog/dd-trace-go.v1 v1.69.1-rc.4 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/samples/go.sum b/samples/go.sum index fffe5690..cc7f6b82 100644 --- a/samples/go.sum +++ b/samples/go.sum @@ -1331,8 +1331,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= -gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20241008195158-49ec2955c1d0 h1:rRceEz0Vi5laWcU1xcn7X8Mgo9vHOGgAsKQN5HfA1vk= -gopkg.in/DataDog/dd-trace-go.v1 v1.39.0-alpha.1.0.20241008195158-49ec2955c1d0/go.mod h1:U9AOeBHNAL95JXcd/SPf4a7O5GNeF/yD13sJtli/yaU= +gopkg.in/DataDog/dd-trace-go.v1 v1.69.1-rc.4 h1:WxbmK9/DjQ0p4cICkbPQ6MfEnsESZGqeZQN6LB5lZfo= +gopkg.in/DataDog/dd-trace-go.v1 v1.69.1-rc.4/go.mod h1:U9AOeBHNAL95JXcd/SPf4a7O5GNeF/yD13sJtli/yaU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 23531168dd5b6f0b39a1b569f19c7377e6359bf0 Mon Sep 17 00:00:00 2001 From: Romain Marcadier Date: Wed, 30 Oct 2024 17:06:20 +0100 Subject: [PATCH 14/18] chore: update generated files --- internal/injector/builtin/generated.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/internal/injector/builtin/generated.go b/internal/injector/builtin/generated.go index e02197e0..b37f33bd 100644 --- a/internal/injector/builtin/generated.go +++ b/internal/injector/builtin/generated.go @@ -719,6 +719,7 @@ var Aspects = [...]aspect.Aspect{ "strings": "strings", "tracing": "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing", }, + context.GoLangVersion{}, ), []string{}), advice.AddStructField("__dd_tracer", join.MustTypeName("*gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing.Tracer")), advice.AddStructField("__dd_prevSpan", join.MustTypeName("__dd_span")), @@ -735,6 +736,7 @@ var Aspects = [...]aspect.Aspect{ map[string]string{ "tracing": "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing", }, + context.GoLangVersion{}, )), }, }, @@ -747,6 +749,7 @@ var Aspects = [...]aspect.Aspect{ advice.PrependStmts(code.MustTemplate( "{{- $r := .Function.Receiver -}}\nif {{ $r }}.__dd_prevSpan != nil {\n {{ $r }}.__dd_prevSpan.Finish()\n {{ $r }}.__dd_prevSpan = nil\n}", map[string]string{}, + context.GoLangVersion{}, )), }, }, @@ -758,6 +761,7 @@ var Aspects = [...]aspect.Aspect{ map[string]string{ "tracing": "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing", }, + context.GoLangVersion{}, ), []string{}), advice.AddStructField("__dd_tracer", join.MustTypeName("*gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing.Tracer")), }, @@ -775,6 +779,7 @@ var Aspects = [...]aspect.Aspect{ "tracer": "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer", "tracing": "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing", }, + context.GoLangVersion{}, )), }, }, From 85dc6ca626a9a68fa66c4038ba0c94cb22c9f885 Mon Sep 17 00:00:00 2001 From: Rodrigo Arguello Date: Thu, 31 Oct 2024 11:56:10 +0100 Subject: [PATCH 15/18] prevent panic on macos --- _integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go b/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go index 51c5d156..a4f2e722 100644 --- a/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go +++ b/_integration-tests/tests/segmentio_kafka.v0/segmentio_kafka.go @@ -37,6 +37,8 @@ type TestCase struct { } func (tc *TestCase) Setup(t *testing.T) { + utils.SkipIfProviderIsNotHealthy(t) + tc.kafka, tc.addr = utils.StartKafkaTestContainer(t) tc.writer = &kafka.Writer{ From 2edb1d99f3f08a4eba07d12e54dd14deccb91bd9 Mon Sep 17 00:00:00 2001 From: Rodrigo Arguello Date: Tue, 5 Nov 2024 11:40:49 +0100 Subject: [PATCH 16/18] run integration tests only 10 at a time --- .github/workflows/validate.yml | 2 +- .github/workflows/workflow_call.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 9ccd5ee0..4bac7cc9 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -323,7 +323,7 @@ jobs: mkdir -p "${GOCOVERDIR}" test_args=("-shuffle=on") if [ "${{ github.event_name }}" != "merge_group" ]; then - test_args+=("-coverpkg=./...,github.com/DataDog/orchestrion/..." "-covermode=atomic" "-cover" "-coverprofile=${{ github.workspace }}/coverage/integration.run.out") + test_args+=("-p=10" "-coverpkg=./...,github.com/DataDog/orchestrion/..." "-covermode=atomic" "-cover" "-coverprofile=${{ github.workspace }}/coverage/integration.run.out") fi case "${{ matrix.build-mode }}" in diff --git a/.github/workflows/workflow_call.yml b/.github/workflows/workflow_call.yml index d61fb8b4..79320db9 100644 --- a/.github/workflows/workflow_call.yml +++ b/.github/workflows/workflow_call.yml @@ -68,4 +68,4 @@ jobs: cd orchestrion/_integration-tests ./orchestrion.exe go mod edit -replace=gopkg.in/DataDog/dd-trace-go.v1=../../dd-trace-go ./orchestrion.exe go mod tidy - ./orchestrion.exe go test -tags=integration,buildtag -shuffle=on ./... + ./orchestrion.exe go test -tags=integration,buildtag -shuffle=on -p=10 ./... From 6714b15e778721828f73504fd3884b16389ad311 Mon Sep 17 00:00:00 2001 From: Rodrigo Arguello Date: Tue, 5 Nov 2024 11:54:10 +0100 Subject: [PATCH 17/18] Revert "run integration tests only 10 at a time" This reverts commit 2edb1d99f3f08a4eba07d12e54dd14deccb91bd9. --- .github/workflows/validate.yml | 2 +- .github/workflows/workflow_call.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 4bac7cc9..9ccd5ee0 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -323,7 +323,7 @@ jobs: mkdir -p "${GOCOVERDIR}" test_args=("-shuffle=on") if [ "${{ github.event_name }}" != "merge_group" ]; then - test_args+=("-p=10" "-coverpkg=./...,github.com/DataDog/orchestrion/..." "-covermode=atomic" "-cover" "-coverprofile=${{ github.workspace }}/coverage/integration.run.out") + test_args+=("-coverpkg=./...,github.com/DataDog/orchestrion/..." "-covermode=atomic" "-cover" "-coverprofile=${{ github.workspace }}/coverage/integration.run.out") fi case "${{ matrix.build-mode }}" in diff --git a/.github/workflows/workflow_call.yml b/.github/workflows/workflow_call.yml index 79320db9..d61fb8b4 100644 --- a/.github/workflows/workflow_call.yml +++ b/.github/workflows/workflow_call.yml @@ -68,4 +68,4 @@ jobs: cd orchestrion/_integration-tests ./orchestrion.exe go mod edit -replace=gopkg.in/DataDog/dd-trace-go.v1=../../dd-trace-go ./orchestrion.exe go mod tidy - ./orchestrion.exe go test -tags=integration,buildtag -shuffle=on -p=10 ./... + ./orchestrion.exe go test -tags=integration,buildtag -shuffle=on ./... From 71134faedd9251b46f7094414a3fe27f99aad873 Mon Sep 17 00:00:00 2001 From: Rodrigo Arguello Date: Tue, 5 Nov 2024 12:04:36 +0100 Subject: [PATCH 18/18] remove unrelated change --- .gitignore | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitignore b/.gitignore index 082696d9..26d2da54 100644 --- a/.gitignore +++ b/.gitignore @@ -5,8 +5,6 @@ /errors *.swp orchestrion -orchestrion.exe -orchestrion.log coverage/ venv/ .python-version