Skip to content

Commit c25a980

Browse files
committed
Attempt at adding observability mode
Signed-off-by: Jake Oliver <jake@truelayer.com>
1 parent 5565cf1 commit c25a980

16 files changed

Lines changed: 428 additions & 0 deletions

File tree

api/v1alpha1/ext_proc_types.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ type ExtProcProcessingMode struct {
6969
// +kubebuilder:validation:XValidation:message="BackendRefs only supports Service, ServiceImport, and Backend kind.",rule="has(self.backendRefs) ? self.backendRefs.all(f, f.kind == 'Service' || f.kind == 'ServiceImport' || f.kind == 'Backend') : true"
7070
// +kubebuilder:validation:XValidation:message="BackendRefs only supports Core, multicluster.x-k8s.io, and gateway.envoyproxy.io groups.",rule="has(self.backendRefs) ? (self.backendRefs.all(f, f.group == \"\" || f.group == 'multicluster.x-k8s.io' || f.group == 'gateway.envoyproxy.io')) : true"
7171
// +kubebuilder:validation:XValidation:message="If FullDuplexStreamed body processing mode is used, FailOpen must be false.",rule="!(has(self.failOpen) && self.failOpen == true && has(self.processingMode) && ((has(self.processingMode.request) && has(self.processingMode.request.body) && self.processingMode.request.body == 'FullDuplexStreamed') || (has(self.processingMode.response) && has(self.processingMode.response.body) && self.processingMode.response.body == 'FullDuplexStreamed')))"
72+
// +kubebuilder:validation:XValidation:message="If observabilityMode is enabled, body processing mode must be Streamed or unset.",rule="!(has(self.observabilityMode) && self.observabilityMode == true && has(self.processingMode) && ((has(self.processingMode.request) && has(self.processingMode.request.body) && self.processingMode.request.body != 'Streamed') || (has(self.processingMode.response) && has(self.processingMode.response.body) && self.processingMode.response.body != 'Streamed')))"
7273
type ExtProc struct {
7374
BackendCluster `json:",inline"`
7475

@@ -97,6 +98,12 @@ type ExtProc struct {
9798
// +optional
9899
ProcessingMode *ExtProcProcessingMode `json:"processingMode,omitempty"`
99100

101+
// ObservabilityMode sets if envoy gateway should treat this external processor as "send and go"
102+
//
103+
// +optional
104+
// +kubebuilder:default=false
105+
ObservabilityMode *bool `json:"observabilityMode,omitempty"`
106+
100107
// Metadata defines options related to the sending and receiving of dynamic metadata.
101108
// These options define which metadata namespaces would be sent to the processor and which dynamic metadata
102109
// namespaces the processor would be permitted to emit metadata to.

api/v1alpha1/zz_generated.deepcopy.go

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

charts/gateway-crds-helm/templates/generated/gateway.envoyproxy.io_envoyextensionpolicies.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1352,6 +1352,11 @@ spec:
13521352
Envoy HTTP filter namespaces
13531353
rule: self.all(f, !f.startsWith('envoy.filters.http'))
13541354
type: object
1355+
observabilityMode:
1356+
default: false
1357+
description: ObservabilityMode sets if envoy gateway should
1358+
treat this external processor as "send and go"
1359+
type: boolean
13551360
processingMode:
13561361
description: |-
13571362
ProcessingMode defines how request and response body is processed
@@ -1432,6 +1437,13 @@ spec:
14321437
&& self.processingMode.request.body == ''FullDuplexStreamed'')
14331438
|| (has(self.processingMode.response) && has(self.processingMode.response.body)
14341439
&& self.processingMode.response.body == ''FullDuplexStreamed'')))'
1440+
- message: If observabilityMode is enabled, body processing mode
1441+
must be Streamed or unset.
1442+
rule: '!(has(self.observabilityMode) && self.observabilityMode
1443+
== true && has(self.processingMode) && ((has(self.processingMode.request)
1444+
&& has(self.processingMode.request.body) && self.processingMode.request.body
1445+
!= ''Streamed'') || (has(self.processingMode.response) && has(self.processingMode.response.body)
1446+
&& self.processingMode.response.body != ''Streamed'')))'
14351447
maxItems: 16
14361448
type: array
14371449
lua:

