Skip to content

Profiling correctness #4425

Profiling correctness

Profiling correctness #4425

name: Profiling correctness
on:
pull_request:
schedule:
- cron: '0 0 * * *'
jobs:
prof-correctness:
runs-on: ubuntu-latest
strategy:
matrix:
php-version: [8.0, 8.1, 8.2, 8.3, 8.4]
phpts: [nts, zts]
include:
- phpts: zts
extensions: parallel
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 1
submodules: true
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-version }}
extensions: ${{ matrix.extensions }}
env:
phpts: ${{ matrix.phpts }}
- name: Restore build cache
uses: actions/cache/restore@v4
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}-${{ matrix.php-version }}-${{ matrix.phpts }}
- name: Build profiler
run: |
echo "deb http://apt.llvm.org/jammy/ llvm-toolchain-jammy-17 main" | sudo tee -a /etc/apt/sources.list
echo "deb-src http://apt.llvm.org/jammy/ llvm-toolchain-jammy-17 main" | sudo tee -a /etc/apt/sources.list
curl https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
curl https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
sudo apt remove -y clang-*
sudo apt-get update
sudo apt install -y clang-17
cd profiling
version_number=$(awk -F' = ' '$1 == "channel" { gsub(/"/, "", $2); print $2 }' rust-toolchain.toml)
curl https://sh.rustup.rs -sSf | sh -s -- --profile minimal -y --default-toolchain "$version_number"
cargo rustc --features="trigger_time_sample" --release --crate-type=cdylib
- name: Cache build dependencies
uses: actions/cache/save@v4
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}-${{ matrix.php-version }}-${{ matrix.phpts }}
- name: Run no profile test
run: |
export DD_PROFILING_ENABLED=Off
export DD_PROFILING_EXPERIMENTAL_FEATURES_ENABLED=1
export DD_PROFILING_EXCEPTION_MESSAGE_ENABLED=1
php -v
php -d extension=target/release/libdatadog_php_profiling.so --ri datadog-profiling
for test_case in "allocations" "time" "strange_frames" "timeline" "exceptions"; do
mkdir -p profiling/tests/correctness/"$test_case"/
export DD_PROFILING_OUTPUT_PPROF=$PWD/profiling/tests/correctness/"$test_case"/test.pprof
php -d extension=$PWD/target/release/libdatadog_php_profiling.so profiling/tests/correctness/"$test_case".php
if [ -f "$DD_PROFILING_OUTPUT_PPROF".1.lz4 ]; then
echo "File $DD_PROFILING_OUTPUT_PPROF.1.lz4 should not exist!"
exit 1;
fi
done
- name: Run tests
run: |
export DD_PROFILING_LOG_LEVEL=trace
export DD_PROFILING_EXPERIMENTAL_FEATURES_ENABLED=1
export DD_PROFILING_EXPERIMENTAL_EXCEPTION_SAMPLING_DISTANCE=1
export DD_PROFILING_EXCEPTION_MESSAGE_ENABLED=1
php -v
php -d extension=target/release/libdatadog_php_profiling.so --ri datadog-profiling
for test_case in "allocations" "time" "strange_frames" "timeline" "exceptions"; do
mkdir -p profiling/tests/correctness/"$test_case"/
export DD_PROFILING_OUTPUT_PPROF=$PWD/profiling/tests/correctness/"$test_case"/test.pprof
php -d extension=$PWD/target/release/libdatadog_php_profiling.so profiling/tests/correctness/"$test_case".php
done
- name: Run ZTS tests
if: matrix.phpts == 'zts'
run: |
export DD_PROFILING_LOG_LEVEL=trace
export DD_PROFILING_EXPERIMENTAL_FEATURES_ENABLED=1
export DD_PROFILING_EXPERIMENTAL_EXCEPTION_SAMPLING_DISTANCE=1
export DD_PROFILING_EXCEPTION_MESSAGE_ENABLED=1
php -v
php -d extension=target/release/libdatadog_php_profiling.so --ri datadog-profiling
for test_case in "exceptions_zts"; do
mkdir -p profiling/tests/correctness/"$test_case"/
export DD_PROFILING_OUTPUT_PPROF=$PWD/profiling/tests/correctness/"$test_case"/test.pprof
php -d extension=$PWD/target/release/libdatadog_php_profiling.so profiling/tests/correctness/"$test_case".php
done
- name: Check profiler correctness for allocations
if: matrix.phpts != 'zts'
uses: Datadog/prof-correctness/analyze@main
with:
expected_json: profiling/tests/correctness/allocations.json
pprof_path: profiling/tests/correctness/allocations/
- name: Check profiler correctness for time
uses: Datadog/prof-correctness/analyze@main
with:
expected_json: profiling/tests/correctness/time.json
pprof_path: profiling/tests/correctness/time/
- name: Check profiler correctness for strange frames
uses: Datadog/prof-correctness/analyze@main
with:
expected_json: profiling/tests/correctness/strange_frames.json
pprof_path: profiling/tests/correctness/strange_frames/
- name: Check profiler correctness for timeline
uses: Datadog/prof-correctness/analyze@main
with:
expected_json: profiling/tests/correctness/timeline.json
pprof_path: profiling/tests/correctness/timeline/
- name: Check profiler correctness for exceptions ZTS
if: matrix.phpts == 'zts'
uses: Datadog/prof-correctness/analyze@main
with:
expected_json: profiling/tests/correctness/exceptions_zts.json
pprof_path: profiling/tests/correctness/exceptions_zts/
- name: Check profiler correctness for exceptions
uses: Datadog/prof-correctness/analyze@main
with:
expected_json: profiling/tests/correctness/exceptions.json
pprof_path: profiling/tests/correctness/exceptions/
- name: Notify Slack
if: failure() && github.ref == 'refs/heads/master'
run: |
curl -X POST "${{ secrets.SLACK_WEBHOOK }}" \
-H 'Content-Type: application/json' \
-d "{'scenarios': 'PHP', 'failed_run_url': '${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}'}"