|
1 | 1 | use crate::{models::Envelope, Error, HttpClient}; |
2 | 2 | use bytes::Bytes; |
3 | | -use flate2::write::GzEncoder; |
4 | | -use flate2::Compression; |
| 3 | +use flate2::{write::GzEncoder, Compression}; |
5 | 4 | use http::{Request, Response, Uri}; |
6 | 5 | use serde::Deserialize; |
7 | 6 | #[cfg(feature = "metrics")] |
8 | 7 | use std::io::Read; |
| 8 | +use std::io::Write; |
9 | 9 |
|
10 | 10 | const STATUS_OK: u16 = 200; |
11 | 11 | const STATUS_PARTIAL_CONTENT: u16 = 206; |
@@ -84,8 +84,16 @@ pub(crate) fn send_sync(endpoint: &Uri, items: Vec<Envelope>) -> Result<(), Erro |
84 | 84 | } |
85 | 85 |
|
86 | 86 | fn serialize_request_body(items: Vec<Envelope>) -> Result<Vec<u8>, Error> { |
| 87 | + // Weirdly gzip_encoder.write_all(serde_json::to_vec()) seems to be faster than |
| 88 | + // serde_json::to_writer(gzip_encoder). In a local test operating on items that result in |
| 89 | + // ~13MiB of JSON, this is what I've seen: |
| 90 | + // gzip_encoder.write_all(serde_json::to_vec()): 159ms |
| 91 | + // serde_json::to_writer(gzip_encoder): 247ms |
| 92 | + let serialized = serde_json::to_vec(&items).map_err(Error::UploadSerializeRequest)?; |
87 | 93 | let mut gzip_encoder = GzEncoder::new(Vec::new(), Compression::default()); |
88 | | - serde_json::to_writer(&mut gzip_encoder, &items).map_err(Error::UploadSerializeRequest)?; |
| 94 | + gzip_encoder |
| 95 | + .write_all(&serialized) |
| 96 | + .map_err(Error::UploadCompressRequest)?; |
89 | 97 | gzip_encoder.finish().map_err(Error::UploadCompressRequest) |
90 | 98 | } |
91 | 99 |
|
|
0 commit comments