本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
join
将来自源日志组的日志事件与其他日志组的事件或基于匹配字段的查询结果相结合。
使用该join命令将日志组等不同来源的相关日志事件关联起来,使用它们之间的通用密钥,例如匹配请求标识符或事务 ID。
语法
join type=<join_type> left=<left_alias> right=<right_alias> where <left_alias>.<field>=<right_alias>.<field> (SOURCE <right_log_group>)
参数
-
<right_log_group>— 要加入的辅助数据源。 -
<left_alias>和<right_alias>— 用于区分左侧(主要)和右(辅助)数据源字段的别名。 -
where <field>— 指定用作连接密钥的字段。该字段必须存在于两个数据源中。 -
type=<join_type>(可选)-指定联接类型。有效值为:-
inner(默认)-仅返回匹配的记录 -
left— 返回主数据源中的所有记录和辅助数据源中的匹配记录
-
示例
例示例 1:将 API 网关请求与 Lambda 执行日志相关联
此示例说明如何将 API Gateway 访问日志与 Lambda 函数日志相结合,以将传入请求与其后端处理相关联。这对于排除端到端请求流故障以及确定哪些 Lambda 调用对应于特定 API 请求很有用。
filter status >= 500 | join type=inner left=api right=lambda where api.requestId=lambda.requestId (SOURCE '/aws/lambda/my-function') | fields api.requestId, api.status, api.latency, lambda.duration, lambda.memoryUsed | sort api.latency desc
这个查询:
-
查询 API 网关访问日志和服务器错误过滤器(状态 >= 500)
-
使用两个日志源中出现的
requestId字段加入 Lambda 函数日志 -
使用别名(
api和lambda)将字段与每个来源区分开 -
返回显示 API 延迟以及 Lambda 执行持续时间和内存使用情况的组合信息
-
按 API 延迟对结果进行排序,以确定最慢的请求
例示例 2:跟踪微服务间的分布式事务
在调试微服务架构中的问题时,您通常需要跟踪多个服务之间的交易。此示例说明如何使用通用事务 ID 加入来自两个不同服务的日志。
filter eventType = "ORDER_CREATED" | join type=left left=order right=payment where order.transactionId=payment.transactionId (SOURCE '/aws/lambda/payment-service') | filter payment.eventType = "PAYMENT_PROCESSED" or !ispresent(payment.eventType) | fields order.transactionId, order.orderId, order.customerId, payment.paymentStatus, payment.amount | filter payment.paymentStatus != "SUCCESS" or !ispresent(payment.paymentStatus)
这个查询:
-
从订单服务中的订单创建事件开始
-
使用 a
left join包括所有订单,即使是付款记录不匹配的订单 -
使用共享
transactionId字段加入付款处理事件 -
筛选最终结果,仅显示付款失败或缺少付款记录的订单
左联接在这里很重要,因为它可以确保您看到已创建但从未发生过相应付款事件的订单,这可能表明系统出现故障。
行为
-
首先处理主数据源(左侧)。
-
使用指定的连接密钥对辅助数据源进行评估和匹配。
-
使用联接字段上的等值比较来执行匹配。
-
对于左连接,将保留主数据源中不匹配的记录,辅助字段的值为空值。
注释和限制
-
仅支持相等 (=) 条件。
-
每个查询仅支持一个连接命令。
-
联接密钥必须存在于两个数据源中,并且类型兼容。
-
使用 join 进行查询可能会扫描更多数据并产生更高的成本。
-
为确保查询性能,辅助数据源中的唯一键值的数量限制为 50,000。
-
不支持联接右侧的子查询。