From 1d9a9b6dd221792079d4d2cf22ae85f90e5eb307 Mon Sep 17 00:00:00 2001
From: Mario Macias <mmaciasl@redhat.com>
Date: Thu, 21 Apr 2022 14:34:47 +0200
Subject: [PATCH] NETOBSERV-201: configure LogLevel and Sampling (#16)

* NETOBSERV-201: configure LogLevel and Sampling

* updated go mod
---
 bpf/flows.c                   |   9 +++++++++
 cmd/netobserv-ebpf-agent.go   |  13 ++++++++++---
 go.mod                        |   2 +-
 pkg/agent/agent.go            |   2 +-
 pkg/agent/agent_test.go       |   1 -
 pkg/agent/config.go           |   7 +++++--
 pkg/ebpf/bpf_bpfeb.o          | Bin 8400 -> 9432 bytes
 pkg/ebpf/bpf_bpfel.o          | Bin 9248 -> 10280 bytes
 pkg/ebpf/tracer.go            |  24 +++++++++++++++++++-----
 scripts/generators.Dockerfile |   2 +-
 10 files changed, 46 insertions(+), 14 deletions(-)

diff --git a/bpf/flows.c b/bpf/flows.c
index 15e1fba1..3b7016f9 100644
--- a/bpf/flows.c
+++ b/bpf/flows.c
@@ -23,6 +23,9 @@ struct {
     __uint(max_entries, 1 << 24);
 } flows SEC(".maps");
 
+// Constant definitions, to be overridden by the invoker
+volatile const u32 sampling = 0;
+
 // sets flow fields from IPv4 header information
 static inline int fill_iphdr(struct iphdr *ip, void *data_end, struct flow *flow) {
     if ((void *)ip + sizeof(*ip) > data_end) {
@@ -72,6 +75,12 @@ static inline int fill_ethhdr(struct ethhdr *eth, void *data_end, struct flow *f
 
 // parses flow information for a given direction (ingress/egress)
 static inline int flow_parse(struct __sk_buff *skb, u8 direction) {
+
+    // If sampling is defined, will only parse 1 out of "sampling" flows
+    if (sampling != 0 && (bpf_get_prandom_u32() % sampling) != 0) {
+        return TC_ACT_OK;
+    }
+
     void *data = (void *)(long)skb->data;
     void *data_end = (void *)(long)skb->data_end;
 
diff --git a/cmd/netobserv-ebpf-agent.go b/cmd/netobserv-ebpf-agent.go
index 49618bbe..310eda2e 100644
--- a/cmd/netobserv-ebpf-agent.go
+++ b/cmd/netobserv-ebpf-agent.go
@@ -21,9 +21,7 @@ func main() {
 	if err := env.Parse(&config); err != nil {
 		logrus.WithError(err).Fatal("can't load configuration from environment")
 	}
-	if config.Verbose {
-		logrus.SetLevel(logrus.DebugLevel)
-	}
+	setLoggerVerbosity(&config)
 
 	logrus.WithField("configuration", fmt.Sprintf("%#v", config)).Debugf("configuration loaded")
 
@@ -45,3 +43,12 @@ func main() {
 		logrus.WithError(err).Fatal("can't start netobserv-ebpf-agent")
 	}
 }
+
+func setLoggerVerbosity(cfg *agent.Config) {
+	lvl, err := logrus.ParseLevel(cfg.LogLevel)
+	if err != nil {
+		logrus.WithError(err).Warn("assuming 'info' logger level as default")
+		lvl = logrus.InfoLevel
+	}
+	logrus.SetLevel(lvl)
+}
diff --git a/go.mod b/go.mod
index 8015af8f..5a7c8451 100644
--- a/go.mod
+++ b/go.mod
@@ -11,6 +11,7 @@ require (
 	github.com/sirupsen/logrus v1.8.1
 	github.com/stretchr/testify v1.7.1
 	github.com/vishvananda/netlink v1.1.0
+	golang.org/x/sys v0.0.0-20220412211240-33da011f77ad
 	google.golang.org/grpc v1.45.0
 	google.golang.org/protobuf v1.28.0
 )
@@ -22,7 +23,6 @@ require (
 	github.com/pmezard/go-difflib v1.0.0 // indirect
 	github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df // indirect
 	golang.org/x/net v0.0.0-20220412020605-290c469a71a5 // indirect
-	golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect
 	golang.org/x/text v0.3.7 // indirect
 	golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f // indirect
 	google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac // indirect
diff --git a/pkg/agent/agent.go b/pkg/agent/agent.go
index d27598c6..45869c09 100644
--- a/pkg/agent/agent.go
+++ b/pkg/agent/agent.go
@@ -42,7 +42,7 @@ func FlowsAgent(cfg *Config) (*Flows, error) {
 	}
 	tracers := map[string]flowTracer{}
 	for iface := range interfaces {
-		tracers[iface] = ebpf.NewFlowTracer(iface)
+		tracers[iface] = ebpf.NewFlowTracer(iface, cfg.Sampling)
 	}
 	target := fmt.Sprintf("%s:%d", cfg.TargetHost, cfg.TargetPort)
 	grpcExporter, err := exporter.StartGRPCProto(target)
diff --git a/pkg/agent/agent_test.go b/pkg/agent/agent_test.go
index 368b8c94..2a90b473 100644
--- a/pkg/agent/agent_test.go
+++ b/pkg/agent/agent_test.go
@@ -28,7 +28,6 @@ func TestFlowsAgent(t *testing.T) {
 	flowsAgent, err := FlowsAgent(&Config{
 		TargetHost:         "127.0.0.1",
 		TargetPort:         port,
-		Verbose:            true,
 		CacheMaxFlows:      1,
 		CacheActiveTimeout: 5 * time.Second,
 		BuffersLength:      10,
diff --git a/pkg/agent/config.go b/pkg/agent/config.go
index 3f51807c..7bb25c93 100644
--- a/pkg/agent/config.go
+++ b/pkg/agent/config.go
@@ -32,8 +32,11 @@ type Config struct {
 	// CacheActiveTimeout specifies the maximum duration in which a flow is kept in the accounting
 	// cache before being flushed for its later export
 	CacheActiveTimeout time.Duration `env:"CACHE_ACTIVE_TIMEOUT" envDefault:"5s"`
-	// Verbose logs mode
-	Verbose bool `env:"VERBOSE" envDefault:"false"`
+	// Logger level. From more to less verbose: trace, debug, info, warn, error, fatal, panic.
+	LogLevel string `env:"LOG_LEVEL" envDefault:"info"`
+	// Sampling holds the rate at which packets should be sampled and sent to the target collector.
+	// E.g. if set to 100, one out of 100 packets, on average, will be sent to each target collector.
+	Sampling uint32 `env:"SAMPLING" envDefault:"0"`
 }
 
 func getInterfaces(cfg *Config, interfaces func() ([]net.Interface, error)) (map[string]struct{}, error) {
diff --git a/pkg/ebpf/bpf_bpfeb.o b/pkg/ebpf/bpf_bpfeb.o
index 208ca53bf2294b8a1b30f720307c32dcf618b0bb..8219d6f33c60b495fcff888e892948a113765a7b 100644
GIT binary patch
literal 9432
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

delta 2654
zcmccNdBJglo|vov0|+>P2nGiReg?k%i3|)I*OV|%++e-=FpDWOvwMKg<U$G2$pRew
zoEsPzm^Uymu+7@6!Lgo+QEu`LE_+7#$r9XVe606)z=kl0Gcd5FO`gCl9VyAcz`z2*
zY}tGeSt$kv21W)3wo-mD4Ho18lMD<33=C}5NaE5^aTW#!wq|xHhk=1@;$|5h8K%uO
zd_gQC$r*`74Ds<fnaQbn#i<N>xrqhElfMg@DY2L^Ft9{GHE}R7Fs^{u3>Fb%U|{_)
z*<V<^UJ=Y^VBE*Rz<7y)u?EBisouxHz$C!HXrRdeb{9yV$%%ncN0otrL4pCSo+*cc
z(E{X02Pl6h1EUQm0|SExlz)nW;f*K*149H7A0(du<^N`2sQ<yrz`$?-BEam(!0?Ba
zfq_v0%I{=gWDsLuU^GDDi!d-SLM>#5$p=8?cQP<?a56A3LM>#z&%jUsQl9~p2k}Aj
z1rR<9A45GugA4-$V+CA*p+Sm)ff4E;7Don#7Lfc2s62=-1r8Z-2(XkeFm$LeFfc(w
z1k9IXU|@oJfMp>A!vt0a1}3NnSoSh7%#mbZV1jypWp6zL!yH})1}3NvSUxi_hHx@4
zFhO0&D#^gG1Eiq=;s7uoq`m{f2gMc$GhKl2S^XIpV?gR}K=~yMj0rLf3``G@_@WF9
z%+M%et)Ifcn8L}xzzmHO)}0KD4XmKl!N9<Pls4E{85k#kY@%}7sK=K$=#Vz*85nUV
z4mzZbdVGn44r#*>TjGEwMpjtbfQAs869eNE*2xbQlqUB`h}WAkF)%QJk^}-X7cej|
z9AkisgHjb-b{j$*l-%Ls-ALjm;Gzr+%aO!E=E9_ALd4lXe5Q`c4wB0C{!9!E%pg7j
zGgmM$FzjQ1i!)~+<QUc=#8I5mf+UXYlm$rQ$WECA5!VA5&C~%Rp;$zafdN#oLAhWG
zRMR91GBB`Ac90S`m0)0C;72Nv(fG`u%m$JN)gK^RK&7|9<ULaIj2xTqNJ%r*gZu-k
zIG_rcK>kJMgPeoRpTWSufXoLOh|J%CCJ*vIviuEH`Ff@or~*tsQ2ERt%^(bQAT!8^
z$b1bn^%iJ+4>UfgE<@<AX8^}2LVy7r<H&rp5MV|N0cNxiU`7i8X0#AsMhSs>1_oxd
z5MV|N0Tz&BKo}YVENCIXf))ZSXd%FY76Rbf9A=&%s9gb11I%3FVw0cBD@^87h@D)l
zASGtO;N#?E5D%sd<IN#F^T}Hk(k3@ZuuPU#bYL`^9HXerSTMOkQJT?bvW%h>7pQ3i
zN~+8iV8P_cGD^~n8j~%Q?6}wsKoX#~07#0p9+Yw?7fOh6u|t|p3|vW*4=9;&2`+-D
zW2u<zpd`&&49cq@by{Ky5D7+5EP&cVpu`Ol0(l5Tg8~PXkvPH1#X*q)5(ecOkP=u)
z17gF(LE!^c4vH(7Fh~ikGyt(-;?)cc3}EF#;-IJm34<I3Qo=TwLq$(b929||a0U4Z
vBn)eFf!HABAjc?7j!}_flChX<p`^^34a%Az2Xo2TfD|w=Fr1t0pd<kRZL=FQ

diff --git a/pkg/ebpf/bpf_bpfel.o b/pkg/ebpf/bpf_bpfel.o
index 81252eea91e8758f00fa67fa5bed397f718cd129..034b40a641efeae375398cfecd0c53277554a14c 100644
GIT binary patch
literal 10280
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
Gt{(tdILcT6

delta 3127
zcmZ1xu)t%2hIE1g0~|PjSq=>R415gx#TYiO{>!{sfb|D6vwMKg<b_hAlNC65I5#je
zFo5u^&8D2|nHc3JKjpS(l%K51W6pbz6>I>HI0FMi+T^)B(vgx33=Aw#oXrN7<&$Dy
zU|?imU?^n+)BGS&4iLe>z#zcDz)+1OE)5k2nb8c<&khorxLK1|o@sLre-MjEaz<hi
zLwtNrW^!s?aVmpeZel_4WOfk~wh&eZh6>injv`X^A6UV5fwVG6K<!z<$iScl7GYr6
z$H>5N3FN36Mh1{uKzsov1_n(7MzEVed?zLb22~wKuznCfhlznf(t?oz6lx&;P9_Eh
zP8&uB4+e;Nr<fQRMBgwlL@+SagDn6FaK2$+NPsH%&BVaK`h$Vt0F>{@%)r3<hk-$X
z5n@0mGXsMd10zEK5?_RYks$(!50cM7;)CQXp!}W83=Etcj0_Eo^$-K^Gcz!V6fiJM
zfGPm-ISUvVW<dFTEDQ`X4GatmkoZy!3=BJv_#pWcNPLj|1tdO5{ss~sB+pRK1aW{P
z$buFI1`Z^?R0{)x0uo=Qg@M5Ui4T&uK;nbs9gz4S`3xw(goS}YrGtT?0EsWx!N5>o
z0To!t!oa{ffq|g|%HPYvz#ut?fnf#`pLY%e!wM+>GYbO)X9y$12`FEZm4QKW2Lr<m
zBtGvB28IVvJ~TNoL@+}<><>~O!&uLd02L@<Wnhp=U}VTZ;)^CQGF*W2r?4_GaHcRa
zynym|vNABRHZU@P5-@UNWd&u13B)GWdIkm(QY-ZnYds?a11vQYPOXrjyHCZ$S`W&f
zpwtaYjRaFGG%l%_SRwfzWFRrAmHLS_7ZRkP)JsHaC74)mKoch{v3`K^o!A%{Sf?;f
zHdIlbyhlo;-jsoXfr)_$mMIv1FhiKfz!VcWk%O5~VjGxd0_Q$36H0W0X(omMsD3b)
zfq`K;n85_jonR)Em<gttm>C{0P0o^5tM>=H14%QeIsp~BV0Fw4AoqirP+}dJX2x(w
z3sfB49Sfl1pi%<Ngc6g$G;=+;cmT7Zga`uzgCGN>wgd@*syz^$2o{IB4q9!3#6eXS
zhz8YAp!yP>KLP4DkWP^N3M9S&!{m1|a*Q0Cd1V(f)&GFT21q5SqT@hP3F1qj@iox+
z7HE7AG(M={1GyAtKB$~S;@2}&plRqp<Ih0jBYOqpz#VAvC(!tyw25RPJdHsdRL=lU
zgb)D+1`ZGd8rC2SB+&R8XnYGaz6TmV0*#-6%&%u)V5mSAU|?YAK;zFq<F7#D??B_9
zK;z#)<G(=S*Mofc14#hH=YS?ekT8fZfyUQB<6EHdJ<#|OX#5NWUlZKAsz3;U`5kC{
zW-f8D$)?H*ljD?QCm&Xp60>0NadI+<2UCXe<`ACwWLA~r$s43tCTFNPFd9wHRFP-;
z!94ktiky@Ww229-BteM*hAmhoPgD_`d_zS*DjBK-ntWg?7%Vs@H>uijIe-EJ+)xA=
z$O?)##>oq%gt-Es5=mT>xzx<KHVHv=&S0I~r7Fi-3@T|r>U0C3c@)&P0x98RU|;}c
zO{jKoD-tBG$H2hA3DP0>0@PRrTL}_pVBna1QB9l`)S86I|G<zJR2OHhhUpjO05z-`
z7#Ls;dXP<QlS9?D1vQ{D3D9unm>j4sE(KD@?DIdLfq|g`Vk3m?ke}S7s>Yhlz`(!^
Qau{ciJVfH$<W5z20O#*degFUf

diff --git a/pkg/ebpf/tracer.go b/pkg/ebpf/tracer.go
index 5c962bab..6de19838 100644
--- a/pkg/ebpf/tracer.go
+++ b/pkg/ebpf/tracer.go
@@ -15,6 +15,7 @@ import (
 	"github.com/netobserv/netobserv-ebpf-agent/pkg/flow"
 	"github.com/sirupsen/logrus"
 	"github.com/vishvananda/netlink"
+	"golang.org/x/sys/unix"
 )
 
 // $BPF_CLANG and $BPF_CFLAGS are set by the Makefile.
@@ -22,6 +23,8 @@ import (
 
 const (
 	qdiscType = "clsact"
+	// constants defined in flows.c as "volatile const"
+	constSampling = "sampling"
 )
 
 var log = logrus.WithField("component", "ebpf.FlowTracer")
@@ -29,6 +32,7 @@ var log = logrus.WithField("component", "ebpf.FlowTracer")
 // FlowTracer reads and forwards the Flows from the Transmission Control, for a given interface.
 type FlowTracer struct {
 	interfaceName string
+	sampling      uint32
 	objects       bpfObjects
 	qdisc         *netlink.GenericQdisc
 	egressFilter  *netlink.BpfFilter
@@ -37,10 +41,11 @@ type FlowTracer struct {
 }
 
 // NewFlowTracer fo a given interface type
-func NewFlowTracer(iface string) *FlowTracer {
+func NewFlowTracer(iface string, sampling uint32) *FlowTracer {
 	log.WithField("iface", iface).Debug("Instantiating flow tracer")
 	return &FlowTracer{
 		interfaceName: iface,
+		sampling:      sampling,
 	}
 }
 
@@ -53,9 +58,18 @@ func (m *FlowTracer) Register() error {
 	if err := rlimit.RemoveMemlock(); err != nil {
 		return fmt.Errorf("removing mem lock: %w", err)
 	}
-	// Load pre-compiled programs and maps into the kernel.
-	if err := loadBpfObjects(&m.objects, nil); err != nil {
-		return fmt.Errorf("loading objects: %w", err)
+	// Load pre-compiled programs and maps into the kernel, and rewrites the configuration
+	spec, err := loadBpf()
+	if err != nil {
+		return fmt.Errorf("loading BPF data: %w", err)
+	}
+	if err := spec.RewriteConstants(map[string]interface{}{
+		constSampling: m.sampling,
+	}); err != nil {
+		return fmt.Errorf("rewriting BPF constants definition: %w", err)
+	}
+	if err := spec.LoadAndAssign(&m.objects, nil); err != nil {
+		return fmt.Errorf("loading and assigning BPF objects: %w", err)
 	}
 	ipvlan, err := netlink.LinkByName(m.interfaceName)
 	if err != nil {
@@ -110,7 +124,7 @@ func (m *FlowTracer) Register() error {
 		LinkIndex: ipvlan.Attrs().Index,
 		Parent:    netlink.HANDLE_MIN_INGRESS,
 		Handle:    netlink.MakeHandle(0, 1),
-		Protocol:  3,
+		Protocol:  unix.ETH_P_ALL,
 		Priority:  1,
 	}
 	m.ingressFilter = &netlink.BpfFilter{
diff --git a/scripts/generators.Dockerfile b/scripts/generators.Dockerfile
index eb33ce61..7fdcf34c 100644
--- a/scripts/generators.Dockerfile
+++ b/scripts/generators.Dockerfile
@@ -1,6 +1,6 @@
 FROM fedora:35
 
-ARG GOVERSION="1.17.8"
+ARG GOVERSION="1.17.9"
 ARG PROTOCVERSION="3.19.4"
 
 # Installs dependencies that are required to compile eBPF programs
-- 
GitLab