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/23 07:33:34 UTC

[skywalking] branch master updated: Support dynamic config the sampling strategy in network profiling. (#10002)

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 2e7a850475 Support dynamic config the sampling strategy in network profiling. (#10002)
2e7a850475 is described below

commit 2e7a8504752eacab5c489bdba3a88d7e0d066a05
Author: mrproliu <74...@qq.com>
AuthorDate: Wed Nov 23 15:33:20 2022 +0800

    Support dynamic config the sampling strategy in network profiling. (#10002)
---
 apm-protocol/apm-network/pom.xml                   |  5 ++
 .../command/EBPFProfilingTaskCommand.java          |  9 ++-
 .../command/EBPFProfilingTaskExtensionConfig.java  | 67 ++++++++++++++++
 apm-protocol/apm-network/src/main/proto            |  2 +-
 docs/en/changes/changes.md                         |  1 +
 .../trace/parser/listener/SampledTraceBuilder.java | 55 ++++++++++---
 .../manual/trace/SampledStatus4xxTraceRecord.java  | 92 ++++++++++++++++++++++
 .../manual/trace/SampledStatus5xxTraceRecord.java  | 92 ++++++++++++++++++++++
 .../oap/server/core/command/CommandService.java    | 33 +++++++-
 .../ebpf/EBPFProfilingMutationService.java         | 62 +++++++++++++++
 .../ebpf/storage/EBPFProfilingTaskRecord.java      |  6 ++
 ...java => EBPFNetworkDataCollectingSettings.java} | 15 +++-
 ...skRequest.java => EBPFNetworkSamplingRule.java} | 20 ++++-
 .../input/EBPFProfilingNetworkTaskRequest.java     |  6 ++
 .../server/core/query/type/EBPFProfilingTask.java  |  1 +
 .../EBPFProfilingTaskExtension.java}               | 16 ++--
 .../oap/server/core/source/DefaultScopeDefine.java |  2 +
 .../src/main/resources/query-protocol              |  2 +-
 .../stream/BanyanDBEBPFProfilingTaskDAO.java       |  4 +
 .../query/EBPFProfilingTaskEsDAO.java              |  4 +
 .../jdbc/common/dao/JDBCEBPFProfilingTaskDAO.java  |  5 ++
 21 files changed, 466 insertions(+), 33 deletions(-)

diff --git a/apm-protocol/apm-network/pom.xml b/apm-protocol/apm-network/pom.xml
index ca2ded1f26..96f90da59f 100644
--- a/apm-protocol/apm-network/pom.xml
+++ b/apm-protocol/apm-network/pom.xml
@@ -58,6 +58,11 @@
             <version>${org.apache.tomcat.annotations-api.version}</version>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>${gson.version}</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/apm-protocol/apm-network/src/main/java/org/apache/skywalking/oap/server/network/trace/component/command/EBPFProfilingTaskCommand.java b/apm-protocol/apm-network/src/main/java/org/apache/skywalking/oap/server/network/trace/component/command/EBPFProfilingTaskCommand.java
index dc01cd7600..18171f3cc7 100644
--- a/apm-protocol/apm-network/src/main/java/org/apache/skywalking/oap/server/network/trace/component/command/EBPFProfilingTaskCommand.java
+++ b/apm-protocol/apm-network/src/main/java/org/apache/skywalking/oap/server/network/trace/component/command/EBPFProfilingTaskCommand.java
@@ -19,6 +19,7 @@
 package org.apache.skywalking.oap.server.network.trace.component.command;
 
 import com.google.common.base.Joiner;
