mirror of
https://github.com/akvorado/akvorado.git
synced 2025-12-11 22:14:02 +01:00
conntrackfixer: removal of the service
This is not needed anymore since Docker Engine v23. This version is unmaintained since May 2025 (not that old). See: - https://github.com/moby/moby/pull/44752 - https://github.com/moby/moby/pull/44742 Fix #2153 (in a way)
This commit is contained in:
2
.github/e2e.sh
vendored
2
.github/e2e.sh
vendored
@@ -16,7 +16,7 @@ EOF
|
|||||||
# For each service, collect coverage files
|
# For each service, collect coverage files
|
||||||
[ -n "$AKVORADO_COVERAGE_DIRECTORY" ]
|
[ -n "$AKVORADO_COVERAGE_DIRECTORY" ]
|
||||||
mkdir -p ${AKVORADO_COVERAGE_DIRECTORY}
|
mkdir -p ${AKVORADO_COVERAGE_DIRECTORY}
|
||||||
for service in orchestrator inlet outlet console exporter-1 conntrack-fixer; do
|
for service in orchestrator inlet outlet console exporter-1; do
|
||||||
cat >> docker/docker-compose-local.yml <<EOF
|
cat >> docker/docker-compose-local.yml <<EOF
|
||||||
akvorado-${service}:
|
akvorado-${service}:
|
||||||
volumes:
|
volumes:
|
||||||
|
|||||||
9
Makefile
9
Makefile
@@ -39,8 +39,7 @@ GENERATED_GO = \
|
|||||||
console/homepagetopwidget_enumer.go \
|
console/homepagetopwidget_enumer.go \
|
||||||
common/kafka/saslmechanism_enumer.go
|
common/kafka/saslmechanism_enumer.go
|
||||||
GENERATED_TEST_GO = \
|
GENERATED_TEST_GO = \
|
||||||
common/clickhousedb/mocks/mock_driver.go \
|
common/clickhousedb/mocks/mock_driver.go
|
||||||
conntrackfixer/mocks/mock_conntrackfixer.go
|
|
||||||
GENERATED = \
|
GENERATED = \
|
||||||
$(GENERATED_GO) \
|
$(GENERATED_GO) \
|
||||||
$(GENERATED_JS) \
|
$(GENERATED_JS) \
|
||||||
@@ -97,12 +96,6 @@ common/clickhousedb/mocks/mock_driver.go: ; $(info $(M) generate mocks for Click
|
|||||||
$Q $(MOCKGEN) -package mocks -build_constraint "!release" -destination $@ \
|
$Q $(MOCKGEN) -package mocks -build_constraint "!release" -destination $@ \
|
||||||
github.com/ClickHouse/clickhouse-go/v2/lib/driver Conn,Row,Rows,ColumnType
|
github.com/ClickHouse/clickhouse-go/v2/lib/driver Conn,Row,Rows,ColumnType
|
||||||
$Q touch $@
|
$Q touch $@
|
||||||
conntrackfixer/mocks/mock_conntrackfixer.go: ; $(info $(M) generate mocks for conntrack-fixer…)
|
|
||||||
$Q if [ `$(GO) env GOOS` = "linux" ]; then \
|
|
||||||
$(MOCKGEN) -package mocks -build_constraint "!release" -destination $@ \
|
|
||||||
akvorado/conntrackfixer ConntrackConn,DockerClient ; \
|
|
||||||
touch $@ ; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
inlet/flow/input/udp/reuseport_%.o: inlet/flow/input/udp/reuseport_kern.c inlet/flow/input/udp/vmlinux.h ; $(info $(M) generate eBPF program for input/udp ($*)…)
|
inlet/flow/input/udp/reuseport_%.o: inlet/flow/input/udp/reuseport_kern.c inlet/flow/input/udp/vmlinux.h ; $(info $(M) generate eBPF program for input/udp ($*)…)
|
||||||
$Q ! $(CLANG) -print-targets 2> /dev/null | grep -qF $* || \
|
$Q ! $(CLANG) -print-targets 2> /dev/null | grep -qF $* || \
|
||||||
|
|||||||
@@ -1,64 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2022 Free Mobile
|
|
||||||
// SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
//go:build linux
|
|
||||||
|
|
||||||
package cmd
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
|
|
||||||
"akvorado/common/daemon"
|
|
||||||
"akvorado/common/httpserver"
|
|
||||||
"akvorado/common/reporter"
|
|
||||||
"akvorado/conntrackfixer"
|
|
||||||
)
|
|
||||||
|
|
||||||
var conntrackFixerCmd = &cobra.Command{
|
|
||||||
Use: "conntrack-fixer",
|
|
||||||
Short: "Clean conntrack for UDP ports",
|
|
||||||
Long: `This helper cleans the conntrack entries for the UDP ports exposed by
|
|
||||||
containers started with the label "akvorado.conntrack.fix=1".`,
|
|
||||||
Args: cobra.NoArgs,
|
|
||||||
RunE: func(_ *cobra.Command, _ []string) error {
|
|
||||||
// This is a simplified service which is not configurable.
|
|
||||||
r, err := reporter.New(reporter.DefaultConfiguration())
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("unable to initialize reporter: %w", err)
|
|
||||||
}
|
|
||||||
daemonComponent, err := daemon.New(r)
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("unable to initialize daemon component: %w", err)
|
|
||||||
}
|
|
||||||
httpConfiguration := httpserver.DefaultConfiguration()
|
|
||||||
httpConfiguration.Listen = ""
|
|
||||||
httpComponent, err := httpserver.New(r, "conntrack-fixer", httpConfiguration, httpserver.Dependencies{
|
|
||||||
Daemon: daemonComponent,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("unable to initialize HTTP component: %w", err)
|
|
||||||
}
|
|
||||||
conntrackFixerComponent, err := conntrackfixer.New(r,
|
|
||||||
conntrackfixer.Dependencies{
|
|
||||||
Daemon: daemonComponent,
|
|
||||||
HTTP: httpComponent,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("unable to initialize conntrack fixer component: %w", err)
|
|
||||||
}
|
|
||||||
addCommonHTTPHandlers(r, "conntrack-fixer", httpComponent)
|
|
||||||
moreMetrics(r)
|
|
||||||
|
|
||||||
components := []any{
|
|
||||||
httpComponent,
|
|
||||||
conntrackFixerComponent,
|
|
||||||
}
|
|
||||||
return StartStopComponents(r, daemonComponent, components)
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
RootCmd.AddCommand(conntrackFixerCmd)
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2022 Free Mobile
|
|
||||||
// SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
//go:build linux
|
|
||||||
|
|
||||||
package conntrackfixer
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"github.com/moby/moby/client"
|
|
||||||
"github.com/ti-mo/conntrack"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ConntrackConn is the part of conntrack.Conn we use
|
|
||||||
type ConntrackConn interface {
|
|
||||||
Close() error
|
|
||||||
Dump(opts *conntrack.DumpOptions) ([]conntrack.Flow, error)
|
|
||||||
Delete(f conntrack.Flow) error
|
|
||||||
}
|
|
||||||
|
|
||||||
// DockerClient is the part of docker.Client we use
|
|
||||||
type DockerClient interface {
|
|
||||||
client.ContainerAPIClient
|
|
||||||
client.SystemAPIClient
|
|
||||||
ServerVersion(ctx context.Context, options client.ServerVersionOptions) (client.ServerVersionResult, error)
|
|
||||||
Close() error
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2022 Free Mobile
|
|
||||||
// SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
// Package mocks contains mocks for conntrackfixer package.
|
|
||||||
package mocks
|
|
||||||
|
|
||||||
import (
|
|
||||||
_ "go.uber.org/mock/mockgen/model" // for mockgen in vendor mode
|
|
||||||
)
|
|
||||||
@@ -1,256 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2022 Free Mobile
|
|
||||||
// SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
//go:build linux
|
|
||||||
|
|
||||||
// Package conntrackfixer remove conntrack entries from selected containers
|
|
||||||
package conntrackfixer
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"fmt"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"akvorado/common/daemon"
|
|
||||||
"akvorado/common/httpserver"
|
|
||||||
"akvorado/common/reporter"
|
|
||||||
|
|
||||||
"github.com/moby/moby/client"
|
|
||||||
"github.com/ti-mo/conntrack"
|
|
||||||
"gopkg.in/tomb.v2"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Component represents the broker.
|
|
||||||
type Component struct {
|
|
||||||
r *reporter.Reporter
|
|
||||||
d *Dependencies
|
|
||||||
t tomb.Tomb
|
|
||||||
|
|
||||||
dockerClient DockerClient
|
|
||||||
conntrackConn ConntrackConn
|
|
||||||
|
|
||||||
changes chan bool
|
|
||||||
healthy chan reporter.ChannelHealthcheckFunc
|
|
||||||
|
|
||||||
metrics struct {
|
|
||||||
conntrackDeleted *reporter.CounterVec
|
|
||||||
runs *reporter.CounterVec
|
|
||||||
errors *reporter.CounterVec
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Dependencies define the dependencies of the broker.
|
|
||||||
type Dependencies struct {
|
|
||||||
HTTP *httpserver.Component
|
|
||||||
Daemon daemon.Component
|
|
||||||
}
|
|
||||||
|
|
||||||
// New creates a new component
|
|
||||||
func New(r *reporter.Reporter, dependencies Dependencies) (*Component, error) {
|
|
||||||
cli, err := client.New(
|
|
||||||
client.FromEnv,
|
|
||||||
)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("unable to initialize Docker client: %w", err)
|
|
||||||
}
|
|
||||||
chl, err := conntrack.Dial(nil)
|
|
||||||
if err != nil {
|
|
||||||
cli.Close()
|
|
||||||
return nil, fmt.Errorf("cannot initialize conntrack support: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
c := Component{
|
|
||||||
r: r,
|
|
||||||
d: &dependencies,
|
|
||||||
|
|
||||||
dockerClient: cli,
|
|
||||||
conntrackConn: chl,
|
|
||||||
|
|
||||||
changes: make(chan bool),
|
|
||||||
healthy: make(chan reporter.ChannelHealthcheckFunc),
|
|
||||||
}
|
|
||||||
|
|
||||||
c.metrics.conntrackDeleted = c.r.CounterVec(
|
|
||||||
reporter.CounterOpts{
|
|
||||||
Name: "conntrack_deleted_total",
|
|
||||||
Help: "Number of conntrack entries deleted.",
|
|
||||||
},
|
|
||||||
[]string{"container", "port"},
|
|
||||||
)
|
|
||||||
c.metrics.runs = c.r.CounterVec(
|
|
||||||
reporter.CounterOpts{
|
|
||||||
Name: "runs_total",
|
|
||||||
Help: "Number of conntrack cleaning runs triggered.",
|
|
||||||
},
|
|
||||||
[]string{"reason"},
|
|
||||||
)
|
|
||||||
c.metrics.errors = c.r.CounterVec(
|
|
||||||
reporter.CounterOpts{
|
|
||||||
Name: "errors_total",
|
|
||||||
Help: "Number of non-fatal errors.",
|
|
||||||
},
|
|
||||||
[]string{"error"},
|
|
||||||
)
|
|
||||||
|
|
||||||
c.d.Daemon.Track(&c.t, "conntrack-fixer")
|
|
||||||
return &c, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start the conntrack fixer component
|
|
||||||
func (c *Component) Start() error {
|
|
||||||
c.r.Info().Msg("starting conntrack-fixer component")
|
|
||||||
c.r.RegisterHealthcheck("conntrack-fixer", c.channelHealthcheck())
|
|
||||||
|
|
||||||
// Trigger an update
|
|
||||||
trigger := func() {
|
|
||||||
select {
|
|
||||||
case c.changes <- true:
|
|
||||||
case <-c.t.Dying():
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Goroutine to watch for changes
|
|
||||||
ready := make(chan bool)
|
|
||||||
c.t.Go(func() error {
|
|
||||||
filter := client.Filters{}
|
|
||||||
filter.Add("event", "start")
|
|
||||||
filter.Add("label", "akvorado.conntrack.fix=true")
|
|
||||||
events := c.dockerClient.Events(c.t.Context(nil), client.EventsListOptions{Filters: filter})
|
|
||||||
close(ready)
|
|
||||||
for {
|
|
||||||
t := time.NewTimer(5 * time.Minute)
|
|
||||||
select {
|
|
||||||
case <-c.t.Dying():
|
|
||||||
return nil
|
|
||||||
case err := <-events.Err:
|
|
||||||
return fmt.Errorf("error while watching for Docker events: %w", err)
|
|
||||||
case msg := <-events.Messages:
|
|
||||||
c.r.Info().
|
|
||||||
Str("id", msg.Actor.ID).
|
|
||||||
Str("from", msg.Actor.Attributes["image"]).
|
|
||||||
Msg("new container started")
|
|
||||||
c.metrics.runs.WithLabelValues("new container").Inc()
|
|
||||||
trigger()
|
|
||||||
case <-t.C:
|
|
||||||
c.metrics.runs.WithLabelValues("schedule").Inc()
|
|
||||||
trigger()
|
|
||||||
}
|
|
||||||
t.Stop()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// Goroutine to react to changes
|
|
||||||
c.t.Go(func() error {
|
|
||||||
filter := client.Filters{}
|
|
||||||
filter.Add("label", "akvorado.conntrack.fix=true")
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case <-c.t.Dying():
|
|
||||||
return nil
|
|
||||||
case cb, ok := <-c.healthy:
|
|
||||||
if ok {
|
|
||||||
ctx, cancel := context.WithTimeout(c.t.Context(nil), time.Second)
|
|
||||||
if _, err := c.dockerClient.ServerVersion(ctx, client.ServerVersionOptions{}); err == nil {
|
|
||||||
cb(reporter.HealthcheckOK, "docker client alive")
|
|
||||||
} else {
|
|
||||||
cb(reporter.HealthcheckWarning, "docker client unavailable")
|
|
||||||
}
|
|
||||||
cancel()
|
|
||||||
}
|
|
||||||
case <-c.changes:
|
|
||||||
containers, err := c.dockerClient.ContainerList(c.t.Context(nil),
|
|
||||||
client.ContainerListOptions{
|
|
||||||
Filters: filter,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
c.r.Err(err).Msg("cannot list containers")
|
|
||||||
c.metrics.errors.WithLabelValues("cannot list containers").Inc()
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
for _, container := range containers.Items {
|
|
||||||
details, err := c.dockerClient.ContainerInspect(c.t.Context(nil), container.ID,
|
|
||||||
client.ContainerInspectOptions{})
|
|
||||||
if err != nil {
|
|
||||||
c.r.Err(err).Msg("cannot get details on container")
|
|
||||||
c.metrics.errors.WithLabelValues("cannot get details on container").Inc()
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
for rport, bindings := range details.Container.NetworkSettings.Ports {
|
|
||||||
if !strings.HasSuffix(rport.String(), "/udp") {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
ports := map[string]struct{}{}
|
|
||||||
for _, binding := range bindings {
|
|
||||||
ports[binding.HostPort] = struct{}{}
|
|
||||||
}
|
|
||||||
for hportStr := range ports {
|
|
||||||
hport, err := strconv.ParseUint(hportStr, 10, 16)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
l := c.r.With().Str("binding",
|
|
||||||
fmt.Sprintf("%s -> %d", rport, hport)).Logger()
|
|
||||||
l.Info().Msg("clear conntrack for UDP port")
|
|
||||||
if count := c.purgeConntrack(uint16(hport)); count > 0 {
|
|
||||||
c.metrics.conntrackDeleted.
|
|
||||||
WithLabelValues(container.ID, hportStr).
|
|
||||||
Add(float64(count))
|
|
||||||
l.Info().Msgf("%d entries deleted", count)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// Trigger now
|
|
||||||
<-ready
|
|
||||||
c.r.Info().Msg("conntrack fixer running")
|
|
||||||
c.metrics.runs.WithLabelValues("start").Inc()
|
|
||||||
trigger()
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stop stops the conntrack-fixer component
|
|
||||||
func (c *Component) Stop() error {
|
|
||||||
c.r.Info().Msg("stopping conntrack-fixer component")
|
|
||||||
defer func() {
|
|
||||||
close(c.changes)
|
|
||||||
c.conntrackConn.Close()
|
|
||||||
c.dockerClient.Close()
|
|
||||||
c.r.Info().Msg("conntrack-fixer component stopped")
|
|
||||||
}()
|
|
||||||
c.t.Kill(nil)
|
|
||||||
return c.t.Wait()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Component) channelHealthcheck() reporter.HealthcheckFunc {
|
|
||||||
return reporter.ChannelHealthcheck(c.t.Context(nil), c.healthy)
|
|
||||||
}
|
|
||||||
|
|
||||||
// purgeConntrack purge the conntrack for the given port.
|
|
||||||
func (c *Component) purgeConntrack(port uint16) int {
|
|
||||||
flows, err := c.conntrackConn.Dump(nil)
|
|
||||||
if err != nil {
|
|
||||||
c.r.Err(err).Msg("cannot list conntrack entries")
|
|
||||||
c.metrics.errors.WithLabelValues("cannot list conntrack entries").Inc()
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
count := 0
|
|
||||||
for _, flow := range flows {
|
|
||||||
if flow.TupleOrig.Proto.Protocol == 17 && flow.TupleOrig.Proto.DestinationPort == port {
|
|
||||||
if err := c.conntrackConn.Delete(flow); err != nil {
|
|
||||||
c.r.Err(err).Msg("cannot delete conntrack entry")
|
|
||||||
c.metrics.errors.WithLabelValues("cannot delete conntrack entries").Inc()
|
|
||||||
} else {
|
|
||||||
count++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return count
|
|
||||||
}
|
|
||||||
@@ -1,242 +0,0 @@
|
|||||||
// SPDX-FileCopyrightText: 2022 Free Mobile
|
|
||||||
// SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
|
|
||||||
//go:build linux
|
|
||||||
|
|
||||||
package conntrackfixer
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"errors"
|
|
||||||
"net/netip"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/moby/moby/api/types/container"
|
|
||||||
"github.com/moby/moby/api/types/events"
|
|
||||||
"github.com/moby/moby/api/types/network"
|
|
||||||
"github.com/moby/moby/client"
|
|
||||||
_ "github.com/opencontainers/image-spec/specs-go/v1" // used by mock
|
|
||||||
"github.com/ti-mo/conntrack"
|
|
||||||
"go.uber.org/mock/gomock"
|
|
||||||
|
|
||||||
"akvorado/common/daemon"
|
|
||||||
"akvorado/common/helpers"
|
|
||||||
"akvorado/common/httpserver"
|
|
||||||
"akvorado/common/reporter"
|
|
||||||
"akvorado/conntrackfixer/mocks"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestRoot(t *testing.T) {
|
|
||||||
r := reporter.NewMock(t)
|
|
||||||
h := httpserver.NewMock(t, r)
|
|
||||||
c, err := New(r, Dependencies{
|
|
||||||
HTTP: h,
|
|
||||||
Daemon: daemon.NewMock(t),
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("New() error:\n%+v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Replace docker client and conntrack connection with mocks
|
|
||||||
ctrl := gomock.NewController(t)
|
|
||||||
dockerClientMock := mocks.NewMockDockerClient(ctrl)
|
|
||||||
c.dockerClient = dockerClientMock
|
|
||||||
conntrackConnMock := mocks.NewMockConntrackConn(ctrl)
|
|
||||||
c.conntrackConn = conntrackConnMock
|
|
||||||
|
|
||||||
dockerClientMock.EXPECT().
|
|
||||||
Close().
|
|
||||||
Return(nil)
|
|
||||||
conntrackConnMock.EXPECT().
|
|
||||||
Close().
|
|
||||||
Return(nil)
|
|
||||||
|
|
||||||
dockerEventMessages := make(chan events.Message)
|
|
||||||
dockerEvents := client.EventsResult{
|
|
||||||
Messages: dockerEventMessages,
|
|
||||||
Err: nil,
|
|
||||||
}
|
|
||||||
dockerClientMock.EXPECT().
|
|
||||||
Events(gomock.Any(), gomock.Any()).
|
|
||||||
Return(dockerEvents)
|
|
||||||
|
|
||||||
// Initial trigger
|
|
||||||
networkSettings := &container.NetworkSettings{}
|
|
||||||
networkSettings.Ports = network.PortMap{
|
|
||||||
network.MustParsePort("2055/udp"): {
|
|
||||||
network.PortBinding{
|
|
||||||
HostIP: netip.MustParseAddr("127.0.0.1"),
|
|
||||||
HostPort: "6776",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
dockerClientMock.EXPECT().
|
|
||||||
ContainerList(gomock.Any(), gomock.Any()).
|
|
||||||
Return(client.ContainerListResult{
|
|
||||||
Items: []container.Summary{{ID: "initial"}},
|
|
||||||
}, nil)
|
|
||||||
dockerClientMock.EXPECT().
|
|
||||||
ContainerInspect(gomock.Any(), "initial", gomock.Any()).
|
|
||||||
Return(client.ContainerInspectResult{
|
|
||||||
Container: container.InspectResponse{
|
|
||||||
NetworkSettings: networkSettings,
|
|
||||||
},
|
|
||||||
}, nil)
|
|
||||||
conntrackConnMock.EXPECT().
|
|
||||||
Dump(nil).
|
|
||||||
Return([]conntrack.Flow{
|
|
||||||
{
|
|
||||||
ID: 1,
|
|
||||||
TupleOrig: conntrack.Tuple{
|
|
||||||
Proto: conntrack.ProtoTuple{
|
|
||||||
Protocol: 17,
|
|
||||||
DestinationPort: 6777,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
ID: 2,
|
|
||||||
TupleOrig: conntrack.Tuple{
|
|
||||||
Proto: conntrack.ProtoTuple{
|
|
||||||
Protocol: 17,
|
|
||||||
DestinationPort: 6776,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}, nil)
|
|
||||||
conntrackConnMock.EXPECT().
|
|
||||||
Delete(conntrack.Flow{
|
|
||||||
ID: 2,
|
|
||||||
TupleOrig: conntrack.Tuple{
|
|
||||||
Proto: conntrack.ProtoTuple{
|
|
||||||
Protocol: 17,
|
|
||||||
DestinationPort: 6776,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}).
|
|
||||||
Return(nil)
|
|
||||||
helpers.StartStop(t, c)
|
|
||||||
|
|
||||||
// Healthcheck test
|
|
||||||
t.Run("healthcheck", func(t *testing.T) {
|
|
||||||
dockerClientMock.EXPECT().ServerVersion(gomock.Any(), gomock.Any()).
|
|
||||||
Return(client.ServerVersionResult{}, nil)
|
|
||||||
got := r.RunHealthchecks(context.Background())
|
|
||||||
if diff := helpers.Diff(got.Details["conntrack-fixer"], reporter.HealthcheckResult{
|
|
||||||
Status: reporter.HealthcheckOK,
|
|
||||||
Reason: "docker client alive",
|
|
||||||
}); diff != "" {
|
|
||||||
t.Fatalf("runHealthcheck() (-got, +want):\n%s", diff)
|
|
||||||
}
|
|
||||||
dockerClientMock.EXPECT().ServerVersion(gomock.Any(), gomock.Any()).
|
|
||||||
Return(client.ServerVersionResult{}, errors.New("unexpected"))
|
|
||||||
got = r.RunHealthchecks(context.Background())
|
|
||||||
if diff := helpers.Diff(got.Details["conntrack-fixer"], reporter.HealthcheckResult{
|
|
||||||
Status: reporter.HealthcheckWarning,
|
|
||||||
Reason: "docker client unavailable",
|
|
||||||
}); diff != "" {
|
|
||||||
t.Fatalf("runHealthcheck() (-got, +want):\n%s", diff)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// New container
|
|
||||||
t.Run("new container", func(_ *testing.T) {
|
|
||||||
networkSettings := &container.NetworkSettings{}
|
|
||||||
networkSettings.Ports = network.PortMap{
|
|
||||||
network.MustParsePort("2055/udp"): {
|
|
||||||
network.PortBinding{
|
|
||||||
HostIP: netip.MustParseAddr("127.0.0.1"),
|
|
||||||
HostPort: "6777",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
dockerClientMock.EXPECT().
|
|
||||||
ContainerList(gomock.Any(), gomock.Any()).
|
|
||||||
Return(client.ContainerListResult{
|
|
||||||
Items: []container.Summary{{ID: "new one"}},
|
|
||||||
}, nil)
|
|
||||||
dockerClientMock.EXPECT().
|
|
||||||
ContainerInspect(gomock.Any(), "new one", gomock.Any()).
|
|
||||||
Return(client.ContainerInspectResult{
|
|
||||||
Container: container.InspectResponse{
|
|
||||||
NetworkSettings: networkSettings,
|
|
||||||
},
|
|
||||||
}, nil)
|
|
||||||
conntrackConnMock.EXPECT().
|
|
||||||
Dump(nil).
|
|
||||||
Return([]conntrack.Flow{
|
|
||||||
{
|
|
||||||
ID: 3,
|
|
||||||
TupleOrig: conntrack.Tuple{
|
|
||||||
Proto: conntrack.ProtoTuple{
|
|
||||||
Protocol: 6, // TCP!
|
|
||||||
DestinationPort: 6777,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
ID: 4,
|
|
||||||
TupleOrig: conntrack.Tuple{
|
|
||||||
Proto: conntrack.ProtoTuple{
|
|
||||||
Protocol: 17,
|
|
||||||
DestinationPort: 6777,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
ID: 5,
|
|
||||||
TupleOrig: conntrack.Tuple{
|
|
||||||
Proto: conntrack.ProtoTuple{
|
|
||||||
Protocol: 17,
|
|
||||||
DestinationPort: 6777,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}, nil)
|
|
||||||
conntrackConnMock.EXPECT().
|
|
||||||
Delete(conntrack.Flow{
|
|
||||||
ID: 4,
|
|
||||||
TupleOrig: conntrack.Tuple{
|
|
||||||
Proto: conntrack.ProtoTuple{
|
|
||||||
Protocol: 17,
|
|
||||||
DestinationPort: 6777,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}).
|
|
||||||
Return(errors.New("already deleted"))
|
|
||||||
conntrackConnMock.EXPECT().
|
|
||||||
Delete(conntrack.Flow{
|
|
||||||
ID: 5,
|
|
||||||
TupleOrig: conntrack.Tuple{
|
|
||||||
Proto: conntrack.ProtoTuple{
|
|
||||||
Protocol: 17,
|
|
||||||
DestinationPort: 6777,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}).
|
|
||||||
Return(nil)
|
|
||||||
dockerEventMessages <- events.Message{
|
|
||||||
Type: events.ContainerEventType,
|
|
||||||
Action: events.ActionCreate,
|
|
||||||
Actor: events.Actor{
|
|
||||||
ID: "something",
|
|
||||||
Attributes: map[string]string{
|
|
||||||
"image": "some/image:v17",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
time.Sleep(20 * time.Millisecond)
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("metrics", func(t *testing.T) {
|
|
||||||
gotMetrics := r.GetMetrics("akvorado_conntrackfixer_")
|
|
||||||
expectedMetrics := map[string]string{
|
|
||||||
`conntrack_deleted_total{container="initial",port="6776"}`: "1",
|
|
||||||
`conntrack_deleted_total{container="new one",port="6777"}`: "1",
|
|
||||||
`errors_total{error="cannot delete conntrack entries"}`: "1",
|
|
||||||
`runs_total{reason="new container"}`: "1",
|
|
||||||
`runs_total{reason="start"}`: "1",
|
|
||||||
}
|
|
||||||
if diff := helpers.Diff(gotMetrics, expectedMetrics); diff != "" {
|
|
||||||
t.Fatalf("Metrics after template (-got, +want):\n%s", diff)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@@ -19,7 +19,7 @@ Check the `docker/docker-compose.yml` file for an example of how to deploy
|
|||||||
the [quick start procedure](00-intro.md#quick-start). This documentation assumes
|
the [quick start procedure](00-intro.md#quick-start). This documentation assumes
|
||||||
you are using the `docker compose` setup.
|
you are using the `docker compose` setup.
|
||||||
|
|
||||||
The minimum supported version for Docker Engine is v25 (Docker API 1.44).
|
The minimum supported version for Docker Engine is v23.
|
||||||
|
|
||||||
If you want to compile the Docker image yourself, use `make docker`.
|
If you want to compile the Docker image yourself, use `make docker`.
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,6 @@ Check that all components are running and healthy:
|
|||||||
```console
|
```console
|
||||||
$ docker compose ps --format "table {{.Service}}\t{{.Status}}"
|
$ docker compose ps --format "table {{.Service}}\t{{.Status}}"
|
||||||
SERVICE STATUS
|
SERVICE STATUS
|
||||||
akvorado-conntrack-fixer Up 28 minutes
|
|
||||||
akvorado-console Up 27 minutes (healthy)
|
akvorado-console Up 27 minutes (healthy)
|
||||||
akvorado-inlet Up 27 minutes (healthy)
|
akvorado-inlet Up 27 minutes (healthy)
|
||||||
akvorado-orchestrator Up 27 minutes (healthy)
|
akvorado-orchestrator Up 27 minutes (healthy)
|
||||||
@@ -118,6 +117,19 @@ address of the exporter and the port with the correct port (2055 for NetFlow,
|
|||||||
0 packets dropped by kernel
|
0 packets dropped by kernel
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If you receive flows but they do not reach Akvorado, check you are running
|
||||||
|
Docker Engine v23 or more recent:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ docker version
|
||||||
|
[...]
|
||||||
|
Server:
|
||||||
|
Engine:
|
||||||
|
Version: 27.5.1+dfsg4
|
||||||
|
API version: 1.47 (minimum version 1.24)
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
Next, check if flows are sent to Kafka correctly:
|
Next, check if flows are sent to Kafka correctly:
|
||||||
|
|
||||||
```console
|
```console
|
||||||
|
|||||||
@@ -10,12 +10,15 @@ identified with a specific icon:
|
|||||||
- 🩹: bug fix
|
- 🩹: bug fix
|
||||||
- 🌱: miscellaneous change
|
- 🌱: miscellaneous change
|
||||||
|
|
||||||
|
## Unreleased
|
||||||
|
|
||||||
|
- 💥 *docker*: remove conntrack-fixer service (this requires Docker Engine v23 or more recent)
|
||||||
|
|
||||||
## 2.0.4 - 2025-12-04
|
## 2.0.4 - 2025-12-04
|
||||||
|
|
||||||
The previous release introduced a performance regression for users with many
|
The previous release introduced a performance regression for users with many
|
||||||
flows from a single exporter. This is fixed in this release.
|
flows from a single exporter. This is fixed in this release.
|
||||||
|
|
||||||
- 💥 *docker*: bump minimum Docker API version supported to 1.44 (Docker Engine v25)
|
|
||||||
- 🩹 *docker*: restart geoip container on boot
|
- 🩹 *docker*: restart geoip container on boot
|
||||||
- 🌱 *inlet*: make load-balancing algorithm for Kafka partitions configurable
|
- 🌱 *inlet*: make load-balancing algorithm for Kafka partitions configurable
|
||||||
(`random` or `by-exporter`) and revert back to `random` by default (like before 2.0.3)
|
(`random` or `by-exporter`) and revert back to `random` by default (like before 2.0.3)
|
||||||
|
|||||||
@@ -167,7 +167,6 @@ services:
|
|||||||
- traefik.http.routers.akvorado-inlet.entrypoints=private
|
- traefik.http.routers.akvorado-inlet.entrypoints=private
|
||||||
- traefik.http.routers.akvorado-inlet.rule=PathPrefix(`/api/v0/inlet`)
|
- traefik.http.routers.akvorado-inlet.rule=PathPrefix(`/api/v0/inlet`)
|
||||||
- traefik.http.services.akvorado-inlet.loadbalancer.server.port=8080
|
- traefik.http.services.akvorado-inlet.loadbalancer.server.port=8080
|
||||||
- akvorado.conntrack.fix=true
|
|
||||||
- metrics.port=8080
|
- metrics.port=8080
|
||||||
- metrics.path=/api/v0/metrics
|
- metrics.path=/api/v0/metrics
|
||||||
akvorado-outlet:
|
akvorado-outlet:
|
||||||
@@ -203,19 +202,6 @@ services:
|
|||||||
- traefik.http.services.akvorado-outlet.loadbalancer.server.port=8080
|
- traefik.http.services.akvorado-outlet.loadbalancer.server.port=8080
|
||||||
- metrics.port=8080
|
- metrics.port=8080
|
||||||
- metrics.path=/api/v0/metrics
|
- metrics.path=/api/v0/metrics
|
||||||
akvorado-conntrack-fixer:
|
|
||||||
extends:
|
|
||||||
file: versions.yml
|
|
||||||
service: akvorado
|
|
||||||
cap_add:
|
|
||||||
- NET_ADMIN
|
|
||||||
command: conntrack-fixer
|
|
||||||
restart: unless-stopped
|
|
||||||
network_mode: host
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "/usr/local/bin/akvorado", "healthcheck", "--service", "conntrack-fixer"]
|
|
||||||
volumes:
|
|
||||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
|
||||||
|
|
||||||
clickhouse:
|
clickhouse:
|
||||||
extends:
|
extends:
|
||||||
|
|||||||
19
go.mod
19
go.mod
@@ -31,20 +31,17 @@ require (
|
|||||||
github.com/hashicorp/go-version v1.8.0
|
github.com/hashicorp/go-version v1.8.0
|
||||||
github.com/itchyny/gojq v0.12.18
|
github.com/itchyny/gojq v0.12.18
|
||||||
github.com/mattn/go-isatty v0.0.20
|
github.com/mattn/go-isatty v0.0.20
|
||||||
github.com/moby/moby/api v1.52.0
|
|
||||||
github.com/moby/moby/client v0.2.1
|
|
||||||
github.com/netsampler/goflow2/v2 v2.2.3
|
github.com/netsampler/goflow2/v2 v2.2.3
|
||||||
github.com/openconfig/gnmi v0.14.0
|
github.com/openconfig/gnmi v0.14.0
|
||||||
github.com/openconfig/gnmic/pkg/api v0.1.9
|
github.com/openconfig/gnmic/pkg/api v0.1.9
|
||||||
github.com/opencontainers/image-spec v1.1.1
|
|
||||||
github.com/oschwald/maxminddb-golang/v2 v2.1.1
|
github.com/oschwald/maxminddb-golang/v2 v2.1.1
|
||||||
github.com/osrg/gobgp/v4 v4.1.0
|
github.com/osrg/gobgp/v4 v4.1.0
|
||||||
|
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10
|
||||||
github.com/prometheus/client_golang v1.23.2
|
github.com/prometheus/client_golang v1.23.2
|
||||||
github.com/rs/zerolog v1.34.0
|
github.com/rs/zerolog v1.34.0
|
||||||
github.com/scrapli/scrapligo v1.3.3
|
github.com/scrapli/scrapligo v1.3.3
|
||||||
github.com/slayercat/GoSNMPServer v0.5.2
|
github.com/slayercat/GoSNMPServer v0.5.2
|
||||||
github.com/spf13/cobra v1.10.1
|
github.com/spf13/cobra v1.10.1
|
||||||
github.com/ti-mo/conntrack v0.6.0
|
|
||||||
github.com/twmb/franz-go v1.20.5
|
github.com/twmb/franz-go v1.20.5
|
||||||
github.com/twmb/franz-go/pkg/kadm v1.17.1
|
github.com/twmb/franz-go/pkg/kadm v1.17.1
|
||||||
github.com/twmb/franz-go/pkg/kfake v0.0.0-20250711145744-a849b8be17b7
|
github.com/twmb/franz-go/pkg/kfake v0.0.0-20250711145744-a849b8be17b7
|
||||||
@@ -72,7 +69,6 @@ require (
|
|||||||
filippo.io/edwards25519 v1.1.0 // indirect
|
filippo.io/edwards25519 v1.1.0 // indirect
|
||||||
github.com/AlekSi/pointer v1.2.0 // indirect
|
github.com/AlekSi/pointer v1.2.0 // indirect
|
||||||
github.com/BurntSushi/toml v1.5.0 // indirect
|
github.com/BurntSushi/toml v1.5.0 // indirect
|
||||||
github.com/Microsoft/go-winio v0.6.2 // indirect
|
|
||||||
github.com/andybalholm/brotli v1.2.0 // indirect
|
github.com/andybalholm/brotli v1.2.0 // indirect
|
||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
github.com/bio-routing/tflow2 v0.0.0-20181230153523-2e308a4a3c3a // indirect
|
github.com/bio-routing/tflow2 v0.0.0-20181230153523-2e308a4a3c3a // indirect
|
||||||
@@ -84,25 +80,19 @@ require (
|
|||||||
github.com/clipperhouse/stringish v0.1.1 // indirect
|
github.com/clipperhouse/stringish v0.1.1 // indirect
|
||||||
github.com/clipperhouse/uax29/v2 v2.3.0 // indirect
|
github.com/clipperhouse/uax29/v2 v2.3.0 // indirect
|
||||||
github.com/cloudwego/base64x v0.1.6 // indirect
|
github.com/cloudwego/base64x v0.1.6 // indirect
|
||||||
github.com/containerd/errdefs v1.0.0 // indirect
|
|
||||||
github.com/containerd/errdefs/pkg v0.3.0 // indirect
|
|
||||||
github.com/cosiner/argv v0.1.0 // indirect
|
github.com/cosiner/argv v0.1.0 // indirect
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect
|
github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect
|
||||||
github.com/creack/pty v1.1.24 // indirect
|
github.com/creack/pty v1.1.24 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||||
github.com/derekparker/trie v0.0.0-20230829180723-39f4de51ef7d // indirect
|
github.com/derekparker/trie v0.0.0-20230829180723-39f4de51ef7d // indirect
|
||||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
||||||
github.com/distribution/reference v0.6.0 // indirect
|
|
||||||
github.com/dlclark/regexp2 v1.11.5 // indirect
|
github.com/dlclark/regexp2 v1.11.5 // indirect
|
||||||
github.com/dmarkham/enumer v1.6.1 // indirect
|
github.com/dmarkham/enumer v1.6.1 // indirect
|
||||||
github.com/dnephin/pflag v1.0.7 // indirect
|
github.com/dnephin/pflag v1.0.7 // indirect
|
||||||
github.com/docker/go-connections v0.6.0 // indirect
|
|
||||||
github.com/docker/go-units v0.5.0 // indirect
|
|
||||||
github.com/dustin/go-humanize v1.0.1 // indirect
|
github.com/dustin/go-humanize v1.0.1 // indirect
|
||||||
github.com/emicklei/dot v0.15.0 // indirect
|
github.com/emicklei/dot v0.15.0 // indirect
|
||||||
github.com/fatih/color v1.18.0 // indirect
|
github.com/fatih/color v1.18.0 // indirect
|
||||||
github.com/fatih/structtag v1.2.0 // indirect
|
github.com/fatih/structtag v1.2.0 // indirect
|
||||||
github.com/felixge/httpsnoop v1.0.4 // indirect
|
|
||||||
github.com/frapposelli/wwhrd v0.4.0 // indirect
|
github.com/frapposelli/wwhrd v0.4.0 // indirect
|
||||||
github.com/gabriel-vasile/mimetype v1.4.8 // indirect
|
github.com/gabriel-vasile/mimetype v1.4.8 // indirect
|
||||||
github.com/gin-contrib/sse v1.1.0 // indirect
|
github.com/gin-contrib/sse v1.1.0 // indirect
|
||||||
@@ -138,7 +128,6 @@ require (
|
|||||||
github.com/jhump/protoreflect v1.17.0 // indirect
|
github.com/jhump/protoreflect v1.17.0 // indirect
|
||||||
github.com/jinzhu/inflection v1.0.0 // indirect
|
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||||
github.com/jinzhu/now v1.1.5 // indirect
|
github.com/jinzhu/now v1.1.5 // indirect
|
||||||
github.com/josharian/native v1.1.0 // indirect
|
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
github.com/klauspost/compress v1.18.1 // indirect
|
github.com/klauspost/compress v1.18.1 // indirect
|
||||||
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
|
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
|
||||||
@@ -146,23 +135,19 @@ require (
|
|||||||
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
|
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
|
||||||
github.com/mattn/go-colorable v0.1.14 // indirect
|
github.com/mattn/go-colorable v0.1.14 // indirect
|
||||||
github.com/mattn/go-runewidth v0.0.19 // indirect
|
github.com/mattn/go-runewidth v0.0.19 // indirect
|
||||||
github.com/mdlayher/netlink v1.7.2 // indirect
|
|
||||||
github.com/mdlayher/socket v0.5.1 // indirect
|
github.com/mdlayher/socket v0.5.1 // indirect
|
||||||
github.com/mgechev/dots v1.0.0 // indirect
|
github.com/mgechev/dots v1.0.0 // indirect
|
||||||
github.com/mgechev/revive v1.12.0 // indirect
|
github.com/mgechev/revive v1.12.0 // indirect
|
||||||
github.com/mna/pigeon v1.3.0 // indirect
|
github.com/mna/pigeon v1.3.0 // indirect
|
||||||
github.com/moby/docker-image-spec v1.3.1 // indirect
|
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||||
github.com/openconfig/grpctunnel v0.1.0 // indirect
|
github.com/openconfig/grpctunnel v0.1.0 // indirect
|
||||||
github.com/opencontainers/go-digest v1.0.0 // indirect
|
|
||||||
github.com/pascaldekloe/name v1.0.1 // indirect
|
github.com/pascaldekloe/name v1.0.1 // indirect
|
||||||
github.com/paulmach/orb v0.11.1 // indirect
|
github.com/paulmach/orb v0.11.1 // indirect
|
||||||
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
|
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
|
||||||
github.com/pierrec/lz4/v4 v4.1.22 // indirect
|
github.com/pierrec/lz4/v4 v4.1.22 // indirect
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect
|
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||||
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
|
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
|
||||||
github.com/prometheus/client_model v0.6.2 // indirect
|
github.com/prometheus/client_model v0.6.2 // indirect
|
||||||
@@ -181,14 +166,12 @@ require (
|
|||||||
github.com/sirupsen/logrus v1.9.3 // indirect
|
github.com/sirupsen/logrus v1.9.3 // indirect
|
||||||
github.com/spf13/afero v1.14.0 // indirect
|
github.com/spf13/afero v1.14.0 // indirect
|
||||||
github.com/spf13/pflag v1.0.9 // indirect
|
github.com/spf13/pflag v1.0.9 // indirect
|
||||||
github.com/ti-mo/netfilter v0.5.3 // indirect
|
|
||||||
github.com/tklauser/go-sysconf v0.3.12 // indirect
|
github.com/tklauser/go-sysconf v0.3.12 // indirect
|
||||||
github.com/tklauser/numcpus v0.6.1 // indirect
|
github.com/tklauser/numcpus v0.6.1 // indirect
|
||||||
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
|
||||||
github.com/ugorji/go/codec v1.3.0 // indirect
|
github.com/ugorji/go/codec v1.3.0 // indirect
|
||||||
github.com/yusufpapurcu/wmi v1.2.4 // indirect
|
github.com/yusufpapurcu/wmi v1.2.4 // indirect
|
||||||
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
|
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect
|
|
||||||
go.opentelemetry.io/otel v1.38.0 // indirect
|
go.opentelemetry.io/otel v1.38.0 // indirect
|
||||||
go.opentelemetry.io/otel/metric v1.38.0 // indirect
|
go.opentelemetry.io/otel/metric v1.38.0 // indirect
|
||||||
go.opentelemetry.io/otel/trace v1.38.0 // indirect
|
go.opentelemetry.io/otel/trace v1.38.0 // indirect
|
||||||
|
|||||||
34
go.sum
34
go.sum
@@ -13,8 +13,6 @@ github.com/ClickHouse/ch-go v0.69.0 h1:nO0OJkpxOlN/eaXFj0KzjTz5p7vwP1/y3GN4qc5z/
|
|||||||
github.com/ClickHouse/ch-go v0.69.0/go.mod h1:9XeZpSAT4S0kVjOpaJ5186b7PY/NH/hhF8R6u0WIjwg=
|
github.com/ClickHouse/ch-go v0.69.0/go.mod h1:9XeZpSAT4S0kVjOpaJ5186b7PY/NH/hhF8R6u0WIjwg=
|
||||||
github.com/ClickHouse/clickhouse-go/v2 v2.40.3 h1:46jB4kKwVDUOnECpStKMVXxvR0Cg9zeV9vdbPjtn6po=
|
github.com/ClickHouse/clickhouse-go/v2 v2.40.3 h1:46jB4kKwVDUOnECpStKMVXxvR0Cg9zeV9vdbPjtn6po=
|
||||||
github.com/ClickHouse/clickhouse-go/v2 v2.40.3/go.mod h1:qO0HwvjCnTB4BPL/k6EE3l4d9f/uF+aoimAhJX70eKA=
|
github.com/ClickHouse/clickhouse-go/v2 v2.40.3/go.mod h1:qO0HwvjCnTB4BPL/k6EE3l4d9f/uF+aoimAhJX70eKA=
|
||||||
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
|
|
||||||
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
|
|
||||||
github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
|
github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
|
||||||
github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
|
github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
|
||||||
github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs=
|
github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs=
|
||||||
@@ -61,10 +59,6 @@ github.com/clipperhouse/uax29/v2 v2.3.0 h1:SNdx9DVUqMoBuBoW3iLOj4FQv3dN5mDtuqwuh
|
|||||||
github.com/clipperhouse/uax29/v2 v2.3.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g=
|
github.com/clipperhouse/uax29/v2 v2.3.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g=
|
||||||
github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
|
github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
|
||||||
github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=
|
github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=
|
||||||
github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI=
|
|
||||||
github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M=
|
|
||||||
github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE=
|
|
||||||
github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk=
|
|
||||||
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
|
||||||
github.com/cosiner/argv v0.1.0 h1:BVDiEL32lwHukgJKP87btEPenzrrHUjajs/8yzaqcXg=
|
github.com/cosiner/argv v0.1.0 h1:BVDiEL32lwHukgJKP87btEPenzrrHUjajs/8yzaqcXg=
|
||||||
github.com/cosiner/argv v0.1.0/go.mod h1:EusR6TucWKX+zFgtdUsKT2Cvg45K5rtpCcWz4hK06d8=
|
github.com/cosiner/argv v0.1.0/go.mod h1:EusR6TucWKX+zFgtdUsKT2Cvg45K5rtpCcWz4hK06d8=
|
||||||
@@ -82,8 +76,6 @@ github.com/derekparker/trie v0.0.0-20230829180723-39f4de51ef7d h1:hUWoLdw5kvo2xC
|
|||||||
github.com/derekparker/trie v0.0.0-20230829180723-39f4de51ef7d/go.mod h1:C7Es+DLenIpPc9J6IYw4jrK0h7S9bKj4DNl8+KxGEXU=
|
github.com/derekparker/trie v0.0.0-20230829180723-39f4de51ef7d/go.mod h1:C7Es+DLenIpPc9J6IYw4jrK0h7S9bKj4DNl8+KxGEXU=
|
||||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
|
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/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
|
||||||
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
|
|
||||||
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
|
|
||||||
github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
|
github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
|
||||||
github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
|
github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
|
||||||
github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ=
|
github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ=
|
||||||
@@ -92,10 +84,6 @@ github.com/dmarkham/enumer v1.6.1 h1:aSc9awYtZL07TUueWs40QcHtxTvHTAwG0EqrNsK45w4
|
|||||||
github.com/dmarkham/enumer v1.6.1/go.mod h1:yixql+kDDQRYqcuBM2n9Vlt7NoT9ixgXhaXry8vmRg8=
|
github.com/dmarkham/enumer v1.6.1/go.mod h1:yixql+kDDQRYqcuBM2n9Vlt7NoT9ixgXhaXry8vmRg8=
|
||||||
github.com/dnephin/pflag v1.0.7 h1:oxONGlWxhmUct0YzKTgrpQv9AUA1wtPBn7zuSjJqptk=
|
github.com/dnephin/pflag v1.0.7 h1:oxONGlWxhmUct0YzKTgrpQv9AUA1wtPBn7zuSjJqptk=
|
||||||
github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE=
|
github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE=
|
||||||
github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94=
|
|
||||||
github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE=
|
|
||||||
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
|
|
||||||
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
|
||||||
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
|
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/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 h1:n3NRTnBn5N0Cbi/IeOHuQn9s2UwVUH7Ga0ZWcP+9JTA=
|
||||||
@@ -108,8 +96,6 @@ github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
|
|||||||
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
|
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
|
||||||
github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
|
github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
|
||||||
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
|
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
|
||||||
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
|
|
||||||
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
|
|
||||||
github.com/frapposelli/wwhrd v0.4.0 h1:Vn4hjT/tHNeOnTxFBO0ys1NBH8/Inxqqi1Q0eJmCImo=
|
github.com/frapposelli/wwhrd v0.4.0 h1:Vn4hjT/tHNeOnTxFBO0ys1NBH8/Inxqqi1Q0eJmCImo=
|
||||||
github.com/frapposelli/wwhrd v0.4.0/go.mod h1:Bzwvr3hY1yoBsBbIMkckeHUI6jf1cLRueaaMxZ3N9FY=
|
github.com/frapposelli/wwhrd v0.4.0/go.mod h1:Bzwvr3hY1yoBsBbIMkckeHUI6jf1cLRueaaMxZ3N9FY=
|
||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||||
@@ -304,12 +290,6 @@ github.com/mgechev/revive v1.12.0 h1:Q+/kkbbwerrVYPv9d9efaPGmAO/NsxwW/nE6ahpQaCU
|
|||||||
github.com/mgechev/revive v1.12.0/go.mod h1:VXsY2LsTigk8XU9BpZauVLjVrhICMOV3k1lpB3CXrp8=
|
github.com/mgechev/revive v1.12.0/go.mod h1:VXsY2LsTigk8XU9BpZauVLjVrhICMOV3k1lpB3CXrp8=
|
||||||
github.com/mna/pigeon v1.3.0 h1:/3fzVrl1C2RK3x04tyL+ribn+3S3VSEFFbCFLmRPAoc=
|
github.com/mna/pigeon v1.3.0 h1:/3fzVrl1C2RK3x04tyL+ribn+3S3VSEFFbCFLmRPAoc=
|
||||||
github.com/mna/pigeon v1.3.0/go.mod h1:SKQNHonx2q9U2QSSoPtMigExj+vQ1mOpL7UVFQF/IA0=
|
github.com/mna/pigeon v1.3.0/go.mod h1:SKQNHonx2q9U2QSSoPtMigExj+vQ1mOpL7UVFQF/IA0=
|
||||||
github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0=
|
|
||||||
github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo=
|
|
||||||
github.com/moby/moby/api v1.52.0 h1:00BtlJY4MXkkt84WhUZPRqt5TvPbgig2FZvTbe3igYg=
|
|
||||||
github.com/moby/moby/api v1.52.0/go.mod h1:8mb+ReTlisw4pS6BRzCMts5M49W5M7bKt1cJy/YbAqc=
|
|
||||||
github.com/moby/moby/client v0.2.1 h1:1Grh1552mvv6i+sYOdY+xKKVTvzJegcVMhuXocyDz/k=
|
|
||||||
github.com/moby/moby/client v0.2.1/go.mod h1:O+/tw5d4a1Ha/ZA/tPxIZJapJRUS6LNZ1wiVRxYHyUE=
|
|
||||||
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
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 h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
|
||||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
|
||||||
@@ -342,10 +322,6 @@ github.com/openconfig/gnmic/pkg/api v0.1.9 h1:XPln4mDgC2Bjh9VqE+BY1LLvQrk1tGHZLi
|
|||||||
github.com/openconfig/gnmic/pkg/api v0.1.9/go.mod h1:Sbjj4ITlGT1w2cXt1qEMU6jBYpRm6aoR6Spe4Do86ec=
|
github.com/openconfig/gnmic/pkg/api v0.1.9/go.mod h1:Sbjj4ITlGT1w2cXt1qEMU6jBYpRm6aoR6Spe4Do86ec=
|
||||||
github.com/openconfig/grpctunnel v0.1.0 h1:EN99qtlExZczgQgp5ANnHRC/Rs62cAG+Tz2BQ5m/maM=
|
github.com/openconfig/grpctunnel v0.1.0 h1:EN99qtlExZczgQgp5ANnHRC/Rs62cAG+Tz2BQ5m/maM=
|
||||||
github.com/openconfig/grpctunnel v0.1.0/go.mod h1:G04Pdu0pml98tdvXrvLaU+EBo3PxYfI9MYqpvdaEHLo=
|
github.com/openconfig/grpctunnel v0.1.0/go.mod h1:G04Pdu0pml98tdvXrvLaU+EBo3PxYfI9MYqpvdaEHLo=
|
||||||
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
|
|
||||||
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
|
|
||||||
github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
|
|
||||||
github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
|
|
||||||
github.com/oschwald/maxminddb-golang/v2 v2.1.1 h1:lA8FH0oOrM4u7mLvowq8IT6a3Q/qEnqRzLQn9eH5ojc=
|
github.com/oschwald/maxminddb-golang/v2 v2.1.1 h1:lA8FH0oOrM4u7mLvowq8IT6a3Q/qEnqRzLQn9eH5ojc=
|
||||||
github.com/oschwald/maxminddb-golang/v2 v2.1.1/go.mod h1:PLdx6PR+siSIoXqqy7C7r3SB3KZnhxWr1Dp6g0Hacl8=
|
github.com/oschwald/maxminddb-golang/v2 v2.1.1/go.mod h1:PLdx6PR+siSIoXqqy7C7r3SB3KZnhxWr1Dp6g0Hacl8=
|
||||||
github.com/osrg/gobgp/v4 v4.1.0 h1:f9wjTna4puPy80USuvoM4yquv29SzPra5u+bQtWfris=
|
github.com/osrg/gobgp/v4 v4.1.0 h1:f9wjTna4puPy80USuvoM4yquv29SzPra5u+bQtWfris=
|
||||||
@@ -437,10 +413,6 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o
|
|||||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||||
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
|
||||||
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
|
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
|
||||||
github.com/ti-mo/conntrack v0.6.0 h1:laiW2+dzKyS2u0aVr6FeRQs+v7cj4t7q+twolL/ZkjQ=
|
|
||||||
github.com/ti-mo/conntrack v0.6.0/go.mod h1:4HZrFQQLOSuBzgQNid3H/wYyyp1kfGXUYxueXjIGibo=
|
|
||||||
github.com/ti-mo/netfilter v0.5.3 h1:ikzduvnaUMwre5bhbNwWOd6bjqLMVb33vv0XXbK0xGQ=
|
|
||||||
github.com/ti-mo/netfilter v0.5.3/go.mod h1:08SyBCg6hu1qyQk4s3DjjJKNrm3RTb32nm6AzyT972E=
|
|
||||||
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
||||||
github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
|
github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
|
||||||
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
|
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
|
||||||
@@ -463,8 +435,6 @@ github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLY
|
|||||||
github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA=
|
github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA=
|
||||||
github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=
|
github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=
|
||||||
github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
|
github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
|
||||||
github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY=
|
|
||||||
github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
|
|
||||||
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
|
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
|
||||||
github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
|
github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
|
||||||
github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
|
github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
|
||||||
@@ -486,8 +456,6 @@ github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQ
|
|||||||
go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g=
|
go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g=
|
||||||
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
|
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
|
||||||
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
|
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU=
|
|
||||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ=
|
|
||||||
go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8=
|
go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8=
|
||||||
go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM=
|
go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM=
|
||||||
go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA=
|
go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA=
|
||||||
@@ -695,5 +663,3 @@ modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds=
|
|||||||
modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU=
|
modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU=
|
||||||
modernc.org/sqlite v1.23.1 h1:nrSBg4aRQQwq59JpvGEQ15tNxoO5pX/kUjcRNwSAGQM=
|
modernc.org/sqlite v1.23.1 h1:nrSBg4aRQQwq59JpvGEQ15tNxoO5pX/kUjcRNwSAGQM=
|
||||||
modernc.org/sqlite v1.23.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk=
|
modernc.org/sqlite v1.23.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk=
|
||||||
pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk=
|
|
||||||
pgregory.net/rapid v1.2.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04=
|
|
||||||
|
|||||||
Reference in New Issue
Block a user