MCPcopy Create free account
hub / github.com/cortexproject/cortex / decodeOTLPWriteRequest

Function decodeOTLPWriteRequest

pkg/util/push/otlp.go:125–182  ·  view source on GitHub ↗
(ctx context.Context, r *http.Request, maxSize int)

Source from the content-addressed store, hash-verified

123}
124
125func decodeOTLPWriteRequest(ctx context.Context, r *http.Request, maxSize int) (pmetricotlp.ExportRequest, error) {
126 expectedSize := int(r.ContentLength)
127 if expectedSize > maxSize {
128 return pmetricotlp.NewExportRequest(), fmt.Errorf("received message larger than max (%d vs %d)", expectedSize, maxSize)
129 }
130
131 contentType := r.Header.Get("Content-Type")
132 contentEncoding := r.Header.Get("Content-Encoding")
133
134 var compressionType util.CompressionType
135 switch contentEncoding {
136 case "gzip":
137 compressionType = util.Gzip
138 case "":
139 compressionType = util.NoCompression
140 default:
141 return pmetricotlp.NewExportRequest(), fmt.Errorf("unsupported compression: %s, Supported compression types are \"gzip\" or '' (no compression)", contentEncoding)
142 }
143
144 var decoderFunc func(reader io.Reader) (pmetricotlp.ExportRequest, error)
145 switch contentType {
146 case pbContentType:
147 decoderFunc = func(reader io.Reader) (pmetricotlp.ExportRequest, error) {
148 req := pmetricotlp.NewExportRequest()
149 otlpReqProto := otlpProtoMessage{req: &req}
150 return req, util.ParseProtoReader(ctx, reader, expectedSize, maxSize, otlpReqProto, compressionType)
151 }
152 case jsonContentType:
153 decoderFunc = func(reader io.Reader) (pmetricotlp.ExportRequest, error) {
154 req := pmetricotlp.NewExportRequest()
155
156 reader = io.LimitReader(reader, int64(maxSize)+1)
157 if compressionType == util.Gzip {
158 var err error
159 reader, err = gzip.NewReader(reader)
160 if err != nil {
161 return req, err
162 }
163 reader = io.LimitReader(reader, int64(maxSize)+1)
164 }
165
166 var buf bytes.Buffer
167 if expectedSize > 0 {
168 buf.Grow(expectedSize + bytes.MinRead) // extra space guarantees no reallocation
169 }
170 _, err := buf.ReadFrom(reader)
171 if err != nil {
172 return req, err
173 }
174
175 return req, req.UnmarshalJSON(buf.Bytes())
176 }
177 default:
178 return pmetricotlp.NewExportRequest(), fmt.Errorf("unsupported content type: %s, supported: [%s, %s]", contentType, jsonContentType, pbContentType)
179 }
180
181 return decoderFunc(r.Body)
182}

Callers 1

OTLPHandlerFunction · 0.85

Calls 4

BytesMethod · 0.95
ParseProtoReaderFunction · 0.92
GetMethod · 0.65
UnmarshalJSONMethod · 0.45

Tested by

no test coverage detected