本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
join
根据匹配的字段,将来自源日志组的日志事件与来自另一个日志组的事件或查询结果相结合。
使用join命令将不同来源(例如日志组)的相关日志事件关联起来,使用日志组中通用的密钥(例如匹配的请求标识符或事务 IDs)。
语法
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 Gateway 请求与 Lambda 执行日志相关联
此示例说明如何将 API Gateway 访问日志与 Lambda 函数日志结合起来,以将传入的请求与其后端处理关联起来。这对于排除 end-to-end请求流故障和确定哪些 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 Gateway 访问日志并筛选服务器错误(状态 >= 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。
-
不支持连接右侧的子查询。