| # Profiling APIs |
| |
| SkyWalking offers two types of Profiling, in-process and out-process, each with its own API. |
| |
| ## In-process profiling APIs |
| |
| [In-process profiling](../concepts-and-designs/profiling.md#in-process-profiling) commonly interacts with auto-instrument agents. It gathers stack traces of programs and sends the data to the OAP for further analysis. |
| |
| ```protobuf |
| syntax = "proto3"; |
| |
| package skywalking.v3; |
| |
| option java_multiple_files = true; |
| option java_package = "org.apache.skywalking.apm.network.language.profile.v3"; |
| option csharp_namespace = "SkyWalking.NetworkProtocol.V3"; |
| option go_package = "skywalking.apache.org/repo/goapi/collect/language/profile/v3"; |
| |
| import "common/Command.proto"; |
| |
| service ProfileTask { |
| |
| // query all sniffer need to execute profile task commands |
| rpc getProfileTaskCommands (ProfileTaskCommandQuery) returns (Commands) { |
| } |
| |
| // collect dumped thread snapshot |
| rpc collectSnapshot (stream ThreadSnapshot) returns (Commands) { |
| } |
| |
| // report profiling task finished |
| rpc reportTaskFinish (ProfileTaskFinishReport) returns (Commands) { |
| } |
| |
| } |
| |
| message ProfileTaskCommandQuery { |
| // current sniffer information |
| string service = 1; |
| string serviceInstance = 2; |
| |
| // last command timestamp |
| int64 lastCommandTime = 3; |
| } |
| |
| // dumped thread snapshot |
| message ThreadSnapshot { |
| // profile task id |
| string taskId = 1; |
| // dumped segment id |
| string traceSegmentId = 2; |
| // dump timestamp |
| int64 time = 3; |
| // snapshot dump sequence, start with zero |
| int32 sequence = 4; |
| // snapshot stack |
| ThreadStack stack = 5; |
| } |
| |
| message ThreadStack { |
| // stack code signature list |
| repeated string codeSignatures = 1; |
| } |
| |
| // profile task finished report |
| message ProfileTaskFinishReport { |
| // current sniffer information |
| string service = 1; |
| string serviceInstance = 2; |
| |
| // profile task |
| string taskId = 3; |
| } |
| ``` |
| |
| ## Out-process profiling |
| |
| [Out-process profiling](../concepts-and-designs/profiling.md#out-of-process-profiling) interacts with eBPF agent, which receives tasks and captures data, then reports it to the OAP for further analysis. |
| |
| ### Process APIs |
| |
| Similar to Service Instance, all processes must be reported to the OAP storage segment prior to analysis. |
| |
| ```protobuf |
| syntax = "proto3"; |
| |
| package skywalking.v3; |
| |
| option java_multiple_files = true; |
| option java_package = "org.apache.skywalking.apm.network.ebpf.profiling.process.v3"; |
| option go_package = "skywalking.apache.org/repo/goapi/collect/ebpf/profiling/process/v3"; |
| |
| import "common/Common.proto"; |
| import "common/Command.proto"; |
| |
| // Define the detected processes and report them. |
| service EBPFProcessService { |
| // Report discovered process in Rover |
| rpc reportProcesses (EBPFProcessReportList) returns (EBPFReportProcessDownstream) { |
| } |
| |
| // Keep the process alive in the backend. |
| rpc keepAlive (EBPFProcessPingPkgList) returns (Commands) { |
| } |
| } |
| |
| message EBPFProcessReportList { |
| repeated EBPFProcessProperties processes = 1; |
| // An ID generated by eBPF agent, should be unique globally. |
| string ebpfAgentID = 2; |
| } |
| |
| message EBPFProcessProperties { |
| // The Process metadata |
| oneof metadata { |
| EBPFHostProcessMetadata hostProcess = 1; |
| EBPFKubernetesProcessMetadata k8sProcess = 2; |
| } |
| } |
| |
| message EBPFHostProcessMetadata { |
| // [required] Entity metadata |
| // Must ensure that entity information is unique at the time of reporting |
| EBPFProcessEntityMetadata entity = 1; |
| // [required] The Process id of the host |
| int32 pid = 2; |
| // [optional] properties of the process |
| repeated KeyStringValuePair properties = 3; |
| } |
| |
| // Process Entity metadata |
| message EBPFProcessEntityMetadata { |
| // [required] Process belong layer name which define in the backend |
| string layer = 1; |
| // [required] Process belong service name |
| string serviceName = 2; |
| // [required] Process belong service instance name |
| string instanceName = 3; |
| // [required] Process name |
| string processName = 4; |
| // Process labels for aggregate from service |
| repeated string labels = 5; |
| } |
| |
| // Kubernetes process metadata |
| message EBPFKubernetesProcessMetadata { |
| // [required] Entity metadata |
| // Must ensure that entity information is unique at the time of reporting |
| EBPFProcessEntityMetadata entity = 1; |
| // [required] The Process id of the host |
| int32 pid = 2; |
| // [optional] properties of the process |
| repeated KeyStringValuePair properties = 3; |
| } |
| |
| message EBPFReportProcessDownstream { |
| repeated EBPFProcessDownstream processes = 1; |
| } |
| |
| message EBPFProcessDownstream { |
| // Generated process id |
| string processId = 1; |
| // Locate the process by basic information |
| oneof process { |
| EBPFHostProcessDownstream hostProcess = 2; |
| EBPFKubernetesProcessDownstream k8sProcess = 3; |
| } |
| } |
| |
| message EBPFHostProcessDownstream { |
| int32 pid = 1; |
| EBPFProcessEntityMetadata entityMetadata = 2; |
| } |
| |
| // Kubernetes process downstream |
| message EBPFKubernetesProcessDownstream { |
| int32 pid = 1; |
| EBPFProcessEntityMetadata entityMetadata = 2; |
| } |
| |
| message EBPFProcessPingPkgList { |
| repeated EBPFProcessPingPkg processes = 1; |
| // An ID generated by eBPF agent, should be unique globally. |
| string ebpfAgentID = 2; |
| } |
| |
| message EBPFProcessPingPkg { |
| // Process entity |
| EBPFProcessEntityMetadata entityMetadata = 1; |
| // Minimize necessary properties |
| repeated KeyStringValuePair properties = 2; |
| } |
| ``` |
| |
| ### Out-process profiling APIs |
| |
| ```protobuf |
| 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"; |
| |
| // Define the Rover Process profiling task and upload profiling data. |
| service EBPFProfilingService { |
| // Query profiling (start or stop) tasks |
| rpc queryTasks (EBPFProfilingTaskQuery) returns (Commands) { |
| } |
| |
| // collect profiling data |
| rpc collectProfilingData (stream EBPFProfilingData) returns (Commands) { |
| } |
| } |
| |
| message EBPFProfilingTaskQuery { |
| // rover instance id |
| string roverInstanceId = 1; |
| |
| // latest task update time |
| int64 latestUpdateTime = 2; |
| } |
| |
| message EBPFProfilingData { |
| // task metadata |
| EBPFProfilingTaskMetadata task = 1; |
| // profiling data |
| oneof profiling { |
| EBPFOnCPUProfiling onCPU = 2; |
| EBPFOffCPUProfiling offCPU = 3; |
| } |
| } |
| |
| message EBPFProfilingTaskMetadata { |
| // profiling task id |
| string taskId = 1; |
| // profiling process id |
| string processId = 2; |
| // the start time of this profiling process |
| int64 profilingStartTime = 3; |
| // report time |
| int64 currentTime = 4; |
| } |
| |
| message EBPFProfilingStackMetadata { |
| // stack type |
| EBPFProfilingStackType stackType = 1; |
| // stack id from kernel provide |
| int32 stackId = 2; |
| // stack symbols |
| repeated string stackSymbols = 3; |
| } |
| |
| enum EBPFProfilingStackType { |
| PROCESS_KERNEL_SPACE = 0; |
| PROCESS_USER_SPACE = 1; |
| } |
| |
| message EBPFOnCPUProfiling { |
| // stack data in one task(thread) |
| repeated EBPFProfilingStackMetadata stacks = 1; |
| // stack counts |
| int32 dumpCount = 2; |
| } |
| |
| message EBPFOffCPUProfiling { |
| // stack data in one task(thread) |
| repeated EBPFProfilingStackMetadata stacks = 1; |
| // total count of the process is switched to off cpu by the scheduler. |
| int32 switchCount = 2; |
| // where time(nanoseconds) is spent waiting while blocked on I/O, locks, timers, paging/swapping, etc. |
| int64 duration = 3; |
| } |
| ``` |