diff --git a/plugins/modbus/modbus_stack.c b/plugins/modbus/modbus_stack.c index 34facfa4..67e7252c 100644 --- a/plugins/modbus/modbus_stack.c +++ b/plugins/modbus/modbus_stack.c @@ -99,6 +99,8 @@ int modbus_stack_recv(modbus_stack_t *stack, uint8_t slave_id, return -1; } + void *trace_ctx = (void *) ((intptr_t) stack + (intptr_t) stack->read_seq); + switch (code.function) { case MODBUS_READ_COIL: case MODBUS_READ_INPUT: @@ -107,7 +109,7 @@ int modbus_stack_recv(modbus_stack_t *stack, uint8_t slave_id, neu_otel_trace_ctx trace = NULL; neu_otel_scope_ctx scope = NULL; if (neu_otel_data_is_started()) { - trace = neu_otel_find_trace((void *) (intptr_t) stack->read_seq); + trace = neu_otel_find_trace(trace_ctx); if (trace) { char new_span_id[36] = { 0 }; neu_otel_new_span_id(new_span_id); @@ -140,14 +142,14 @@ int modbus_stack_recv(modbus_stack_t *stack, uint8_t slave_id, stack->value_fn(stack->ctx, code.slave_id, header.len - sizeof(struct modbus_code) - sizeof(struct modbus_data), - bytes, 0, (void *) (intptr_t) stack->read_seq); + bytes, 0, trace_ctx); } else { bytes = neu_protocol_unpack_buf(buf, data.n_byte); if (bytes == NULL) { return -1; } stack->value_fn(stack->ctx, code.slave_id, data.n_byte, bytes, - 0, (void *) (intptr_t) stack->read_seq); + 0, trace_ctx); } break; case MODBUS_PROTOCOL_RTU: @@ -156,7 +158,7 @@ int modbus_stack_recv(modbus_stack_t *stack, uint8_t slave_id, return -1; } stack->value_fn(stack->ctx, code.slave_id, data.n_byte, bytes, 0, - (void *) (intptr_t) stack->read_seq); + trace_ctx); break; } @@ -374,8 +376,10 @@ int modbus_stack_read(modbus_stack_t *stack, uint8_t slave_id, neu_otel_trace_ctx trace = NULL; neu_otel_scope_ctx scope = NULL; trace = neu_otel_create_trace( - new_trace_id, (void *) (intptr_t) stack->read_seq, 0, - trace_state); + new_trace_id, + (void *) ((intptr_t) stack + + (intptr_t) stack->read_seq), + 0, trace_state); if (trace) { scope = neu_otel_add_span(trace); neu_otel_scope_set_span_name(scope, "driver cmd send"); diff --git a/src/otel/otel_manager.c b/src/otel/otel_manager.c index 29a9a7e3..054a5fb0 100644 --- a/src/otel/otel_manager.c +++ b/src/otel/otel_manager.c @@ -37,7 +37,7 @@ #define SPAN_ID_LENGTH 16 #define ID_CHARSET "0123456789abcdef" -#define TRACE_TIME_OUT (3 * 60 * 1000) +#define TRACE_TIME_OUT (60 * 1000) bool otel_flag = false; char otel_collector_url[128] = { 0 }; @@ -1072,25 +1072,33 @@ static int otel_timer_cb(void *data) HASH_ITER(hh, traces_table, el, tmp) { + bool should_send = false; + bool is_timeout = false; + if (neu_time_ms() - el->ctx->ts >= TRACE_TIME_OUT) { - nlog_debug("trace:%s time out", (char *) el->ctx->trace_id); - HASH_DEL(traces_table, el); - neu_otel_free_trace(el->ctx); - free(el); + should_send = true; + is_timeout = true; + nlog_debug("trace:%s time out, reporting incomplete trace", + (char *) el->ctx->trace_id); } else if (el->ctx->final && el->ctx->span_num == el->ctx->trace_data.resource_spans[0] ->scope_spans[0] ->n_spans && el->ctx->expected_span_num <= 0) { - int data_size = neu_otel_trace_pack_size(el->ctx); + should_send = true; + } - uint8_t *data_buf = calloc(1, data_size); + if (should_send) { + int data_size = neu_otel_trace_pack_size(el->ctx); + uint8_t *data_buf = calloc(1, data_size); neu_otel_trace_pack(el->ctx, data_buf); int status = neu_http_post_otel_trace(data_buf, data_size); free(data_buf); - nlog_debug("send trace:%s status:%d", (char *) el->ctx->trace_id, + nlog_debug("send %strace:%s status:%d", + is_timeout ? "timeout " : "", (char *) el->ctx->trace_id, status); + if (status == 200 || status == 400) { HASH_DEL(traces_table, el); neu_otel_free_trace(el->ctx);