diff --git a/include/neuron/otel/otel_manager.h b/include/neuron/otel/otel_manager.h index 25aad8a0..074d6657 100644 --- a/include/neuron/otel/otel_manager.h +++ b/include/neuron/otel/otel_manager.h @@ -42,6 +42,8 @@ neu_otel_trace_ctx neu_otel_find_trace2(void *req_ctx); void neu_otel_trace_set_final(neu_otel_trace_ctx ctx); void neu_otel_trace_set_expected_span_num(neu_otel_trace_ctx ctx, uint32_t num); +void neu_otel_trace_reduce_expected_span_num(neu_otel_trace_ctx ctx, + uint32_t num); uint8_t *neu_otel_get_trace_id(neu_otel_trace_ctx ctx); neu_otel_trace_ctx neu_otel_find_trace_by_id(const char *trace_id); diff --git a/src/adapter/adapter.c b/src/adapter/adapter.c index d27c43fb..a0a9b9ef 100644 --- a/src/adapter/adapter.c +++ b/src/adapter/adapter.c @@ -124,6 +124,13 @@ static void *adapter_consumer(void *arg) if (adapter->state == NEU_NODE_RUNNING_STATE_RUNNING) { adapter->module->intf_funs->request( adapter->plugin, (neu_reqresp_head_t *) header, &header[1]); + } else { + if (neu_otel_control_is_started() && header->ctx) { + neu_otel_trace_ctx trace = neu_otel_find_trace(header->ctx); + if (trace) { + neu_otel_trace_reduce_expected_span_num(trace, 1); + } + } } neu_trans_data_free((neu_reqresp_trans_data_t *) &header[1]); diff --git a/src/otel/otel_manager.c b/src/otel/otel_manager.c index dfff5fd2..4f19b02c 100644 --- a/src/otel/otel_manager.c +++ b/src/otel/otel_manager.c @@ -540,6 +540,16 @@ void neu_otel_trace_set_expected_span_num(neu_otel_trace_ctx ctx, uint32_t num) trace_ctx->expected_span_num = num; } +void neu_otel_trace_reduce_expected_span_num(neu_otel_trace_ctx ctx, + uint32_t num) +{ + trace_ctx_t *trace_ctx = (trace_ctx_t *) ctx; + trace_ctx->expected_span_num -= num; + if (trace_ctx->expected_span_num <= 0) { + trace_ctx->final = true; + } +} + uint8_t *neu_otel_get_trace_id(neu_otel_trace_ctx ctx) { trace_ctx_t *trace_ctx = (trace_ctx_t *) ctx;