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);
}