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  }