in pkg/exporter/probe/tracekernel/tracekernel.go [297:375]
func (p *kernelLatencyProbe) loadAndAttachBPF() error {
// 准备动作
if err := rlimit.RemoveMemlock(); err != nil {
return err
}
opts := ebpf.CollectionOptions{}
// 获取btf信息
opts.Programs = ebpf.ProgramOptions{
KernelTypes: bpfutil.LoadBTFSpecOrNil(),
}
// 获取Loaded的程序/map的fd信息
if err := loadBpfObjects(&p.objs, &opts); err != nil {
return fmt.Errorf("loading objects: %v", err)
}
progrcv, err := link.Kprobe(HOOK_IPRCV, p.objs.KlatencyIpRcv, &link.KprobeOptions{})
if err != nil {
return fmt.Errorf("link HOOK_IPRCV: %s", err.Error())
}
p.links = append(p.links, progrcv)
progrcvfin, err := link.Kprobe(HOOK_IPRCVFIN, p.objs.KlatencyIpRcvFinish, &link.KprobeOptions{})
if err != nil {
return fmt.Errorf("link HOOK_IPRCVFIN: %s", err.Error())
}
p.links = append(p.links, progrcvfin)
proglocal, err := link.Kprobe(HOOK_IPLOCAL, p.objs.KlatencyIpLocalDeliver, &link.KprobeOptions{})
if err != nil {
return fmt.Errorf("link HOOK_IPRCV: %s", err.Error())
}
p.links = append(p.links, proglocal)
proglocalfin, err := link.Kprobe(HOOK_IPLOCALFIN, p.objs.KlatencyIpLocalDeliverFinish, &link.KprobeOptions{})
if err != nil {
return fmt.Errorf("link HOOK_IPLOCALFIN: %s", err.Error())
}
p.links = append(p.links, proglocalfin)
progxmit, err := link.Kprobe(HOOK_IPXMIT, p.objs.KlatencyIpQueueXmit, &link.KprobeOptions{})
if err != nil {
return fmt.Errorf("link HOOK_IPXMIT: %s", err.Error())
}
p.links = append(p.links, progxmit)
proglocalout, err := link.Kprobe(HOOK_IPLOCALOUT, p.objs.KlatencyIpLocal, &link.KprobeOptions{})
if err != nil {
return fmt.Errorf("link HOOK_IPLOCALOUT: %s", err.Error())
}
p.links = append(p.links, proglocalout)
progoutput, err := link.Kprobe(HOOK_IPOUTPUT, p.objs.KlatencyIpOutput, &link.KprobeOptions{})
if err != nil {
return fmt.Errorf("link HOOK_IPOUTPUT: %s", err.Error())
}
p.links = append(p.links, progoutput)
progfin, err := link.Kprobe(HOOK_IPOUTPUTFIN, p.objs.KlatencyIpFinishOutput2, &link.KprobeOptions{})
if err != nil {
return fmt.Errorf("link HOOK_IPOUTPUTFIN: %s", err.Error())
}
p.links = append(p.links, progfin)
progkfree, err := link.Kprobe("kfree_skb", p.objs.ReportKfree, &link.KprobeOptions{})
if err != nil {
return fmt.Errorf("link kfree_skb: %s", err.Error())
}
p.links = append(p.links, progkfree)
progconsume, err := link.Kprobe("consume_skb", p.objs.ReportConsume, &link.KprobeOptions{})
if err != nil {
return fmt.Errorf("link consume_skb: %s", err.Error())
}
p.links = append(p.links, progconsume)
return nil
}