Support continuous profiling feature (#83)
diff --git a/common/Command.proto b/common/Command.proto
index c62c695..f4f7328 100644
--- a/common/Command.proto
+++ b/common/Command.proto
@@ -74,6 +74,28 @@
// MaxResponseSize: Integer
// ------------------------
// FixedTriggerDuration: Long
+//
+// Name: ContinuousProfilingPolicyQuery
+// Args:
+// ServiceWithPolicyJSON: List JSON serialization of ServiceWithPolicy.
+// --- ServiceWithPolicy ---
+// ServiceName: String
+// UUID: String
+// Profiling: Multiple profiling configuration. Map
+// Key: Profiling type. Enum, value = ON_CPU, OFF_CPU, NETWORK
+// Value: Profiling policies. Map
+// Key: Monitoring type. Enum, value = PROCESS_CPU, PROCESS_THREAD_COUNT, SYSTEM_LOAD, HTTP_ERROR_RATE, HTTP_AVG_RESPONSE_TIME
+// Value: Policy configuration. Object.
+// Threshold: String
+// Period(s): Integer
+// Count: Integer
+// URIList: List<String>
+// URIRegex: String
+// ---------------------------
+//
+// Name: ContinuousProfilingReportTask
+// Args:
+// TaskId: String
message Command {
// Use command name to distinguish different data type.
string command = 1;
diff --git a/ebpf/profiling/Continuous.proto b/ebpf/profiling/Continuous.proto
new file mode 100644
index 0000000..b39e42a
--- /dev/null
+++ b/ebpf/profiling/Continuous.proto
@@ -0,0 +1,123 @@
+/*
+ * 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.
+ *
+ */
+
+syntax = "proto3";
+
+package skywalking.v3;
+
+option java_multiple_files = true;
+option java_package = "org.apache.skywalking.apm.network.ebpf.profiling.v3";
+option go_package = "skywalking.apache.org/repo/goapi/collect/ebpf/profiling/v3";
+
+import "common/Command.proto";
+
+service ContinuousProfilingService {
+ // Query continuous profiling policy
+ rpc queryPolicies(ContinuousProfilingPolicyQuery) returns (Commands) {
+ }
+
+ // Report the profiling task when the policy threshold is reached
+ // Use the returned task ID to perform the profiling task through EBPFProfilingService#collectProfilingData.
+ rpc reportProfilingTask(ContinuousProfilingReport) returns (Commands) {
+ }
+}
+
+message ContinuousProfilingPolicyQuery {
+ // current agent contains service and policies
+ repeated ContinuousProfilingServicePolicyQuery policies = 1;
+}
+
+message ContinuousProfilingServicePolicyQuery {
+ // service name of the each process
+ string serviceName = 1;
+ // UUID represents the version(hash/shasum) of the current policies for the service.
+ // This is blank in the initialization stage and is set through the `ContinuousProfilingPolicyQuery` command response for the following rounds of queries.
+ string uuid = 2;
+}
+
+message ContinuousProfilingReport {
+ // over threshold process entity
+ string layer = 1;
+ string serviceName = 2;
+ string instanceName = 3;
+ string processName = 4;
+
+ // reached thresholds causes
+ repeated ContinuousProfilingCause causes = 5;
+
+ // The execution duration for this triggered profiling.
+ // This is set at the agent side.
+ int32 duration = 6;
+ // target profiling task
+ oneof targetTask {
+ ContinuousOnCPUProfilingTask onCPU = 7;
+ ContinuousOffCPUProfilingTask offCPU = 8;
+ ContinuousNetworkProfilingTask network = 9;
+ }
+}
+
+message ContinuousProfilingCause {
+ ContinuousProfilingCauseType type = 1;
+ oneof cause {
+ ContinuousProfilingSingleValueCause singleValue = 2;
+ ContinuousProfilingURICause uri = 3;
+ }
+}
+
+enum ContinuousProfilingCauseType {
+ // Current process CPU usage percent(0-100).
+ ProcessCPU = 0;
+ // The number of threads in the process.
+ ProcessThreadCount = 1;
+ // System load value.
+ SystemLoad = 2;
+ // Process response error rate(0-100).
+ // HTTP response codes in [500-600) are considered errors.
+ // Formula: ErrorCount / TotalCount * 100
+ HTTPErrorRate = 3;
+ // Process response average time(ms).
+ // Formula: TotalResponseTime(ms) / TotalCount
+ HTTPAvgResponseTime = 4;
+}
+
+message ContinuousProfilingSingleValueCause {
+ double threshold = 1;
+ double current = 2;
+}
+
+message ContinuousProfilingURICause {
+ oneof uri {
+ string regex = 1;
+ string path = 2;
+ }
+ double threshold = 3;
+ double current = 4;
+}
+
+// eBPF on CPU profiling task
+message ContinuousOnCPUProfilingTask {
+}
+
+// eBPF off CPU profiling task
+message ContinuousOffCPUProfilingTask {
+}
+
+// eBPF Network profiling task
+message ContinuousNetworkProfilingTask {
+ string samplingURIRegex = 1;
+}
\ No newline at end of file