@@ -19,9 +19,11 @@ import (
1919
2020 "github.com/pkg/errors"
2121 "github.com/rs/zerolog"
22+ "go.opentelemetry.io/otel/attribute"
2223 "golang.org/x/net/icmp"
2324
2425 "github.com/cloudflare/cloudflared/packet"
26+ "github.com/cloudflare/cloudflared/tracing"
2527)
2628
2729const (
@@ -98,14 +100,24 @@ func checkInPingGroup() error {
98100}
99101
100102func (ip * icmpProxy ) Request (ctx context.Context , pk * packet.ICMP , responder * packetResponder ) error {
103+ ctx , span := responder .requestSpan (ctx , pk )
104+ defer responder .exportSpan ()
105+
101106 originalEcho , err := getICMPEcho (pk .Message )
102107 if err != nil {
108+ tracing .EndWithErrorStatus (span , err )
103109 return err
104110 }
111+ span .SetAttributes (
112+ attribute .Int ("originalEchoID" , originalEcho .ID ),
113+ attribute .Int ("seq" , originalEcho .Seq ),
114+ )
115+
105116 newConnChan := make (chan * icmp.PacketConn , 1 )
106117 newFunnelFunc := func () (packet.Funnel , error ) {
107118 conn , err := newICMPConn (ip .listenIP , ip .ipv6Zone )
108119 if err != nil {
120+ tracing .EndWithErrorStatus (span , err )
109121 return nil , errors .Wrap (err , "failed to open ICMP socket" )
110122 }
111123 ip .logger .Debug ().Msgf ("Opened ICMP socket listen on %s" , conn .LocalAddr ())
@@ -117,6 +129,8 @@ func (ip *icmpProxy) Request(ctx context.Context, pk *packet.ICMP, responder *pa
117129 if ! ok {
118130 return nil , fmt .Errorf ("ICMP listener address %s is not net.UDPAddr" , conn .LocalAddr ())
119131 }
132+ span .SetAttributes (attribute .Int ("port" , localUDPAddr .Port ))
133+
120134 echoID := localUDPAddr .Port
121135 icmpFlow := newICMPEchoFlow (pk .Src , closeCallback , conn , responder , echoID , originalEcho .ID , packet .NewEncoder ())
122136 return icmpFlow , nil
@@ -128,13 +142,16 @@ func (ip *icmpProxy) Request(ctx context.Context, pk *packet.ICMP, responder *pa
128142 }
129143 funnel , isNew , err := ip .srcFunnelTracker .GetOrRegister (funnelID , newFunnelFunc )
130144 if err != nil {
145+ tracing .EndWithErrorStatus (span , err )
131146 return err
132147 }
133148 icmpFlow , err := toICMPEchoFlow (funnel )
134149 if err != nil {
150+ tracing .EndWithErrorStatus (span , err )
135151 return err
136152 }
137153 if isNew {
154+ span .SetAttributes (attribute .Bool ("newFlow" , true ))
138155 ip .logger .Debug ().
139156 Str ("src" , pk .Src .String ()).
140157 Str ("dst" , pk .Dst .String ()).
@@ -153,8 +170,10 @@ func (ip *icmpProxy) Request(ctx context.Context, pk *packet.ICMP, responder *pa
153170 }()
154171 }
155172 if err := icmpFlow .sendToDst (pk .Dst , pk .Message ); err != nil {
173+ tracing .EndWithErrorStatus (span , err )
156174 return errors .Wrap (err , "failed to send ICMP echo request" )
157175 }
176+ tracing .End (span )
158177 return nil
159178}
160179
0 commit comments