Use a sidecar connection per PHP thread #9432
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 }}'}" |