in log_store.go [366:457]
func (s *LogStore) PostLogStoreLogs(req *PostLogStoreLogsRequest) (err error) {
if err = s.SetPutLogCompressType(req.CompressType); err != nil {
return err
}
if req.LogGroup == nil || len(req.LogGroup.Logs) == 0 {
// empty log group or empty hashkey
return nil
}
if s.useMetricStoreURL {
return s.PutLogs(req.LogGroup)
}
body, err := proto.Marshal(req.LogGroup)
if err != nil {
return NewClientError(err)
}
var out []byte
var h map[string]string
var outLen int
switch s.putLogCompressType {
case Compress_LZ4:
// Compresse body with lz4
out = make([]byte, lz4.CompressBlockBound(len(body)))
var hashTable [1 << 16]int
n, err := lz4.CompressBlock(body, out, hashTable[:])
if err != nil {
return NewClientError(err)
}
// copy incompressible data as lz4 format
if n == 0 {
n, _ = copyIncompressible(body, out)
}
h = map[string]string{
"x-log-compresstype": "lz4",
"x-log-bodyrawsize": strconv.Itoa(len(body)),
"Content-Type": "application/x-protobuf",
}
outLen = n
case Compress_ZSTD:
// Compress body with zstd
out, _ = slsZstdCompressor.Compress(body, nil)
h = map[string]string{
"x-log-compresstype": "zstd",
"x-log-bodyrawsize": strconv.Itoa(len(body)),
"Content-Type": "application/x-protobuf",
}
outLen = len(out)
case Compress_None:
// no compress
out = body
h = map[string]string{
"x-log-bodyrawsize": strconv.Itoa(len(body)),
"Content-Type": "application/x-protobuf",
}
outLen = len(out)
}
var uri = fmt.Sprintf("/logstores/%s", s.Name)
var params = url.Values{}
if req.HashKey != nil && *req.HashKey != "" {
params.Set("key", *req.HashKey)
uri = fmt.Sprintf("/logstores/%s/shards/route", s.Name)
}
if req.Processor != "" {
params.Set("processor", req.Processor)
}
if len(params) > 0 {
uri = fmt.Sprintf("%s?%s", uri, params.Encode())
}
r, err := request(s.project, "POST", uri, h, out[:outLen])
if err != nil {
return NewClientError(err)
}
defer r.Body.Close()
buf, err := ioutil.ReadAll(r.Body)
if err != nil {
return readResponseError(err)
}
if r.StatusCode != http.StatusOK {
err := new(Error)
if jErr := json.Unmarshal(buf, err); jErr != nil {
return NewBadResponseError(string(buf), r.Header, r.StatusCode)
}
return err
}
return nil
}