This is an automated email from the ASF dual-hosted git repository. wusheng pushed a commit to branch fix/log-tags-raw-data-include-lal-tags in repository https://gitbox.apache.org/repos/asf/skywalking.git
commit 73b62154d9f68bec2547680647c5e059428afd0c Author: Wu Sheng <[email protected]> AuthorDate: Wed Mar 18 09:21:34 2026 +0800 Fix LogBuilder tagsRawData to include LAL-added tags tagsRawData only contained original LogData tags from the agent, causing LAL-added tags (via `tag 'key': value`) to be missing from the UI tag display and Kafka export. Merge both original and LAL-added tags into a single LogTags protobuf for tagsRawData. Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]> --- .../oap/server/core/source/LogBuilder.java | 30 +++++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/LogBuilder.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/LogBuilder.java index a49ffc83cb..8f64d53072 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/LogBuilder.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/LogBuilder.java @@ -28,8 +28,10 @@ import lombok.Getter; import lombok.Setter; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.apache.skywalking.apm.network.common.v3.KeyStringValuePair; import org.apache.skywalking.apm.network.logging.v3.LogData; import org.apache.skywalking.apm.network.logging.v3.LogDataBody; +import org.apache.skywalking.apm.network.logging.v3.LogTags; import org.apache.skywalking.oap.server.core.Const; import org.apache.skywalking.oap.server.core.CoreModule; import org.apache.skywalking.oap.server.core.analysis.IDManager; @@ -209,17 +211,37 @@ public class LogBuilder implements LALOutputBuilder { log.setContentType(ContentType.JSON); log.setContent(body.getJson().getJson()); } - // raw tags from original LogData - if (logData.getTags().getDataCount() > 0) { - log.setTagsRawData(logData.getTags().toByteArray()); - } } + // raw tags: merge original LogData tags + LAL-added tags + log.setTagsRawData(buildMergedTagsRawData()); // searchable tags from LogData + LAL-added tags log.getTags().addAll(collectSearchableTags()); return log; } + /** + * Build merged tagsRawData from original LogData tags + LAL-added tags. + * Returns null if there are no tags at all. + */ + private byte[] buildMergedTagsRawData() { + final boolean hasOriginal = logData != null && logData.getTags().getDataCount() > 0; + if (!hasOriginal && lalTags.isEmpty()) { + return null; + } + final LogTags.Builder builder = LogTags.newBuilder(); + if (hasOriginal) { + builder.addAllData(logData.getTags().getDataList()); + } + for (final String[] kv : lalTags) { + builder.addData(KeyStringValuePair.newBuilder() + .setKey(kv[0]) + .setValue(kv[1]) + .build()); + } + return builder.build().toByteArray(); + } + private Collection<Tag> collectSearchableTags() { final HashSet<Tag> result = new HashSet<>(); if (SEARCHABLE_TAG_KEYS != null) {
