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  }