|
5 | 5 | "compress/gzip" |
6 | 6 | "fmt" |
7 | 7 | "io" |
8 | | - "math" |
9 | 8 | "mime" |
10 | 9 | "net/http" |
11 | 10 | "strconv" |
@@ -69,7 +68,10 @@ const ( |
69 | 68 | AggregatedMetricLabel = "__aggregated_metric__" |
70 | 69 | ) |
71 | 70 |
|
72 | | -var ErrAllLogsFiltered = errors.New("all logs lines filtered during parsing") |
| 71 | +var ( |
| 72 | + ErrAllLogsFiltered = errors.New("all logs lines filtered during parsing") |
| 73 | + ErrRequestBodyTooLarge = errors.New("request body too large") |
| 74 | +) |
73 | 75 |
|
74 | 76 | type TenantsRetention interface { |
75 | 77 | RetentionPeriodFor(userID string, lbs labels.Labels) time.Duration |
@@ -103,7 +105,7 @@ type StreamResolver interface { |
103 | 105 | } |
104 | 106 |
|
105 | 107 | type ( |
106 | | - RequestParser func(userID string, r *http.Request, limits Limits, tracker UsageTracker, streamResolver StreamResolver, logPushRequestStreams bool, logger log.Logger) (*logproto.PushRequest, *Stats, error) |
| 108 | + RequestParser func(userID string, r *http.Request, limits Limits, maxRecvMsgSize int, tracker UsageTracker, streamResolver StreamResolver, logPushRequestStreams bool, logger log.Logger) (*logproto.PushRequest, *Stats, error) |
107 | 109 | RequestParserWrapper func(inner RequestParser) RequestParser |
108 | 110 | ErrorWriter func(w http.ResponseWriter, errorStr string, code int, logger log.Logger) |
109 | 111 | ) |
@@ -137,9 +139,12 @@ type Stats struct { |
137 | 139 | IsAggregatedMetric bool |
138 | 140 | } |
139 | 141 |
|
140 | | -func ParseRequest(logger log.Logger, userID string, r *http.Request, limits Limits, pushRequestParser RequestParser, tracker UsageTracker, streamResolver StreamResolver, logPushRequestStreams bool) (*logproto.PushRequest, error) { |
141 | | - req, pushStats, err := pushRequestParser(userID, r, limits, tracker, streamResolver, logPushRequestStreams, logger) |
| 142 | +func ParseRequest(logger log.Logger, userID string, maxRecvMsgSize int, r *http.Request, limits Limits, pushRequestParser RequestParser, tracker UsageTracker, streamResolver StreamResolver, logPushRequestStreams bool) (*logproto.PushRequest, error) { |
| 143 | + req, pushStats, err := pushRequestParser(userID, r, limits, maxRecvMsgSize, tracker, streamResolver, logPushRequestStreams, logger) |
142 | 144 | if err != nil && !errors.Is(err, ErrAllLogsFiltered) { |
| 145 | + if errors.Is(err, loki_util.ErrMessageSizeTooLarge) { |
| 146 | + return nil, fmt.Errorf("%w: %s", ErrRequestBodyTooLarge, err.Error()) |
| 147 | + } |
143 | 148 | return nil, err |
144 | 149 | } |
145 | 150 |
|
@@ -203,7 +208,7 @@ func ParseRequest(logger log.Logger, userID string, r *http.Request, limits Limi |
203 | 208 | return req, err |
204 | 209 | } |
205 | 210 |
|
206 | | -func ParseLokiRequest(userID string, r *http.Request, limits Limits, tracker UsageTracker, streamResolver StreamResolver, logPushRequestStreams bool, logger log.Logger) (*logproto.PushRequest, *Stats, error) { |
| 211 | +func ParseLokiRequest(userID string, r *http.Request, limits Limits, maxRecvMsgSize int, tracker UsageTracker, streamResolver StreamResolver, logPushRequestStreams bool, logger log.Logger) (*logproto.PushRequest, *Stats, error) { |
207 | 212 | // Body |
208 | 213 | var body io.Reader |
209 | 214 | // bodySize should always reflect the compressed size of the request body |
@@ -263,7 +268,7 @@ func ParseLokiRequest(userID string, r *http.Request, limits Limits, tracker Usa |
263 | 268 | default: |
264 | 269 | // When no content-type header is set or when it is set to |
265 | 270 | // `application/x-protobuf`: expect snappy compression. |
266 | | - if err := util.ParseProtoReader(r.Context(), body, int(r.ContentLength), math.MaxInt32, &req, util.RawSnappy); err != nil { |
| 271 | + if err := util.ParseProtoReader(r.Context(), body, int(r.ContentLength), maxRecvMsgSize, &req, util.RawSnappy); err != nil { |
267 | 272 | return nil, nil, err |
268 | 273 | } |
269 | 274 | } |
|
0 commit comments