Read and decode a metric segment from in-memory bytes.
(data: &[u8])
| 191 | |
| 192 | /// Read and decode a metric segment from in-memory bytes. |
| 193 | pub fn read_metric_segment_from_bytes(data: &[u8]) -> Result<MetricSegmentData, SegmentReadError> { |
| 194 | let header_end = decode_tseg_header(data)?; |
| 195 | let mut cur = Cursor::new(&data[header_end..]); |
| 196 | |
| 197 | let kind = cur |
| 198 | .read_u8() |
| 199 | .ok_or(SegmentReadError::TooSmall { size: data.len() })?; |
| 200 | if kind != KIND_METRIC { |
| 201 | return Err(SegmentReadError::UnknownKind { kind }); |
| 202 | } |
| 203 | |
| 204 | let _sample_count = cur |
| 205 | .read_u64_le() |
| 206 | .ok_or(SegmentReadError::TooSmall { size: data.len() })?; |
| 207 | let block_len = cur |
| 208 | .read_u32_le() |
| 209 | .ok_or(SegmentReadError::TooSmall { size: data.len() })? as usize; |
| 210 | |
| 211 | let gorilla_block = cur |
| 212 | .read_bytes(block_len) |
| 213 | .ok_or(SegmentReadError::TooSmall { size: data.len() })?; |
| 214 | |
| 215 | let mut decoder = GorillaDecoder::new(gorilla_block); |
| 216 | let samples = decoder.decode_all(); |
| 217 | |
| 218 | Ok(MetricSegmentData { samples }) |
| 219 | } |
| 220 | |
| 221 | /// Read and decode a log segment from disk. |
| 222 | /// |
no test coverage detected