github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/catgo/cat-go/message/encoder_binary.go (about) 1 package message 2 3 import ( 4 "bytes" 5 "time" 6 ) 7 8 const ( 9 defaultThreadGroupName = "" 10 defaultThreadId = "0" 11 defaultThreadName = "" 12 ) 13 14 type BinaryEncoder struct { 15 encoderBase 16 } 17 18 func NewBinaryEncoder() *BinaryEncoder { 19 return &BinaryEncoder{} 20 } 21 22 func writeI64(buf *bytes.Buffer, i int64) (err error) { 23 for { 24 if i&^0x7F == 0 { 25 if err = buf.WriteByte(byte(i)); err != nil { 26 return 27 } 28 return 29 } else { 30 if err = buf.WriteByte(byte(i&0x7F | 0x80)); err != nil { 31 return 32 } 33 i >>= 7 34 } 35 } 36 } 37 38 func writeString(buf *bytes.Buffer, s string) (err error) { 39 if err = writeI64(buf, int64(len(s))); err != nil { 40 return 41 } 42 if _, err = buf.WriteString(s); err != nil { 43 return 44 } 45 return 46 } 47 48 func encodeMessageStart(buf *bytes.Buffer, m Messager) (err error) { 49 var timestamp = m.GetTime().UnixNano() / time.Millisecond.Nanoseconds() 50 if err = writeI64(buf, timestamp); err != nil { 51 return 52 } 53 if err = writeString(buf, m.GetType()); err != nil { 54 return 55 } 56 if err = writeString(buf, m.GetName()); err != nil { 57 return 58 } 59 return 60 } 61 62 func encodeMessageEnd(buf *bytes.Buffer, m Messager) (err error) { 63 if err = writeString(buf, m.GetStatus()); err != nil { 64 return 65 } 66 67 if m.GetData() == nil { 68 if err = writeI64(buf, 0); err != nil { 69 return 70 } 71 } else { 72 if err = writeI64(buf, int64(m.GetData().Len())); err != nil { 73 return 74 } 75 if _, err = buf.Write(m.GetData().Bytes()); err != nil { 76 return 77 } 78 } 79 return 80 } 81 82 func encodeMessageWithLeader(buf *bytes.Buffer, m *Message, leader rune) (err error) { 83 if _, err = buf.WriteRune(leader); err != nil { 84 return 85 } 86 if err = encodeMessageStart(buf, m); err != nil { 87 return 88 } 89 if err = encodeMessageEnd(buf, m); err != nil { 90 return 91 } 92 return 93 } 94 95 func (e *BinaryEncoder) EncodeMessage(buf *bytes.Buffer, message Messager) (err error) { 96 return encodeMessage(e, buf, message) 97 } 98 99 func (e *BinaryEncoder) EncodeTransaction(buf *bytes.Buffer, trans *Transaction) (err error) { 100 if _, err = buf.WriteRune('t'); err != nil { 101 return 102 } 103 if err = encodeMessageStart(buf, trans); err != nil { 104 return 105 } 106 107 for _, message := range trans.GetChildren() { 108 if err = e.EncodeMessage(buf, message); err != nil { 109 return 110 } 111 } 112 113 if _, err = buf.WriteRune('T'); err != nil { 114 return 115 } 116 if err = encodeMessageEnd(buf, trans); err != nil { 117 return 118 } 119 120 duration := trans.GetDuration().Nanoseconds() / time.Microsecond.Nanoseconds() 121 if err = writeI64(buf, duration); err != nil { 122 return 123 } 124 return 125 } 126 127 func (e *BinaryEncoder) EncodeEvent(buf *bytes.Buffer, m *Event) (err error) { 128 return encodeMessageWithLeader(buf, &m.Message, 'E') 129 } 130 131 func (e *BinaryEncoder) EncodeHeartbeat(buf *bytes.Buffer, m *Heartbeat) (err error) { 132 return encodeMessageWithLeader(buf, &m.Message, 'H') 133 } 134 135 func (e *BinaryEncoder) EncodeMetric(buf *bytes.Buffer, m *Metric) (err error) { 136 return encodeMessageWithLeader(buf, &m.Message, 'M') 137 }