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

Reply via email to