hkc-8010 opened a new issue, #69304:
URL: https://github.com/apache/airflow/issues/69304

   ### Apache Airflow version
   main (Airflow 3.x)
   
   ### What happened
   When a task logs a non-string value as the sole log message (for example 
`self.log.info(some_list)` with no `%s` placeholder), Airflow 3's structured 
logging stores that value verbatim as the log `event`. When the log backend 
persists structured logs as JSON (as the Elasticsearch and OpenSearch remote 
log handlers do), that `event` field is stored as a JSON array/object instead 
of a string.
   
   When the log is later read back through the task log API, both 
`ElasticsearchTaskHandler._read()` and `OpensearchTaskHandler._read()` 
construct a `StructuredLogMessage` directly from the stored fields:
   
   ```python
   StructuredLogMessage(**_build_log_fields(hit.to_dict()))
   ```
   
   `StructuredLogMessage.event` 
(`airflow-core/src/airflow/utils/log/file_task_handler.py`) is a required `str` 
field with no coercion. A non-string stored value raises 
`pydantic.ValidationError`, which is not caught anywhere in the read path 
(`_read()` → `read_log_chunks`/`read_log_stream` → the 
`/dags/{dag_id}/dagRuns/{run_id}/taskInstances/{task_id}/logs/{try_number}` 
endpoint). The exception propagates unhandled and the entire log-fetch request 
500s for that task attempt, instead of degrading gracefully for the one 
malformed line.
   
   ### What you think should happen instead
   A single malformed stored log entry should not fail the entire log-fetch 
request. Airflow already has a precedent for this exact situation: 
`_log_stream_to_parsed_log_stream` in `file_task_handler.py` catches 
`ValidationError` when parsing a stored log line and falls back to a 
stringified `StructuredLogMessage`. The Elasticsearch and OpenSearch task log 
handlers should apply the same fallback.
   
   ### How to reproduce
   1. Run a task that logs a non-string object as the sole message argument, 
e.g. `self.log.info(["a", "b"])`, with the Elasticsearch or OpenSearch remote 
logging backend configured.
   2. Attempt to view that task's logs in the Airflow UI or via the task 
instance logs API.
   3. The request fails with a 500 and a traceback ending in 
`pydantic_core._pydantic_core.ValidationError: 1 validation error for 
StructuredLogMessage / event / Input should be a valid string`.
   
   ### Operating System
   N/A (server-side)
   
   ### Versions of Apache Airflow Providers
   apache-airflow-providers-elasticsearch, apache-airflow-providers-opensearch 
(both affected independently — each has its own copy of the same unguarded 
pattern)
   
   ### Deployment
   Other
   
   ### Deployment details
   _No response_
   
   ### Anything else
   This affects both 
`providers/elasticsearch/src/airflow/providers/elasticsearch/log/es_task_handler.py`
 and 
`providers/opensearch/src/airflow/providers/opensearch/log/os_task_handler.py` 
independently — they have separately duplicated `_build_log_fields()` 
implementations, not a shared one. Planning to submit two separate PRs, one per 
provider, both referencing this issue.
   
   ### Are you willing to submit PR?
   - [x] Yes I am willing to submit a PR!
   
   ### Code of Conduct
   - [x] I agree to follow this project's Code of Conduct


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to