charts/gateway-helm/charts/crds/crds/generated/gateway.envoyproxy.io_envoyextensionpolicies.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1351,6 +1351,11 @@ spec:
13511351
Envoy HTTP filter namespaces
13521352
rule: self.all(f, !f.startsWith('envoy.filters.http'))
13531353
type: object
1354+
observabilityMode:
1355+
default: false
1356+
description: ObservabilityMode sets if envoy gateway should
1357+
treat this external processor as "send and go"
1358+
type: boolean
13541359
processingMode:
13551360
description: |-
13561361
ProcessingMode defines how request and response body is processed
@@ -1431,6 +1436,13 @@ spec:
14311436
&& self.processingMode.request.body == ''FullDuplexStreamed'')
14321437
|| (has(self.processingMode.response) && has(self.processingMode.response.body)
14331438
&& self.processingMode.response.body == ''FullDuplexStreamed'')))'
1439+
- message: If observabilityMode is enabled, body processing mode
1440+
must be Streamed or unset.
1441+
rule: '!(has(self.observabilityMode) && self.observabilityMode
1442+
== true && has(self.processingMode) && ((has(self.processingMode.request)
1443+
&& has(self.processingMode.request.body) && self.processingMode.request.body
1444+
!= ''Streamed'') || (has(self.processingMode.response) && has(self.processingMode.response.body)
1445+
&& self.processingMode.response.body != ''Streamed'')))'
14341446
maxItems: 16
14351447
type: array
14361448
lua:

internal/cmd/egctl/testdata/translate/out/backend-endpoint.all.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ envoyExtensionPolicies:
6464
port: 9002
6565
weight: 1
6666
failOpen: false
67+
observabilityMode: false
6768
processingMode:
6869
request: {}
6970
response:

internal/gatewayapi/envoyextensionpolicy.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -851,6 +851,10 @@ func (t *Translator) buildExtProc(
851851
extProcIR.MessageTimeout = ir.MetaV1DurationPtr(d)
852852
}
853853

854+
if extProc.ObservabilityMode != nil {
855+
extProcIR.ObservabilityMode = extProc.ObservabilityMode
856+
}
857+
854858
if extProc.FailOpen != nil {
855859
extProcIR.FailOpen = extProc.FailOpen
856860
}

internal/gatewayapi/resource/testdata/all-resources.out.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ envoyExtensionPolicies:
114114
port: 9002
115115
weight: 1
116116
failOpen: false
117+
observabilityMode: false
117118
processingMode:
118119
request: {}
119120
response:

internal/gatewayapi/resource/testdata/all-resources2.out.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ envoyExtensionPolicies:
114114
port: 9002
115115
weight: 1
116116
failOpen: false
117+
observabilityMode: false
117118
processingMode:
118119
request: {}
119120
response:
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
gateways:
2+
- apiVersion: gateway.networking.k8s.io/v1
3+
kind: Gateway
4+
metadata:
5+
namespace: default
6+
name: gateway-1
7+
spec:
8+
gatewayClassName: envoy-gateway-class
9+
listeners:
10+
- name: http
11+
protocol: HTTP
12+
port: 80
13+
allowedRoutes:
14+
namespaces:
15+
from: All
16+
httpRoutes:
17+
- apiVersion: gateway.networking.k8s.io/v1
18+
kind: HTTPRoute
19+
metadata:
20+
namespace: default
21+
name: httproute-1
22+
spec:
23+
hostnames:
24+
- www.foo.com
25+
parentRefs:
26+
- namespace: default
27+
name: gateway-1
28+
sectionName: http
29+
rules:
30+
- matches:
31+
- path:
32+
value: /foo
33+
backendRefs:
34+
- name: service-1
35+
port: 8080
36+
services:
37+
- apiVersion: v1
38+
kind: Service
39+
metadata:
40+
namespace: default
41+
name: grpc-backend
42+
spec:
43+
ports:
44+
- port: 9000
45+
name: grpc
46+
protocol: TCP
47+
endpointSlices:
48+
- apiVersion: discovery.k8s.io/v1
49+
kind: EndpointSlice
50+
metadata:
51+
name: endpointslice-grpc-backend
52+
namespace: default
53+
labels:
54+
kubernetes.io/service-name: grpc-backend
55+
addressType: IPv4
56+
ports:
57+
- name: grpc
58+
protocol: TCP
59+
port: 9000
60+
endpoints:
61+
- addresses:
62+
- 8.8.8.8
63+
conditions:
64+
ready: true
65+
envoyExtensionPolicies:
66+
- apiVersion: gateway.envoyproxy.io/v1alpha1
67+
kind: EnvoyExtensionPolicy
68+
metadata:
69+
namespace: default
70+
name: policy-for-http-route
71+
spec:
72+
targetRef:
73+
group: gateway.networking.k8s.io
74+
kind: HTTPRoute
75+
name: httproute-1
76+
extProc:
77+
- backendRefs:
78+
- Name: grpc-backend
79+
Port: 9000
80+
observabilityMode: true
81+
processingMode:
82+
request:
83+
body: Streamed
84+
response:
85+
body: Streamed

0 commit comments

Comments
 (0)