yeganeahmadnejad opened a new issue, #13980:
URL: https://github.com/apache/apisix/issues/13980

   ## Description
   
   The vendored `opentelemetry-lua` dependency (pinned `opentelemetry-lua = 
0.2-6` in `apisix-master-0.rockspec`) has a bug in `batch_span_processor.lua`'s 
`create_timer()`: when `ngx.timer.at()` fails because the worker is exiting -- 
expected near the end of every graceful shutdown/deploy -- it falls back to a 
*synchronous* span export (`self:flush_all()`, opening a cosocket).
   
   Since spans finish inline inside whatever phase the `opentelemetry` plugin 
is running (`body_filter_by_lua*` or `log_by_lua*` for HTTP spans -- see 
`apisix/plugins/opentelemetry.lua`'s `phase_func`), that synchronous cosocket 
call hits APISIX's own phase guard in `apisix/patch.lua` and crashes:
   
   ```
   2026/09/20 09:31:05 [error] 70#70: *1277095 failed to run log_by_lua*: 
/usr/local/apisix/apisix/patch.lua:406: API disabled in the context of 
log_by_lua*
   ```
   
   Full traceback (captured on 3.18.0):
   
   ```
   batch_span_processor.lua:97: create_timer(): failed to create timer: process 
exiting while logging request
   stack traceback:
        [C]: in function 'error'
        .../resty/core/socket/tcp.lua:298: in function 'original_tcp'
        .../apisix/patch.lua:406: in function 'ngx_socket_tcp'
        .../resty/http.lua:227: in function 'new'
        .../opentelemetry/trace/exporter/http_client.lua:36: in function 
'do_request'
        .../opentelemetry/trace/exporter/otlp.lua:58: in function 'export_spans'
        .../opentelemetry/trace/batch_span_processor.lua:45: in function 
'process_batches'
        .../opentelemetry/trace/batch_span_processor.lua:215: in function 
'flush_all'
        .../opentelemetry/trace/batch_span_processor.lua:99: in function 
'create_timer'
        .../opentelemetry/trace/batch_span_processor.lua:183: in function 
'on_end'
        .../opentelemetry/trace/recording_span.lua:98: in function 'finish'
        /usr/local/apisix/apisix/plugins/opentelemetry.lua:559: in function 
'phase_func'
        /usr/local/apisix/apisix/plugin.lua:1442: in function 'common_phase'
        /usr/local/apisix/apisix/init.lua:1213: in function 'http_log_phase'
   ```
   
   ## Steps to reproduce
   
   1. Enable the `opentelemetry` plugin with `tracing: true` (or the default 
per-route tracing) on any route -- including one with no other plugins, e.g. 
just a health-check route.
   2. Deploy/restart the worker (trigger a graceful shutdown) while traffic is 
hitting that route.
   3. Near the end of the outgoing worker's shutdown, the last span(s) to 
finish will hit the race and crash with the above error.
   
   Because this only requires the worker to be exiting -- not any specific 
plugin config -- it fires ~consistently on every rolling deploy of any release 
with tracing enabled.
   
   ## Root cause & fix
   
   Filed and fixed upstream in opentelemetry-lua: 
yangxikun/opentelemetry-lua#107, fix at yangxikun/opentelemetry-lua#106. Once 
merged/released there, bumping the pinned `opentelemetry-lua` version here 
would pick up the fix. In the meantime, APISIX could consider wrapping 
`phase_func`'s span-finishing call in a `pcall` as defense in depth, since this 
class of "third-party tracer code doing something disallowed in a restricted 
phase" isn't fully preventable from the library side alone.
   
   ## Environment
   
   - APISIX 3.18.0 (Ubuntu-based image), `opentelemetry-lua = 0.2-6`
   - OpenResty/CentOS or Ubuntu base, not relevant to the phase-restriction 
behavior (standard OpenResty `body_filter_by_lua*`/`log_by_lua*` cosocket 
restriction)


-- 
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