+import com.google.gson.Gson;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import org.apache.skywalking.apm.network.common.v3.Command;
@@ -31,6 +32,7 @@ import java.util.List;
  */
 public class EBPFProfilingTaskCommand extends BaseCommand implements Serializable {
     public static final String NAME = "EBPFProfilingTaskQuery";
+    private static final Gson GSON = new Gson();
 
     private String taskId;
     private List<String> processIdList;
@@ -39,10 +41,11 @@ public class EBPFProfilingTaskCommand extends BaseCommand implements Serializabl
     private String triggerType;
     private FixedTrigger fixedTrigger;
     private String targetType;
+    private EBPFProfilingTaskExtensionConfig extensionConfig;
 
     public EBPFProfilingTaskCommand(String serialNumber, String taskId, List<String> processIdList, long taskStartTime,
                                     long taskUpdateTime, String triggerType, FixedTrigger fixedTrigger,
-                                    String targetType) {
+                                    String targetType, EBPFProfilingTaskExtensionConfig extensionConfig) {
         super(NAME, serialNumber);
         this.taskId = taskId;
         this.processIdList = processIdList;
@@ -51,6 +54,7 @@ public class EBPFProfilingTaskCommand extends BaseCommand implements Serializabl
         this.triggerType = triggerType;
         this.fixedTrigger = fixedTrigger;
         this.targetType = targetType;
+        this.extensionConfig = extensionConfig;
     }
 
     @Override
@@ -61,7 +65,8 @@ public class EBPFProfilingTaskCommand extends BaseCommand implements Serializabl
                 .addArgs(KeyStringValuePair.newBuilder().setKey("TaskUpdateTime").setValue(String.valueOf(taskUpdateTime)))
                 .addArgs(KeyStringValuePair.newBuilder().setKey("TriggerType").setValue(triggerType))
                 .addArgs(KeyStringValuePair.newBuilder().setKey("TargetType").setValue(targetType))
-                .addArgs(KeyStringValuePair.newBuilder().setKey("TaskStartTime").setValue(String.valueOf(taskStartTime)));
+                .addArgs(KeyStringValuePair.newBuilder().setKey("TaskStartTime").setValue(String.valueOf(taskStartTime)))
+                .addArgs(KeyStringValuePair.newBuilder().setKey("ExtensionConfigJSON").setValue(GSON.toJson(extensionConfig)));
 
         if (fixedTrigger != null) {
             builder.addArgs(KeyStringValuePair.newBuilder().setKey("FixedTriggerDuration").setValue(String.valueOf(fixedTrigger.duration)));
diff --git a/apm-protocol/apm-network/src/main/java/org/apache/skywalking/oap/server/network/trace/component/command/EBPFProfilingTaskExtensionConfig.java b/apm-protocol/apm-network/src/main/java/org/apache/skywalking/oap/server/network/trace/component/command/EBPFProfilingTaskExtensionConfig.java
new file mode 100644
index 0000000000..6c220a451e
--- /dev/null
+++ b/apm-protocol/apm-network/src/main/java/org/apache/skywalking/oap/server/network/trace/component/command/EBPFProfilingTaskExtensionConfig.java
@@ -0,0 +1,67 @@
+/*
+ * 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.network.trace.component.command;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+public class EBPFProfilingTaskExtensionConfig {
+
+    @SerializedName("NetworkSamplings")
+    private List<NetworkSamplingRule> networkSamplings;
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class NetworkSamplingRule {
+        @SerializedName("URIRegex")
+        private String uriRegex;
+        @SerializedName("MinDuration")
+        private Integer minDuration;
+        @SerializedName("When4xx")
+        private boolean when4xx;
+        @SerializedName("When5xx")
+        private boolean when5xx;
+
+        @SerializedName("Settings")
+        private CollectSettings settings;
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class CollectSettings {
+        @SerializedName("RequireCompleteRequest")
+        private boolean requireCompleteRequest;
+        @SerializedName("MaxRequestSize")
+        private Integer maxRequestSize;
+        @SerializedName("RequireCompleteResponse")
+        private boolean requireCompleteResponse;
+        @SerializedName("MaxResponseSize")
+        private Integer maxResponseSize;
+    }
+}
diff --git a/apm-protocol/apm-network/src/main/proto b/apm-protocol/apm-network/src/main/proto
index c2c9bbbff4..b561375576 160000
--- a/apm-protocol/apm-network/src/main/proto
+++ b/apm-protocol/apm-network/src/main/proto
@@ -1 +1 @@
-Subproject commit c2c9bbbff43f0ad9f917a0a55285538a6b45739e
+Subproject commit b561375576d97a061e4bc3bf30f0f1ae66e2a436
diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md
index 4bda098a40..e865f06135 100644
--- a/docs/en/changes/changes.md
+++ b/docs/en/changes/changes.md
@@ -116,6 +116,7 @@
 * Changed system variable `SW_SUPERDATASET_STORAGE_DAY_STEP` to `SW_STORAGE_ES_SUPER_DATASET_DAY_STEP` to be consistent with other ES storage related variables.
 * Fix ESEventQueryDAO missing metric_table boolQuery criteria.
 * Add default entity name(`_blank`) if absent to avoid NPE in the decoding. This caused `Can't split xxx id into 2 parts`.
+* Support dynamic config the sampling strategy in network profiling.
 * Zipkin module support BanyanDB storage.
 * Zipkin traces query API, sort the result set by start time by default.
 
diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SampledTraceBuilder.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SampledTraceBuilder.java
index e3c628fc88..799155bba6 100644
--- a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SampledTraceBuilder.java
+++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/SampledTraceBuilder.java
@@ -28,6 +28,8 @@ import org.apache.skywalking.oap.server.core.analysis.IDManager;
 import org.apache.skywalking.oap.server.core.analysis.Layer;
 import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
 import org.apache.skywalking.oap.server.core.analysis.manual.trace.SampledSlowTraceRecord;
+import org.apache.skywalking.oap.server.core.analysis.manual.trace.SampledStatus4xxTraceRecord;
+import org.apache.skywalking.oap.server.core.analysis.manual.trace.SampledStatus5xxTraceRecord;
 import org.apache.skywalking.oap.server.core.analysis.record.Record;
 import org.apache.skywalking.oap.server.core.config.NamingControl;
 import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine;
@@ -81,7 +83,7 @@ public class SampledTraceBuilder {
     public void validate() {
         Preconditions.checkArgument(!Strings.isNullOrEmpty(traceId), "traceId can't be empty");
         Preconditions.checkArgument(!Strings.isNullOrEmpty(uri), "uri can't be empty");
-        Preconditions.checkArgument(latency > 0, "latency must bigger zero");
+        Preconditions.checkArgument(latency >= 0, "latency must bigger or equals zero");
         Preconditions.checkArgument(reason != null, "reason can't be empty");
         Preconditions.checkArgument(layer != null, "layer can't be empty");
         Preconditions.checkArgument(!Strings.isNullOrEmpty(serviceName), "service name can't be empty");
@@ -94,16 +96,43 @@ public class SampledTraceBuilder {
     }
 
     public Record toRecord() {
-        final SampledSlowTraceRecord record = new SampledSlowTraceRecord();
-        record.setScope(DefaultScopeDefine.PROCESS_RELATION);
-        record.setEntityId(IDManager.ProcessID.buildRelationId(new IDManager.ProcessID.ProcessRelationDefine(
-            processId, destProcessId
-        )));
-        record.setTraceId(traceId);
-        record.setUri(uri);
-        record.setLatency(latency);
-        record.setTimeBucket(TimeBucket.getTimeBucket(timestamp, DownSampling.Second));
-        return record;
+        switch (this.reason) {
+            case SLOW:
+                final SampledSlowTraceRecord slowTraceRecord = new SampledSlowTraceRecord();
+                slowTraceRecord.setScope(DefaultScopeDefine.PROCESS_RELATION);
+                slowTraceRecord.setEntityId(IDManager.ProcessID.buildRelationId(new IDManager.ProcessID.ProcessRelationDefine(
+                    processId, destProcessId
+                )));
+                slowTraceRecord.setTraceId(traceId);
+                slowTraceRecord.setUri(uri);
+                slowTraceRecord.setLatency(latency);
+                slowTraceRecord.setTimeBucket(TimeBucket.getTimeBucket(timestamp, DownSampling.Second));
+                return slowTraceRecord;
+            case STATUS_4XX:
+                final SampledStatus4xxTraceRecord status4xxTraceRecord = new SampledStatus4xxTraceRecord();
+                status4xxTraceRecord.setScope(DefaultScopeDefine.PROCESS_RELATION);
+                status4xxTraceRecord.setEntityId(IDManager.ProcessID.buildRelationId(new IDManager.ProcessID.ProcessRelationDefine(
+                    processId, destProcessId
+                )));
+                status4xxTraceRecord.setTraceId(traceId);
+                status4xxTraceRecord.setUri(uri);
+                status4xxTraceRecord.setLatency(latency);
+                status4xxTraceRecord.setTimeBucket(TimeBucket.getTimeBucket(timestamp, DownSampling.Second));
+                return status4xxTraceRecord;
+            case STATUS_5XX:
+                final SampledStatus5xxTraceRecord status5xxTraceRecord = new SampledStatus5xxTraceRecord();
+                status5xxTraceRecord.setScope(DefaultScopeDefine.PROCESS_RELATION);
+                status5xxTraceRecord.setEntityId(IDManager.ProcessID.buildRelationId(new IDManager.ProcessID.ProcessRelationDefine(
+                    processId, destProcessId
+                )));
+                status5xxTraceRecord.setTraceId(traceId);
+                status5xxTraceRecord.setUri(uri);
+                status5xxTraceRecord.setLatency(latency);
+                status5xxTraceRecord.setTimeBucket(TimeBucket.getTimeBucket(timestamp, DownSampling.Second));
+                return status5xxTraceRecord;
+            default:
+                throw new IllegalArgumentException("unknown reason: " + this.reason);
+        }
     }
 
     public ISource toEntity() {
@@ -123,6 +152,8 @@ public class SampledTraceBuilder {
      * The reason of sampled trace.
      */
     public enum Reason {
-        SLOW
+        SLOW,
+        STATUS_4XX,
+        STATUS_5XX
     }
 }
\ No newline at end of file
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/trace/SampledStatus4xxTraceRecord.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/trace/SampledStatus4xxTraceRecord.java
new file mode 100644
index 0000000000..a84dd11bf8
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/trace/SampledStatus4xxTraceRecord.java
@@ -0,0 +1,92 @@
+/*
+ * 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.manual.trace;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.skywalking.oap.server.core.Const;
+import org.apache.skywalking.oap.server.core.analysis.Stream;
+import org.apache.skywalking.oap.server.core.analysis.record.Record;
+import org.apache.skywalking.oap.server.core.analysis.topn.TopN;
+import org.apache.skywalking.oap.server.core.analysis.worker.RecordStreamProcessor;
+import org.apache.skywalking.oap.server.core.source.ScopeDeclaration;
+import org.apache.skywalking.oap.server.core.storage.annotation.BanyanDB;
+import org.apache.skywalking.oap.server.core.storage.annotation.Column;
+import org.apache.skywalking.oap.server.core.storage.type.Convert2Entity;
+import org.apache.skywalking.oap.server.core.storage.type.Convert2Storage;
+import org.apache.skywalking.oap.server.core.storage.type.StorageBuilder;
+
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SAMPLED_STATUS_4XX_TRACE;
+
+@Setter
+@Getter
+@ScopeDeclaration(id = SAMPLED_STATUS_4XX_TRACE, name = "SampledStatus4xxTraceRecord")
+@Stream(name = SampledStatus4xxTraceRecord.INDEX_NAME, scopeId = SAMPLED_STATUS_4XX_TRACE, builder = SampledStatus4xxTraceRecord.Builder.class, processor = RecordStreamProcessor.class)
+public class SampledStatus4xxTraceRecord extends Record {
+
+    public static final String INDEX_NAME = "sampled_status_4xx_trace_record";
+
+    public static final String SCOPE = "scope";
+    public static final String ENTITY_ID = "entity_id";
+    public static final String TRACE_ID = TopN.TRACE_ID;
+    public static final String URI = TopN.STATEMENT;
+    public static final String LATENCY = "latency";
+
+    @Column(columnName = SCOPE)
+    private int scope;
+    @Column(columnName = ENTITY_ID)
+    private String entityId;
+    @Column(columnName = TRACE_ID)
+    @BanyanDB.ShardingKey(index = 0)
+    private String traceId;
+    @Column(columnName = URI, storageOnly = true)
+    private String uri;
+    @Column(columnName = LATENCY, dataType = Column.ValueDataType.SAMPLED_RECORD)
+    private long latency;
+
+    @Override
+    public String id() {
+        return getTimeBucket() + Const.ID_CONNECTOR + entityId + Const.ID_CONNECTOR + traceId;
+    }
+
+    public static class Builder implements StorageBuilder<SampledStatus4xxTraceRecord> {
+
+        @Override
+        public SampledStatus4xxTraceRecord storage2Entity(Convert2Entity converter) {
+            final SampledStatus4xxTraceRecord record = new SampledStatus4xxTraceRecord();
+            record.setScope(((Number) converter.get(SCOPE)).intValue());
+            record.setEntityId((String) converter.get(ENTITY_ID));
+            record.setTraceId((String) converter.get(TRACE_ID));
+            record.setUri((String) converter.get(URI));
+            record.setLatency(((Number) converter.get(LATENCY)).longValue());
+            record.setTimeBucket(((Number) converter.get(TIME_BUCKET)).longValue());
+            return record;
+        }
+
+        @Override
+        public void entity2Storage(SampledStatus4xxTraceRecord entity, Convert2Storage converter) {
+            converter.accept(SCOPE, entity.getScope());
+            converter.accept(ENTITY_ID, entity.getEntityId());
+            converter.accept(TRACE_ID, entity.getTraceId());
+            converter.accept(URI, entity.getUri());
+            converter.accept(LATENCY, entity.getLatency());
+            converter.accept(TIME_BUCKET, entity.getTimeBucket());
+        }
+    }
+}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/trace/SampledStatus5xxTraceRecord.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/trace/SampledStatus5xxTraceRecord.java
new file mode 100644
index 0000000000..9f22153a08
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/trace/SampledStatus5xxTraceRecord.java
@@ -0,0 +1,92 @@
+/*
+ * 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.manual.trace;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.skywalking.oap.server.core.Const;
+import org.apache.skywalking.oap.server.core.analysis.Stream;
+import org.apache.skywalking.oap.server.core.analysis.record.Record;
+import org.apache.skywalking.oap.server.core.analysis.topn.TopN;
+import org.apache.skywalking.oap.server.core.analysis.worker.RecordStreamProcessor;
+import org.apache.skywalking.oap.server.core.source.ScopeDeclaration;
+import org.apache.skywalking.oap.server.core.storage.annotation.BanyanDB;
+import org.apache.skywalking.oap.server.core.storage.annotation.Column;
+import org.apache.skywalking.oap.server.core.storage.type.Convert2Entity;
+import org.apache.skywalking.oap.server.core.storage.type.Convert2Storage;
+import org.apache.skywalking.oap.server.core.storage.type.StorageBuilder;
+
+import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SAMPLED_STATUS_5XX_TRACE;
+
+@Setter
+@Getter
+@ScopeDeclaration(id = SAMPLED_STATUS_5XX_TRACE, name = "SampledStatus5xxTraceRecord")
+@Stream(name = SampledStatus5xxTraceRecord.INDEX_NAME, scopeId = SAMPLED_STATUS_5XX_TRACE, builder = SampledStatus5xxTraceRecord.Builder.class, processor = RecordStreamProcessor.class)
+public class SampledStatus5xxTraceRecord extends Record {
+
+    public static final String INDEX_NAME = "sampled_status_5xx_trace_record";
+
+    public static final String SCOPE = "scope";
+    public static final String ENTITY_ID = "entity_id";
+    public static final String TRACE_ID = TopN.TRACE_ID;
+    public static final String URI = TopN.STATEMENT;
+    public static final String LATENCY = "latency";
+
+    @Column(columnName = SCOPE)
+    private int scope;
+    @Column(columnName = ENTITY_ID)
+    private String entityId;
+    @Column(columnName = TRACE_ID)
+    @BanyanDB.ShardingKey(index = 0)
+    private String traceId;
+    @Column(columnName = URI, storageOnly = true)
+    private String uri;
+    @Column(columnName = LATENCY, dataType = Column.ValueDataType.SAMPLED_RECORD)
+    private long latency;
+
+    @Override
+    public String id() {
+        return getTimeBucket() + Const.ID_CONNECTOR + entityId + Const.ID_CONNECTOR + traceId;
+    }
+
+    public static class Builder implements StorageBuilder<SampledStatus5xxTraceRecord> {
+
+        @Override
+        public SampledStatus5xxTraceRecord storage2Entity(Convert2Entity converter) {
+            final SampledStatus5xxTraceRecord record = new SampledStatus5xxTraceRecord();
+            record.setScope(((Number) converter.get(SCOPE)).intValue());
+            record.setEntityId((String) converter.get(ENTITY_ID));
+            record.setTraceId((String) converter.get(TRACE_ID));
+            record.setUri((String) converter.get(URI));
+            record.setLatency(((Number) converter.get(LATENCY)).longValue());
+            record.setTimeBucket(((Number) converter.get(TIME_BUCKET)).longValue());
+            return record;
+        }
+
+        @Override
+        public void entity2Storage(SampledStatus5xxTraceRecord entity, Convert2Storage converter) {
+            converter.accept(SCOPE, entity.getScope());
+            converter.accept(ENTITY_ID, entity.getEntityId());
+            converter.accept(TRACE_ID, entity.getTraceId());
+            converter.accept(URI, entity.getUri());
+            converter.accept(LATENCY, entity.getLatency());
+            converter.accept(TIME_BUCKET, entity.getTimeBucket());
+        }
+    }
+}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/command/CommandService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/command/CommandService.java
index 8054b9ce3b..48b826b909 100755
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/command/CommandService.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/command/CommandService.java
@@ -21,10 +21,14 @@ package org.apache.skywalking.oap.server.core.command;
 import java.util.List;
 import java.util.Objects;
 import java.util.UUID;
+import java.util.stream.Collectors;
 
 import org.apache.skywalking.oap.server.core.profiling.ebpf.storage.EBPFProfilingTriggerType;
 import org.apache.skywalking.oap.server.core.query.type.EBPFProfilingTask;
+import org.apache.skywalking.oap.server.core.query.type.EBPFProfilingTaskExtension;
+import org.apache.skywalking.oap.server.library.util.CollectionUtils;
 import org.apache.skywalking.oap.server.network.trace.component.command.EBPFProfilingTaskCommand;
+import org.apache.skywalking.oap.server.network.trace.component.command.EBPFProfilingTaskExtensionConfig;
 import org.apache.skywalking.oap.server.network.trace.component.command.ProfileTaskCommand;
 import org.apache.skywalking.oap.server.core.query.type.ProfileTask;
 import org.apache.skywalking.oap.server.library.module.ModuleManager;
@@ -57,11 +61,32 @@ public class CommandService implements Service {
             fixedTrigger = new EBPFProfilingTaskCommand.FixedTrigger(task.getFixedTriggerDuration());
         }
         return new EBPFProfilingTaskCommand(serialNumber, task.getTaskId(), processId, task.getTaskStartTime(),
-                task.getLastUpdateTime(), task.getTriggerType().name(), fixedTrigger, task.getTargetType().name());
+                task.getLastUpdateTime(), task.getTriggerType().name(), fixedTrigger, task.getTargetType().name(),
+                convertExtension(task));
     }
 
-    private String generateSerialNumber(final int serviceInstanceId, final long time,
-                                        final String serviceInstanceUUID) {
-        return UUID.randomUUID().toString(); // Simply generate a uuid without taking care of the parameters
+    private EBPFProfilingTaskExtensionConfig convertExtension(EBPFProfilingTask task) {
+        EBPFProfilingTaskExtension extensionConfig = task.getExtensionConfig();
+        if (extensionConfig == null || CollectionUtils.isEmpty(extensionConfig.getNetworkSamplings())) {
+            return null;
+        }
+        EBPFProfilingTaskExtensionConfig config = new EBPFProfilingTaskExtensionConfig();
+        config.setNetworkSamplings(extensionConfig.getNetworkSamplings().stream().map(s -> {
+            return EBPFProfilingTaskExtensionConfig.NetworkSamplingRule.builder()
+                    .uriRegex(s.getUriRegex())
+                    .minDuration(s.getMinDuration())
+                    .when4xx(s.isWhen5xx())
+                    .when5xx(s.isWhen5xx())
+                    .settings(EBPFProfilingTaskExtensionConfig.CollectSettings.builder()
+                            .requireCompleteRequest(s.getSettings().isRequireCompleteRequest())
+                            .maxRequestSize(s.getSettings().getMaxRequestSize())
+                            .requireCompleteResponse(s.getSettings().isRequireCompleteResponse())
+                            .maxResponseSize(s.getSettings().getMaxResponseSize())
+                            .build())
+                    .build();
+        }).collect(Collectors.toList()));
+
+        return config;
     }
+
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/profiling/ebpf/EBPFProfilingMutationService.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/profiling/ebpf/EBPFProfilingMutationService.java
index bb8df1a718..63aa15905f 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/profiling/ebpf/EBPFProfilingMutationService.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/profiling/ebpf/EBPFProfilingMutationService.java
@@ -19,6 +19,7 @@
 package org.apache.skywalking.oap.server.core.profiling.ebpf;
 
 import com.google.common.base.Joiner;
+import com.google.common.collect.Maps;
 import com.google.gson.Gson;
 import lombok.RequiredArgsConstructor;
 import org.apache.skywalking.oap.server.core.Const;
@@ -28,11 +29,14 @@ import org.apache.skywalking.oap.server.core.analysis.worker.NoneStreamProcessor
 import org.apache.skywalking.oap.server.core.profiling.ebpf.storage.EBPFProfilingTargetType;
 import org.apache.skywalking.oap.server.core.profiling.ebpf.storage.EBPFProfilingTriggerType;
 import org.apache.skywalking.oap.server.core.profiling.ebpf.storage.EBPFProfilingTaskRecord;
+import org.apache.skywalking.oap.server.core.query.input.EBPFNetworkDataCollectingSettings;
+import org.apache.skywalking.oap.server.core.query.input.EBPFNetworkSamplingRule;
 import org.apache.skywalking.oap.server.core.query.input.EBPFProfilingNetworkTaskRequest;
 import org.apache.skywalking.oap.server.core.query.input.EBPFProfilingTaskFixedTimeCreationRequest;
 import org.apache.skywalking.oap.server.core.query.type.EBPFNetworkKeepProfilingResult;
 import org.apache.skywalking.oap.server.core.query.type.EBPFProfilingTask;
 import org.apache.skywalking.oap.server.core.query.type.EBPFProfilingTaskCreationResult;
+import org.apache.skywalking.oap.server.core.query.type.EBPFProfilingTaskExtension;
 import org.apache.skywalking.oap.server.core.storage.StorageModule;
 import org.apache.skywalking.oap.server.core.storage.profiling.ebpf.IEBPFProfilingTaskDAO;
 import org.apache.skywalking.oap.server.core.storage.profiling.ebpf.IServiceLabelDAO;
@@ -47,6 +51,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Comparator;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Objects;
 import java.util.concurrent.TimeUnit;
@@ -121,6 +126,7 @@ public class EBPFProfilingMutationService implements Service {
         task.setLastUpdateTime(current);
         task.setTimeBucket(TimeBucket.getMinuteTimeBucket(current));
         task.generateLogicalId();
+        task.setExtensionConfigJson(Const.EMPTY_STRING);
         NoneStreamProcessor.getInstance().in(task);
 
         return EBPFProfilingTaskCreationResult.builder().status(true).id(task.getLogicalId()).build();
@@ -149,6 +155,9 @@ public class EBPFProfilingMutationService implements Service {
         task.setCreateTime(current);
         task.setLastUpdateTime(current);
         task.setTimeBucket(TimeBucket.getMinuteTimeBucket(current));
+        final EBPFProfilingTaskExtension extensionConfig = new EBPFProfilingTaskExtension();
+        extensionConfig.setNetworkSamplings(request.getSamplings());
+        task.setExtensionConfigJson(GSON.toJson(extensionConfig));
         task.generateLogicalId();
         NoneStreamProcessor.getInstance().in(task);
 
@@ -190,6 +199,7 @@ public class EBPFProfilingMutationService implements Service {
         record.setTargetType(EBPFProfilingTargetType.NETWORK.value());
         record.setCreateTime(now.getTimeInMillis());
         record.setLastUpdateTime(now.getTimeInMillis());
+        record.setExtensionConfigJson(Const.EMPTY_STRING);
         NoneStreamProcessor.getInstance().in(record);
         return buildKeepProfilingSuccess();
     }
@@ -271,6 +281,58 @@ public class EBPFProfilingMutationService implements Service {
             return "The instance doesn't have processes.";
         }
 
+        if (StringUtil.isNotEmpty(err = validateSamplingRules(request.getSamplings()))) {
+            return err;
+        }
+
+        return null;
+    }
+
+    private String validateSamplingRules(List<EBPFNetworkSamplingRule> rules) {
+        if (CollectionUtils.isEmpty(rules)) {
+            return null;
+        }
+
+        String error;
+        boolean alreadyContainerNullSetting = false;
+        final HashMap<String, EBPFNetworkSamplingRule> urlSampling = Maps.newHashMap();
+        for (EBPFNetworkSamplingRule rule : rules) {
+            if (StringUtil.isEmpty(rule.getUriRegex())) {
+                if (alreadyContainerNullSetting) {
+                    return "already contains the default sampling config";
+                }
+                alreadyContainerNullSetting = true;
+            } else {
+                if (urlSampling.get(rule.getUriRegex()) != null) {
+                    return "already contains the \"" + rule.getUriRegex() + "\" sampling config";
+                }
+                urlSampling.put(rule.getUriRegex(), rule);
+            }
+
+            if (StringUtil.isNotEmpty(error = validateSingleSampleRule(rule))) {
+                return error;
+            }
+        }
+        return null;
+    }
+
+    private String validateSingleSampleRule(EBPFNetworkSamplingRule rule) {
+        if (rule.getMinDuration() != null && rule.getMinDuration() < 0) {
+            return "the min duration must bigger or equals zero";
+        }
+        final EBPFNetworkDataCollectingSettings settings = rule.getSettings();
+        if (settings == null) {
+            return "the rule sampling setting cannot be null";
+        }
+        if (!settings.isRequireCompleteRequest() && !settings.isRequireCompleteResponse()) {
+            return "please collect at least one of request or response";
+        }
+        if (settings.getMaxRequestSize() != null && settings.getMaxRequestSize() <= 0) {
+            return "the max request size must bigger than zero";
+        }
+        if (settings.getMaxResponseSize() != null && settings.getMaxResponseSize() <= 0) {
+            return "the max response size must bigger than zero";
+        }
         return null;
     }
 
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/profiling/ebpf/storage/EBPFProfilingTaskRecord.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/profiling/ebpf/storage/EBPFProfilingTaskRecord.java
index 95676c1940..98c4894143 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/profiling/ebpf/storage/EBPFProfilingTaskRecord.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/profiling/ebpf/storage/EBPFProfilingTaskRecord.java
@@ -52,8 +52,10 @@ public class EBPFProfilingTaskRecord extends NoneStream {
     public static final String TARGET_TYPE = "target_type";
     public static final String CREATE_TIME = "create_time";
     public static final String LAST_UPDATE_TIME = "last_update_time";
+    public static final String EXTENSION_CONFIG_JSON = "extension_config_json";
 
     public static final int PROCESS_LABELS_JSON_MAX_LENGTH = 1000;
+    public static final int EXTENSION_CONFIG_JSON_MAX_LENGTH = 1000;
 
     @Column(columnName = LOGICAL_ID)
     private String logicalId;
@@ -76,6 +78,8 @@ public class EBPFProfilingTaskRecord extends NoneStream {
     private long createTime;
     @Column(columnName = LAST_UPDATE_TIME)
     private long lastUpdateTime;
+    @Column(columnName = EXTENSION_CONFIG_JSON, length = EXTENSION_CONFIG_JSON_MAX_LENGTH, storageOnly = true)
+    private String extensionConfigJson;
 
     @Override
     public String id() {
@@ -112,6 +116,7 @@ public class EBPFProfilingTaskRecord extends NoneStream {
             record.setCreateTime(((Number) converter.get(CREATE_TIME)).longValue());
             record.setLastUpdateTime(((Number) converter.get(LAST_UPDATE_TIME)).longValue());
             record.setTimeBucket(((Number) converter.get(TIME_BUCKET)).longValue());
+            record.setExtensionConfigJson((String) converter.get(EXTENSION_CONFIG_JSON));
             return record;
         }
 
@@ -128,6 +133,7 @@ public class EBPFProfilingTaskRecord extends NoneStream {
             converter.accept(CREATE_TIME, storageData.getCreateTime());
             converter.accept(LAST_UPDATE_TIME, storageData.getLastUpdateTime());
             converter.accept(TIME_BUCKET, storageData.getTimeBucket());
+            converter.accept(EXTENSION_CONFIG_JSON, storageData.getExtensionConfigJson());
         }
     }
 }
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/EBPFProfilingNetworkTaskRequest.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/EBPFNetworkDataCollectingSettings.java
similarity index 63%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/EBPFProfilingNetworkTaskRequest.java
copy to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/EBPFNetworkDataCollectingSettings.java
index 42377b3c94..ba8b9e8559 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/EBPFProfilingNetworkTaskRequest.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/EBPFNetworkDataCollectingSettings.java
@@ -25,7 +25,16 @@ import lombok.NoArgsConstructor;
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
-public class EBPFProfilingNetworkTaskRequest {
-    // Define which processes under the service instance need to be profiling
-    private String instanceId;
+public class EBPFNetworkDataCollectingSettings {
+    // Require to collect the complete request
+    private boolean requireCompleteRequest;
+    // The max size of request context. The unit is byte.
+    // Collect the whole request header and body if this is not set.
+    private Integer maxRequestSize;
+
+    // Require to collect the complete response
+    private boolean requireCompleteResponse;
+    // The max size of response context. The unit is byte.
+    // Collect the whole response header and body if this is not set.
+    private Integer maxResponseSize;
 }
\ No newline at end of file
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/EBPFProfilingNetworkTaskRequest.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/EBPFNetworkSamplingRule.java
similarity index 60%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/EBPFProfilingNetworkTaskRequest.java
copy to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/EBPFNetworkSamplingRule.java
index 42377b3c94..f7e5cec287 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/EBPFProfilingNetworkTaskRequest.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/EBPFNetworkSamplingRule.java
@@ -25,7 +25,19 @@ import lombok.NoArgsConstructor;
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
-public class EBPFProfilingNetworkTaskRequest {
-    // Define which processes under the service instance need to be profiling
-    private String instanceId;
-}
\ No newline at end of file
+public class EBPFNetworkSamplingRule {
+    // The match pattern for HTTP request. This is HTTP URI-oriented.
+    // Matches all requests if not set
+    private String uriRegex;
+
+    // The minimal request duration to activate the network data(HTTP request/response raw data) sampling.
+    // Collecting requests without minimal request duration.
+    private Integer minDuration;
+    // Collecting requests when the response code is 400-499.
+    private boolean when4xx;
+    // Collecting requests when the response code is 500-599
+    private boolean when5xx;
+
+    // Define how to collect sampled data
+    private EBPFNetworkDataCollectingSettings settings;
+}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/EBPFProfilingNetworkTaskRequest.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/EBPFProfilingNetworkTaskRequest.java
index 42377b3c94..4b0c439648 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/EBPFProfilingNetworkTaskRequest.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/EBPFProfilingNetworkTaskRequest.java
@@ -22,10 +22,16 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.util.List;
+
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
 public class EBPFProfilingNetworkTaskRequest {
     // Define which processes under the service instance need to be profiling
     private String instanceId;
+
+    // The rule list for network profiling.
+    // Set various rules for different HTTP URIs if necessary.
+    private List<EBPFNetworkSamplingRule> samplings;
 }
\ No newline at end of file
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/EBPFProfilingTask.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/EBPFProfilingTask.java
index cbe255255e..87b4706499 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/EBPFProfilingTask.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/EBPFProfilingTask.java
@@ -39,6 +39,7 @@ public class EBPFProfilingTask {
     private EBPFProfilingTargetType targetType;
     private long createTime;
     private long lastUpdateTime;
+    private EBPFProfilingTaskExtension extensionConfig;
 
     /**
      * combine the same task
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/EBPFProfilingNetworkTaskRequest.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/EBPFProfilingTaskExtension.java
similarity index 75%
copy from oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/EBPFProfilingNetworkTaskRequest.java
copy to oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/EBPFProfilingTaskExtension.java
index 42377b3c94..d768788d3a 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/input/EBPFProfilingNetworkTaskRequest.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/query/type/EBPFProfilingTaskExtension.java
@@ -16,16 +16,20 @@
  *
  */
 
-package org.apache.skywalking.oap.server.core.query.input;
+package org.apache.skywalking.oap.server.core.query.type;
 
 import lombok.AllArgsConstructor;
+import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.apache.skywalking.oap.server.core.query.input.EBPFNetworkSamplingRule;
+
+import java.util.List;
 
 @Data
-@AllArgsConstructor
+@Builder
 @NoArgsConstructor
-public class EBPFProfilingNetworkTaskRequest {
-    // Define which processes under the service instance need to be profiling
-    private String instanceId;
-}
\ No newline at end of file
+@AllArgsConstructor
+public class EBPFProfilingTaskExtension {
+    private List<EBPFNetworkSamplingRule> networkSamplings;
+}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DefaultScopeDefine.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DefaultScopeDefine.java
index a7cacff910..9b47583caa 100644
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DefaultScopeDefine.java
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/DefaultScopeDefine.java
@@ -120,6 +120,8 @@ public class DefaultScopeDefine {
     public static final int MESSAGE_QUEUE_ENDPOINT_ACCESS = 64;
 
     public static final int SPAN_ATTACHED_EVENT = 65;
+    public static final int SAMPLED_STATUS_4XX_TRACE = 66;
+    public static final int SAMPLED_STATUS_5XX_TRACE = 67;
 
     /**
      * Catalog of scope, the metrics processor could use this to group all generated metrics by oal rt.
diff --git a/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol b/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol
index 6ebb10a411..90724a9c49 160000
--- a/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol
+++ b/oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol
@@ -1 +1 @@
-Subproject commit 6ebb10a411902cfca1b36e9fe6133f0e347433ea
+Subproject commit 90724a9c4982ea806d6ad58304ed70d3c3758248
diff --git a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBEBPFProfilingTaskDAO.java b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBEBPFProfilingTaskDAO.java
index f36f8adfa3..b024bcece6 100644
--- a/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBEBPFProfilingTaskDAO.java
+++ b/oap-server/server-storage-plugin/storage-banyandb-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/banyandb/stream/BanyanDBEBPFProfilingTaskDAO.java
@@ -29,6 +29,7 @@ import org.apache.skywalking.oap.server.core.profiling.ebpf.storage.EBPFProfilin
 import org.apache.skywalking.oap.server.core.profiling.ebpf.storage.EBPFProfilingTaskRecord;
 import org.apache.skywalking.oap.server.core.profiling.ebpf.storage.EBPFProfilingTriggerType;
 import org.apache.skywalking.oap.server.core.query.type.EBPFProfilingTask;
+import org.apache.skywalking.oap.server.core.query.type.EBPFProfilingTaskExtension;
 import org.apache.skywalking.oap.server.core.storage.profiling.ebpf.IEBPFProfilingTaskDAO;
 import org.apache.skywalking.oap.server.library.util.CollectionUtils;
 import org.apache.skywalking.oap.server.library.util.StringUtil;
@@ -161,6 +162,9 @@ public class BanyanDBEBPFProfilingTaskDAO extends AbstractBanyanDBDAO implements
         task.setTargetType(EBPFProfilingTargetType.valueOf(record.getTargetType()));
         task.setCreateTime(record.getCreateTime());
         task.setLastUpdateTime(record.getLastUpdateTime());
+        if (StringUtil.isNotEmpty(record.getExtensionConfigJson())) {
+            task.setExtensionConfig(GSON.fromJson(record.getExtensionConfigJson(), EBPFProfilingTaskExtension.class));
+        }
         return task;
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/EBPFProfilingTaskEsDAO.java b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/EBPFProfilingTaskEsDAO.java
index f26fa2b2d6..de23ed7a28 100644
--- a/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/EBPFProfilingTaskEsDAO.java
+++ b/oap-server/server-storage-plugin/storage-elasticsearch-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/elasticsearch/query/EBPFProfilingTaskEsDAO.java
@@ -31,6 +31,7 @@ import org.apache.skywalking.oap.server.core.profiling.ebpf.storage.EBPFProfilin
 import org.apache.skywalking.oap.server.core.profiling.ebpf.storage.EBPFProfilingTaskRecord;
 import org.apache.skywalking.oap.server.core.profiling.ebpf.storage.EBPFProfilingTriggerType;
 import org.apache.skywalking.oap.server.core.query.type.EBPFProfilingTask;
+import org.apache.skywalking.oap.server.core.query.type.EBPFProfilingTaskExtension;
 import org.apache.skywalking.oap.server.core.storage.profiling.ebpf.IEBPFProfilingTaskDAO;
 import org.apache.skywalking.oap.server.library.client.elasticsearch.ElasticSearchClient;
 import org.apache.skywalking.oap.server.library.util.CollectionUtils;
@@ -159,6 +160,9 @@ public class EBPFProfilingTaskEsDAO extends EsDAO implements IEBPFProfilingTaskD
         task.setTargetType(EBPFProfilingTargetType.valueOf(record.getTargetType()));
         task.setCreateTime(record.getCreateTime());
         task.setLastUpdateTime(record.getLastUpdateTime());
+        if (StringUtil.isNotEmpty(record.getExtensionConfigJson())) {
+            task.setExtensionConfig(GSON.fromJson(record.getExtensionConfigJson(), EBPFProfilingTaskExtension.class));
+        }
         return task;
     }
 }
diff --git a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/common/dao/JDBCEBPFProfilingTaskDAO.java b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/common/dao/JDBCEBPFProfilingTaskDAO.java
index c4b3d4bcd0..897a8d9ee7 100644
--- a/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/common/dao/JDBCEBPFProfilingTaskDAO.java
+++ b/oap-server/server-storage-plugin/storage-jdbc-hikaricp-plugin/src/main/java/org/apache/skywalking/oap/server/storage/plugin/jdbc/common/dao/JDBCEBPFProfilingTaskDAO.java
@@ -25,6 +25,7 @@ import org.apache.skywalking.oap.server.core.profiling.ebpf.storage.EBPFProfilin
 import org.apache.skywalking.oap.server.core.profiling.ebpf.storage.EBPFProfilingTaskRecord;
 import org.apache.skywalking.oap.server.core.profiling.ebpf.storage.EBPFProfilingTriggerType;
 import org.apache.skywalking.oap.server.core.query.type.EBPFProfilingTask;
+import org.apache.skywalking.oap.server.core.query.type.EBPFProfilingTaskExtension;
 import org.apache.skywalking.oap.server.core.storage.profiling.ebpf.IEBPFProfilingTaskDAO;
 import org.apache.skywalking.oap.server.library.client.jdbc.hikaricp.JDBCHikariCPClient;
 import org.apache.skywalking.oap.server.library.util.CollectionUtils;
@@ -164,6 +165,10 @@ public class JDBCEBPFProfilingTaskDAO implements IEBPFProfilingTaskDAO {
                     resultSet.getInt(EBPFProfilingTaskRecord.TARGET_TYPE)));
             task.setCreateTime(resultSet.getLong(EBPFProfilingTaskRecord.CREATE_TIME));
             task.setLastUpdateTime(resultSet.getLong(EBPFProfilingTaskRecord.LAST_UPDATE_TIME));
+            String extensionConfigJson = resultSet.getString(EBPFProfilingTaskRecord.EXTENSION_CONFIG_JSON);
+            if (StringUtil.isNotEmpty(extensionConfigJson)) {
+                task.setExtensionConfig(GSON.fromJson(extensionConfigJson, EBPFProfilingTaskExtension.class));
+            }
 
             tasks.add(task);
         }