From 98fb7884f95c602600ac59c3893128890bfdb8bc Mon Sep 17 00:00:00 2001 From: "jizhong.jiangjz" Date: Fri, 22 Mar 2024 17:31:27 +0800 Subject: [PATCH 1/3] add tuple labels to packet loss tuple labels: * protocol * src * src_type * src_node * src_namespace * src_pod * dst * dst_type * dst_node * dst_namespace * dst_pod * sport * dport --- bpf/headers/inspector.h | 5 +- bpf/packetloss.c | 37 +-- deploy/net-exporter-config.yaml | 6 +- pkg/exporter/bpfutil/format.go | 18 +- pkg/exporter/probe/flow/flow.go | 43 +--- pkg/exporter/probe/legacy.go | 87 +++++++ .../probe/tracepacketloss/bpf_bpfeb.go | 55 ++--- .../probe/tracepacketloss/bpf_bpfeb.o | Bin 132104 -> 11464 bytes .../probe/tracepacketloss/bpf_bpfel.go | 55 ++--- .../probe/tracepacketloss/bpf_bpfel.o | Bin 132104 -> 11464 bytes .../probe/tracepacketloss/packetloss.go | 224 +++++++++--------- pkg/exporter/probe/types.go | 9 + 12 files changed, 264 insertions(+), 275 deletions(-) create mode 100644 pkg/exporter/probe/types.go diff --git a/bpf/headers/inspector.h b/bpf/headers/inspector.h index bbefce4b..6cf786c0 100644 --- a/bpf/headers/inspector.h +++ b/bpf/headers/inspector.h @@ -29,11 +29,8 @@ struct flow_tuple_4 { }; union addr { + unsigned char v6addr[16]; u32 v4addr; - struct { - u64 d1; - u64 d2; - } v6addr; } __attribute__((packed)); struct skb_meta { diff --git a/bpf/packetloss.c b/bpf/packetloss.c index 00c9940e..4fe6f293 100644 --- a/bpf/packetloss.c +++ b/bpf/packetloss.c @@ -17,30 +17,12 @@ struct kfree_skb_args { }; struct insp_pl_event_t { - char target[TASK_COMM_LEN]; struct tuple tuple; - struct skb_meta skb_meta; - u32 pid; - u32 cpu; u64 location; s64 stack_id; }; -struct insp_pl_metric_t { - u64 location; - u32 netns; - u8 protocol; -}; - -struct insp_pl_event_t *unused_event __attribute__((unused)); -struct insp_pl_metric_t *unused_event2 __attribute__((unused)); - -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __type(key, struct insp_pl_metric_t); - __type(value, u64); - __uint(max_entries, 4096); -} insp_pl_metric SEC(".maps"); +const struct insp_pl_event_t *unused_insp_pl_event_t __attribute__((unused)); struct { __uint(type, BPF_MAP_TYPE_STACK_TRACE); @@ -56,26 +38,9 @@ struct { SEC("tracepoint/skb/kfree_skb") int kfree_skb(struct kfree_skb_args *args) { struct sk_buff *skb = (struct sk_buff *)args->skb; - struct insp_pl_metric_t mkey = {0}; struct insp_pl_event_t event = {0}; set_tuple(skb, &event.tuple); - set_meta(skb, &event.skb_meta); - - mkey.netns = get_netns(skb); - mkey.location = (u64)args->location; - mkey.protocol = (u8)args->protocol; - u64 *valp = bpf_map_lookup_elem(&insp_pl_metric, &mkey); - if (!valp) { - u64 initval = 1; - bpf_map_update_elem(&insp_pl_metric, &mkey, &initval, 0); - } else { - __sync_fetch_and_add(valp, 1); - } - - bpf_get_current_comm(&event.target, sizeof(event.target)); - event.pid = bpf_get_current_pid_tgid()>> 32; - event.cpu = bpf_get_smp_processor_id(); event.location = (u64)args->location; event.stack_id = bpf_get_stackid((struct pt_regs *)args, &insp_pl_stack, KERN_STACKID_FLAGS); diff --git a/deploy/net-exporter-config.yaml b/deploy/net-exporter-config.yaml index b4d86631..088b3824 100644 --- a/deploy/net-exporter-config.yaml +++ b/deploy/net-exporter-config.yaml @@ -1,6 +1,6 @@ debugmode: true port: 9102 -enable_controller: true + #enable_controller: true metrics: probes: - name: conntrack @@ -21,7 +21,7 @@ event: - name: kernellatency - name: packetloss - name: tcpreset - sinks: - - name: stderr + sinks: [] + diff --git a/pkg/exporter/bpfutil/format.go b/pkg/exporter/bpfutil/format.go index fccddbac..b5af4a60 100644 --- a/pkg/exporter/bpfutil/format.go +++ b/pkg/exporter/bpfutil/format.go @@ -1,6 +1,7 @@ package bpfutil import ( + "encoding/binary" "fmt" "net" "strings" @@ -8,7 +9,7 @@ import ( ) // GetAddrStr get string format ip address,default in ipv4 -func GetAddrStr(proto uint16, addr [16]byte) string { +func GetAddrStr(proto uint16, addr [16]uint8) string { switch proto { case syscall.ETH_P_IPV6: return fmt.Sprintf("[%s]", net.IP(addr[:]).String()) @@ -17,6 +18,21 @@ func GetAddrStr(proto uint16, addr [16]byte) string { } } +func GetV4AddrStr(addr uint32) string { + var bytes [4]byte + bytes[0] = byte(addr & 0xff) + bytes[1] = byte(addr >> 8 & 0xff) + bytes[2] = byte(addr >> 16 & 0xff) + bytes[3] = byte(addr >> 24 & 0xff) + return fmt.Sprintf("%d.%d.%d.%d", bytes[0], bytes[1], bytes[2], bytes[3]) +} + +func Htons(i uint16) uint16 { + data := make([]byte, 2) + binary.BigEndian.PutUint16(data, i) + return binary.LittleEndian.Uint16(data) +} + /* enum { TCP_ESTABLISHED = 1, diff --git a/pkg/exporter/probe/flow/flow.go b/pkg/exporter/probe/flow/flow.go index 36521bb3..113010f6 100644 --- a/pkg/exporter/probe/flow/flow.go +++ b/pkg/exporter/probe/flow/flow.go @@ -2,7 +2,6 @@ package flow import ( "context" - "encoding/binary" "fmt" "strings" "sync" @@ -218,7 +217,7 @@ func metricsProbeCreator(args flowArgs) (probe.MetricsProbe, error) { opts := probe.BatchMetricsOpts{ Namespace: probe.MetricsNamespace, Subsystem: probeName, - VariableLabels: []string{"protocol", "src", "src_type", "src_node", "src_namespace", "src_pod", "dst", "dst_type", "dst_node", "dst_namespace", "dst_pod", "sport", "dport"}, + VariableLabels: probe.TupleMetricsLabels, SingleMetricsOpts: []probe.SingleMetricsOpts{ {Name: metricsBytes, ValueType: prometheus.CounterValue}, {Name: metricsPackets, ValueType: prometheus.CounterValue}, @@ -252,12 +251,8 @@ func (p *metricsProbe) Stop(_ context.Context) error { } return p.bpfObjs.Close() } + func (p *metricsProbe) collectOnce(emit probe.Emit) error { - htons := func(port uint16) uint16 { - data := make([]byte, 2) - binary.BigEndian.PutUint16(data, port) - return binary.LittleEndian.Uint16(data) - } var values []bpfFlowMetrics var key bpfFlowTuple4 iterator := p.bpfObjs.bpfMaps.InspFlow4Metrics.Iterate() @@ -273,21 +268,6 @@ func (p *metricsProbe) collectOnce(emit probe.Emit) error { val.Packets += values[i].Packets } - var protocol string - - switch key.Proto { - case 1: - protocol = "icmp" - case 6: - protocol = "tcp" - case 17: - protocol = "udp" - case 132: - protocol = "sctp" - default: - log.Errorf("%s unknown ip protocol number %d", probeName, key.Proto) - } - ipInfo := func(ip string) []string { info := nettop.GetIPInfo(ip) if info == nil { @@ -305,16 +285,16 @@ func (p *metricsProbe) collectOnce(emit probe.Emit) error { return []string{"unknown", "", "", ""} } - labels := []string{protocol} - srcIP := toIPString(key.Src) + labels := []string{bpfutil.GetProtoStr(key.Proto)} + srcIP := bpfutil.GetV4AddrStr(key.Src) labels = append(labels, srcIP) labels = append(labels, ipInfo(srcIP)...) - dstIP := toIPString(key.Dst) + dstIP := bpfutil.GetV4AddrStr(key.Dst) labels = append(labels, dstIP) labels = append(labels, ipInfo(dstIP)...) - labels = append(labels, fmt.Sprintf("%d", htons(key.Sport))) - labels = append(labels, fmt.Sprintf("%d", htons(key.Dport))) + labels = append(labels, fmt.Sprintf("%d", bpfutil.Htons(key.Sport))) + labels = append(labels, fmt.Sprintf("%d", bpfutil.Htons(key.Dport))) emit("bytes", labels, float64(val.Bytes)) emit("packets", labels, float64(val.Packets)) @@ -366,15 +346,6 @@ func (f *ebpfFlow) cleanup() error { return cleanQdisc(f.dev) } -func toIPString(addr uint32) string { - var bytes [4]byte - bytes[0] = byte(addr & 0xff) - bytes[1] = byte(addr >> 8 & 0xff) - bytes[2] = byte(addr >> 16 & 0xff) - bytes[3] = byte(addr >> 24 & 0xff) - return fmt.Sprintf("%d.%d.%d.%d", bytes[0], bytes[1], bytes[2], bytes[3]) -} - func (f *ebpfFlow) setupTCFilter(link netlink.Link) error { if err := replaceQdisc(link); err != nil { return errors.Wrapf(err, "failed replace qdics clsact for dev %s", link.Attrs().Name) diff --git a/pkg/exporter/probe/legacy.go b/pkg/exporter/probe/legacy.go index 3288c185..4f6a175e 100644 --- a/pkg/exporter/probe/legacy.go +++ b/pkg/exporter/probe/legacy.go @@ -3,6 +3,7 @@ package probe import ( "fmt" + "github.com/alibaba/kubeskoop/pkg/exporter/bpfutil" "github.com/alibaba/kubeskoop/pkg/exporter/nettop" "github.com/prometheus/client_golang/prometheus" log "github.com/sirupsen/logrus" @@ -10,6 +11,7 @@ import ( var legacyMetricsLabels = []string{"target_node", "target_namespace", "target_pod", "node", "namespace", "pod"} var StandardMetricsLabels = []string{"k8s_node", "k8s_namespace", "k8s_pod"} +var TupleMetricsLabels = []string{"protocol", "src", "src_type", "src_node", "src_namespace", "src_pod", "dst", "dst_type", "dst_node", "dst_namespace", "dst_pod", "sport", "dport"} func BuildStandardMetricsLabelValues(entity *nettop.Entity) []string { return []string{nettop.GetNodeName(), entity.GetPodNamespace(), entity.GetPodName()} @@ -110,6 +112,91 @@ func LagacyEventLabels(netns uint32) []Label { } } +func BuildTupleMetricsLabels(tuple *Tuple) []string { + ipInfo := func(ip string) []string { + info := nettop.GetIPInfo(ip) + if info == nil { + return []string{"unknown", "", "", ""} + } + + switch info.Type { + case nettop.IPTypeNode: + return []string{"node", info.NodeName, "", ""} + case nettop.IPTypePod: + return []string{"pod", "", info.PodNamespace, info.PodName} + default: + log.Warningf("unknown ip type %s for %s", ip, info.Type) + } + return []string{"unknown", "", "", ""} + } + + labels := []string{bpfutil.GetProtoStr(tuple.Protocol)} + labels = append(labels, tuple.Src) + labels = append(labels, ipInfo(tuple.Src)...) + + labels = append(labels, tuple.Dst) + labels = append(labels, ipInfo(tuple.Dst)...) + labels = append(labels, fmt.Sprintf("%d", bpfutil.Htons(tuple.Sport))) + labels = append(labels, fmt.Sprintf("%d", bpfutil.Htons(tuple.Dport))) + return labels +} + +func BuildTupleEventLabels(tuple *Tuple) []Label { + ipInfo := func(prefix, ip string) (ret []Label) { + var values [4]string + + defer func() { + ret = []Label{ + {Name: prefix + "_type", Value: values[0]}, + {Name: prefix + "_node", Value: values[1]}, + {Name: prefix + "_namespace", Value: values[2]}, + {Name: prefix + "_pod", Value: values[3]}, + } + + }() + + info := nettop.GetIPInfo(ip) + if info == nil { + values = [...]string{"unknown", "", "", ""} + return + } + + switch info.Type { + case nettop.IPTypeNode: + values = [...]string{"node", info.NodeName, "", ""} + case nettop.IPTypePod: + values = [...]string{"pod", "", info.PodNamespace, info.PodName} + default: + log.Warningf("unknown ip type %s for %s", ip, info.Type) + } + values = [...]string{"unknown", "", "", ""} + return + } + + labels := []Label{ + {Name: "protocol", Value: bpfutil.GetProtoStr(tuple.Protocol)}, + } + labels = append(labels, Label{ + Name: "src", Value: tuple.Src, + }) + + labels = append(labels, ipInfo("src", tuple.Src)...) + + labels = append(labels, Label{ + Name: "dst", Value: tuple.Dst, + }) + labels = append(labels, ipInfo("dst", tuple.Dst)...) + labels = append(labels, Label{ + Name: "sport", Value: fmt.Sprintf("%d", bpfutil.Htons(tuple.Sport)), + }) + + labels = append(labels, Label{ + Name: "dport", Value: fmt.Sprintf("%d", bpfutil.Htons(tuple.Dport)), + }) + + return labels +} + func CopyLegacyMetricsMap(m map[string]map[uint32]uint64) map[string]map[uint32]uint64 { ret := make(map[string]map[uint32]uint64) for key, nsMap := range m { diff --git a/pkg/exporter/probe/tracepacketloss/bpf_bpfeb.go b/pkg/exporter/probe/tracepacketloss/bpf_bpfeb.go index 87fbc2a9..817a8972 100644 --- a/pkg/exporter/probe/tracepacketloss/bpf_bpfeb.go +++ b/pkg/exporter/probe/tracepacketloss/bpf_bpfeb.go @@ -13,44 +13,22 @@ import ( "github.com/cilium/ebpf" ) +type bpfAddr struct{ V6addr [16]uint8 } + type bpfInspPlEventT struct { - Target [20]int8 - Tuple struct { - Saddr struct { - V4addr uint32 - _ [12]byte - } - Daddr struct { - V4addr uint32 - _ [12]byte - } - Sport uint16 - Dport uint16 - L3Proto uint16 - L4Proto uint8 - Pad uint8 - } - SkbMeta struct { - Netns uint32 - Mark uint32 - Ifindex uint32 - Len uint32 - Mtu uint32 - SkState uint32 - Protocol uint16 - Pad uint16 - } - Pid uint32 - Cpu uint32 + Tuple bpfTuple Location uint64 StackId int64 } -type bpfInspPlMetricT struct { - Location uint64 - Netns uint32 - Protocol uint8 - _ [3]byte +type bpfTuple struct { + Saddr bpfAddr + Daddr bpfAddr + Sport uint16 + Dport uint16 + L3Proto uint16 + L4Proto uint8 + Pad uint8 } // loadBpf returns the embedded CollectionSpec for bpf. @@ -101,9 +79,8 @@ type bpfProgramSpecs struct { // // It can be passed ebpf.CollectionSpec.Assign. type bpfMapSpecs struct { - InspPlEvent *ebpf.MapSpec `ebpf:"insp_pl_event"` - InspPlMetric *ebpf.MapSpec `ebpf:"insp_pl_metric"` - InspPlStack *ebpf.MapSpec `ebpf:"insp_pl_stack"` + InspPlEvent *ebpf.MapSpec `ebpf:"insp_pl_event"` + InspPlStack *ebpf.MapSpec `ebpf:"insp_pl_stack"` } // bpfObjects contains all objects after they have been loaded into the kernel. @@ -125,15 +102,13 @@ func (o *bpfObjects) Close() error { // // It can be passed to loadBpfObjects or ebpf.CollectionSpec.LoadAndAssign. type bpfMaps struct { - InspPlEvent *ebpf.Map `ebpf:"insp_pl_event"` - InspPlMetric *ebpf.Map `ebpf:"insp_pl_metric"` - InspPlStack *ebpf.Map `ebpf:"insp_pl_stack"` + InspPlEvent *ebpf.Map `ebpf:"insp_pl_event"` + InspPlStack *ebpf.Map `ebpf:"insp_pl_stack"` } func (m *bpfMaps) Close() error { return _BpfClose( m.InspPlEvent, - m.InspPlMetric, m.InspPlStack, ) } diff --git a/pkg/exporter/probe/tracepacketloss/bpf_bpfeb.o b/pkg/exporter/probe/tracepacketloss/bpf_bpfeb.o index 2faf4acb7763b1f1f8a37c5e6bec4c38ad7b6ca0..9c4c80c68ed6091fe477cddacba7eda03d5db2b3 100644 GIT binary patch literal 11464 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 NO18203_Jf#{|AVu-`M~F literal 132104 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 IdH*y24_Ipo{Qv*} diff --git a/pkg/exporter/probe/tracepacketloss/bpf_bpfel.go b/pkg/exporter/probe/tracepacketloss/bpf_bpfel.go index d54bd046..d28ebddd 100644 --- a/pkg/exporter/probe/tracepacketloss/bpf_bpfel.go +++ b/pkg/exporter/probe/tracepacketloss/bpf_bpfel.go @@ -13,44 +13,22 @@ import ( "github.com/cilium/ebpf" ) +type bpfAddr struct{ V6addr [16]uint8 } + type bpfInspPlEventT struct { - Target [20]int8 - Tuple struct { - Saddr struct { - V4addr uint32 - _ [12]byte - } - Daddr struct { - V4addr uint32 - _ [12]byte - } - Sport uint16 - Dport uint16 - L3Proto uint16 - L4Proto uint8 - Pad uint8 - } - SkbMeta struct { - Netns uint32 - Mark uint32 - Ifindex uint32 - Len uint32 - Mtu uint32 - SkState uint32 - Protocol uint16 - Pad uint16 - } - Pid uint32 - Cpu uint32 + Tuple bpfTuple Location uint64 StackId int64 } -type bpfInspPlMetricT struct { - Location uint64 - Netns uint32 - Protocol uint8 - _ [3]byte +type bpfTuple struct { + Saddr bpfAddr + Daddr bpfAddr + Sport uint16 + Dport uint16 + L3Proto uint16 + L4Proto uint8 + Pad uint8 } // loadBpf returns the embedded CollectionSpec for bpf. @@ -101,9 +79,8 @@ type bpfProgramSpecs struct { // // It can be passed ebpf.CollectionSpec.Assign. type bpfMapSpecs struct { - InspPlEvent *ebpf.MapSpec `ebpf:"insp_pl_event"` - InspPlMetric *ebpf.MapSpec `ebpf:"insp_pl_metric"` - InspPlStack *ebpf.MapSpec `ebpf:"insp_pl_stack"` + InspPlEvent *ebpf.MapSpec `ebpf:"insp_pl_event"` + InspPlStack *ebpf.MapSpec `ebpf:"insp_pl_stack"` } // bpfObjects contains all objects after they have been loaded into the kernel. @@ -125,15 +102,13 @@ func (o *bpfObjects) Close() error { // // It can be passed to loadBpfObjects or ebpf.CollectionSpec.LoadAndAssign. type bpfMaps struct { - InspPlEvent *ebpf.Map `ebpf:"insp_pl_event"` - InspPlMetric *ebpf.Map `ebpf:"insp_pl_metric"` - InspPlStack *ebpf.Map `ebpf:"insp_pl_stack"` + InspPlEvent *ebpf.Map `ebpf:"insp_pl_event"` + InspPlStack *ebpf.Map `ebpf:"insp_pl_stack"` } func (m *bpfMaps) Close() error { return _BpfClose( m.InspPlEvent, - m.InspPlMetric, m.InspPlStack, ) } diff --git a/pkg/exporter/probe/tracepacketloss/bpf_bpfel.o b/pkg/exporter/probe/tracepacketloss/bpf_bpfel.o index 6e9421c2443e93f58e096785b10894e8812631b9..1287ce767765ea22a6c3f838e950f49b20fb3b09 100644 GIT binary patch literal 11464 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 literal 132104 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 was removed and sock was not bind - if key.Netns == 0 { - continue - } - - // if _, ok := res[PACKETLOSS_TOTAL][key.Netns]; ok { - // res[PACKETLOSS_TOTAL][key.Netns] += value - // } else { - // res[PACKETLOSS_TOTAL][key.Netns] += value - // } - - sym, err := bpfutil.GetSymPtFromBpfLocation(key.Location) - if err != nil { - log.Warnf("%s get sym failed, location: %x, err: %v", probeName, key.Location, err) - continue - } - - switch sym.GetName() { - case netfilterSymbol: - resMap[PACKETLOSS_NETFILTER][key.Netns] += value - case tcpstatmSymbol: - resMap[PACKETLOSS_TCPSTATEM][key.Netns] += value - case tcprcvSymbol: - resMap[PACKETLOSS_TCPRCV][key.Netns] += value - case tcpdorcvSymbol: - resMap[PACKETLOSS_TCPHANDLE][key.Netns] += value - default: - if _, ok := ignoreSymbolList[sym.GetName()]; !ok { - resMap[PACKETLOSS_ABNORMAL][key.Netns] += value - } - resMap[PACKETLOSS_TOTAL][key.Netns] += value - } - - // if _, ok := ignoreSymbolList[sym.GetName()]; !ok { - // if _, ok := res[PACKETLOSS_ABNORMAL][key.Netns]; ok { - // res[PACKETLOSS_ABNORMAL][key.Netns] += value - // } else { - // res[PACKETLOSS_ABNORMAL][key.Netns] += value - // } - // } - } - - return resMap, nil -} - func (p *packetLossProbe) loadAndAttachBPF() error { // Allow the current process to lock memory for eBPF resources. if err := rlimit.RemoveMemlock(); err != nil { @@ -291,6 +246,42 @@ func (p *packetLossProbe) loadAndAttachBPF() error { return nil } +func ignoreLocation(loc uint64) bool { + sym, err := bpfutil.GetSymPtFromBpfLocation(loc) + if err != nil { + log.Infof("cannot find location %d", loc) + // emit the event anyway + return false + } + + _, ok := uselessSymbols[sym.GetName()] + return !ok +} + +func toProbeTuple(t *bpfTuple) *probe.Tuple { + return &probe.Tuple{ + Protocol: t.L4Proto, + Src: bpfutil.GetAddrStr(t.L3Proto, t.Saddr.V6addr), + Dst: bpfutil.GetAddrStr(t.L3Proto, t.Daddr.V6addr), + Sport: t.Sport, + Dport: t.Dport, + } +} + +func (p *packetLossProbe) countByLocation(loc uint64, counter *Counter) { + sym, err := bpfutil.GetSymPtFromBpfLocation(loc) + if err != nil { + log.Warnf("%s get sym failed, location: %x, err: %v", probeName, loc, err) + return + } + + switch sym.GetName() { + case netfilterSymbol: + counter.Netfilter++ + } + +} + func (p *packetLossProbe) perfLoop() { for { anotherLoop: @@ -310,45 +301,48 @@ func (p *packetLossProbe) perfLoop() { } var event bpfInspPlEventT - if err := binary.Read(bytes.NewBuffer(record.RawSample), binary.LittleEndian, &event); err != nil { + if err := binary.Read(bytes.NewBuffer(record.RawSample), binary.NativeEndian, &event); err != nil { log.Errorf("%s failed parsing event, err: %v", probeName, err) continue } - // filter netlink/unixsock/tproxy packet - if event.Tuple.Dport == 0 && event.Tuple.Sport == 0 { + + if ignoreLocation(event.Location) { continue } + tuple := toProbeTuple(&event.Tuple) + + v, ok := p.cache.Get(*tuple) + if !ok { + v = &Counter{} + p.cache.Add(*tuple, v) + } + v.Total++ + p.countByLocation(event.Location, v) + evt := &probe.Event{ Timestamp: time.Now().UnixNano(), - Type: PACKETLOSS, - Labels: probe.LagacyEventLabels(event.SkbMeta.Netns), + Type: PacketLoss, + Labels: probe.BuildTupleEventLabels(tuple), } - tuple := fmt.Sprintf("protocol=%s saddr=%s sport=%d daddr=%s dport=%d ", bpfutil.GetProtoStr(event.Tuple.L4Proto), bpfutil.GetAddrStr(event.Tuple.L3Proto, *(*[16]byte)(unsafe.Pointer(&event.Tuple.Saddr))), bits.ReverseBytes16(event.Tuple.Sport), bpfutil.GetAddrStr(event.Tuple.L3Proto, *(*[16]byte)(unsafe.Pointer(&event.Tuple.Daddr))), bits.ReverseBytes16(event.Tuple.Dport)) - + //TODO add trigger to enable/disable stack stacks, err := bpfutil.GetSymsByStack(uint32(event.StackId), p.objs.InspPlStack) if err != nil { log.Warnf("%s failed get sym by stack, err: %v", probeName, err) continue } - strs := []string{} + var strs []string for _, sym := range stacks { if _, ok := ignoreSymbolList[sym.GetName()]; ok { goto anotherLoop } - if _, ok := uselessSymbolList[sym.GetName()]; ok { - continue - } strs = append(strs, sym.GetExpr()) } - stackStr := strings.Join(strs, "\n") - - evt.Message = fmt.Sprintf("%s\nstacktrace:\n%s", tuple, stackStr) + evt.Message = strings.Join(strs, "\n") if p.sink != nil { - log.Debugf("%s sink event %s", probeName, util.ToJSONString(evt)) p.sink <- evt } } diff --git a/pkg/exporter/probe/types.go b/pkg/exporter/probe/types.go new file mode 100644 index 00000000..981626fb --- /dev/null +++ b/pkg/exporter/probe/types.go @@ -0,0 +1,9 @@ +package probe + +type Tuple struct { + Protocol uint8 + Src string + Dst string + Sport uint16 + Dport uint16 +} From abae22beee805ce6922c6d867586560ae2dddf9c Mon Sep 17 00:00:00 2001 From: "jizhong.jiangjz" Date: Tue, 26 Mar 2024 15:05:07 +0800 Subject: [PATCH 2/3] update golang version to 1.221. in dockerfile --- Dockerfile | 14 +++++--------- bpf/tcpretrans.c | 0 deploy/net-exporter-config.yaml | 5 +++-- 3 files changed, 8 insertions(+), 11 deletions(-) create mode 100644 bpf/tcpretrans.c diff --git a/Dockerfile b/Dockerfile index 6727279e..7a8206bc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,10 @@ -FROM docker.io/library/golang:1.20.5-alpine AS build -# --build-arg GOPROXY=https://goproxy.cn,direct -ARG GOPROXY -# --build-arg ALPINE_MIRROR=mirrors.aliyun.com +FROM docker.io/library/golang:1.22.1-alpine AS build + ARG ALPINE_MIRROR -ENV GOPROXY=$GOPROXY ENV ALPINE_MIRROR=$ALPINE_MIRROR RUN if [ ! -z "$ALPINE_MIRROR" ]; then sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories; fi && \ - apk add gcc g++ linux-headers git make bash && \ - go env -w GOPROXY=$GOPROXY + apk add gcc g++ linux-headers git make bash WORKDIR /go/src/github.com/alibaba/kubeskoop/ RUN go env -w GOMODCACHE=/root/.cache/go-build @@ -24,10 +20,10 @@ ADD ./webui /webconsole RUN yarn install && yarn build FROM docker.io/library/alpine:3.19 as base -ARG GOPROXY + ARG ALPINE_MIRROR -ENV GOPROXY=$GOPROXY ENV ALPINE_MIRROR=$ALPINE_MIRROR + RUN if [ ! -z "$ALPINE_MIRROR" ]; then sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories; fi && \ apk add --no-cache \ iproute2 \ diff --git a/bpf/tcpretrans.c b/bpf/tcpretrans.c new file mode 100644 index 00000000..e69de29b diff --git a/deploy/net-exporter-config.yaml b/deploy/net-exporter-config.yaml index 088b3824..03bd61e5 100644 --- a/deploy/net-exporter-config.yaml +++ b/deploy/net-exporter-config.yaml @@ -1,6 +1,6 @@ debugmode: true port: 9102 - #enable_controller: true +enable_controller: true metrics: probes: - name: conntrack @@ -21,7 +21,8 @@ event: - name: kernellatency - name: packetloss - name: tcpreset - sinks: [] + sinks: + - name: stderr From 4ab42fc4bade7c271d2a74a654297692d35744c3 Mon Sep 17 00:00:00 2001 From: "jizhong.jiangjz" Date: Wed, 27 Mar 2024 09:29:18 +0800 Subject: [PATCH 3/3] update go-sqlite3 to 1.14.22 --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index cdad8e7d..a656ca9d 100644 --- a/go.mod +++ b/go.mod @@ -24,7 +24,7 @@ require ( github.com/hashicorp/golang-lru/v2 v2.0.6 github.com/jmoiron/sqlx v1.3.5 github.com/json-iterator/go v1.1.12 - github.com/mattn/go-sqlite3 v1.14.6 + github.com/mattn/go-sqlite3 v1.14.22 github.com/mdlayher/netlink v1.7.1 github.com/mitchellh/mapstructure v1.5.0 github.com/moby/ipvs v1.1.0 diff --git a/go.sum b/go.sum index f15acb72..b2fb10ab 100644 --- a/go.sum +++ b/go.sum @@ -804,8 +804,9 @@ github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= -github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=