Skip to content

Commit 1d3a00a

Browse files
Use AwsLogsHook when fetching Glue job logs (#38010)
1 parent 1739e05 commit 1d3a00a

2 files changed

Lines changed: 16 additions & 9 deletions

File tree

airflow/providers/amazon/aws/hooks/glue.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,13 @@
1919

2020
import asyncio
2121
import time
22+
from functools import cached_property
2223

23-
import boto3
2424
from botocore.exceptions import ClientError
2525

2626
from airflow.exceptions import AirflowException
2727
from airflow.providers.amazon.aws.hooks.base_aws import AwsBaseHook
28+
from airflow.providers.amazon.aws.hooks.logs import AwsLogsHook
2829

2930
DEFAULT_LOG_SUFFIX = "output"
3031
ERROR_LOG_SUFFIX = "error"
@@ -213,6 +214,13 @@ async def async_get_job_state(self, job_name: str, run_id: str) -> str:
213214
job_run = await client.get_job_run(JobName=job_name, RunId=run_id)
214215
return job_run["JobRun"]["JobRunState"]
215216

217+
@cached_property
218+
def logs_hook(self):
219+
"""Returns an AwsLogsHook instantiated with the parameters of the GlueJobHook."""
220+
return AwsLogsHook(
221+
aws_conn_id=self.aws_conn_id, region_name=self.region_name, verify=self.verify, config=self.config
222+
)
223+
216224
def print_job_logs(
217225
self,
218226
job_name: str,
@@ -225,7 +233,7 @@ def print_job_logs(
225233
:param continuation_tokens: the tokens where to resume from when reading logs.
226234
The object gets updated with the new tokens by this method.
227235
"""
228-
log_client = boto3.client("logs")
236+
log_client = self.logs_hook.get_conn()
229237
paginator = log_client.get_paginator("filter_log_events")
230238

231239
def display_logs_from(log_group: str, continuation_token: str | None) -> str | None:
@@ -264,7 +272,6 @@ def display_logs_from(log_group: str, continuation_token: str | None) -> str | N
264272
log_group_prefix = self.conn.get_job_run(JobName=job_name, RunId=run_id)["JobRun"]["LogGroupName"]
265273
log_group_default = f"{log_group_prefix}/{DEFAULT_LOG_SUFFIX}"
266274
log_group_error = f"{log_group_prefix}/{ERROR_LOG_SUFFIX}"
267-
268275
# one would think that the error log group would contain only errors, but it actually contains
269276
# a lot of interesting logs too, so it's valuable to have both
270277
continuation_tokens.output_stream_continuation = display_logs_from(

tests/providers/amazon/aws/hooks/test_glue.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
from airflow.exceptions import AirflowException
3030
from airflow.providers.amazon.aws.hooks.base_aws import AwsBaseHook
3131
from airflow.providers.amazon.aws.hooks.glue import GlueJobHook
32+
from airflow.providers.amazon.aws.hooks.logs import AwsLogsHook
3233

3334
if TYPE_CHECKING:
3435
from unittest.mock import MagicMock
@@ -376,12 +377,12 @@ def test_initialize_job(self, mock_conn, mock_get_job_state):
376377
glue_job_run_state = glue_job_hook.get_job_state(glue_job_run["JobName"], glue_job_run["JobRunId"])
377378
assert glue_job_run_state == mock_job_run_state, "Mocks but be equal"
378379

379-
@mock.patch("airflow.providers.amazon.aws.hooks.glue.boto3.client")
380+
@mock.patch.object(AwsLogsHook, "get_conn")
380381
@mock.patch.object(GlueJobHook, "conn")
381-
def test_print_job_logs_returns_token(self, conn_mock: MagicMock, client_mock: MagicMock, caplog):
382-
hook = GlueJobHook()
382+
def test_print_job_logs_returns_token(self, conn_mock: MagicMock, log_client_mock: MagicMock, caplog):
383+
hook = GlueJobHook(job_name="test")
383384
conn_mock().get_job_run.return_value = {"JobRun": {"LogGroupName": "my_log_group"}}
384-
client_mock().get_paginator().paginate.return_value = [
385+
log_client_mock().get_paginator().paginate.return_value = [
385386
# first response : 2 log lines
386387
{
387388
"events": [
@@ -399,12 +400,11 @@ def test_print_job_logs_returns_token(self, conn_mock: MagicMock, client_mock: M
399400
tokens = GlueJobHook.LogContinuationTokens()
400401
with caplog.at_level("INFO"):
401402
hook.print_job_logs("name", "run", tokens)
402-
403403
assert "\thello\n\tworld\n" in caplog.text
404404
assert tokens.output_stream_continuation == "my_continuation_token"
405405
assert tokens.error_stream_continuation == "my_continuation_token"
406406

407-
@mock.patch("airflow.providers.amazon.aws.hooks.glue.boto3.client")
407+
@mock.patch.object(AwsLogsHook, "get_conn")
408408
@mock.patch.object(GlueJobHook, "conn")
409409
def test_print_job_logs_no_stream_yet(self, conn_mock: MagicMock, client_mock: MagicMock):
410410
hook = GlueJobHook()

0 commit comments

Comments
 (0)