apache/seatunnel · warning

Skip event with invalid payload for traceId=

Error message

Skip event with invalid payload for traceId={}: {}

What it means

When converting a StainTraceEvent to an OTLP JSON line fails (exception or null result), the local-file trace handler skips the event and logs this warning with the traceId and error message. This prevents a single malformed event from breaking the whole trace file batch.

Solutions

  1. Inspect the logged traceId and error message to identify the malformed event source.
  2. Upgrade/align event producer and handler versions so payload fields match the converter's expectations.
  3. Add validation at event creation time to catch invalid payloads before they enter the ring buffer.

Example fix

null
Defensive patterns

Strategy: type-guard

Validate before calling

try { toOtlpJsonLine(event); } catch (Exception e) { skip(event); }

Type guard

boolean isConvertible(StainTraceEvent e) { try { return toOtlpJsonLine(e) != null; } catch (Exception ex) { return false; } }

Try / catch

try { String line = toOtlpJsonLine(e); if (line == null) { log.warn("unconvertible event"); } } catch (Exception ex) { log.warn("skipping malformed event", ex); }

Prevention

When it happens

Trigger: toOtlpJsonLine(traceEvent) throws (malformed payload, serialization error) or returns null (unsupported/unmappable event content) while writing events from the ring buffer or local buffer.

Common situations: Version skew between event producers and the OTLP conversion code; corrupted or truncated event payloads; events with unexpected field values.

Understand the failure class

Background: json.Marshal / "failed to marshal" errors in Go: why "unsupported type" happens and how to fix it — this error's family across 22 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/c4710e9a10cc1a43. Report an issue: GitHub.

Appendix: source

Thrown at seatunnel-engine/seatunnel-engine-server/src/main/java/org/apache/seatunnel/engine/server/event/JobEventLocalFileHandler.java:220

            return false;
        }
        synchronized (writerLock) {
            for (Event event : events) {
                if (!(event instanceof StainTraceEvent)) {
                    continue;
                }
                StainTraceEvent traceEvent = (StainTraceEvent) event;
                String jobId = traceEvent.getJobId();
                if (jobId == null || jobId.isEmpty()) {
                    log.warn("Skip event with null or empty jobId");
                    continue;
                }

                String otlpLine;
                try {
                    otlpLine = toOtlpJsonLine(traceEvent);
                } catch (Exception e) {
                    log.warn(
                            "Skip event with invalid payload for traceId={}: {}",
                            traceEvent.getTraceId(),
                            e.getMessage());
                    continue;
                }
                if (otlpLine == null) {
                    continue;
                }

                String date =
                        java.time.Instant.ofEpochMilli(traceEvent.getCreatedTime())
                                .atZone(ZoneId.systemDefault())
                                .toLocalDate()
                                .format(DATE_FORMATTER);

                if (currentWriter == null) {
                    currentWriter = new TraceFileWriter(baseDir, jobId, date);
                } else if (!jobId.equals(currentWriter.getJobId())

View on GitHub (pinned to cf67b549a7)