diff --git a/docker-compose.yml b/docker-compose.yml index 1350f7c8..41448801 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -43,6 +43,8 @@ services: tty: true volumes: - ./conf/leaf1.conf:/etc/frr/frr.conf + ports: + - "16686:16686" networks: n1l1tos1: ipv4_address: 10.168.1.5 diff --git a/go.mod b/go.mod index 8f22981b..37bd7563 100644 --- a/go.mod +++ b/go.mod @@ -18,6 +18,7 @@ require ( go.opentelemetry.io/otel v1.19.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 go.opentelemetry.io/otel/sdk v1.19.0 + go.opentelemetry.io/otel/trace v1.19.0 golang.org/x/tools v0.13.0 google.golang.org/grpc v1.58.2 google.golang.org/protobuf v1.31.0 @@ -195,7 +196,6 @@ require ( gitlab.com/bosi/decorder v0.4.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect go.opentelemetry.io/otel/metric v1.19.0 // indirect - go.opentelemetry.io/otel/trace v1.19.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect go.tmz.dev/musttag v0.7.2 // indirect go.uber.org/atomic v1.9.0 // indirect diff --git a/pkg/evpn/evpn.go b/pkg/evpn/evpn.go index 9a42059e..288eddce 100644 --- a/pkg/evpn/evpn.go +++ b/pkg/evpn/evpn.go @@ -10,6 +10,9 @@ import ( "fmt" "log" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/trace" + "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "google.golang.org/protobuf/proto" @@ -35,12 +38,13 @@ type Server struct { Vrfs map[string]*pe.Vrf Pagination map[string]int nLink utils.Netlink + tracer trace.Tracer } // NewServer creates initialized instance of EVPN server func NewServer() *Server { - nLink := utils.NetlinkWrapper{} - return NewServerWithArgs(&nLink) + nLink := utils.NewNetlinkWrapper() + return NewServerWithArgs(nLink) } // NewServerWithArgs creates initialized instance of EVPN server @@ -56,6 +60,7 @@ func NewServerWithArgs(nLink utils.Netlink) *Server { Vrfs: make(map[string]*pe.Vrf), Pagination: make(map[string]int), nLink: nLink, + tracer: otel.Tracer(""), } } diff --git a/pkg/utils/netlink.go b/pkg/utils/netlink.go index 8d5e49dc..3c42e26b 100644 --- a/pkg/utils/netlink.go +++ b/pkg/utils/netlink.go @@ -9,6 +9,10 @@ import ( "net" "github.com/vishvananda/netlink" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" ) // Netlink represents limited subset of functions from netlink package @@ -30,72 +34,105 @@ type Netlink interface { // NetlinkWrapper wrapper for netlink package type NetlinkWrapper struct { + tracer trace.Tracer +} + +// NewNetlinkWrapper creates initialized instance of NetlinkWrapper +func NewNetlinkWrapper() *NetlinkWrapper { + return &NetlinkWrapper{tracer: otel.Tracer("")} } // build time check that struct implements interface var _ Netlink = (*NetlinkWrapper)(nil) // LinkByName is a wrapper for netlink.LinkByName -func (n *NetlinkWrapper) LinkByName(_ context.Context, name string) (netlink.Link, error) { +func (n *NetlinkWrapper) LinkByName(ctx context.Context, name string) (netlink.Link, error) { + _, childSpan := n.tracer.Start(ctx, "netlink.LinkByName") + childSpan.SetAttributes(attribute.String("link.name", name)) + defer childSpan.End() return netlink.LinkByName(name) } // LinkModify is a wrapper for netlink.LinkModify -func (n *NetlinkWrapper) LinkModify(_ context.Context, link netlink.Link) error { +func (n *NetlinkWrapper) LinkModify(ctx context.Context, link netlink.Link) error { + _, childSpan := n.tracer.Start(ctx, "netlink.LinkModify") + defer childSpan.End() return netlink.LinkModify(link) } // LinkSetHardwareAddr is a wrapper for netlink.LinkSetHardwareAddr -func (n *NetlinkWrapper) LinkSetHardwareAddr(_ context.Context, link netlink.Link, hwaddr net.HardwareAddr) error { +func (n *NetlinkWrapper) LinkSetHardwareAddr(ctx context.Context, link netlink.Link, hwaddr net.HardwareAddr) error { + _, childSpan := n.tracer.Start(ctx, "netlink.LinkSetHardwareAddr") + defer childSpan.End() return netlink.LinkSetHardwareAddr(link, hwaddr) } // AddrAdd is a wrapper for netlink.AddrAdd -func (n *NetlinkWrapper) AddrAdd(_ context.Context, link netlink.Link, addr *netlink.Addr) error { +func (n *NetlinkWrapper) AddrAdd(ctx context.Context, link netlink.Link, addr *netlink.Addr) error { + _, childSpan := n.tracer.Start(ctx, "netlink.AddrAdd") + defer childSpan.End() return netlink.AddrAdd(link, addr) } // AddrDel is a wrapper for netlink.AddrDel -func (n *NetlinkWrapper) AddrDel(_ context.Context, link netlink.Link, addr *netlink.Addr) error { +func (n *NetlinkWrapper) AddrDel(ctx context.Context, link netlink.Link, addr *netlink.Addr) error { + _, childSpan := n.tracer.Start(ctx, "netlink.AddrDel") + defer childSpan.End() return netlink.AddrDel(link, addr) } // LinkAdd is a wrapper for netlink.LinkAdd -func (n *NetlinkWrapper) LinkAdd(_ context.Context, link netlink.Link) error { +func (n *NetlinkWrapper) LinkAdd(ctx context.Context, link netlink.Link) error { + _, childSpan := n.tracer.Start(ctx, "netlink.LinkAdd") + defer childSpan.End() return netlink.LinkAdd(link) } // LinkDel is a wrapper for netlink.LinkDel -func (n *NetlinkWrapper) LinkDel(_ context.Context, link netlink.Link) error { +func (n *NetlinkWrapper) LinkDel(ctx context.Context, link netlink.Link) error { + _, childSpan := n.tracer.Start(ctx, "netlink.LinkDel") + defer childSpan.End() return netlink.LinkDel(link) } // LinkSetUp is a wrapper for netlink.LinkSetUp -func (n *NetlinkWrapper) LinkSetUp(_ context.Context, link netlink.Link) error { +func (n *NetlinkWrapper) LinkSetUp(ctx context.Context, link netlink.Link) error { + _, childSpan := n.tracer.Start(ctx, "netlink.LinkSetUp") + defer childSpan.End() return netlink.LinkSetUp(link) } // LinkSetDown is a wrapper for netlink.LinkSetDown -func (n *NetlinkWrapper) LinkSetDown(_ context.Context, link netlink.Link) error { +func (n *NetlinkWrapper) LinkSetDown(ctx context.Context, link netlink.Link) error { + _, childSpan := n.tracer.Start(ctx, "netlink.LinkSetDown") + defer childSpan.End() return netlink.LinkSetDown(link) } // LinkSetMaster is a wrapper for netlink.LinkSetMaster -func (n *NetlinkWrapper) LinkSetMaster(_ context.Context, link, master netlink.Link) error { +func (n *NetlinkWrapper) LinkSetMaster(ctx context.Context, link, master netlink.Link) error { + _, childSpan := n.tracer.Start(ctx, "netlink.LinkSetMaster") + defer childSpan.End() return netlink.LinkSetMaster(link, master) } // LinkSetNoMaster is a wrapper for netlink.LinkSetNoMaster -func (n *NetlinkWrapper) LinkSetNoMaster(_ context.Context, link netlink.Link) error { +func (n *NetlinkWrapper) LinkSetNoMaster(ctx context.Context, link netlink.Link) error { + _, childSpan := n.tracer.Start(ctx, "netlink.LinkSetNoMaster") + defer childSpan.End() return netlink.LinkSetNoMaster(link) } // BridgeVlanAdd is a wrapper for netlink.BridgeVlanAdd -func (n *NetlinkWrapper) BridgeVlanAdd(_ context.Context, link netlink.Link, vid uint16, pvid, untagged, self, master bool) error { +func (n *NetlinkWrapper) BridgeVlanAdd(ctx context.Context, link netlink.Link, vid uint16, pvid, untagged, self, master bool) error { + _, childSpan := n.tracer.Start(ctx, "netlink.BridgeVlanAdd") + defer childSpan.End() return netlink.BridgeVlanAdd(link, vid, pvid, untagged, self, master) } // BridgeVlanDel is a wrapper for netlink.BridgeVlanDel -func (n *NetlinkWrapper) BridgeVlanDel(_ context.Context, link netlink.Link, vid uint16, pvid, untagged, self, master bool) error { +func (n *NetlinkWrapper) BridgeVlanDel(ctx context.Context, link netlink.Link, vid uint16, pvid, untagged, self, master bool) error { + _, childSpan := n.tracer.Start(ctx, "netlink.BridgeVlanDel") + defer childSpan.End() return netlink.BridgeVlanDel(link, vid, pvid, untagged, self, master) }