Skip to content

Commit 8f42acc

Browse files
authored
Merge pull request #101 from awgn/istio-access-log-improvements
Access Log improved for common Istio operators
2 parents 5f47ee8 + cb7932a commit 8f42acc

30 files changed

+869
-480
lines changed

orion-error/src/lib.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,10 @@ impl Error {
192192
self.0
193193
}
194194

195+
pub fn inner(&self) -> &(impl ErrorTrait + Send + Sync + 'static) {
196+
&self.0
197+
}
198+
195199
pub fn get_context_data<T: 'static>(&self) -> Option<&T> {
196200
if let ErrorImpl::Context(ErrorInfo { message: _, any: Some(val) }, _) = &self.0 {
197201
val.downcast_ref::<T>()
@@ -274,8 +278,7 @@ enum ErrorImpl {
274278
impl ErrorTrait for ErrorImpl {
275279
fn source(&self) -> Option<&(dyn ErrorTrait + 'static)> {
276280
match self {
277-
Self::Error(err) => err.source(),
278-
Self::Context(_, err) => Some(err.as_ref()),
281+
Self::Error(err) | Self::Context(_, err) => Some(err.as_ref()),
279282
}
280283
}
281284
}

orion-format/benches/benchmark.rs

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,9 @@ fn benchmark_rust_format(c: &mut Criterion) {
9595
bytes_received: 128,
9696
bytes_sent: 256,
9797
response_flags: ResponseFlags::empty(),
98+
upstream_failure: None,
99+
response_code_details: None,
100+
connection_termination_details: None,
98101
};
99102

100103
let default_header_value = HeaderValue::from_static("");
@@ -174,6 +177,9 @@ fn benchmark_log_formatter(c: &mut Criterion) {
174177
bytes_received: 128,
175178
bytes_sent: 256,
176179
response_flags: ResponseFlags::empty(),
180+
upstream_failure: None,
181+
response_code_details: None,
182+
connection_termination_details: None,
177183
};
178184

179185
let fmt = LogFormatter::try_new(DEFAULT_ACCESS_LOG_FORMAT, false).stealth_unwrap();
@@ -183,7 +189,7 @@ fn benchmark_log_formatter(c: &mut Criterion) {
183189
b.iter(|| {
184190
let mut fmt = fmt.local_clone();
185191
black_box(eval_format(
186-
&DownstreamContext { request: &request, trace_id: None, request_head_size: 0 },
192+
&DownstreamContext { request: &request, trace_id: None, request_head_size: 0, server_name: None },
187193
&DownstreamResponse { response: &response, response_head_size: 0 },
188194
&start,
189195
&end,
@@ -196,7 +202,7 @@ fn benchmark_log_formatter(c: &mut Criterion) {
196202
b.iter(|| {
197203
let mut fmt = fmt.local_clone();
198204
black_box(eval_format(
199-
&DownstreamContext { request: &request, trace_id: None, request_head_size: 0 },
205+
&DownstreamContext { request: &request, trace_id: None, request_head_size: 0, server_name: None },
200206
&DownstreamResponse { response: &response, response_head_size: 0 },
201207
&start,
202208
&end,
@@ -214,7 +220,7 @@ fn benchmark_log_formatter(c: &mut Criterion) {
214220

215221
let mut formatted = fmt.local_clone();
216222
eval_format(
217-
&DownstreamContext { request: &request, trace_id: None, request_head_size: 0 },
223+
&DownstreamContext { request: &request, trace_id: None, request_head_size: 0, server_name: None },
218224
&DownstreamResponse { response: &response, response_head_size: 0 },
219225
&start,
220226
&end,
@@ -244,14 +250,17 @@ fn benchmark_request_parts(c: &mut Criterion) {
244250
bytes_received: 128,
245251
bytes_sent: 256,
246252
response_flags: ResponseFlags::empty(),
253+
upstream_failure: None,
254+
response_code_details: None,
255+
connection_termination_details: None,
247256
};
248257

249258
let fmt = LogFormatter::try_new("%START_TIME%", false).stealth_unwrap();
250259
c.bench_function("%START_TIME%", |b| {
251260
b.iter(|| {
252261
let mut fmt = fmt.local_clone();
253262
black_box(eval_format(
254-
&DownstreamContext { request: &request, trace_id: None, request_head_size: 0 },
263+
&DownstreamContext { request: &request, trace_id: None, request_head_size: 0, server_name: None },
255264
&DownstreamResponse { response: &response, response_head_size: 0 },
256265
&start,
257266
&end,
@@ -265,7 +274,7 @@ fn benchmark_request_parts(c: &mut Criterion) {
265274
b.iter(|| {
266275
let mut fmt = fmt.local_clone();
267276
black_box(eval_format(
268-
&DownstreamContext { request: &request, trace_id: None, request_head_size: 0 },
277+
&DownstreamContext { request: &request, trace_id: None, request_head_size: 0, server_name: None },
269278
&DownstreamResponse { response: &response, response_head_size: 0 },
270279
&start,
271280
&end,
@@ -279,7 +288,7 @@ fn benchmark_request_parts(c: &mut Criterion) {
279288
b.iter(|| {
280289
let mut fmt = fmt.local_clone();
281290
black_box(eval_format(
282-
&DownstreamContext { request: &request, trace_id: None, request_head_size: 0 },
291+
&DownstreamContext { request: &request, trace_id: None, request_head_size: 0, server_name: None },
283292
&DownstreamResponse { response: &response, response_head_size: 0 },
284293
&start,
285294
&end,
@@ -293,7 +302,7 @@ fn benchmark_request_parts(c: &mut Criterion) {
293302
b.iter(|| {
294303
let mut fmt = fmt.local_clone();
295304
black_box(eval_format(
296-
&DownstreamContext { request: &request, trace_id: None, request_head_size: 0 },
305+
&DownstreamContext { request: &request, trace_id: None, request_head_size: 0, server_name: None },
297306
&DownstreamResponse { response: &response, response_head_size: 0 },
298307
&start,
299308
&end,
@@ -357,6 +366,9 @@ fn benchmark_log_headers(c: &mut Criterion) {
357366
bytes_received: 128,
358367
bytes_sent: 256,
359368
response_flags: ResponseFlags::empty(),
369+
upstream_failure: None,
370+
response_code_details: None,
371+
connection_termination_details: None,
360372
};
361373

362374
let fmt = LogFormatter::try_new(ENVOY_FORMAT, false).stealth_unwrap();
@@ -365,7 +377,7 @@ fn benchmark_log_headers(c: &mut Criterion) {
365377
b.iter(|| {
366378
let mut fmt = fmt.local_clone();
367379
black_box(eval_format(
368-
&DownstreamContext { request: &request, trace_id: None, request_head_size: 0 },
380+
&DownstreamContext { request: &request, trace_id: None, request_head_size: 0, server_name: None },
369381
&DownstreamResponse { response: &response, response_head_size: 0 },
370382
&start,
371383
&end,

orion-format/src/bin/format-test.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ fn main() -> Result<(), BoxError> {
5959
bytes_received: 128,
6060
bytes_sent: 256,
6161
response_flags: ResponseFlags::empty(),
62+
upstream_failure: None,
63+
response_code_details: None,
64+
connection_termination_details: None,
6265
};
6366

6467
let fmt = LogFormatter::try_new(DEF_FMT, false)?;
@@ -71,7 +74,7 @@ fn main() -> Result<(), BoxError> {
7174
for _ in 0..TOTAL {
7275
let mut fmt = black_box(fmt.local_clone());
7376
black_box(eval_format(
74-
&DownstreamContext { request: &request, request_head_size: 0, trace_id: None },
77+
&DownstreamContext { request: &request, request_head_size: 0, trace_id: None, server_name: None },
7578
&DownstreamResponse { response: &response, response_head_size: 0 },
7679
&start,
7780
&end,

orion-format/src/context.rs

Lines changed: 63 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -52,56 +52,44 @@ impl Context for TcpContext<'_> {
5252
}
5353
fn eval_part(&self, op: &Operator) -> StringType {
5454
match op {
55-
Operator::UpstreamHost | Operator::UpstreamRemoteAddress => match self.upstream_peer_addr {
56-
Some(addr) => StringType::Smol(addr.to_smolstr()),
57-
None => StringType::None,
55+
Operator::UpstreamHost | Operator::UpstreamRemoteAddress => {
56+
self.upstream_peer_addr.map_or(StringType::None, |addr| StringType::Smol(addr.to_smolstr()))
5857
},
59-
Operator::UpstreamRemoteAddressWithoutPort => match self.upstream_peer_addr {
60-
None => StringType::None,
61-
Some(addr) => StringType::Smol(addr.ip().to_smolstr()),
58+
Operator::UpstreamRemoteAddressWithoutPort => {
59+
self.upstream_peer_addr.map_or(StringType::None, |addr| StringType::Smol(addr.ip().to_smolstr()))
6260
},
63-
Operator::UpstreamRemotePort => match self.upstream_peer_addr {
64-
None => StringType::None,
65-
Some(addr) => StringType::Smol(addr.port().to_smolstr()),
61+
Operator::UpstreamRemotePort => {
62+
self.upstream_peer_addr.map_or(StringType::None, |addr| StringType::Smol(addr.port().to_smolstr()))
6663
},
67-
Operator::UpstreamLocalAddress => match self.upstream_local_addr {
68-
Some(addr) => StringType::Smol(addr.to_smolstr()),
69-
None => StringType::None,
64+
Operator::UpstreamLocalAddress => {
65+
self.upstream_local_addr.map_or(StringType::None, |addr| StringType::Smol(addr.to_smolstr()))
7066
},
71-
Operator::UpstreamLocalAddressWithoutPort => match self.upstream_local_addr {
72-
Some(addr) => StringType::Smol(addr.ip().to_smolstr()),
73-
None => StringType::None,
67+
Operator::UpstreamLocalAddressWithoutPort => {
68+
self.upstream_local_addr.map_or(StringType::None, |addr| StringType::Smol(addr.ip().to_smolstr()))
7469
},
75-
Operator::UpstreamLocalPort => match self.upstream_local_addr {
76-
Some(addr) => StringType::Smol(addr.port().to_smolstr()),
77-
None => StringType::None,
70+
Operator::UpstreamLocalPort => {
71+
self.upstream_local_addr.map_or(StringType::None, |addr| StringType::Smol(addr.port().to_smolstr()))
7872
},
79-
Operator::DownstreamLocalAddress => match self.downstream_local_addr {
80-
Some(addr) => StringType::Smol(addr.to_smolstr()),
81-
None => StringType::None,
73+
Operator::DownstreamLocalAddress => {
74+
self.downstream_local_addr.map_or(StringType::None, |addr| StringType::Smol(addr.to_smolstr()))
8275
},
83-
Operator::DownstreamLocalAddressWithoutPort => match self.downstream_local_addr {
84-
Some(addr) => StringType::Smol(addr.ip().to_smolstr()),
85-
None => StringType::None,
76+
Operator::DownstreamLocalAddressWithoutPort => {
77+
self.downstream_local_addr.map_or(StringType::None, |addr| StringType::Smol(addr.ip().to_smolstr()))
8678
},
87-
Operator::DownstreamLocalPort => match self.downstream_local_addr {
88-
Some(addr) => StringType::Smol(addr.port().to_smolstr()),
89-
None => StringType::None,
79+
Operator::DownstreamLocalPort => {
80+
self.downstream_local_addr.map_or(StringType::None, |addr| StringType::Smol(addr.port().to_smolstr()))
9081
},
9182

92-
Operator::DownstreamRemoteAddress => match self.downstream_peer_addr {
93-
Some(addr) => StringType::Smol(addr.to_smolstr()),
94-
None => StringType::None,
83+
Operator::DownstreamRemoteAddress => {
84+
self.downstream_peer_addr.map_or(StringType::None, |addr| StringType::Smol(addr.to_smolstr()))
9585
},
9686

97-
Operator::DownstreamRemoteAddressWithoutPort => match self.downstream_peer_addr {
98-
Some(addr) => StringType::Smol(addr.ip().to_smolstr()),
99-
None => StringType::None,
87+
Operator::DownstreamRemoteAddressWithoutPort => {
88+
self.downstream_peer_addr.map_or(StringType::None, |addr| StringType::Smol(addr.ip().to_smolstr()))
10089
},
10190

102-
Operator::DownstreamRemotePort => match self.downstream_peer_addr {
103-
Some(addr) => StringType::Smol(addr.port().to_smolstr()),
104-
None => StringType::None,
91+
Operator::DownstreamRemotePort => {
92+
self.downstream_peer_addr.map_or(StringType::None, |addr| StringType::Smol(addr.port().to_smolstr()))
10593
},
10694

10795
Operator::UpstreamCluster | Operator::UpstreamClusterRaw => {
@@ -142,8 +130,9 @@ fn hash_connection(local: Option<&SocketAddr>, peer: Option<&SocketAddr>, protoc
142130

143131
#[derive(Clone, Debug)]
144132
pub struct UpstreamContext<'a> {
145-
pub authority: &'a Authority,
146-
pub cluster_name: &'a str,
133+
pub authority: Option<&'a Authority>,
134+
pub cluster_name: Option<&'a str>,
135+
pub route_name: &'a str,
147136
}
148137

149138
impl Context for UpstreamContext<'_> {
@@ -152,10 +141,13 @@ impl Context for UpstreamContext<'_> {
152141
}
153142
fn eval_part(&self, op: &Operator) -> StringType {
154143
match op {
155-
Operator::UpstreamHost => StringType::Smol(SmolStr::new(self.authority.as_str())),
144+
Operator::UpstreamHost => {
145+
self.authority.map_or(StringType::None, |name| StringType::Smol(SmolStr::new(name)))
146+
},
156147
Operator::UpstreamCluster | Operator::UpstreamClusterRaw => {
157-
StringType::Smol(SmolStr::new(self.cluster_name))
148+
self.cluster_name.map_or(StringType::None, |cluster_name| StringType::Smol(SmolStr::new(cluster_name)))
158149
},
150+
Operator::RouteName => StringType::Smol(SmolStr::new(self.route_name)),
159151
_ => StringType::None,
160152
}
161153
}
@@ -184,6 +176,7 @@ pub struct InitHttpContext<'a, T> {
184176
pub downstream_request: &'a Request<T>,
185177
pub request_head_size: usize,
186178
pub trace_id: Option<u128>,
179+
pub server_name: Option<&'a str>,
187180
}
188181

189182
impl<T> Context for InitHttpContext<'_, T> {
@@ -197,6 +190,7 @@ impl<T> Context for InitHttpContext<'_, T> {
197190
request: self.downstream_request,
198191
trace_id: self.trace_id,
199192
request_head_size: self.request_head_size,
193+
server_name: self.server_name,
200194
}
201195
.eval_part(op),
202196
}
@@ -259,6 +253,9 @@ pub struct FinishContext {
259253
pub bytes_received: u64,
260254
pub bytes_sent: u64,
261255
pub response_flags: ResponseFlags,
256+
pub upstream_failure: Option<&'static str>,
257+
pub response_code_details: Option<&'static str>,
258+
pub connection_termination_details: Option<&'static str>,
262259
}
263260

264261
impl Context for FinishContext {
@@ -281,6 +278,15 @@ impl Context for FinishContext {
281278
let mut buffer = itoa::Buffer::new();
282279
StringType::Smol(SmolStr::new(buffer.format(self.bytes_sent)))
283280
},
281+
Operator::UpstreamTransportFailureReason => {
282+
self.upstream_failure.map_or(StringType::None, |msg| StringType::Smol(SmolStr::new_static(msg)))
283+
},
284+
Operator::ResponseCodeDetails => {
285+
self.response_code_details.map_or(StringType::None, |msg| StringType::Smol(SmolStr::new_static(msg)))
286+
},
287+
Operator::ConnectionTerminationDetails => self
288+
.connection_termination_details
289+
.map_or(StringType::None, |msg| StringType::Smol(SmolStr::new_static(msg))),
284290
_ => StringType::None,
285291
}
286292
}
@@ -290,6 +296,7 @@ pub struct DownstreamContext<'a, T> {
290296
pub request: &'a Request<T>,
291297
pub request_head_size: usize,
292298
pub trace_id: Option<u128>,
299+
pub server_name: Option<&'a str>,
293300
}
294301

295302
pub struct DownstreamResponse<'a, T> {
@@ -336,21 +343,18 @@ impl<T> Context for DownstreamContext<'_, T> {
336343
StringType::None
337344
}
338345
},
339-
Operator::Request(h) => {
340-
let hv = self.request.headers().get(h.0.as_str());
341-
match hv {
342-
Some(hv) => StringType::Bytes(hv.as_bytes().into()),
343-
None => StringType::None,
344-
}
345-
},
346-
Operator::TraceId => {
347-
if let Some(trace_id) = self.trace_id {
348-
StringType::Smol(format_smolstr!("{:032x}", trace_id))
349-
} else {
350-
StringType::None
351-
}
352-
},
346+
Operator::Request(h) => self
347+
.request
348+
.headers()
349+
.get(h.0.as_str())
350+
.map_or(StringType::None, |hv| StringType::Bytes(hv.as_bytes().into())),
351+
Operator::TraceId => self
352+
.trace_id
353+
.map_or(StringType::None, |trace_id| StringType::Smol(format_smolstr!("{:032x}", trace_id))),
353354
Operator::Protocol => StringType::Smol(SmolStr::new_static(self.request.version().to_static_str())),
355+
Operator::RequestedServerName => {
356+
self.server_name.map_or(StringType::None, |sni| StringType::Smol(SmolStr::new(sni)))
357+
},
354358
_ => StringType::None,
355359
}
356360
}
@@ -394,13 +398,11 @@ impl<T> Context for DownstreamResponse<'_, T> {
394398
Operator::ResponseStatus | Operator::ResponseCode => {
395399
StringType::Smol(SmolStr::new_inline(self.response.status().as_str()))
396400
},
397-
Operator::Response(header_name) => {
398-
let hv = self.response.headers().get(header_name.0.as_str());
399-
match hv {
400-
Some(hv) => StringType::Bytes(hv.as_bytes().into()),
401-
None => StringType::None,
402-
}
403-
},
401+
Operator::Response(header_name) => self
402+
.response
403+
.headers()
404+
.get(header_name.0.as_str())
405+
.map_or(StringType::None, |hv| StringType::Bytes(hv.as_bytes().into())),
404406
_ => StringType::None,
405407
}
406408
}

orion-format/src/grammar.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,13 @@ static ENVOY_PATTERNS: LazyLock<Trie<u8, (Operator, Category, usize, bool)>> = L
7373
trie_mapstr!(trie, "PROTOCOL", Operator::Protocol, Category::DOWNSTREAM_REQUEST);
7474
trie_mapstr!(trie, "UPSTREAM_PROTOCOL", Operator::UpstreamProtocol, Category::UPSTREAM_REQUEST);
7575
trie_mapstr!(trie, "RESPONSE_CODE", Operator::ResponseCode, Category::DOWNSTREAM_RESPONSE);
76-
trie_mapstr!(trie, "RESPONSE_CODE_DETAILS", Operator::ResponseCodeDetails, Category::UNSUPPORTED);
77-
trie_mapstr!(trie, "CONNECTION_TERMINATION_DETAILS", Operator::ConnectionTerminationDetails, Category::UNSUPPORTED);
76+
trie_mapstr!(trie, "RESPONSE_CODE_DETAILS", Operator::ResponseCodeDetails, Category::FINISH_CONTEXT);
77+
trie_mapstr!(
78+
trie,
79+
"CONNECTION_TERMINATION_DETAILS",
80+
Operator::ConnectionTerminationDetails,
81+
Category::FINISH_CONTEXT
82+
);
7883
trie_mapstr!(trie, "BYTES_SENT", Operator::BytesSent, Category::FINISH_CONTEXT);
7984
trie_mapstr!(trie, "UPSTREAM_WIRE_BYTES_SENT", Operator::UpstreamWireBytesSent, Category::UNSUPPORTED);
8085
trie_mapstr!(trie, "UPSTREAM_HEADER_BYTES_SENT", Operator::UpstreamHeaderBytesSent, Category::UNSUPPORTED);
@@ -164,8 +169,8 @@ static ENVOY_PATTERNS: LazyLock<Trie<u8, (Operator, Category, usize, bool)>> = L
164169
trie_mapstr!(trie, "CONNECTION_ID", Operator::ConnectionId, Category::DOWNSTREAM_CONTEXT);
165170
trie_mapstr!(trie, "REQUEST_HEADERS_BYTES", Operator::RequestHeadersBytes, Category::DOWNSTREAM_REQUEST);
166171
trie_mapstr!(trie, "RESPONSE_HEADERS_BYTES", Operator::ResponseHeadersBytes, Category::DOWNSTREAM_RESPONSE);
167-
trie_mapstr!(trie, "REQUESTED_SERVER_NAME", Operator::RequestedServerName, Category::UNSUPPORTED);
168-
trie_mapstr!(trie, "ROUTE_NAME", Operator::RouteName, Category::UNSUPPORTED);
172+
trie_mapstr!(trie, "REQUESTED_SERVER_NAME", Operator::RequestedServerName, Category::DOWNSTREAM_REQUEST);
173+
trie_mapstr!(trie, "ROUTE_NAME", Operator::RouteName, Category::UPSTREAM_CONTEXT);
169174
trie_mapstr!(trie, "UPSTREAM_PEER_URI_SAN", Operator::UpstreamPeerUriSan, Category::UNSUPPORTED);
170175
trie_mapstr!(trie, "UPSTREAM_PEER_DNS_SAN", Operator::UpstreamPeerDnsSan, Category::UNSUPPORTED);
171176
trie_mapstr!(trie, "UPSTREAM_PEER_IP_SAN", Operator::UpstreamPeerIpSan, Category::UNSUPPORTED);
@@ -220,7 +225,7 @@ static ENVOY_PATTERNS: LazyLock<Trie<u8, (Operator, Category, usize, bool)>> = L
220225
trie,
221226
"UPSTREAM_TRANSPORT_FAILURE_REASON",
222227
Operator::UpstreamTransportFailureReason,
223-
Category::UNSUPPORTED
228+
Category::FINISH_CONTEXT
224229
);
225230
trie_mapstr!(trie, "HOSTNAME", Operator::Hostname, Category::UNSUPPORTED);
226231
trie_mapstr!(trie, "FILTER_CHAIN_NAME", Operator::FilterChainName, Category::UNSUPPORTED);

0 commit comments

Comments
 (0)