Skip to content

Use a sidecar connection per PHP thread #9432

Use a sidecar connection per PHP thread

Use a sidecar connection per PHP thread #9432

name: Profiling correctness
on:
pull_request:
schedule:
- cron: '0 0 * * *'
jobs:
prof-correctness:
runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
php-version: ['8.0', '8.1', '8.2', '8.3', '8.4', '8.5']
phpts: [nts, zts]
include:
- phpts: zts
extensions: parallel-krakjoe/parallel@v1.2.7
steps:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 1
submodules: true
- name: Setup PHP
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
with:
php-version: ${{ matrix.php-version }}
coverage: none
extensions: ${{ matrix.extensions }}
env:
phpts: ${{ matrix.phpts }}
fail-fast: true
- name: Restore build cache
uses: actions/cache/restore@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
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: |
codename="$(lsb_release -cs)"
curl -fsSL https://apt.llvm.org/llvm-snapshot.gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/llvm-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/llvm-archive-keyring.gpg] http://apt.llvm.org/${codename}/ llvm-toolchain-${codename}-19 main" | sudo tee /etc/apt/sources.list.d/llvm.list
sudo apt-get update
sudo apt-get install -y clang-19 lld-19
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-19 100
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-19 100
sudo update-alternatives --install /usr/bin/ld.lld ld.lld /usr/bin/ld.lld-19 100
clang --version
ld.lld --version
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" --profile profiler-release --crate-type=cdylib
- name: Cache build dependencies
uses: actions/cache/save@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
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/profiler-release/libdatadog_php_profiling.so --ri datadog-profiling
for test_case in "allocations" "time" "strange_frames" "timeline" "exceptions" "io" "allocation_time_combined"; 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/profiler-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/profiler-release/libdatadog_php_profiling.so --ri datadog-profiling
for test_case in "allocations" "time" "strange_frames" "timeline" "exceptions" "io" "allocation_time_combined"; 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/profiler-release/libdatadog_php_profiling.so profiling/tests/correctness/"$test_case".php
done
mkdir -p profiling/tests/correctness/allocations_1byte/
export DD_PROFILING_OUTPUT_PPROF=$PWD/profiling/tests/correctness/allocations_1byte/test.pprof
export DD_PROFILING_ALLOCATION_SAMPLING_DISTANCE=1
php -d extension=$PWD/target/profiler-release/libdatadog_php_profiling.so profiling/tests/correctness/allocations.php
mkdir -p profiling/tests/correctness/allocations_1byte_no_zend_alloc/
export DD_PROFILING_OUTPUT_PPROF=$PWD/profiling/tests/correctness/allocations_1byte_no_zend_alloc/test.pprof
export DD_PROFILING_ALLOCATION_SAMPLING_DISTANCE=1
USE_ZEND_ALLOC=0 php -d extension=$PWD/target/profiler-release/libdatadog_php_profiling.so profiling/tests/correctness/allocations.php
unset DD_PROFILING_ALLOCATION_SAMPLING_DISTANCE
- 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/profiler-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/profiler-release/libdatadog_php_profiling.so profiling/tests/correctness/"$test_case".php
done
- name: Check profiler correctness for allocations
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 allocations with 1 byte sampling distance
uses: Datadog/prof-correctness/analyze@main
with:
expected_json: profiling/tests/correctness/allocations.json
pprof_path: profiling/tests/correctness/allocations_1byte/
- name: Check profiler correctness for allocations with 1 byte sampling distance and `USE_ZEND_ALLOC=0`
uses: Datadog/prof-correctness/analyze@main
with:
expected_json: profiling/tests/correctness/allocations.json
pprof_path: profiling/tests/correctness/allocations_1byte_no_zend_alloc/
- 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 allocation_time_combined
uses: Datadog/prof-correctness/analyze@main
with:
expected_json: profiling/tests/correctness/allocation_time_combined.json
pprof_path: profiling/tests/correctness/allocation_time_combined/
- name: Check profiler correctness for IO
uses: Datadog/prof-correctness/analyze@main
with:
expected_json: profiling/tests/correctness/io.json
pprof_path: profiling/tests/correctness/io/
- 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 }}'}"