Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
41acb04
feat: support pprof feature
JophieQu Sep 18, 2025
6b4640f
fix
JophieQu Sep 18, 2025
a54d8dc
fix
JophieQu Sep 24, 2025
d069e68
fix: rollback yaml
JophieQu Sep 24, 2025
1afb571
fix
JophieQu Sep 29, 2025
2578bd1
fix
JophieQu Sep 29, 2025
4c03a81
add jdbc & es storage
JophieQu Oct 10, 2025
5520d01
test ci
JophieQu Oct 10, 2025
c965482
update proto
JophieQu Oct 10, 2025
c467076
fix query submules
JophieQu Oct 11, 2025
5000e71
fix ci
JophieQu Oct 11, 2025
cce039d
fix ci
JophieQu Oct 11, 2025
3989494
ci test (to rollback)
JophieQu Oct 11, 2025
232cdc4
fix
JophieQu Oct 12, 2025
1dc8fcd
Merge remote-tracking branch 'origin/master' into ci
JophieQu Oct 12, 2025
e8f44ad
fix
JophieQu Oct 14, 2025
f46887f
fix e2e
JophieQu Oct 14, 2025
f49e7a3
fix e2e
JophieQu Oct 14, 2025
3449d89
fix e2e docker path
JophieQu Oct 14, 2025
26956b0
fix
JophieQu Oct 14, 2025
baaf886
fix
JophieQu Oct 14, 2025
62fd3fb
fix
JophieQu Oct 15, 2025
88692d1
fix duration
JophieQu Oct 15, 2025
843585f
fix
JophieQu Oct 15, 2025
07fe14c
fix port
JophieQu Oct 15, 2025
2e62876
fix e2e
JophieQu Oct 15, 2025
02a5b55
fix e2e
JophieQu Oct 15, 2025
ed0403a
fix e2e
JophieQu Oct 15, 2025
fc0ae02
Add self obs metrics for L1/L2 queue and persistent cache. (#13405)
wankai123 Aug 8, 2025
b3d09ca
add design doc
JophieQu Oct 15, 2025
c6d7a79
fix so11y UI template MQE (#13411)
wankai123 Aug 11, 2025
e8253f0
test ci
JophieQu Oct 10, 2025
a438569
merge
JophieQu Oct 10, 2025
4df8bd2
merge change
JophieQu Oct 15, 2025
78d2e8a
Merge branch 'ci' into feat/pprof
JophieQu Oct 15, 2025
b5f3e89
rollback ci
JophieQu Oct 15, 2025
57fc59f
rollback ci
JophieQu Oct 15, 2025
1b7d636
Merge remote-tracking branch 'origin/master' into feat/pprof
JophieQu Oct 15, 2025
39911d4
fix ci
JophieQu Oct 16, 2025
78a2c9c
test ci(to roll back)
JophieQu Oct 16, 2025
a4882ff
test ci(to roll back)
JophieQu Oct 16, 2025
ba4f02f
fix ci
JophieQu Oct 16, 2025
9c1379a
fix
JophieQu Oct 16, 2025
6a2dd3a
test
JophieQu Oct 16, 2025
050a339
Fix
JophieQu Oct 16, 2025
602917d
fix go agent e2e
JophieQu Oct 16, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 23 additions & 13 deletions .github/workflows/skywalking.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@
name: CI

on:
push:
branches:
- citest
pull_request:
schedule:
- cron: "0 18 * * *" # TimeZone: UTC 0
Expand All @@ -32,7 +35,7 @@ env:

jobs:
license-header:
if: (github.event_name == 'schedule' && github.repository == 'apache/skywalking') || (github.event_name != 'schedule')
if: (github.event_name == 'schedule' && github.repository == 'JophieQu/skywalking') || (github.event_name != 'schedule')
name: License header
runs-on: ubuntu-latest
timeout-minutes: 10
Expand All @@ -45,7 +48,7 @@ jobs:
uses: apache/skywalking-eyes@5b7ee1731d036b5aac68f8bd3fc9e6f98ada082e

code-style:
if: (github.event_name == 'schedule' && github.repository == 'apache/skywalking') || (github.event_name != 'schedule')
if: (github.event_name == 'schedule' && github.repository == 'JophieQu/skywalking') || (github.event_name != 'schedule')
name: Code style
runs-on: ubuntu-latest
timeout-minutes: 10
Expand All @@ -60,7 +63,7 @@ jobs:
dependency-license:
if: |
( always() && ! cancelled() ) &&
((github.event_name == 'schedule' && github.repository == 'apache/skywalking') || needs.changes.outputs.pom == 'true' || needs.changes.outputs.ui == 'true')
((github.event_name == 'schedule' && github.repository == 'JophieQu/skywalking') || needs.changes.outputs.pom == 'true' || needs.changes.outputs.ui == 'true')
name: Dependency licenses
needs: [changes]
runs-on: ubuntu-latest
Expand Down Expand Up @@ -90,7 +93,7 @@ jobs:
fi

sanity-check:
if: ( always() && ! cancelled() ) && (github.event_name == 'schedule' && github.repository == 'apache/skywalking') || (github.event_name != 'schedule')
if: ( always() && ! cancelled() ) && (github.event_name == 'schedule' && github.repository == 'JophieQu/skywalking') || (github.event_name != 'schedule')
name: Sanity check results
needs: [license-header, code-style, dependency-license]
runs-on: ubuntu-latest
Expand Down Expand Up @@ -159,7 +162,7 @@ jobs:
dist-tar:
if: |
( always() && ! cancelled() ) &&
((github.event_name == 'schedule' && github.repository == 'apache/skywalking') || needs.changes.outputs.oap == 'true')
((github.event_name == 'schedule' && github.repository == 'JophieQu/skywalking') || needs.changes.outputs.oap == 'true')
name: Build dist tar
needs: [changes]
runs-on: ubuntu-latest
Expand Down Expand Up @@ -191,7 +194,7 @@ jobs:
docker:
if: |
( always() && ! cancelled() ) &&
((github.event_name == 'schedule' && github.repository == 'apache/skywalking') || needs.changes.outputs.oap == 'true')
((github.event_name == 'schedule' && github.repository == 'JophieQu/skywalking') || needs.changes.outputs.oap == 'true')
name: Docker images
needs: [sanity-check, dist-tar, changes]
runs-on: ubuntu-latest
Expand Down Expand Up @@ -230,7 +233,7 @@ jobs:
unit-test:
if: |
( always() && ! cancelled() ) &&
((github.event_name == 'schedule' && github.repository == 'apache/skywalking') || needs.changes.outputs.oap == 'true')
((github.event_name == 'schedule' && github.repository == 'JophieQu/skywalking') || needs.changes.outputs.oap == 'true')
name: Unit test
needs: [sanity-check, changes]
runs-on: ${{ matrix.os }}
Expand Down Expand Up @@ -265,7 +268,7 @@ jobs:
integration-test:
if: |
( always() && ! cancelled() ) &&
((github.event_name == 'schedule' && github.repository == 'apache/skywalking') || needs.changes.outputs.oap == 'true')
((github.event_name == 'schedule' && github.repository == 'JophieQu/skywalking') || needs.changes.outputs.oap == 'true')
name: Integration test
needs: [sanity-check, changes]
runs-on: ubuntu-latest
Expand Down Expand Up @@ -298,7 +301,7 @@ jobs:
slow-integration-test:
if: |
( always() && ! cancelled() ) &&
((github.event_name == 'schedule' && github.repository == 'apache/skywalking') || needs.changes.outputs.oap == 'true')
((github.event_name == 'schedule' && github.repository == 'JophieQu/skywalking') || needs.changes.outputs.oap == 'true')
name: Slow Integration Tests
needs: [sanity-check, changes]
runs-on: ubuntu-latest
Expand Down Expand Up @@ -331,7 +334,7 @@ jobs:
e2e-test:
if: |
( always() && ! cancelled() ) &&
((github.event_name == 'schedule' && github.repository == 'apache/skywalking') || needs.changes.outputs.oap == 'true')
((github.event_name == 'schedule' && github.repository == 'JophieQu/skywalking') || needs.changes.outputs.oap == 'true')
name: E2E test
needs: [docker, dist-tar]
runs-on: ${{ matrix.test.runs-on || 'ubuntu-latest' }}
Expand Down Expand Up @@ -723,6 +726,13 @@ jobs:
config: test/e2e-v2/cases/profiling/async-profiler/banyandb/e2e.yaml
- name: Async Profiler MySQL
config: test/e2e-v2/cases/profiling/async-profiler/mysql/e2e.yaml

- name: Pprof ES
config: test/e2e-v2/cases/profiling/pprof/es/e2e.yaml
- name: Pprof BanyanDB
config: test/e2e-v2/cases/profiling/pprof/banyandb/e2e.yaml
- name: Pprof MySQL
config: test/e2e-v2/cases/profiling/pprof/mysql/e2e.yaml
steps:
- uses: actions/checkout@v4
with:
Expand Down Expand Up @@ -786,7 +796,7 @@ jobs:
e2e-test-istio:
if: |
( always() && ! cancelled() ) &&
((github.event_name == 'schedule' && github.repository == 'apache/skywalking') || needs.changes.outputs.oap == 'true')
((github.event_name == 'schedule' && github.repository == 'JophieQu/skywalking') || needs.changes.outputs.oap == 'true')
name: E2E test
needs: [docker]
runs-on: ubuntu-24.04
Expand Down Expand Up @@ -854,7 +864,7 @@ jobs:
e2e-test-istio-ambient:
if: |
( always() && ! cancelled() ) &&
((github.event_name == 'schedule' && github.repository == 'apache/skywalking') || needs.changes.outputs.oap == 'true')
((github.event_name == 'schedule' && github.repository == 'JophieQu/skywalking') || needs.changes.outputs.oap == 'true')
name: E2E test
needs: [docker]
runs-on: ubuntu-24.04
Expand Down Expand Up @@ -915,7 +925,7 @@ jobs:
e2e-test-java-versions:
if: |
( always() && ! cancelled() ) &&
((github.event_name == 'schedule' && github.repository == 'apache/skywalking') || needs.changes.outputs.oap == 'true')
((github.event_name == 'schedule' && github.repository == 'JophieQu/skywalking') || needs.changes.outputs.oap == 'true')
name: E2E test
needs: [docker]
runs-on: ubuntu-latest
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ public static BaseCommand deserialize(final Command command) {
return ConfigurationDiscoveryCommand.DESERIALIZER.deserialize(command);
} else if (AsyncProfilerTaskCommand.NAME.equals(commandName)) {
return AsyncProfilerTaskCommand.DESERIALIZER.deserialize(command);
} else if (PprofTaskCommand.NAME.equals(commandName)) {
return PprofTaskCommand.DESERIALIZER.deserialize(command);
}
throw new UnsupportedCommandException(command);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
/*
* 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 org.apache.skywalking.apm.network.common.v3.Command;
import org.apache.skywalking.apm.network.common.v3.KeyStringValuePair;
import java.util.List;
import lombok.Getter;

@Getter
public class PprofTaskCommand extends BaseCommand implements Serializable, Deserializable<PprofTaskCommand> {
public static final Deserializable<PprofTaskCommand> DESERIALIZER = new PprofTaskCommand("", "", "", 0, 0, 0);
public static final String NAME = "PprofTaskQuery";
/**
* pprof taskId
*/
private String taskId;
// Type of profiling (CPU/Heap/Block/Mutex/Goroutine/Threadcreate/Allocs)
private String events;
/**
* run profiling for duration (minute)
*/
private long duration;
/**
* task create time
*/
private long createTime;
/**
* pprof dump period parameters. There are different dumpperiod configurations for different events.
* Here is a table of parameters.
*
* <p>For Block - sample an average of one blocking event per rate nanoseconds spent blocked. (default: 0)</p>
* <p>For Mutex - sample an average of 1/rate events are reported. (default: 0)</p>
* details @see <a href="https://pkg.go.dev/runtime/pprof">pprof argument</a>
*/
private int dumpPeriod;

public PprofTaskCommand(String serialNumber, String taskId, String events,
long duration, long createTime, int dumpPeriod) {
super(NAME, serialNumber);
this.taskId = taskId;
this.duration = duration;
this.createTime = createTime;
this.dumpPeriod = dumpPeriod;
this.events = events;
}

@Override
public PprofTaskCommand deserialize(Command command) {
final List<KeyStringValuePair> argsList = command.getArgsList();
String taskId = null;
String events = null;
long duration = 0;
long createTime = 0;
int dumpPeriod = 0;
String serialNumber = null;
for (final KeyStringValuePair pair : argsList) {
if ("SerialNumber".equals(pair.getKey())) {
serialNumber = pair.getValue();
} else if ("TaskId".equals(pair.getKey())) {
taskId = pair.getValue();
} else if ("Events".equals(pair.getKey())) {
events = pair.getValue();
} else if ("Duration".equals(pair.getKey())) {
duration = Long.parseLong(pair.getValue());
} else if ("CreateTime".equals(pair.getKey())) {
createTime = Long.parseLong(pair.getValue());
} else if ("DumpPeriod".equals(pair.getKey())) {
dumpPeriod = Integer.parseInt(pair.getValue());
}
}
return new PprofTaskCommand(serialNumber, taskId, events, duration, createTime, dumpPeriod);
}

@Override
public Command.Builder serialize() {
final Command.Builder builder = commandBuilder();
builder.addArgs(KeyStringValuePair.newBuilder().setKey("TaskId").setValue(taskId))
.addArgs(KeyStringValuePair.newBuilder().setKey("Events").setValue(events))
.addArgs(KeyStringValuePair.newBuilder().setKey("Duration").setValue(String.valueOf(duration)))
.addArgs(KeyStringValuePair.newBuilder().setKey("CreateTime").setValue(String.valueOf(createTime)))
.addArgs(KeyStringValuePair.newBuilder().setKey("DumpPeriod").setValue(String.valueOf(dumpPeriod)));
return builder;
}
}
31 changes: 16 additions & 15 deletions dist-material/release-docs/LICENSE
Original file line number Diff line number Diff line change
Expand Up @@ -477,20 +477,21 @@ The text of each license is also included in licenses/LICENSE-[project].txt.
https://npmjs.com/package/@floating-ui/core/v/1.6.9 1.6.9 MIT
https://npmjs.com/package/@floating-ui/dom/v/1.6.13 1.6.13 MIT
https://npmjs.com/package/@floating-ui/utils/v/0.2.9 0.2.9 MIT
https://npmjs.com/package/@interactjs/actions/v/1.10.27 1.10.27 MIT
https://npmjs.com/package/@interactjs/auto-scroll/v/1.10.27 1.10.27 MIT
https://npmjs.com/package/@interactjs/auto-start/v/1.10.27 1.10.27 MIT
https://npmjs.com/package/@interactjs/core/v/1.10.27 1.10.27 MIT
https://npmjs.com/package/@interactjs/dev-tools/v/1.10.27 1.10.27 MIT
https://npmjs.com/package/@interactjs/inertia/v/1.10.27 1.10.27 MIT
https://npmjs.com/package/@interactjs/interact/v/1.10.27 1.10.27 MIT
https://npmjs.com/package/@interactjs/interactjs/v/1.10.27 1.10.27 MIT
https://npmjs.com/package/@interactjs/modifiers/v/1.10.27 1.10.27 MIT
https://npmjs.com/package/@interactjs/offset/v/1.10.27 1.10.27 MIT
https://npmjs.com/package/@interactjs/pointer-events/v/1.10.27 1.10.27 MIT
https://npmjs.com/package/@interactjs/reflow/v/1.10.27 1.10.27 MIT
https://npmjs.com/package/@interactjs/snappers/v/1.10.27 1.10.27 MIT
https://npmjs.com/package/@interactjs/utils/v/1.10.27 1.10.27 MIT
https://npmjs.com/package/@interactjs/actions/v/1.10.17 1.10.17 MIT
https://npmjs.com/package/@interactjs/auto-scroll/v/1.10.17 1.10.17 MIT
https://npmjs.com/package/@interactjs/auto-start/v/1.10.17 1.10.17 MIT
https://npmjs.com/package/@interactjs/core/v/1.10.17 1.10.17 MIT
https://npmjs.com/package/@interactjs/dev-tools/v/1.10.17 1.10.17 MIT
https://npmjs.com/package/@interactjs/inertia/v/1.10.17 1.10.17 MIT
https://npmjs.com/package/@interactjs/interact/v/1.10.17 1.10.17 MIT
https://npmjs.com/package/@interactjs/interactjs/v/1.10.17 1.10.17 MIT
https://npmjs.com/package/@interactjs/modifiers/v/1.10.17 1.10.17 MIT
https://npmjs.com/package/@interactjs/offset/v/1.10.17 1.10.17 MIT
https://npmjs.com/package/@interactjs/pointer-events/v/1.10.17 1.10.17 MIT
https://npmjs.com/package/@interactjs/reflow/v/1.10.17 1.10.17 MIT
https://npmjs.com/package/@interactjs/snappers/v/1.10.17 1.10.17 MIT
https://npmjs.com/package/@interactjs/types/v/1.10.17 1.10.17 MIT
https://npmjs.com/package/@interactjs/utils/v/1.10.17 1.10.17 MIT
https://npmjs.com/package/@intlify/core-base/v/9.14.5 9.14.5 MIT
https://npmjs.com/package/@intlify/message-compiler/v/9.14.5 9.14.5 MIT
https://npmjs.com/package/@intlify/shared/v/9.14.5 9.14.5 MIT
Expand Down Expand Up @@ -528,7 +529,7 @@ The text of each license is also included in licenses/LICENSE-[project].txt.
https://npmjs.com/package/d3-dsv/node_modules/commander/v/7.2.0 7.2.0 MIT
https://npmjs.com/package/d3-tip/v/0.9.1 0.9.1 MIT
https://npmjs.com/package/dayjs/v/1.11.13 1.11.13 MIT
https://npmjs.com/package/element-plus/v/2.11.0 2.11.0 MIT
https://npmjs.com/package/element-plus/v/2.9.4 2.9.4 MIT
https://npmjs.com/package/element-resize-detector/v/1.2.4 1.2.4 MIT
https://npmjs.com/package/escape-html/v/1.0.3 1.0.3 MIT
https://npmjs.com/package/estree-walker/v/2.0.2 2.0.2 MIT
Expand Down
1 change: 1 addition & 0 deletions docs/en/changes/changes.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
* Add UI dashboard for Ruby runtime metrics.
* Tracing Query Execution HTTP APIs: make the argument `service layer` optional.
* GraphQL API: metadata, topology, log and trace support query by name.
* Support pprof profiling feature
* [Break Change] MQE function `sort_values` sorts according to the aggregation result and labels rather than the simple time series values.
* Self Observability: add `metrics_aggregation_queue_used_percentage` and `metrics_persistent_collection_cached_size` metrics for the OAP server.
* Optimize metrics aggregate/persistent worker: separate `OAL` and `MAL` workers and consume pools. The dataflow signal drives the new MAL consumer,
Expand Down
14 changes: 14 additions & 0 deletions docs/en/concepts-and-designs/profiling.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,20 @@ Async Profiler can trace the following kinds of events:

Only Java agent support this.

### Go App Profiling

Go App Profiling uses the [Pprof](https://github.com/google/pprof) for sampling.

pprof is a profiling tool by Google for visualizing and analyzing sampled performance data.
It reads samples in profile.proto format and generates text or graphical reports (via the dot visualization) to highlight performance hotspots.

pprof supports profiling of:

- CPU.
- Memory allocs / heap.
- Block / mutex.
- Gouroutine / threadcreate.

## Out-of-process profiling

Out-of-process profiling leverage [eBPF](https://ebpf.io/) technology with origins in the Linux kernel.
Expand Down
5 changes: 5 additions & 0 deletions oap-server/server-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@
<artifactId>library-async-profiler-jfr-parser</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>library-pprof-parser</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>telemetry-api</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.util.List;
import org.apache.skywalking.oap.server.core.analysis.meter.MeterSystem;
import org.apache.skywalking.oap.server.core.cache.AsyncProfilerTaskCache;
import org.apache.skywalking.oap.server.core.cache.PprofTaskCache;
import org.apache.skywalking.oap.server.core.cache.NetworkAddressAliasCache;
import org.apache.skywalking.oap.server.core.cache.ProfileTaskCache;
import org.apache.skywalking.oap.server.core.command.CommandService;
Expand All @@ -41,6 +42,8 @@
import org.apache.skywalking.oap.server.core.profiling.continuous.ContinuousProfilingQueryService;
import org.apache.skywalking.oap.server.core.profiling.ebpf.EBPFProfilingMutationService;
import org.apache.skywalking.oap.server.core.profiling.ebpf.EBPFProfilingQueryService;
import org.apache.skywalking.oap.server.core.profiling.pprof.PprofMutationService;
import org.apache.skywalking.oap.server.core.profiling.pprof.PprofQueryService;
import org.apache.skywalking.oap.server.core.profiling.trace.ProfileTaskMutationService;
import org.apache.skywalking.oap.server.core.profiling.trace.ProfileTaskQueryService;
import org.apache.skywalking.oap.server.core.query.AggregationQueryService;
Expand Down Expand Up @@ -106,6 +109,7 @@ public Class[] services() {
addManagementService(classes);
addEBPFProfilingService(classes);
addAsyncProfilerService(classes);
addPprofService(classes);

classes.add(CommandService.class);
classes.add(HierarchyService.class);
Expand Down Expand Up @@ -137,6 +141,12 @@ private void addAsyncProfilerService(List<Class> classes) {
classes.add(AsyncProfilerTaskCache.class);
}

private void addPprofService(List<Class> classes) {
classes.add(PprofMutationService.class);
classes.add(PprofQueryService.class);
classes.add(PprofTaskCache.class);
}

private void addOALService(List<Class> classes) {
classes.add(OALEngineLoaderService.class);
}
Expand Down
Loading
Loading