From 88131108ca83ce88b3f196ff331fce167f88d931 Mon Sep 17 00:00:00 2001 From: Nikolay Sivko Date: Fri, 3 Oct 2025 10:49:29 +0300 Subject: [PATCH 1/9] fix net interface name filtering --- node/net.go | 5 +++-- node/net_test.go | 43 +++++++++++++++++++------------------------ 2 files changed, 22 insertions(+), 26 deletions(-) diff --git a/node/net.go b/node/net.go index 3c6701e4..b13b2730 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]+)`) 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..54b293b2 100644 --- a/node/net_test.go +++ b/node/net_test.go @@ -7,29 +7,24 @@ 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")) - "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")) } From ca581912c2fd4e0cb5fa30acde792eed91bf09bb Mon Sep 17 00:00:00 2001 From: asimon Date: Sun, 5 Oct 2025 16:43:18 +0200 Subject: [PATCH 2/9] improve error logs in journald reader --- logs/journald_reader.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/logs/journald_reader.go b/logs/journald_reader.go index c8b1a961..75b1b7ef 100644 --- a/logs/journald_reader.go +++ b/logs/journald_reader.go @@ -26,13 +26,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 } From ef0fc3e3a4507e52541bf6a6f9577d61dcf3cff7 Mon Sep 17 00:00:00 2001 From: Nikolay Sivko Date: Wed, 15 Oct 2025 11:58:22 +0300 Subject: [PATCH 3/9] journald: add fallback when inotify is unavailable due to system limits --- logs/journald_reader.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/logs/journald_reader.go b/logs/journald_reader.go index 75b1b7ef..bf3c1dfc 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 @@ -60,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() From 41caad3e5071357e9bc94f4253aee0231d9ef298 Mon Sep 17 00:00:00 2001 From: Nikolay Sivko Date: Thu, 16 Oct 2025 15:04:20 +0300 Subject: [PATCH 4/9] docker: use debian:bullseye instead of golang image to build with older glibc --- Dockerfile | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index da4e7e8b..8d84d7e0 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 . From 3e9da1fae770758c05ceacab4569ad50d45fa266 Mon Sep 17 00:00:00 2001 From: clstb Date: Wed, 17 Dec 2025 23:13:07 +0100 Subject: [PATCH 5/9] feat: add bridge interfaces --- node/net.go | 2 +- node/net_test.go | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/node/net.go b/node/net.go index b13b2730..4dd66c12 100644 --- a/node/net.go +++ b/node/net.go @@ -10,7 +10,7 @@ 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]+)`) +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(strings.ToLower(name)) diff --git a/node/net_test.go b/node/net_test.go index 54b293b2..eded0356 100644 --- a/node/net_test.go +++ b/node/net_test.go @@ -19,6 +19,8 @@ func TestNetDeviceFilter(t *testing.T) { 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")) assert.False(t, netDeviceFilter("dummy0")) assert.False(t, netDeviceFilter("docker0")) From 76fdc048dcbc29125d4bb9e979c9b52a978d60c8 Mon Sep 17 00:00:00 2001 From: Nikolay Sivko Date: Tue, 30 Dec 2025 14:40:13 -0300 Subject: [PATCH 6/9] logparser v1.2.1: cap log patterns per container --- containers/container.go | 6 +++--- flags/flags.go | 15 ++++++++------- go.mod | 2 +- go.sum | 4 ++-- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/containers/container.go b/containers/container.go index e0abf600..54c186f4 100644 --- a/containers/container.go +++ b/containers/container.go @@ -1056,7 +1056,7 @@ func (c *Container) runLogParser(logPath string) { return } ch := make(chan logparser.LogEntry) - parser := logparser.NewParser(ch, nil, logs.OtelLogEmitter(containerId), multilineCollectorTimeout) + parser := logparser.NewParser(ch, nil, logs.OtelLogEmitter(containerId), multilineCollectorTimeout, *flags.LogPatternsPerContainer) reader, err := logs.NewTailReader(proc.HostPath(logPath), ch) if err != nil { klog.Warningln(err) @@ -1075,7 +1075,7 @@ func (c *Container) runLogParser(logPath string) { klog.Warningln(err) return } - parser := logparser.NewParser(ch, nil, logs.OtelLogEmitter(containerId), multilineCollectorTimeout) + parser := logparser.NewParser(ch, nil, logs.OtelLogEmitter(containerId), multilineCollectorTimeout, *flags.LogPatternsPerContainer) stop := func() { JournaldUnsubscribe(c.cgroup) } @@ -1091,7 +1091,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) + parser := logparser.NewParser(ch, c.metadata.logDecoder, logs.OtelLogEmitter(containerId), multilineCollectorTimeout, *flags.LogPatternsPerContainer) reader, err := logs.NewTailReader(proc.HostPath(c.metadata.logPath), ch) if err != nil { klog.Warningln(err) diff --git a/flags/flags.go b/flags/flags.go index c5c5769b..ffd457db 100644 --- a/flags/flags.go +++ b/flags/flags.go @@ -27,13 +27,14 @@ 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() - 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() + 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 bb054b20..fe6a0757 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ require ( 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/coroot/logparser v1.1.9 + github.com/coroot/logparser v1.2.1 github.com/docker/docker v27.4.0+incompatible github.com/florianl/go-conntrack v0.3.0 github.com/go-kit/log v0.2.1 diff --git a/go.sum b/go.sum index 03da0f84..535a21cb 100644 --- a/go.sum +++ b/go.sum @@ -278,8 +278,8 @@ github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfc github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coroot/dotnetdiag v1.2.2 h1:PVP/By8o+xhPjfVolJYcjHLbFQInM7pkaD6/otPLc8Q= github.com/coroot/dotnetdiag v1.2.2/go.mod h1:veXCMlFzm1yNl7wwJb/ZLxO4WbzhDBoy1VG1XtkH2ls= -github.com/coroot/logparser v1.1.9 h1:c8R8m5vZtcNqnEiWHZ+uQBcLin18vlIP1VJTL77xjW0= -github.com/coroot/logparser v1.1.9/go.mod h1:YfYxn9FYBm5GYHHUB4zI22irFAWVDe2bcbOWDHKSmEo= +github.com/coroot/logparser v1.2.1 h1:NLU4VAgGwqMTtKyRHDpTtE9BtPQJLOhDIuB5yiQdelQ= +github.com/coroot/logparser v1.2.1/go.mod h1:/7qHU4/I4zWRYIzRchQPehlTzbcMv5HV6cwBqg2zl6I= github.com/coroot/pyroscope/ebpf v0.0.0-20250418092207-a70610b6df72 h1:NFEMXMOdUzQFG+OwRVecv/yc75/s8MmLkNquMm6hk3I= github.com/coroot/pyroscope/ebpf v0.0.0-20250418092207-a70610b6df72/go.mod h1:IepHM9FJ0n3n3k+ZV23Y7vNAfvWI7LDuLqWPO4rB6sQ= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= From 61b0744ad5785532454868d00149f3cd3c95d35e Mon Sep 17 00:00:00 2001 From: Nikolay Sivko Date: Mon, 5 Jan 2026 10:21:37 -0300 Subject: [PATCH 7/9] recognize `kube.slice` and `azure.slice` as systemd service --- cgroup/cgroup.go | 4 ++-- cgroup/cgroup_test.go | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/cgroup/cgroup.go b/cgroup/cgroup.go index 1dd1df53..48dff4e8 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\.([^/]+)`) ) @@ -193,7 +193,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) From 71458d747a1918f52843a137ff988589fd8b54dc Mon Sep 17 00:00:00 2001 From: Nikolay Sivko Date: Mon, 5 Jan 2026 10:33:57 -0300 Subject: [PATCH 8/9] fix panic in python cmdline parsing --- containers/process.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/containers/process.go b/containers/process.go index 6d79a452..bd91b980 100644 --- a/containers/process.go +++ b/containers/process.go @@ -110,7 +110,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 } From a82801d3d0d9c305091fad6c09772662f290c51c Mon Sep 17 00:00:00 2001 From: mayankpande88 Date: Tue, 6 Jan 2026 10:37:26 +0530 Subject: [PATCH 9/9] Update dependencies with go mod tidy - Reorder dependencies alphabetically - Move nudgebee/logparser to correct position in require section - Promote google/uuid, hashicorp/golang-lru to direct dependencies - Add missing k8s.io packages as direct dependencies - Update indirect dependency versions --- go.mod | 13 +++++++------ go.sum | 4 ++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 954c3cca..355fd554 100644 --- a/go.mod +++ b/go.mod @@ -12,16 +12,18 @@ require ( 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/nudgebee/logparser v0.0.0-20250610175416-3edee28c2059 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 github.com/grafana/pyroscope/ebpf v0.4.9 + github.com/hashicorp/golang-lru/v2 v2.0.7 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.2.0 github.com/prometheus/client_golang v1.20.5 github.com/prometheus/client_model v0.6.1 @@ -45,7 +47,11 @@ require ( 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 + k8s.io/client-go v0.32.0 k8s.io/klog/v2 v2.130.1 ) @@ -104,11 +110,9 @@ require ( github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db // indirect - github.com/google/uuid v1.6.0 // 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.20.0 // indirect - github.com/hashicorp/golang-lru/v2 v2.0.7 // 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 @@ -186,10 +190,7 @@ require ( gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.32.0 // indirect k8s.io/apiextensions-apiserver v0.32.0 // indirect - k8s.io/apimachinery v0.32.0 // indirect - k8s.io/client-go v0.32.0 // indirect k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect k8s.io/utils v0.0.0-20241210054802-24370beab758 // indirect sigs.k8s.io/controller-runtime v0.20.1 // indirect diff --git a/go.sum b/go.sum index 535a21cb..e18099c4 100644 --- a/go.sum +++ b/go.sum @@ -278,8 +278,6 @@ github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfc github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coroot/dotnetdiag v1.2.2 h1:PVP/By8o+xhPjfVolJYcjHLbFQInM7pkaD6/otPLc8Q= github.com/coroot/dotnetdiag v1.2.2/go.mod h1:veXCMlFzm1yNl7wwJb/ZLxO4WbzhDBoy1VG1XtkH2ls= -github.com/coroot/logparser v1.2.1 h1:NLU4VAgGwqMTtKyRHDpTtE9BtPQJLOhDIuB5yiQdelQ= -github.com/coroot/logparser v1.2.1/go.mod h1:/7qHU4/I4zWRYIzRchQPehlTzbcMv5HV6cwBqg2zl6I= github.com/coroot/pyroscope/ebpf v0.0.0-20250418092207-a70610b6df72 h1:NFEMXMOdUzQFG+OwRVecv/yc75/s8MmLkNquMm6hk3I= github.com/coroot/pyroscope/ebpf v0.0.0-20250418092207-a70610b6df72/go.mod h1:IepHM9FJ0n3n3k+ZV23Y7vNAfvWI7LDuLqWPO4rB6sQ= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -706,6 +704,8 @@ github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRW github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nudgebee/logparser v0.0.0-20250610175416-3edee28c2059 h1:uBl8oxU66pg5348GTrIvRiNz1er9Wc7Ild+Kg0Qq+fA= +github.com/nudgebee/logparser v0.0.0-20250610175416-3edee28c2059/go.mod h1:ddmUa8en2sToRL+bBvFkuS1AHvA6Msn56v3BpLMbKoc= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=