We decode OTel AnyValue in three places and only one does it right. extraction.py silently drops array/kvlist/bytes values, loader/otlp.py JSON-dumps the raw proto structure, and only otlp_processing.py decodes it properly (and only for log bodies).
Concrete symptom: gen_ai.response.finish_reasons shows up as the literal blob {"values":[{"stringValue":"stop"}]} via one path and vanishes via another. One shared decoder fixes all three call sites.
We decode OTel
AnyValuein three places and only one does it right.extraction.pysilently drops array/kvlist/bytes values,loader/otlp.pyJSON-dumps the raw proto structure, and onlyotlp_processing.pydecodes it properly (and only for log bodies).Concrete symptom:
gen_ai.response.finish_reasonsshows up as the literal blob{"values":[{"stringValue":"stop"}]}via one path and vanishes via another. One shared decoder fixes all three call sites.