Make the request body buffer a per-domain setting

ai-proxy's log_payloads and log_statistics produced nothing on the AI
gateway despite being enabled. The cause was not the plugin's own
max_request_body_size but nginx's client_body_buffer_size, left at its 8k
default: past it the body goes to a temp file, and
kong.request.get_raw_body() returns nil for a body on disk, so any plugin
reading the body silently stops working. Prompts on that gateway run to 30
KB. Measured, not guessed — request.size was 30369 on the last call.

Expose it as ${CLIENT_BODY_BUFFER_SIZE} with the 8k default every domain
keeps, rather than raising it globally. The buffer is allocated per
connection carrying a body, so a value that is free on a gateway seeing 18
requests a day is not free on one serving real traffic.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Stéphane Tailland
2026-08-27 16:41:33 +02:00
parent 11d27c2655
commit 86d56dc4ea
3 changed files with 18 additions and 0 deletions
@@ -35,6 +35,18 @@ spec:
value: "256k"
- name: KONG_NGINX_HTTP_LARGE_CLIENT_HEADER_BUFFERS
value: "4 32k"
# How much of a request body nginx keeps in memory. Past it the body
# goes to a temp file, and kong.request.get_raw_body() returns nil for
# a body on disk — so any plugin that reads the body silently stops
# working. That is what kept ai-proxy's log_payloads and log_statistics
# empty on the AI gateway, whose prompts run to 30 KB against this 8k
# default.
#
# Per domain, not global: the buffer is allocated per connection carrying
# a body, so a value that is free on a gateway seeing 18 requests a day
# is not free on one serving real traffic.
- name: KONG_NGINX_HTTP_CLIENT_BODY_BUFFER_SIZE
value: "${CLIENT_BODY_BUFFER_SIZE}"
konnect:
authRef:
name: ${NAME}
@@ -18,6 +18,9 @@ data:
CORS_ORIGINS: https://*.sttlab.local
RATE_LIMIT_MINUTE: "300"
REQUEST_MAX_BODY_SIZE: "10" # MB
# nginx default. Domains that need to introspect larger bodies raise it
# in their own Kustomization; see the AI gateway.
CLIENT_BODY_BUFFER_SIZE: 8k
# Tempo (OTLP-native), ns observability, cluster-wide — shared by every
# domain, not domain-specific. Replaced Jaeger on 2026-08-25: Tempo is the
# trace backend of the infra-observability stack, so its span metrics feed
@@ -21,6 +21,9 @@ data:
CORS_ORIGINS: https://*.sttlab.local
RATE_LIMIT_MINUTE: "300"
REQUEST_MAX_BODY_SIZE: "10" # MB
# nginx default. Domains that need to introspect larger bodies raise it
# in their own Kustomization; see the AI gateway.
CLIENT_BODY_BUFFER_SIZE: 8k
# Tempo (OTLP-native), ns observability, cluster-wide — shared by every
# domain, not domain-specific. Replaced Jaeger on 2026-08-25: Tempo is the
# trace backend of the infra-observability stack, so its span metrics feed