diff --git a/Dockerfile b/Dockerfile index 7db0b38d..9bedaad1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,15 @@ -FROM golang:1.24.7-trixie AS builder -RUN apt update && apt install -y libsystemd-dev +FROM debian:bullseye AS builder +# Using Debian instead of the official Golang image because it’s based on newer OS versions +# with newer glibc, which causes compatibility issues. + +RUN apt-get update && apt-get install -y \ + curl git build-essential pkg-config libsystemd-dev + +ARG GO_VERSION=1.24.9 +RUN curl -fsSL https://go.dev/dl/go${GO_VERSION}.linux-$(dpkg --print-architecture).tar.gz -o go.tar.gz && \ + tar -C /usr/local -xzf go.tar.gz && rm go.tar.gz +ENV PATH="/usr/local/go/bin:${PATH}" + WORKDIR /tmp/src COPY go.mod . COPY go.sum . diff --git a/cgroup/cgroup.go b/cgroup/cgroup.go index f7e93a04..c876f4a3 100644 --- a/cgroup/cgroup.go +++ b/cgroup/cgroup.go @@ -23,7 +23,7 @@ var ( crioIdRegexp = regexp.MustCompile(`crio-([a-z0-9]{64})`) containerdIdRegexp = regexp.MustCompile(`cri-containerd[-:]([a-z0-9]{64})`) lxcIdRegexp = regexp.MustCompile(`/lxc/([^/]+)`) - systemSliceIdRegexp = regexp.MustCompile(`(/(system|runtime|reserved)\.slice/([^/]+))`) + systemSliceIdRegexp = regexp.MustCompile(`(/(system|runtime|reserved|kube|azure)\.slice/([^/]+))`) talosIdRegexp = regexp.MustCompile(`/(system|podruntime)/([^/]+)`) lxcPayloadRegexp = regexp.MustCompile(`/lxc\.payload\.([^/]+)`) ) @@ -196,7 +196,7 @@ func containerByCgroup(cgroupPath string) (ContainerType, string, error) { return ContainerTypeUnknown, "", fmt.Errorf("invalid talos runtime cgroup %s", cgroupPath) } return ContainerTypeTalosRuntime, path.Join("/talos/", matches[2]), nil - case prefix == "system.slice" || prefix == "runtime.slice" || prefix == "reserved.slice": + case prefix == "system.slice" || prefix == "runtime.slice" || prefix == "reserved.slice" || prefix == "kube.slice" || prefix == "azure.slice": matches := systemSliceIdRegexp.FindStringSubmatch(cgroupPath) if matches == nil { return ContainerTypeUnknown, "", fmt.Errorf("invalid systemd cgroup %s", cgroupPath) diff --git a/cgroup/cgroup_test.go b/cgroup/cgroup_test.go index b7adbfcb..888d7ace 100644 --- a/cgroup/cgroup_test.go +++ b/cgroup/cgroup_test.go @@ -161,6 +161,16 @@ func TestContainerByCgroup(t *testing.T) { as.Equal("/reserved.slice/kubelet.service", id) as.Nil(err) + typ, id, err = containerByCgroup("/kube.slice/kubelet.service") + as.Equal(typ, ContainerTypeSystemdService) + as.Equal("/kube.slice/kubelet.service", id) + as.Nil(err) + + typ, id, err = containerByCgroup("/azure.slice/walinuxagent.service") + as.Equal(typ, ContainerTypeSystemdService) + as.Equal("/azure.slice/walinuxagent.service", id) + as.Nil(err) + typ, id, err = containerByCgroup("/system.slice/system-postgresql.slice/postgresql@9.4-main.service") as.Equal(typ, ContainerTypeSystemdService) as.Equal("/system.slice/system-postgresql.slice", id) diff --git a/containers/container.go b/containers/container.go index 25508fb1..c13401bd 100644 --- a/containers/container.go +++ b/containers/container.go @@ -1351,7 +1351,7 @@ func (c *Container) runLogParser(logPath string) { return } ch := make(chan logparser.LogEntry) - parser := logparser.NewParser(ch, nil, logs.OtelLogEmitter(containerId), multilineCollectorTimeout, *flags.DisableSensitiveLogParsing) + parser := logparser.NewParser(ch, nil, logs.OtelLogEmitter(containerId), multilineCollectorTimeout, *flags.LogPatternsPerContainer, false) reader, err := logs.NewTailReader(proc.HostPath(logPath), ch) if err != nil { klog.Warningln(err) @@ -1371,7 +1371,7 @@ func (c *Container) runLogParser(logPath string) { klog.Warningln(err) return } - parser := logparser.NewParser(ch, nil, logs.OtelLogEmitter(containerId), multilineCollectorTimeout, *flags.DisableSensitiveLogParsing) + parser := logparser.NewParser(ch, nil, logs.OtelLogEmitter(containerId), multilineCollectorTimeout, *flags.LogPatternsPerContainer, false) stop := func() { JournaldUnsubscribe(c.cgroup) } @@ -1388,7 +1388,7 @@ func (c *Container) runLogParser(logPath string) { delete(c.logParsers, "stdout/stderr") } ch := make(chan logparser.LogEntry) - parser := logparser.NewParser(ch, c.metadata.logDecoder, logs.OtelLogEmitter(containerId), multilineCollectorTimeout, *flags.DisableSensitiveLogParsing) + parser := logparser.NewParser(ch, c.metadata.logDecoder, logs.OtelLogEmitter(containerId), multilineCollectorTimeout, *flags.LogPatternsPerContainer, false) reader, err := logs.NewTailReader(proc.HostPath(c.metadata.logPath), ch) if err != nil { klog.Warningln(err) diff --git a/containers/process.go b/containers/process.go index 17206d92..65e795a1 100644 --- a/containers/process.go +++ b/containers/process.go @@ -113,7 +113,11 @@ func (p *Process) instrumentPython(cmdline []byte, tracer *ebpftracer.Tracer) { if len(cmd) == 0 { return } - cmd = bytes.TrimSuffix(bytes.Fields(cmd)[0], []byte{':'}) + cmdFields := bytes.Fields(cmd) + if len(cmdFields) == 0 { + return + } + cmd = bytes.TrimSuffix(cmdFields[0], []byte{':'}) if !pythonCmd.Match(cmd) { return } diff --git a/ebpftracer/elf.go b/ebpftracer/elf.go new file mode 100644 index 00000000..00e39666 --- /dev/null +++ b/ebpftracer/elf.go @@ -0,0 +1,169 @@ +package ebpftracer + +import ( + "debug/elf" + "fmt" + "io" + + "github.com/cilium/ebpf" + "github.com/cilium/ebpf/link" + "golang.org/x/arch/arm64/arm64asm" + "golang.org/x/arch/x86/x86asm" +) + +type Symbol struct { + s *elf.Symbol + f *ELFFile + address uint64 +} + +func (s *Symbol) Name() string { + return s.s.Name +} + +func (s *Symbol) Address() uint64 { + if s.address == 0 { + s.address = s.s.Value + for _, p := range s.f.elf.Progs { + if p.Type != elf.PT_LOAD || (p.Flags&elf.PF_X) == 0 { + continue + } + if p.Vaddr <= s.s.Value && s.s.Value < (p.Vaddr+p.Memsz) { + s.address = s.s.Value - p.Vaddr + p.Off + break + } + } + } + return s.address +} + +func (s *Symbol) ReturnOffsets() ([]int, error) { + text, reader, err := s.f.getTextSectionAndReader() + if err != nil { + return nil, err + } + + sStart := s.s.Value - text.Addr + _, err = reader.Seek(int64(sStart), io.SeekStart) + if err != nil { + return nil, err + } + sBytes := make([]byte, s.s.Size) + _, err = reader.Read(sBytes) + if err != nil { + return nil, err + } + + offsets := getReturnOffsets(s.f.elf.Machine, sBytes) + if len(offsets) == 0 { + return nil, fmt.Errorf("no offsets found") + } + return offsets, nil +} + +func (s *Symbol) AttachUprobe(exe *link.Executable, prog *ebpf.Program, pid uint32) (link.Link, error) { + return exe.Uprobe(s.Name(), prog, &link.UprobeOptions{Address: s.Address(), PID: int(pid)}) +} + +func (s *Symbol) AttachUretprobes(exe *link.Executable, prog *ebpf.Program, pid uint32) ([]link.Link, error) { + returnOffsets, err := s.ReturnOffsets() + if err != nil { + return nil, err + } + var links []link.Link + for _, offset := range returnOffsets { + l, err := exe.Uprobe("pthread_cond_timedwait", prog, &link.UprobeOptions{Address: s.Address(), Offset: uint64(offset), PID: int(pid)}) + if err != nil { + return links, err + } + links = append(links, l) + } + + return links, nil +} + +type ELFFile struct { + elf *elf.File + symbols []elf.Symbol + textSection *elf.Section + textSectionReader io.ReadSeeker +} + +func OpenELFFile(path string) (*ELFFile, error) { + file, err := elf.Open(path) + if err != nil { + return nil, err + } + return &ELFFile{elf: file}, nil +} + +func (f *ELFFile) readSymbols() error { + symbols, _ := f.elf.Symbols() + dyn, _ := f.elf.DynamicSymbols() + + if len(symbols) == 0 && len(dyn) == 0 { + return fmt.Errorf("no symbols found") + } + f.symbols = append(symbols, dyn...) + return nil +} + +func (f *ELFFile) GetSymbol(name string) (*Symbol, error) { + if f.symbols == nil { + if err := f.readSymbols(); err != nil { + return nil, err + } + } + var es *elf.Symbol + for _, s := range f.symbols { + if elf.ST_TYPE(s.Info) != elf.STT_FUNC || s.Size == 0 || s.Value == 0 { + continue + } + if s.Name == name && s.VersionIndex&0x8000 == 0 { + es = &s + break + } + } + if es == nil { + return nil, fmt.Errorf("symbol %s not found", name) + } + return &Symbol{s: es, f: f}, nil +} + +func (f *ELFFile) getTextSectionAndReader() (*elf.Section, io.ReadSeeker, error) { + if f.textSection == nil { + f.textSection = f.elf.Section(".text") + if f.textSection == nil { + return nil, nil, fmt.Errorf("no .text") + } + f.textSectionReader = f.textSection.Open() + } + return f.textSection, f.textSectionReader, nil +} + +func (f *ELFFile) Close() error { + return f.elf.Close() +} + +func getReturnOffsets(machine elf.Machine, instructions []byte) []int { + var res []int + switch machine { + case elf.EM_X86_64: + for i := 0; i < len(instructions); { + ins, err := x86asm.Decode(instructions[i:], 64) + if err == nil && ins.Op == x86asm.RET { + res = append(res, i) + } + i += ins.Len + } + case elf.EM_AARCH64: + for i := 0; i < len(instructions); { + ins, err := arm64asm.Decode(instructions[i:]) + if err == nil && ins.Op == arm64asm.RET { + res = append(res, i) + } + i += 4 + } + } + return res +} diff --git a/ebpftracer/nodejs.go b/ebpftracer/nodejs.go index ae7ac063..78cef98a 100644 --- a/ebpftracer/nodejs.go +++ b/ebpftracer/nodejs.go @@ -25,55 +25,65 @@ func (t *Tracer) AttachNodejsProbes(pid uint32, exe string) []link.Link { klog.InfofDepth(1, "pid=%d lib=%s: %s", pid, libPath, msg) } - var ( - lastErr error - links []link.Link - libPath string - ) - for _, libPath = range append(getLibuv(pid), proc.Path(pid, "root", exe)) { - exe, err := link.OpenExecutable(libPath) - if err != nil { - log(libPath, "failed to open executable", err) - return nil - } - options := &link.UprobeOptions{PID: int(pid)} - var uprobe, uretprobe link.Link - uprobe, lastErr = exe.Uprobe("uv__io_poll", t.uprobes["uv_io_poll_enter"], options) - if lastErr != nil { - continue + for _, libPath := range append(getLibuv(pid), proc.Path(pid, "root", exe)) { + if links, err := t.attachNodejsUprobes(libPath, pid); err == nil { + log(libPath, "nodejs uprobes attached", nil) + return links + } else { + log(libPath, "failed to attach nodejs uprobes", err) } + } + return nil +} - links = append(links, uprobe) - uretprobe, lastErr = exe.Uretprobe("uv__io_poll", t.uprobes["uv_io_poll_exit"], options) - if lastErr != nil { - continue - } +func (t *Tracer) attachNodejsUprobes(libPath string, pid uint32) ([]link.Link, error) { + exe, err := link.OpenExecutable(libPath) + if err != nil { + return nil, err + } + ef, err := OpenELFFile(libPath) + if err != nil { + return nil, err + } + defer ef.Close() + + s, err := ef.GetSymbol("uv__io_poll") + if err != nil { + return nil, err + } + l, err := s.AttachUprobe(exe, t.uprobes["uv_io_poll_enter"], pid) + if err != nil { + return nil, err + } + var links []link.Link + links = append(links, l) - links = append(links, uretprobe) + ls, err := s.AttachUretprobes(exe, t.uprobes["uv_io_poll_exit"], pid) + links = append(links, ls...) + if err != nil { + for _, l := range links { + _ = l.Close() + } + return nil, err + } - for _, cb := range []string{"uv__stream_io", "uv__async_io", "uv__poll_io", "uv__server_io", "uv__udp_io"} { - uprobe, lastErr = exe.Uprobe(cb, t.uprobes["uv_io_cb_enter"], options) - if lastErr != nil { - break - } - links = append(links, uprobe) - uretprobe, lastErr = exe.Uretprobe(cb, t.uprobes["uv_io_cb_exit"], options) - if lastErr != nil { - break - } - links = append(links, uretprobe) + for _, cb := range []string{"uv__stream_io", "uv__async_io", "uv__poll_io", "uv__server_io", "uv__udp_io"} { + s, err = ef.GetSymbol(cb) + if err != nil { + break } - if lastErr != nil { - continue + l, err = s.AttachUprobe(exe, t.uprobes["uv_io_cb_enter"], pid) + if err != nil { + break + } + links = append(links, l) + ls, err = s.AttachUretprobes(exe, t.uprobes["uv_io_cb_exit"], pid) + links = append(links, ls...) + if err != nil { + break } - - log(libPath, "nodejs uprobes attached", nil) - break - } - if lastErr != nil { - log(libPath, "failed to attach uprobe", lastErr) } - return links + return links, nil } func getLibuv(pid uint32) []string { diff --git a/ebpftracer/python.go b/ebpftracer/python.go index 875c1a55..a4814491 100644 --- a/ebpftracer/python.go +++ b/ebpftracer/python.go @@ -14,7 +14,7 @@ import ( var ( libcRegexp = regexp.MustCompile(`libc[\.-]`) - muslRegexp = regexp.MustCompile(`musl[\.-]`) + muslRegexp = regexp.MustCompile(`ld-musl[\.-]`) ) func (t *Tracer) AttachPythonThreadLockProbes(pid uint32) []link.Link { @@ -32,38 +32,55 @@ func (t *Tracer) AttachPythonThreadLockProbes(pid uint32) []link.Link { } var ( - lastErr error - links []link.Link - libPath string + links []link.Link + err error ) - for _, libPath = range getPthreadLibs(pid) { - exe, err := link.OpenExecutable(libPath) - if err != nil { - log(libPath, "failed to open executable", err) - return nil - } - options := &link.UprobeOptions{PID: int(pid)} - var uprobe, uretprobe link.Link - uprobe, lastErr = exe.Uprobe("pthread_cond_timedwait", t.uprobes["pthread_cond_timedwait_enter"], options) - if lastErr != nil { - continue - } - links = append(links, uprobe) - uretprobe, lastErr = exe.Uretprobe("pthread_cond_timedwait", t.uprobes["pthread_cond_timedwait_exit"], options) - if lastErr != nil { - continue + for _, libPath := range getPthreadLibs(pid) { + if links, err = t.attachPythonUprobes(libPath, pid); err == nil { + log(libPath, "python uprobes attached", nil) + return links + } else { + log(libPath, "failed to attach python uprobes", err) } - links = append(links, uretprobe) - log(libPath, "python uprobes attached", nil) - break } - if lastErr != nil { - log(libPath, "failed to attach uprobe", lastErr) + if len(links) > 0 { + } return links } +func (t *Tracer) attachPythonUprobes(libPath string, pid uint32) ([]link.Link, error) { + exe, err := link.OpenExecutable(libPath) + if err != nil { + return nil, err + } + ef, err := OpenELFFile(libPath) + if err != nil { + return nil, err + } + defer ef.Close() + + s, err := ef.GetSymbol("pthread_cond_timedwait") + if err != nil { + return nil, err + } + l, err := s.AttachUprobe(exe, t.uprobes["pthread_cond_timedwait_enter"], pid) + if err != nil { + return nil, err + } + links := []link.Link{l} + ls, err := s.AttachUretprobes(exe, t.uprobes["pthread_cond_timedwait_exit"], pid) + links = append(links, ls...) + if err != nil { + for _, l := range links { + _ = l.Close() + } + return nil, err + } + return links, nil +} + func getPthreadLibs(pid uint32) []string { f, err := os.Open(proc.Path(pid, "maps")) if err != nil { diff --git a/ebpftracer/tls.go b/ebpftracer/tls.go index 02ad5abd..633ef0f8 100644 --- a/ebpftracer/tls.go +++ b/ebpftracer/tls.go @@ -5,9 +5,6 @@ import ( "bytes" "debug/buildinfo" "debug/elf" - "errors" - "fmt" - "io" "os" "regexp" "strings" @@ -15,8 +12,6 @@ import ( "github.com/cilium/ebpf/link" "github.com/coroot/coroot-node-agent/common" "github.com/coroot/coroot-node-agent/proc" - "golang.org/x/arch/arm64/arm64asm" - "golang.org/x/arch/x86/x86asm" "k8s.io/klog/v2" ) @@ -58,6 +53,11 @@ func (t *Tracer) AttachOpenSslUprobes(pid uint32) []link.Link { return nil } var links []link.Link + closeLinks := func() { + for _, l := range links { + l.Close() + } + } writeEnter := "openssl_SSL_write_enter" readEnter := "openssl_SSL_read_enter" readExEnter := "openssl_SSL_read_ex_enter" @@ -95,26 +95,43 @@ func (t *Tracer) AttachOpenSslUprobes(pid uint32) []link.Link { {symbol: "SSL_read_ex", uretprobe: readExit}, }...) } + + ef, err := OpenELFFile(libPath) + if err != nil { + log("open elf", err) + return nil + } + defer ef.Close() + for _, p := range progs { + s, err := ef.GetSymbol(p.symbol) + if err != nil { + log("failed to get symbol", err) + closeLinks() + return nil + } if p.uprobe != "" { - l, err := exe.Uprobe(p.symbol, t.uprobes[p.uprobe], nil) + l, err := s.AttachUprobe(exe, t.uprobes[p.uprobe], pid) if err != nil { log("failed to attach uprobe", err) + closeLinks() return nil } links = append(links, l) } if p.uretprobe != "" { - l, err := exe.Uretprobe(p.symbol, t.uprobes[p.uretprobe], nil) + ls, err := s.AttachUretprobes(exe, t.uprobes[p.uretprobe], pid) + links = append(links, ls...) if err != nil { - log("failed to attach uretprobe", err) + log("failed to attach exit uprobe", err) + closeLinks() return nil } - links = append(links, l) } } - - log("libssl uprobes attached", nil) + if len(links) > 0 { + log("libssl uprobes attached", nil) + } return links } @@ -163,98 +180,57 @@ func (t *Tracer) AttachGoTlsUprobes(pid uint32) ([]link.Link, bool) { return nil, isGolangApp } - ef, err := elf.Open(path) + ef, err := OpenELFFile(path) if err != nil { log("failed to open as elf binary", err) return nil, isGolangApp } defer ef.Close() - symbols, err := ef.Symbols() + exe, err := link.OpenExecutable(path) if err != nil { - if errors.Is(err, elf.ErrNoSymbols) { - log("no symbol section", nil) - return nil, isGolangApp - } - log("failed to read symbols", err) + log("failed to open executable", err) return nil, isGolangApp } - textSection := ef.Section(".text") - if textSection == nil { - log("no text section", nil) - return nil, isGolangApp + var links []link.Link + closeLinks := func() { + for _, l := range links { + l.Close() + } } - textReader := textSection.Open() - exe, err := link.OpenExecutable(path) + ws, err := ef.GetSymbol(goTlsWriteSymbol) if err != nil { - log("failed to open executable", err) + log("failed to get symbol", err) + return nil, isGolangApp + } + l, err := ws.AttachUprobe(exe, t.uprobes["go_crypto_tls_write_enter"], pid) + if err != nil { + log("failed to attach write_enter uprobe", err) return nil, isGolangApp } + links = append(links, l) - var links []link.Link - for _, s := range symbols { - if elf.ST_TYPE(s.Info) != elf.STT_FUNC || s.Size == 0 { - continue - } - switch s.Name { - case goTlsWriteSymbol, goTlsReadSymbol: - default: - continue - } - address := s.Value - for _, p := range ef.Progs { - if p.Type != elf.PT_LOAD || (p.Flags&elf.PF_X) == 0 { - continue - } + rs, err := ef.GetSymbol(goTlsReadSymbol) + if err != nil { + log("failed to get symbol", err) + return nil, isGolangApp + } + l, err = rs.AttachUprobe(exe, t.uprobes["go_crypto_tls_read_enter"], pid) + if err != nil { + log("failed to attach read_enter uprobe", err) + closeLinks() + return nil, isGolangApp + } + links = append(links, l) - if p.Vaddr <= s.Value && s.Value < (p.Vaddr+p.Memsz) { - address = s.Value - p.Vaddr + p.Off - break - } - } - switch s.Name { - case goTlsWriteSymbol: - l, err := exe.Uprobe(s.Name, t.uprobes["go_crypto_tls_write_enter"], &link.UprobeOptions{Address: address}) - if err != nil { - log("failed to attach write_enter uprobe", err) - return nil, isGolangApp - } - links = append(links, l) - case goTlsReadSymbol: - l, err := exe.Uprobe(s.Name, t.uprobes["go_crypto_tls_read_enter"], &link.UprobeOptions{Address: address}) - if err != nil { - log("failed to attach read_enter uprobe", err) - return nil, isGolangApp - } - links = append(links, l) - sStart := s.Value - textSection.Addr - _, err = textReader.Seek(int64(sStart), io.SeekStart) - if err != nil { - log("failed to seek", err) - return nil, isGolangApp - } - sBytes := make([]byte, s.Size) - _, err = textReader.Read(sBytes) - if err != nil { - log("failed to read", err) - return nil, isGolangApp - } - returnOffsets := getReturnOffsets(ef.Machine, sBytes) - if len(returnOffsets) == 0 { - log("failed to attach read_exit uprobe", fmt.Errorf("no return offsets found")) - return nil, isGolangApp - } - for _, offset := range returnOffsets { - l, err := exe.Uprobe(s.Name, t.uprobes["go_crypto_tls_read_exit"], &link.UprobeOptions{Address: address, Offset: uint64(offset)}) - if err != nil { - log("failed to attach read_exit uprobe", err) - return nil, isGolangApp - } - links = append(links, l) - } - } + ls, err := rs.AttachUretprobes(exe, t.uprobes["go_crypto_tls_read_exit"], pid) + links = append(links, ls...) + if err != nil { + log("failed to attach read_exit uprobe", err) + closeLinks() + return nil, isGolangApp } if len(links) == 0 { return nil, isGolangApp @@ -347,26 +323,3 @@ func getSslLibPathAndVersion(pid uint32) (string, string) { } return libsslPath, "v" + version } - -func getReturnOffsets(machine elf.Machine, instructions []byte) []int { - var res []int - switch machine { - case elf.EM_X86_64: - for i := 0; i < len(instructions); { - ins, err := x86asm.Decode(instructions[i:], 64) - if err == nil && ins.Op == x86asm.RET { - res = append(res, i) - } - i += ins.Len - } - case elf.EM_AARCH64: - for i := 0; i < len(instructions); { - ins, err := arm64asm.Decode(instructions[i:]) - if err == nil && ins.Op == arm64asm.RET { - res = append(res, i) - } - i += 4 - } - } - return res -} diff --git a/flags/flags.go b/flags/flags.go index 0ddb07c3..c3d11e54 100644 --- a/flags/flags.go +++ b/flags/flags.go @@ -28,14 +28,15 @@ var ( Strings() EphemeralPortRange = kingpin.Flag("ephemeral-port-range", "Destination and Listen TCP ports from this range will be skipped").Default("32768-60999").Envar("EPHEMERAL_PORT_RANGE").String() - Provider = kingpin.Flag("provider", "`provider` label for `node_cloud_info` metric").Envar("PROVIDER").String() - Region = kingpin.Flag("region", "`region` label for `node_cloud_info` metric").Envar("REGION").String() - AvailabilityZone = kingpin.Flag("availability-zone", "`availability_zone` label for `node_cloud_info` metric").Envar("AVAILABILITY_ZONE").String() - AccountId = kingpin.Flag("account-id", "`account_id` label for `node_cloud_info` metric").Envar("ACCOUNT_ID").String() - InstanceType = kingpin.Flag("instance-type", "`instance_type` label for `node_cloud_info` metric").Envar("INSTANCE_TYPE").String() - InstanceLifeCycle = kingpin.Flag("instance-life-cycle", "`instance_life_cycle` label for `node_cloud_info` metric").Envar("INSTANCE_LIFE_CYCLE").String() - LogPerSecond = kingpin.Flag("log-per-second", "The number of logs per second").Default("10.0").Envar("LOG_PER_SECOND").Float64() - LogBurst = kingpin.Flag("log-burst", "The maximum number of tokens that can be consumed in a single call to allow").Default("100").Envar("LOG_BURST").Int() + Provider = kingpin.Flag("provider", "`provider` label for `node_cloud_info` metric").Envar("PROVIDER").String() + Region = kingpin.Flag("region", "`region` label for `node_cloud_info` metric").Envar("REGION").String() + AvailabilityZone = kingpin.Flag("availability-zone", "`availability_zone` label for `node_cloud_info` metric").Envar("AVAILABILITY_ZONE").String() + AccountId = kingpin.Flag("account-id", "`account_id` label for `node_cloud_info` metric").Envar("ACCOUNT_ID").String() + InstanceType = kingpin.Flag("instance-type", "`instance_type` label for `node_cloud_info` metric").Envar("INSTANCE_TYPE").String() + InstanceLifeCycle = kingpin.Flag("instance-life-cycle", "`instance_life_cycle` label for `node_cloud_info` metric").Envar("INSTANCE_LIFE_CYCLE").String() + LogPerSecond = kingpin.Flag("log-per-second", "The number of logs per second").Default("10.0").Envar("LOG_PER_SECOND").Float64() + LogBurst = kingpin.Flag("log-burst", "The maximum number of tokens that can be consumed in a single call to allow").Default("100").Envar("LOG_BURST").Int() + LogPatternsPerContainer = kingpin.Flag("log-patterns-per-container", "Max unique log patterns per container per level").Default("256").Envar("LOG_PATTERNS_PER_CONTAINER").Int() MaxLabelLength = kingpin.Flag("max-label-length", "Maximum length of a metric label value").Default("4096").Envar("MAX_LABEL_LENGTH").Int() diff --git a/go.mod b/go.mod index 70bc8c34..355fd554 100644 --- a/go.mod +++ b/go.mod @@ -3,18 +3,19 @@ module github.com/coroot/coroot-node-agent go 1.24.7 require ( - cloud.google.com/go/compute/metadata v0.6.0 - github.com/ClickHouse/ch-go v0.65.0 + cloud.google.com/go/compute/metadata v0.5.2 + github.com/ClickHouse/ch-go v0.62.0 github.com/NVIDIA/go-nvml v0.12.4-1 github.com/agoda-com/opentelemetry-logs-go v0.4.1 - github.com/cilium/cilium v1.17.3 - github.com/cilium/ebpf v0.19.0 + github.com/cilium/cilium v1.17.2 + github.com/cilium/ebpf v0.20.0 github.com/containerd/cgroups v1.0.4 github.com/containerd/containerd v1.6.38 github.com/coreos/go-systemd/v22 v22.5.0 - github.com/docker/docker v28.0.0+incompatible + github.com/docker/docker v27.4.0+incompatible github.com/florianl/go-conntrack v0.3.0 github.com/go-kit/log v0.2.1 + github.com/gobwas/glob v0.2.3 github.com/godbus/dbus/v5 v5.1.0 github.com/golang/snappy v0.0.4 github.com/google/uuid v1.6.0 @@ -23,29 +24,30 @@ require ( github.com/jpillora/backoff v1.0.0 github.com/mdlayher/taskstats v0.0.0-20230712191918-387b3d561d14 github.com/nudgebee/logparser v0.0.0-20250610175416-3edee28c2059 - github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 + github.com/opencontainers/runtime-spec v1.2.0 github.com/prometheus/client_golang v1.20.5 github.com/prometheus/client_model v0.6.1 github.com/prometheus/common v0.61.0 github.com/prometheus/prometheus v0.51.2 github.com/pyroscope-io/dotnetdiag v1.2.1 github.com/stretchr/testify v1.10.0 - github.com/vishvananda/netlink v1.3.1-0.20250303224720-0e7078ed04c8 + github.com/vishvananda/netlink v1.3.1-0.20250221194427-0af32151e72b github.com/vishvananda/netns v0.0.5 github.com/xin053/hsperfdata v0.2.3 go.mongodb.org/mongo-driver v1.14.0 go.opentelemetry.io/otel v1.34.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 - go.opentelemetry.io/otel/sdk v1.34.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 + go.opentelemetry.io/otel/sdk v1.31.0 go.opentelemetry.io/otel/trace v1.34.0 golang.org/x/arch v0.4.0 golang.org/x/exp v0.0.0-20240808152545-0cdaa3abc0fa - golang.org/x/net v0.38.0 - golang.org/x/sys v0.36.0 + golang.org/x/net v0.46.0 + golang.org/x/sys v0.37.0 golang.org/x/time v0.8.0 gopkg.in/alecthomas/kingpin.v2 v2.2.6 gopkg.in/yaml.v2 v2.4.0 + gotest.tools v2.2.0+incompatible inet.af/netaddr v0.0.0-20230525184311-b8eac61e914a k8s.io/api v0.32.0 k8s.io/apimachinery v0.32.0 @@ -53,11 +55,6 @@ require ( k8s.io/klog/v2 v2.130.1 ) -require ( - github.com/gobwas/glob v0.2.3 - gotest.tools v2.2.0+incompatible -) - require ( github.com/Microsoft/go-winio v0.6.2 // indirect github.com/Microsoft/hcsshim v0.9.12 // indirect @@ -70,7 +67,7 @@ require ( github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cilium/hive v0.0.0-20250121145729-e67f66eb0375 // indirect - github.com/cilium/proxy v0.0.0-20250408103314-d3be7c547203 // indirect + github.com/cilium/proxy v0.0.0-20241115112946-fb67566cbd95 // indirect github.com/cilium/statedb v0.3.6 // indirect github.com/cilium/stream v0.0.0-20241203114243-53c3e5d79744 // indirect github.com/cilium/workerpool v1.2.0 // indirect @@ -115,7 +112,7 @@ require ( github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db // indirect github.com/gopacket/gopacket v1.3.1 // indirect github.com/grafana/regexp v0.0.0-20221123153739-15dc172cd2db // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect github.com/hashicorp/hcl v1.0.1-vault-5 // indirect github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect @@ -147,7 +144,7 @@ require ( github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect github.com/pelletier/go-toml/v2 v2.2.2 // indirect github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 // indirect - github.com/pierrec/lz4/v4 v4.1.22 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/procfs v0.15.1 // indirect @@ -164,7 +161,7 @@ require ( github.com/spf13/pflag v1.0.6-0.20210604193023-d5e0c0615ace // indirect github.com/spf13/viper v1.19.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect - github.com/ulikunitz/xz v0.5.14 // indirect + github.com/ulikunitz/xz v0.5.12 // indirect github.com/x448/float16 v0.8.4 // indirect go.etcd.io/etcd/api/v3 v3.5.17 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.17 // indirect @@ -173,7 +170,7 @@ require ( go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect go.opentelemetry.io/otel/metric v1.34.0 // indirect - go.opentelemetry.io/proto/otlp v1.5.0 // indirect + go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/dig v1.17.1 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect @@ -181,14 +178,14 @@ require ( go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect go4.org/unsafe/assume-no-moving-gc v0.0.0-20230525183740-e7c30c78aeb2 // indirect golang.org/x/oauth2 v0.27.0 // indirect - golang.org/x/sync v0.12.0 // indirect - golang.org/x/term v0.30.0 // indirect - golang.org/x/text v0.23.0 // indirect - golang.org/x/tools v0.28.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250407143221-ac9807e6c755 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250407143221-ac9807e6c755 // indirect - google.golang.org/grpc v1.71.1 // indirect - google.golang.org/protobuf v1.36.6 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/term v0.36.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/tools v0.38.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d // indirect + google.golang.org/grpc v1.69.2 // indirect + google.golang.org/protobuf v1.36.5 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index 25e55d51..e18099c4 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,6 @@ bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -cel.dev/expr v0.19.1 h1:NciYrtDRIR0lNCnH1LFJegdjspNx9fI59O7TWcua/W4= -cel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= +cel.dev/expr v0.18.0 h1:CJ6drgk+Hf96lkLikr4rFf19WrU0BOWEihyZnI2TAzo= +cel.dev/expr v0.18.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= 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= @@ -16,8 +16,8 @@ cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZ 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/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= -cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= +cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo= +cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= 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/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= @@ -45,8 +45,8 @@ github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZ github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ClickHouse/ch-go v0.65.0 h1:vZAXfTQliuNNefqkPDewX3kgRxN6Q4vUENnnY+ynTRY= -github.com/ClickHouse/ch-go v0.65.0/go.mod h1:tCM0XEH5oWngoi9Iu/8+tjPBo04I/FxNIffpdjtwx3k= +github.com/ClickHouse/ch-go v0.62.0 h1:eXH0hytXeCEEZHgMvOX9IiW7wqBb4w1MJMp9rArbkrc= +github.com/ClickHouse/ch-go v0.62.0/go.mod h1:uzso52/PD9+gZj7tL6XAo8/EYDrx7CIwNF4c6PnO6S0= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= @@ -130,22 +130,22 @@ github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d8 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/cilium/cilium v1.17.3 h1:puIIQhN4GnDZmlvEyMy4BTniffMHirFgaHeFZksavpg= -github.com/cilium/cilium v1.17.3/go.mod h1:fIBDMpEU/adT00vwvSR2ULvG0as10rNd0CzhJuU3Kao= +github.com/cilium/cilium v1.17.2 h1:hMahLKho06pzcAk8X+Co7jXhhwrj79rkTsy5FFehr8Q= +github.com/cilium/cilium v1.17.2/go.mod h1:BMwiENNHcSrSsx59fmzyu9V5pBKzav8bWawiA2PcA7U= github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.5.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.19.0 h1:Ro/rE64RmFBeA9FGjcTc+KmCeY6jXmryu6FfnzPRIao= -github.com/cilium/ebpf v0.19.0/go.mod h1:fLCgMo3l8tZmAdM3B2XqdFzXBpwkcSTroaVqN08OWVY= +github.com/cilium/ebpf v0.20.0 h1:atwWj9d3NffHyPZzVlx3hmw1on5CLe9eljR8VuHTwhM= +github.com/cilium/ebpf v0.20.0/go.mod h1:pzLjFymM+uZPLk/IXZUL63xdx5VXEo+enTzxkZXdycw= github.com/cilium/fake v0.6.1 h1:cLkNx1nkF0b0pPW79JaQxaI5oG2/rBzRKpp0YUg1fTA= github.com/cilium/fake v0.6.1/go.mod h1:V9lCbbcsnSf3vB6sdOP7Q0bsUUJ/jyHPZxnFAw5nPUc= github.com/cilium/hive v0.0.0-20250121145729-e67f66eb0375 h1:EhoCO0AI3qJavnhfAls4w7VpVVpAr12wIh293sNA0hQ= github.com/cilium/hive v0.0.0-20250121145729-e67f66eb0375/go.mod h1:pI2GJ1n3SLKIQVFrKF7W6A6gb6BQkZ+3Hp4PAEo5SuI= -github.com/cilium/proxy v0.0.0-20250408103314-d3be7c547203 h1:ncS+290YywupX+tmbB5bFbzcsZcrlK+go27Aihs36eQ= -github.com/cilium/proxy v0.0.0-20250408103314-d3be7c547203/go.mod h1:Kksp75+KLYLFwTLA6qcrUlIOQkXLRqQm+Tm6foOTJyM= +github.com/cilium/proxy v0.0.0-20241115112946-fb67566cbd95 h1:iMn0++U3CDqoDINY5JLOhlPcjj3kW/xCmse+d+EZkOM= +github.com/cilium/proxy v0.0.0-20241115112946-fb67566cbd95/go.mod h1:/UoCz3gByKwF5gCHFMUhwmIN5/Pgmb8LTIrfBlmjGCo= github.com/cilium/statedb v0.3.6 h1:dGwzZTJgVWlnG7io0Wl0XsI7ULsz2TbNqH8Ag+dP6is= github.com/cilium/statedb v0.3.6/go.mod h1:n2lNVxi8vz5Up1Y1rRD++aQP2izQA932fUwTkedKSV0= github.com/cilium/stream v0.0.0-20241203114243-53c3e5d79744 h1:f+CgYUy2YyZ2EX31QSqf3vwFiJJQSAMIQLn4d3QQYno= @@ -156,8 +156,8 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f h1:C5bqEmzEPLsHm9Mv73lSE9e9bKV23aB1vxOsmZrkl3k= -github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= @@ -306,8 +306,8 @@ github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TT github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v28.0.0+incompatible h1:Olh0KS820sJ7nPsBKChVhk5pzqcwDR15fumfAd/p9hM= -github.com/docker/docker v28.0.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v27.4.0+incompatible h1:I9z7sQ5qyzO0BfAb9IMOawRkAGxhYsidKiTMcm0DU+A= +github.com/docker/docker v27.4.0+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= @@ -337,8 +337,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= -github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= +github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM= +github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v5.9.0+incompatible h1:fBXyNpNMuTTDdquAq/uisOr2lShz4oaXpDTX2bLe7ls= github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= @@ -537,8 +537,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 h1:VNqngBF40hVlDloBruUehVYC3ArSgIyScOAyMRqBxRg= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1/go.mod h1:RBRO7fro65R6tjKzYgLAFo0t1QEXY1Dp+i/bvpRiqiQ= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= @@ -752,8 +752,9 @@ github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/ github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc= github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk= +github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= @@ -769,8 +770,8 @@ github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= -github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= -github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +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/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -911,8 +912,8 @@ github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ulikunitz/xz v0.5.14 h1:uv/0Bq533iFdnMHZdRBTOlaNMdb1+ZxXIlHDZHIHcvg= -github.com/ulikunitz/xz v0.5.14/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= +github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc= +github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -920,8 +921,8 @@ github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netlink v1.3.1-0.20250303224720-0e7078ed04c8 h1:Y4egeTrP7sccowz2GWTJVtHlwkZippgBTpUmMteFUWQ= -github.com/vishvananda/netlink v1.3.1-0.20250303224720-0e7078ed04c8/go.mod h1:i6NetklAujEcC6fK0JPjT8qSwWyO0HLn4UKG+hGqeJs= +github.com/vishvananda/netlink v1.3.1-0.20250221194427-0af32151e72b h1:hYWtmuzlR0jpWu+ljWfPMi7oNiZ9x/D3GbBqgZTOhyI= +github.com/vishvananda/netlink v1.3.1-0.20250221194427-0af32151e72b/go.mod h1:i6NetklAujEcC6fK0JPjT8qSwWyO0HLn4UKG+hGqeJs= github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= @@ -973,19 +974,19 @@ go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 h1:Xw8U6u2f8DK2XAkGRFV7BBLENgnTGX9i4rQRxJf+/vs= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0/go.mod h1:6KW1Fm6R/s6Z3PGXwSJN2K4eT6wQB3vXX6CVnYX9NmM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk= go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= -go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= -go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= -go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= -go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= +go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk= +go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= +go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc= +go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8= go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= -go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= +go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/dig v1.17.1 h1:Tga8Lz8PcYNsWsyHMZ1Vm0OQOUaJNDyvPImgbAu9YSc= @@ -1098,8 +1099,8 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= -golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= 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= @@ -1118,8 +1119,8 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ 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.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= -golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1204,11 +1205,11 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= -golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= -golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= 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= @@ -1216,8 +1217,8 @@ 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.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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= @@ -1271,8 +1272,8 @@ golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4X golang.org/x/tools v0.0.0-20210106214847-113979e3529a/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.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8= -golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= 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= @@ -1321,10 +1322,10 @@ google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto/googleapis/api v0.0.0-20250407143221-ac9807e6c755 h1:AMLTAunltONNuzWgVPZXrjLWtXpsG6A3yLLPEoJ/IjU= -google.golang.org/genproto/googleapis/api v0.0.0-20250407143221-ac9807e6c755/go.mod h1:2R6XrVC8Oc08GlNh8ujEpc7HkLiEZ16QeY7FxIs20ac= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250407143221-ac9807e6c755 h1:TwXJCGVREgQ/cl18iY0Z4wJCTL/GmW+Um2oSwZiZPnc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250407143221-ac9807e6c755/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d h1:xJJRGY7TJcvIlpSrN3K6LAWgNFUILlO+OMAqtg9aqnw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d/go.mod h1:3ENsm/5D1mzDyhpzeRi1NR784I0BcofWBoSc5QqqMK4= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -1343,8 +1344,8 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.71.1 h1:ffsFWr7ygTUscGPI0KKK6TLrGz0476KUvvsbqWK0rPI= -google.golang.org/grpc v1.71.1/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= +google.golang.org/grpc v1.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU= +google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= 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= @@ -1358,8 +1359,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= diff --git a/logs/journald_reader.go b/logs/journald_reader.go index 17ddc31f..56976cb2 100644 --- a/logs/journald_reader.go +++ b/logs/journald_reader.go @@ -11,6 +11,10 @@ import ( "k8s.io/klog/v2" ) +const ( + journaldPollTimeout = 100 * time.Millisecond +) + type JournaldReader struct { journal *sdjournal.Journal subscribers map[string]chan<- logparser.LogEntry @@ -26,13 +30,16 @@ func NewJournaldReader(journalPaths ...string) (*JournaldReader, error) { var err error for _, journalPath := range journalPaths { if r.journal, err = sdjournal.NewJournalFromDir(journalPath); err != nil { + klog.Errorf("failed to get journal at %s: %s", journalPath, err) continue } usage, err := r.journal.GetUsage() if err != nil { + klog.Errorf("failed to read journal disk space usage at %s: %s", journalPath, err) continue } if usage == 0 { + klog.Errorf("journal at %s is empty", journalPath) r.journal = nil continue } @@ -57,7 +64,11 @@ func (r *JournaldReader) follow() { return } if c <= 0 { - r.journal.Wait(time.Millisecond * 100) + t := time.Now() + ret := r.journal.Wait(journaldPollTimeout) + if ret <= 0 && time.Since(t) < journaldPollTimeout { // inotify can't work due to system limits + time.Sleep(journaldPollTimeout) + } continue } e, err := r.journal.GetEntry() diff --git a/node/net.go b/node/net.go index 3c6701e4..4dd66c12 100644 --- a/node/net.go +++ b/node/net.go @@ -2,6 +2,7 @@ package node import ( "regexp" + "strings" "github.com/coroot/coroot-node-agent/proc" "github.com/vishvananda/netlink" @@ -9,10 +10,10 @@ import ( "inet.af/netaddr" ) -var netDeviceFilterRe = regexp.MustCompile(`^(en(P\d+)?p\d+s\d+(f\d+)?|eth\d+|eno\d+|ens\d+|em\d+|bond\d+|p\d+p\d+|enx[0-9a-f]{12})`) +var netDeviceFilterRe = regexp.MustCompile(`^(en(p\d+)?p\d+s\d+(f\d+)?|eth\d+|eno\d+|ens\d+|em\d+|bond\d+|p\d+p\d+|enx[0-9a-f]+|br\d+|vmbr\d+)`) func netDeviceFilter(name string) bool { - return netDeviceFilterRe.MatchString(name) + return netDeviceFilterRe.MatchString(strings.ToLower(name)) } type NetDeviceInfo struct { diff --git a/node/net_test.go b/node/net_test.go index d1442109..eded0356 100644 --- a/node/net_test.go +++ b/node/net_test.go @@ -7,29 +7,26 @@ import ( ) func TestNetDeviceFilter(t *testing.T) { - cases := map[string]bool{ - "eth0": true, - "eth0@if699": true, - "enp2s0": true, - "bond0": true, - "ens1": true, - "p1p1": true, - "eno2": true, - "em1": true, - "enx78e7d1ea46da": true, - "enP4p65s0": true, - "enP2p33s0": true, + assert.True(t, netDeviceFilter("eth0")) + assert.True(t, netDeviceFilter("eth0@if699")) + assert.True(t, netDeviceFilter("enp2s0")) + assert.True(t, netDeviceFilter("bond0")) + assert.True(t, netDeviceFilter("ens1")) + assert.True(t, netDeviceFilter("p1p1")) + assert.True(t, netDeviceFilter("eno2")) + assert.True(t, netDeviceFilter("em1")) + assert.True(t, netDeviceFilter("enx78e7d1ea46da")) + assert.True(t, netDeviceFilter("enP4p65s0")) + assert.True(t, netDeviceFilter("enP2p33s0")) + assert.True(t, netDeviceFilter("enX0")) + assert.True(t, netDeviceFilter("br0")) + assert.True(t, netDeviceFilter("vmbr0")) - "dummy0": false, - "docker0": false, - "kube-ipvs0": false, - "veth1b0c947@if2": false, - "flannel.1": false, - "cni0": false, - "lxc00aa@if698": false, - } - - for name, ok := range cases { - assert.Equal(t, ok, netDeviceFilter(name), name) - } + assert.False(t, netDeviceFilter("dummy0")) + assert.False(t, netDeviceFilter("docker0")) + assert.False(t, netDeviceFilter("kube-ipvs0")) + assert.False(t, netDeviceFilter("veth1b0c947@if2")) + assert.False(t, netDeviceFilter("flannel.1")) + assert.False(t, netDeviceFilter("cni0")) + assert.False(t, netDeviceFilter("lxc00aa@if698")) }