github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/util/unmarshal/unmarshal.go (about) 1 package unmarshal 2 3 import ( 4 "io" 5 "unsafe" 6 7 jsoniter "github.com/json-iterator/go" 8 9 "github.com/grafana/loki/pkg/loghttp" 10 "github.com/grafana/loki/pkg/logproto" 11 ) 12 13 // DecodePushRequest directly decodes json to a logproto.PushRequest 14 func DecodePushRequest(b io.Reader, r *logproto.PushRequest) error { 15 var request loghttp.PushRequest 16 17 if err := jsoniter.NewDecoder(b).Decode(&request); err != nil { 18 return err 19 } 20 *r = NewPushRequest(request) 21 22 return nil 23 } 24 25 // NewPushRequest constructs a logproto.PushRequest from a PushRequest 26 func NewPushRequest(r loghttp.PushRequest) logproto.PushRequest { 27 ret := logproto.PushRequest{ 28 Streams: make([]logproto.Stream, len(r.Streams)), 29 } 30 31 for i, s := range r.Streams { 32 ret.Streams[i] = NewStream(s) 33 } 34 35 return ret 36 } 37 38 // NewStream constructs a logproto.Stream from a Stream 39 func NewStream(s *loghttp.Stream) logproto.Stream { 40 return logproto.Stream{ 41 Entries: *(*[]logproto.Entry)(unsafe.Pointer(&s.Entries)), 42 Labels: s.Labels.String(), 43 } 44 } 45 46 // WebsocketReader knows how to read message to a websocket connection. 47 type WebsocketReader interface { 48 ReadMessage() (int, []byte, error) 49 } 50 51 // ReadTailResponseJSON unmarshals the loghttp.TailResponse from a websocket reader. 52 func ReadTailResponseJSON(r *loghttp.TailResponse, reader WebsocketReader) error { 53 _, data, err := reader.ReadMessage() 54 if err != nil { 55 return err 56 } 57 return jsoniter.Unmarshal(data, r) 58 }