Expose RPC reconnections and ping time (#20157)

- Keeps track of reconnection count.
- Keeps track of connection ping roundtrip times. 
  Sends timestamp in ping message.
- Allow ping without payload.
This commit is contained in:
Klaus Post
2024-07-25 14:07:21 -07:00
committed by GitHub
parent 4a1edfd9aa
commit 15b609ecea
6 changed files with 307 additions and 20 deletions

View File

@@ -787,6 +787,109 @@ func (z muxConnectError) Msgsize() (s int) {
return
}
// DecodeMsg implements msgp.Decodable
func (z *pingMsg) DecodeMsg(dc *msgp.Reader) (err error) {
var field []byte
_ = field
var zb0001 uint32
zb0001, err = dc.ReadMapHeader()
if err != nil {
err = msgp.WrapError(err)
return
}
for zb0001 > 0 {
zb0001--
field, err = dc.ReadMapKeyPtr()
if err != nil {
err = msgp.WrapError(err)
return
}
switch msgp.UnsafeString(field) {
case "t":
z.T, err = dc.ReadTime()
if err != nil {
err = msgp.WrapError(err, "T")
return
}
default:
err = dc.Skip()
if err != nil {
err = msgp.WrapError(err)
return
}
}
}
return
}
// EncodeMsg implements msgp.Encodable
func (z pingMsg) EncodeMsg(en *msgp.Writer) (err error) {
// map header, size 1
// write "t"
err = en.Append(0x81, 0xa1, 0x74)
if err != nil {
return
}
err = en.WriteTime(z.T)
if err != nil {
err = msgp.WrapError(err, "T")
return
}
return
}
// MarshalMsg implements msgp.Marshaler
func (z pingMsg) MarshalMsg(b []byte) (o []byte, err error) {
o = msgp.Require(b, z.Msgsize())
// map header, size 1
// string "t"
o = append(o, 0x81, 0xa1, 0x74)
o = msgp.AppendTime(o, z.T)
return
}
// UnmarshalMsg implements msgp.Unmarshaler
func (z *pingMsg) UnmarshalMsg(bts []byte) (o []byte, err error) {
var field []byte
_ = field
var zb0001 uint32
zb0001, bts, err = msgp.ReadMapHeaderBytes(bts)
if err != nil {
err = msgp.WrapError(err)
return
}
for zb0001 > 0 {
zb0001--
field, bts, err = msgp.ReadMapKeyZC(bts)
if err != nil {
err = msgp.WrapError(err)
return
}
switch msgp.UnsafeString(field) {
case "t":
z.T, bts, err = msgp.ReadTimeBytes(bts)
if err != nil {
err = msgp.WrapError(err, "T")
return
}
default:
bts, err = msgp.Skip(bts)
if err != nil {
err = msgp.WrapError(err)
return
}
}
}
o = bts
return
}
// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message
func (z pingMsg) Msgsize() (s int) {
s = 1 + 2 + msgp.TimeSize
return
}
// DecodeMsg implements msgp.Decodable
func (z *pongMsg) DecodeMsg(dc *msgp.Reader) (err error) {
var field []byte
@@ -829,6 +932,12 @@ func (z *pongMsg) DecodeMsg(dc *msgp.Reader) (err error) {
return
}
}
case "t":
z.T, err = dc.ReadTime()
if err != nil {
err = msgp.WrapError(err, "T")
return
}
default:
err = dc.Skip()
if err != nil {
@@ -842,9 +951,9 @@ func (z *pongMsg) DecodeMsg(dc *msgp.Reader) (err error) {
// EncodeMsg implements msgp.Encodable
func (z *pongMsg) EncodeMsg(en *msgp.Writer) (err error) {
// map header, size 2
// map header, size 3
// write "nf"
err = en.Append(0x82, 0xa2, 0x6e, 0x66)
err = en.Append(0x83, 0xa2, 0x6e, 0x66)
if err != nil {
return
}
@@ -870,15 +979,25 @@ func (z *pongMsg) EncodeMsg(en *msgp.Writer) (err error) {
return
}
}
// write "t"
err = en.Append(0xa1, 0x74)
if err != nil {
return
}
err = en.WriteTime(z.T)
if err != nil {
err = msgp.WrapError(err, "T")
return
}
return
}
// MarshalMsg implements msgp.Marshaler
func (z *pongMsg) MarshalMsg(b []byte) (o []byte, err error) {
o = msgp.Require(b, z.Msgsize())
// map header, size 2
// map header, size 3
// string "nf"
o = append(o, 0x82, 0xa2, 0x6e, 0x66)
o = append(o, 0x83, 0xa2, 0x6e, 0x66)
o = msgp.AppendBool(o, z.NotFound)
// string "e"
o = append(o, 0xa1, 0x65)
@@ -887,6 +1006,9 @@ func (z *pongMsg) MarshalMsg(b []byte) (o []byte, err error) {
} else {
o = msgp.AppendString(o, *z.Err)
}
// string "t"
o = append(o, 0xa1, 0x74)
o = msgp.AppendTime(o, z.T)
return
}
@@ -931,6 +1053,12 @@ func (z *pongMsg) UnmarshalMsg(bts []byte) (o []byte, err error) {
return
}
}
case "t":
z.T, bts, err = msgp.ReadTimeBytes(bts)
if err != nil {
err = msgp.WrapError(err, "T")
return
}
default:
bts, err = msgp.Skip(bts)
if err != nil {
@@ -951,5 +1079,6 @@ func (z *pongMsg) Msgsize() (s int) {
} else {
s += msgp.StringPrefixSize + len(*z.Err)
}
s += 2 + msgp.TimeSize
return
}