Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
ae426ee
fix(gateway): async healthcheck handler + explicit readiness probe ti…
lorenzo-norcini-scale Aug 14, 2026
5b083f4
fix(chart): stop retrying 503 at the gateway VirtualService; make ret…
lorenzo-norcini-scale Aug 14, 2026
f6f90c6
fix(chart): add istio-proxy CPU request on gateway pods
lorenzo-norcini-scale Aug 14, 2026
e5d11a2
[MLI-8206] Set an explicit, configurable timeout on the sync forwarder
lorenzo-norcini-scale Aug 13, 2026
7d7b40f
Validate timeout_seconds at forwarder load time
lorenzo-norcini-scale Aug 13, 2026
e4cf62e
fix(gateway): run async-task polls on a dedicated thread limiter
lorenzo-norcini-scale Aug 14, 2026
87d5140
fix(db): build SQLAlchemy engines lazily, one per session kind on fir…
lorenzo-norcini-scale Aug 14, 2026
e604287
feat(chart): per-pod local_ratelimit on gateway sidecars + named-tena…
lorenzo-norcini-scale Aug 14, 2026
2dde946
feat(gateway): per-user request rate limiting at authentication, fail…
lorenzo-norcini-scale Aug 14, 2026
198ef97
docs: add async-task polling guidance (backoff + jitter, bounded outs…
lorenzo-norcini-scale Aug 14, 2026
09372cc
refactor: review cleanups on incident-hardening branch
lorenzo-norcini-scale Aug 14, 2026
962ce90
fix(gateway): atomic rate-limit counter TTL; sample log-only warnings
lorenzo-norcini-scale Aug 14, 2026
62bd717
fix(chart+gateway): Envoy 1.23 compatibility, Redis brownout breaker,…
lorenzo-norcini-scale Aug 14, 2026
45c722d
fix(chart): match rate limiter workload port
lorenzo-norcini-scale Aug 17, 2026
53d4a07
fix(gateway): address forwarding and DB review findings
lorenzo-norcini-scale Aug 17, 2026
782fb2a
fix(db): await async engine disposal
lorenzo-norcini-scale Aug 17, 2026
b424fb4
fix(chart): inbound vhost is named by Service port, verified on Istio…
lorenzo-norcini-scale Aug 17, 2026
9d22158
fix(chart): apply rate-limit actions at HTTP_ROUTE, not VIRTUAL_HOST
lorenzo-norcini-scale Aug 17, 2026
b3b2f27
test: cover limiter breaker/sampling/client-cache, task bulkhead, DB …
lorenzo-norcini-scale Aug 17, 2026
0d2b742
fix(db): dispose expired async engines safely when a loop is already …
lorenzo-norcini-scale Aug 18, 2026
4c3ae9e
fix(chart): case-insensitive auth-scheme match in tenant clamp
lorenzo-norcini-scale Aug 18, 2026
d65d0f2
chore(chart): regenerate istio attribute-match conditions from the li…
lorenzo-norcini-scale Aug 18, 2026
16dd846
fix(chart): resize route buckets against hardened-build capacity
lorenzo-norcini-scale Aug 18, 2026
9564b6c
fix(chart): size the poll bucket for bytes, not just requests
lorenzo-norcini-scale Aug 18, 2026
5397d14
feat(gateway): per-tenant rate-limit decision metric
lorenzo-norcini-scale Aug 18, 2026
1d6c24f
fix(gateway): enforce Celery forwarding deadline
lorenzo-norcini-scale Aug 18, 2026
0fbbd65
revert(db): remove lazy engine changes
lorenzo-norcini-scale Aug 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
178 changes: 98 additions & 80 deletions charts/model-engine/templates/_istio-attribute-match-conditions.tpl
Original file line number Diff line number Diff line change
@@ -1,117 +1,135 @@
{{- /* Generated from the OpenAPI schema with model-engine-internal/scripts/generate_istio_metric_tags.py */}}
{{- define "modelEngine.istioAttributeMatchConditions" -}}
- condition: request.method == 'GET' && request.url_path == '/healthcheck'
value: get_/healthcheck
- condition: request.method == 'GET' && request.url_path == '/healthz'
value: get_/healthz
- condition: request.method == 'GET' && request.url_path == '/readyz'
value: get_/readyz
- condition: request.method == 'POST' && request.url_path == '/v1/async-tasks'
value: post_/v1/async-tasks
- condition: request.method == 'GET' && request.url_path.matches('^/v1/async-tasks/[[:alnum:]-_]*$')
value: get_/v1/async-tasks/_task_id
- condition: request.method == 'POST' && request.url_path == '/v1/batch-jobs'
value: post_/v1/batch-jobs
- condition: request.method == 'GET' && request.url_path.matches('^/v1/batch-jobs/[[:alnum:]-_]*$')
value: get_/v1/batch-jobs/_batch_job_id
- condition: request.method == 'PUT' && request.url_path.matches('^/v1/batch-jobs/[[:alnum:]-_]*$')
value: put_/v1/batch-jobs/_batch_job_id
- condition: request.method == 'GET' && request.url_path == '/v1/docker-image-batch-job-bundles'
value: get_/v1/docker-image-batch-job-bundles
- condition: request.method == 'POST' && request.url_path == '/v1/docker-image-batch-job-bundles'
value: post_/v1/docker-image-batch-job-bundles
- condition: request.method == 'GET' && request.url_path == '/v1/docker-image-batch-job-bundles/latest'
value: get_/v1/docker-image-batch-job-bundles/latest
- condition: request.method == 'GET' && request.url_path.matches('^/v1/docker-image-batch-job-bundles/[[:alnum:]-_]*$')
value: get_/v1/docker-image-batch-job-bundles/_docker_image_batch_job_bundle_id
- condition: request.method == 'GET' && request.url_path == '/v1/docker-image-batch-jobs'
value: get_/v1/docker-image-batch-jobs
- condition: request.method == 'POST' && request.url_path == '/v1/docker-image-batch-jobs'
value: post_/v1/docker-image-batch-jobs
- condition: request.method == 'GET' && request.url_path == '/v1/docker-image-batch-jobs'
value: get_/v1/docker-image-batch-jobs
- condition: request.method == 'GET' && request.url_path.matches('^/v1/docker-image-batch-jobs/[[:alnum:]-_]*$')
value: get_/v1/docker-image-batch-jobs/_batch_job_id
- condition: request.method == 'PUT' && request.url_path.matches('^/v1/docker-image-batch-jobs/[[:alnum:]-_]*$')
value: put_/v1/docker-image-batch-jobs/_batch_job_id
- condition: request.method == 'GET' && request.url_path == '/v1/files'
value: get_/v1/files
- condition: request.method == 'POST' && request.url_path == '/v1/files'
value: post_/v1/files
- condition: request.method == 'DELETE' && request.url_path.matches('^/v1/files/[[:alnum:]-_]*$')
value: delete_/v1/files/_file_id
- condition: request.method == 'GET' && request.url_path.matches('^/v1/files/[[:alnum:]-_]*$')
value: get_/v1/files/_file_id
- condition: request.method == 'GET' && request.url_path.matches('^/v1/files/[[:alnum:]-_]*/content$')
value: get_/v1/files/_file_id/content
- condition: request.method == 'POST' && request.url_path == '/v1/llm/completions-stream'
value: post_/v1/llm/completions-stream
- condition: request.method == 'POST' && request.url_path == '/v1/llm/completions-sync'
value: post_/v1/llm/completions-sync
- condition: request.method == 'GET' && request.url_path == '/v1/llm/fine-tunes'
value: get_/v1/llm/fine-tunes
- condition: request.method == 'POST' && request.url_path == '/v1/llm/fine-tunes'
value: post_/v1/llm/fine-tunes
- condition: request.method == 'GET' && request.url_path.matches('^/v1/llm/fine-tunes/[[:alnum:]-_]*$')
value: get_/v1/llm/fine-tunes/_fine_tune_id
- condition: request.method == 'PUT' && request.url_path.matches('^/v1/llm/fine-tunes/[[:alnum:]-_]*/cancel$')
value: put_/v1/llm/fine-tunes/_fine_tune_id/cancel
- condition: request.method == 'GET' && request.url_path.matches('^/v1/llm/fine-tunes/[[:alnum:]-_]*/events$')
value: get_/v1/llm/fine-tunes/_fine_tune_id/events
- condition: request.method == 'GET' && request.url_path == '/v1/llm/model-endpoints'
value: get_/v1/llm/model-endpoints
- condition: request.method == 'POST' && request.url_path == '/v1/llm/model-endpoints'
value: post_/v1/llm/model-endpoints
- condition: request.method == 'POST' && request.url_path == '/v1/llm/model-endpoints/download'
value: post_/v1/llm/model-endpoints/download
- condition: request.method == 'DELETE' && request.url_path.matches('^/v1/llm/model-endpoints/[[:alnum:]-_]*$')
value: delete_/v1/llm/model-endpoints/_model_endpoint_name
- condition: request.method == 'GET' && request.url_path.matches('^/v1/llm/model-endpoints/[[:alnum:]-_]*$')
value: get_/v1/llm/model-endpoints/_model_endpoint_name
- condition: request.method == 'GET' && request.url_path == '/v1/model-bundles'
value: get_/v1/model-bundles
- condition: request.method == 'POST' && request.url_path == '/v1/async-tasks'
value: post_/v1/async-tasks
- condition: request.method == 'GET' && request.url_path.matches('^/v1/async-tasks/[[:alnum:]-_]*$')
value: get_/v1/async-tasks/_task_id
- condition: request.method == 'POST' && request.url_path == '/v1/sync-tasks'
value: post_/v1/sync-tasks
- condition: request.method == 'POST' && request.url_path == '/v1/streaming-tasks'
value: post_/v1/streaming-tasks
- condition: request.method == 'POST' && request.url_path == '/v1/model-bundles'
value: post_/v1/model-bundles
- condition: request.method == 'GET' && request.url_path == '/v1/model-bundles'
value: get_/v1/model-bundles
- condition: request.method == 'POST' && request.url_path == '/v1/model-bundles/clone-with-changes'
value: post_/v1/model-bundles/clone-with-changes
- condition: request.method == 'GET' && request.url_path == '/v1/model-bundles/latest'
value: get_/v1/model-bundles/latest
- condition: request.method == 'GET' && request.url_path.matches('^/v1/model-bundles/[[:alnum:]-_]*$')
value: get_/v1/model-bundles/_model_bundle_id
- condition: request.method == 'GET' && request.url_path == '/v1/model-endpoints'
value: get_/v1/model-endpoints
- condition: request.method == 'POST' && request.url_path == '/v2/model-bundles'
value: post_/v2/model-bundles
- condition: request.method == 'GET' && request.url_path == '/v2/model-bundles'
value: get_/v2/model-bundles
- condition: request.method == 'POST' && request.url_path == '/v2/model-bundles/clone-with-changes'
value: post_/v2/model-bundles/clone-with-changes
- condition: request.method == 'GET' && request.url_path == '/v2/model-bundles/latest'
value: get_/v2/model-bundles/latest
- condition: request.method == 'GET' && request.url_path.matches('^/v2/model-bundles/[[:alnum:]-_]*$')
value: get_/v2/model-bundles/_model_bundle_id
- condition: request.method == 'POST' && request.url_path == '/v1/model-endpoints'
value: post_/v1/model-endpoints
- condition: request.method == 'GET' && request.url_path == '/v1/model-endpoints-api'
value: get_/v1/model-endpoints-api
- condition: request.method == 'GET' && request.url_path == '/v1/model-endpoints-schema.json'
value: get_/v1/model-endpoints-schema.json
- condition: request.method == 'DELETE' && request.url_path.matches('^/v1/model-endpoints/[[:alnum:]-_]*$')
value: delete_/v1/model-endpoints/_model_endpoint_id
- condition: request.method == 'GET' && request.url_path == '/v1/model-endpoints'
value: get_/v1/model-endpoints
- condition: request.method == 'GET' && request.url_path.matches('^/v1/model-endpoints/[[:alnum:]-_]*$')
value: get_/v1/model-endpoints/_model_endpoint_id
- condition: request.method == 'PUT' && request.url_path.matches('^/v1/model-endpoints/[[:alnum:]-_]*$')
value: put_/v1/model-endpoints/_model_endpoint_id
- condition: request.method == 'POST' && request.url_path == '/v1/streaming-tasks'
value: post_/v1/streaming-tasks
- condition: request.method == 'POST' && request.url_path == '/v1/sync-tasks'
value: post_/v1/sync-tasks
- condition: request.method == 'DELETE' && request.url_path.matches('^/v1/model-endpoints/[[:alnum:]-_]*$')
value: delete_/v1/model-endpoints/_model_endpoint_id
- condition: request.method == 'POST' && request.url_path.matches('^/v1/model-endpoints/[[:alnum:]-_]*/restart$')
value: post_/v1/model-endpoints/_model_endpoint_id/restart
- condition: request.method == 'GET' && request.url_path == '/v1/model-endpoints-schema.json'
value: get_/v1/model-endpoints-schema.json
- condition: request.method == 'GET' && request.url_path == '/v1/model-endpoints-api'
value: get_/v1/model-endpoints-api
- condition: request.method == 'POST' && request.url_path == '/v1/docker-image-batch-job-bundles'
value: post_/v1/docker-image-batch-job-bundles
- condition: request.method == 'GET' && request.url_path == '/v1/docker-image-batch-job-bundles'
value: get_/v1/docker-image-batch-job-bundles
- condition: request.method == 'GET' && request.url_path == '/v1/docker-image-batch-job-bundles/latest'
value: get_/v1/docker-image-batch-job-bundles/latest
- condition: request.method == 'GET' && request.url_path.matches('^/v1/docker-image-batch-job-bundles/[[:alnum:]-_]*$')
value: get_/v1/docker-image-batch-job-bundles/_docker_image_batch_job_bundle_id
- condition: request.method == 'POST' && request.url_path == '/v1/llm/model-endpoints'
value: post_/v1/llm/model-endpoints
- condition: request.method == 'GET' && request.url_path == '/v1/llm/model-endpoints'
value: get_/v1/llm/model-endpoints
- condition: request.method == 'GET' && request.url_path.matches('^/v1/llm/model-endpoints/[[:alnum:]-_]*$')
value: get_/v1/llm/model-endpoints/_model_endpoint_name
- condition: request.method == 'PUT' && request.url_path.matches('^/v1/llm/model-endpoints/[[:alnum:]-_]*$')
value: put_/v1/llm/model-endpoints/_model_endpoint_name
- condition: request.method == 'DELETE' && request.url_path.matches('^/v1/llm/model-endpoints/[[:alnum:]-_]*$')
value: delete_/v1/llm/model-endpoints/_model_endpoint_name
- condition: request.method == 'POST' && request.url_path == '/v1/llm/completions-sync'
value: post_/v1/llm/completions-sync
- condition: request.method == 'POST' && request.url_path == '/v1/llm/completions-stream'
value: post_/v1/llm/completions-stream
- condition: request.method == 'GET' && request.url_path == '/v1/llm/fine-tunes'
value: get_/v1/llm/fine-tunes
- condition: request.method == 'POST' && request.url_path == '/v1/llm/fine-tunes'
value: post_/v1/llm/fine-tunes
- condition: request.method == 'GET' && request.url_path.matches('^/v1/llm/fine-tunes/[[:alnum:]-_]*$')
value: get_/v1/llm/fine-tunes/_fine_tune_id
- condition: request.method == 'PUT' && request.url_path.matches('^/v1/llm/fine-tunes/[[:alnum:]-_]*/cancel$')
value: put_/v1/llm/fine-tunes/_fine_tune_id/cancel
- condition: request.method == 'GET' && request.url_path.matches('^/v1/llm/fine-tunes/[[:alnum:]-_]*/events$')
value: get_/v1/llm/fine-tunes/_fine_tune_id/events
- condition: request.method == 'POST' && request.url_path == '/v1/llm/model-endpoints/download'
value: post_/v1/llm/model-endpoints/download
- condition: request.method == 'POST' && request.url_path == '/v1/llm/batch-completions'
value: post_/v1/llm/batch-completions
- condition: request.method == 'GET' && request.url_path == '/v1/files'
value: get_/v1/files
- condition: request.method == 'POST' && request.url_path == '/v1/files'
value: post_/v1/files
- condition: request.method == 'GET' && request.url_path.matches('^/v1/files/[[:alnum:]-_]*$')
value: get_/v1/files/_file_id
- condition: request.method == 'DELETE' && request.url_path.matches('^/v1/files/[[:alnum:]-_]*$')
value: delete_/v1/files/_file_id
- condition: request.method == 'GET' && request.url_path.matches('^/v1/files/[[:alnum:]-_]*/content$')
value: get_/v1/files/_file_id/content
- condition: request.method == 'GET' && request.url_path == '/v1/triggers'
value: get_/v1/triggers
- condition: request.method == 'POST' && request.url_path == '/v1/triggers'
value: post_/v1/triggers
- condition: request.method == 'DELETE' && request.url_path.matches('^/v1/triggers/[[:alnum:]-_]*$')
value: delete_/v1/triggers/_trigger_id
- condition: request.method == 'GET' && request.url_path.matches('^/v1/triggers/[[:alnum:]-_]*$')
value: get_/v1/triggers/_trigger_id
- condition: request.method == 'PUT' && request.url_path.matches('^/v1/triggers/[[:alnum:]-_]*$')
value: put_/v1/triggers/_trigger_id
- condition: request.method == 'GET' && request.url_path == '/v2/model-bundles'
value: get_/v2/model-bundles
- condition: request.method == 'POST' && request.url_path == '/v2/model-bundles'
value: post_/v2/model-bundles
- condition: request.method == 'POST' && request.url_path == '/v2/model-bundles/clone-with-changes'
value: post_/v2/model-bundles/clone-with-changes
- condition: request.method == 'GET' && request.url_path == '/v2/model-bundles/latest'
value: get_/v2/model-bundles/latest
- condition: request.method == 'GET' && request.url_path.matches('^/v2/model-bundles/[[:alnum:]-_]*$')
value: get_/v2/model-bundles/_model_bundle_id
- condition: request.method == 'DELETE' && request.url_path.matches('^/v1/triggers/[[:alnum:]-_]*$')
value: delete_/v1/triggers/_trigger_id
- condition: request.method == 'POST' && request.url_path == '/v2/batch-completions'
value: post_/v2/batch-completions
- condition: request.method == 'GET' && request.url_path.matches('^/v2/batch-completions/[[:alnum:]-_]*$')
value: get_/v2/batch-completions/_batch_completion_id
- condition: request.method == 'POST' && request.url_path.matches('^/v2/batch-completions/[[:alnum:]-_]*$')
value: post_/v2/batch-completions/_batch_completion_id
- condition: request.method == 'POST' && request.url_path.matches('^/v2/batch-completions/[[:alnum:]-_]*/actions/cancel$')
value: post_/v2/batch-completions/_batch_completion_id/actions/cancel
- condition: request.method == 'POST' && request.url_path == '/v2/chat/completions'
value: post_/v2/chat/completions
- condition: request.method == 'POST' && request.url_path == '/v2/completions'
value: post_/v2/completions
- condition: request.method == 'GET' && request.url_path == '/healthcheck'
value: get_/healthcheck
- condition: request.method == 'GET' && request.url_path == '/healthz'
value: get_/healthz
- condition: request.method == 'GET' && request.url_path == '/readyz'
value: get_/readyz
{{- end -}}
5 changes: 5 additions & 0 deletions charts/model-engine/templates/gateway_deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ spec:
}]
sidecar.istio.io/proxyMemoryLimit: "5Gi"
sidecar.istio.io/proxyMemory: "1Gi"
{{- /* Without a CPU request the sidecar is starved on nodes packed to their CPU
request capacity, its postStart hook hangs, and new gateway pods never
become Ready. No CPU limit: throttling the proxy adds tail latency. */}}
sidecar.istio.io/proxyCPU: {{ .Values.gateway.sidecarCPURequest | quote }}
labels:
{{- include "modelEngine.selectorLabels.gateway" . | nindent 8 }}
{{- include "modelEngine.labels" . | nindent 8 }}
Expand Down Expand Up @@ -60,6 +64,7 @@ spec:
path: /readyz
port: 5000
periodSeconds: 2
timeoutSeconds: {{ .Values.gateway.readinessProbeTimeoutSeconds }}
failureThreshold: 30
command:
- dumb-init
Expand Down
Loading