You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2022/11/16 05:29:14 UTC

[skywalking] branch master updated: Add `LongText` to support longer logs persistent as a text type (#9964)

This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git


The following commit(s) were added to refs/heads/master by this push:
     new 978599edc4 Add `LongText` to support longer logs persistent as a text type  (#9964)
978599edc4 is described below

commit 978599edc48d0f3377dd5c13dbc444683757f91b
Author: 吴晟 Wu Sheng <wu...@foxmail.com>
AuthorDate: Wed Nov 16 13:28:57 2022 +0800

    Add `LongText` to support longer logs persistent as a text type  (#9964)
---
 docs/en/changes/changes.md                         |  1 +
 docs/en/protocols/README.md                        |  8 ++--
 .../provider/kafka/log/KafkaLogExporter.java       |  6 +--
 .../analysis/manual/log/AbstractLogRecord.java     |  5 +-
 .../analysis/manual/log/LogRecordDispatcher.java   |  3 +-
 .../oap/server/core/analysis/record/LongText.java  | 56 ++++++++++++++++++++++
 6 files changed, 70 insertions(+), 9 deletions(-)

diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md
index 534cf5c459..008b3feb94 100644
--- a/docs/en/changes/changes.md
+++ b/docs/en/changes/changes.md
@@ -109,6 +109,7 @@
 * Add component IDs(135, 136, 137) for EventMesh server and client-side plugins.
 * Bump up Kafka client to 2.8.1 to fix CVE-2021-38153.
 * Remove `lengthEnvVariable` for `Column` as it never works as expected.
+* Add `LongText` to support longer logs persistent as a text type in ElasticSearch, instead of a keyword, to avoid length limitation.
 
 #### UI
 
diff --git a/docs/en/protocols/README.md b/docs/en/protocols/README.md
index 512efa7978..15a68b9241 100644
--- a/docs/en/protocols/README.md
+++ b/docs/en/protocols/README.md
@@ -24,9 +24,11 @@ Please read SkyWalking language agents documentation to see whether it is suppor
 SkyWalking has a native metrics format, and supports widely used metric formats, such as Prometheus, OpenCensus, OpenTelemetry, and Zabbix.
 
 The native metrics format definition could be found [here](https://github.com/apache/skywalking-data-collect-protocol/blob/master/language-agent/Meter.proto).
-Typically, the agent meter plugin (e.g. [Java Meter Plugin](https://skywalking.apache.org/docs/skywalking-java/next/en/setup/service-agent/java-agent/java-plugin-development-guide/#meter-plugin)) and
-Satellite [Prometheus fetcher](https://skywalking.apache.org/docs/skywalking-satellite/next/en/setup/plugins/fetcher_prometheus-metrics-fetcher/)
-would convert metrics into native format and forward them to SkyWalking OAP server.
+The agent meter plugin (e.g. [Java Meter Plugin](https://skywalking.apache.org/docs/skywalking-java/next/en/setup/service-agent/java-agent/java-plugin-development-guide/#meter-plugin)) uses the
+native metric format to report metrics.
+
+OpenTelemetry collector, Telegraf agents, Zabbix agents could use their native protocol(e.g. OTLP)
+and OAP server would convert metrics into native format and forward them to [MAL](../concepts-and-designs/mal.md) engine.
 
 To learn more about receiving 3rd party formats metrics, see [Meter receiver](../setup/backend/backend-meter.md) and [OpenTelemetry receiver](../setup/backend/opentelemetry-receiver.md).
 
diff --git a/oap-server/exporter/src/main/java/org/apache/skywalking/oap/server/exporter/provider/kafka/log/KafkaLogExporter.java b/oap-server/exporter/src/main/java/org/apache/skywalking/oap/server/exporter/provider/kafka/log/KafkaLogExporter.java
index d8b9245a92..033cbdf4f5 100644
--- a/oap-server/exporter/src/main/java/org/apache/skywalking/oap/server/exporter/provider/kafka/log/KafkaLogExporter.java
+++ b/oap-server/exporter/src/main/java/org/apache/skywalking/oap/server/exporter/provider/kafka/log/KafkaLogExporter.java
@@ -142,15 +142,15 @@ public class KafkaLogExporter extends KafkaExportProducer implements LogExportSe
         switch (ContentType.instanceOf(logRecord.getContentType())) {
             case JSON:
                 bodyBuilder.setType(ContentType.JSON.name());
-                bodyBuilder.setJson(JSONLog.newBuilder().setJson(logRecord.getContent()));
+                bodyBuilder.setJson(JSONLog.newBuilder().setJson(logRecord.getContent().getText()));
                 break;
             case YAML:
                 bodyBuilder.setType(ContentType.YAML.name());
-                bodyBuilder.setYaml(YAMLLog.newBuilder().setYaml(logRecord.getContent()));
+                bodyBuilder.setYaml(YAMLLog.newBuilder().setYaml(logRecord.getContent().getText()));
                 break;
             case TEXT:
                 bodyBuilder.setType(ContentType.TEXT.name());
-                bodyBuilder.setText(TextLog.newBuilder().setText(logRecord.getContent()));
+                bodyBuilder.setText(TextLog.newBuilder().setText(logRecord.getContent().getText()));
                 break;
             case NONE:
                 bodyBuilder.setType(ContentType.NONE.name());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/log/AbstractLogRecord.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/log/AbstractLogRecord.java
index 58809b1248..71da67e112 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/log/AbstractLogRecord.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/log/AbstractLogRecord.java
@@ -23,6 +23,7 @@ import lombok.Getter;
 import lombok.Setter;
 import org.apache.skywalking.oap.server.core.UnexpectedException;
 import org.apache.skywalking.oap.server.core.analysis.manual.searchtag.Tag;
+import org.apache.skywalking.oap.server.core.analysis.record.LongText;
 import org.apache.skywalking.oap.server.core.analysis.record.Record;
 import org.apache.skywalking.oap.server.core.query.type.ContentType;
 import org.apache.skywalking.oap.server.core.storage.annotation.BanyanDB;
@@ -85,7 +86,7 @@ public abstract class AbstractLogRecord extends Record {
     @Getter
     @Column(columnName = CONTENT, length = 1_000_000)
     @ElasticSearch.MatchQuery(analyzer = ElasticSearch.MatchQuery.AnalyzerType.OAP_LOG_ANALYZER)
-    private String content;
+    private LongText content;
     @Setter
     @Getter
     @Column(columnName = TIMESTAMP)
@@ -118,7 +119,7 @@ public abstract class AbstractLogRecord extends Record {
             record.setTraceSegmentId((String) converter.get(TRACE_SEGMENT_ID));
             record.setSpanId(((Number) converter.get(SPAN_ID)).intValue());
             record.setContentType(((Number) converter.get(CONTENT_TYPE)).intValue());
-            record.setContent((String) converter.get(CONTENT));
+            record.setContent(new LongText((String) converter.get(CONTENT)));
             record.setTimestamp(((Number) converter.get(TIMESTAMP)).longValue());
             record.setTagsRawData(converter.getBytes(TAGS_RAW_DATA));
             record.setTimeBucket(((Number) converter.get(TIME_BUCKET)).longValue());
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/log/LogRecordDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/log/LogRecordDispatcher.java
index d3920d6e08..95736d66f9 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/log/LogRecordDispatcher.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/log/LogRecordDispatcher.java
@@ -19,6 +19,7 @@ package org.apache.skywalking.oap.server.core.analysis.manual.log;
 
 import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher;
 import org.apache.skywalking.oap.server.core.analysis.manual.searchtag.Tag;
+import org.apache.skywalking.oap.server.core.analysis.record.LongText;
 import org.apache.skywalking.oap.server.core.analysis.worker.RecordStreamProcessor;
 import org.apache.skywalking.oap.server.core.source.Log;
 
@@ -37,7 +38,7 @@ public class LogRecordDispatcher implements SourceDispatcher<Log> {
         record.setTraceSegmentId(source.getTraceSegmentId());
         record.setSpanId(source.getSpanId());
         record.setContentType(source.getContentType().value());
-        record.setContent(source.getContent());
+        record.setContent(new LongText(source.getContent()));
         record.setTagsRawData(source.getTagsRawData());
         record.setTagsInString(Tag.Util.toStringList(source.getTags()));
 
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/record/LongText.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/record/LongText.java
new file mode 100644
index 0000000000..1215e725b1
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/record/LongText.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.oap.server.core.analysis.record;
+
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.apache.skywalking.oap.server.core.storage.type.StorageDataComplexObject;
+
+/**
+ * LongText represents a string field, but the length is not predictable and could be longer than 1000.
+ * This is a wrapper of Java String only, which provides an indicator of long text field.
+ */
+@Getter
+@Setter
+@ToString
+@EqualsAndHashCode
+public class LongText implements StorageDataComplexObject<LongText> {
+    private String text;
+
+    public LongText(final String text) {
+        this.text = text;
+    }
+
+    @Override
+    public String toStorageData() {
+        return text;
+    }
+
+    @Override
+    public void toObject(final String data) {
+        this.text = data;
+    }
+
+    @Override
+    public void copyFrom(final LongText source) {
+        this.text = source.text;
+    }
+}