From 4cd46c8260f1a2113a709b83f4ff7b0276373cad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=E1=BA=A1m=20Minh=20=C4=90=E1=BA=A1t?= Date: Tue, 31 Mar 2026 07:58:33 +0700 Subject: [PATCH] Elastic-APM --- .github/workflows/test.yml | 2 +- Makefile | 16 ++++++++---- extensions/elastic-apm/8.0/Dockerfile.alpine | 24 ++++++++++++++++++ extensions/elastic-apm/8.1/Dockerfile.alpine | 24 ++++++++++++++++++ extensions/elastic-apm/8.2/Dockerfile.alpine | 26 ++++++++++++++++++++ extensions/elastic-apm/8.3/Dockerfile.alpine | 26 ++++++++++++++++++++ extensions/elastic-apm/8.4/Dockerfile.alpine | 26 ++++++++++++++++++++ test.php | 16 ++++++++---- 8 files changed, 149 insertions(+), 11 deletions(-) create mode 100644 extensions/elastic-apm/8.0/Dockerfile.alpine create mode 100644 extensions/elastic-apm/8.1/Dockerfile.alpine create mode 100644 extensions/elastic-apm/8.2/Dockerfile.alpine create mode 100644 extensions/elastic-apm/8.3/Dockerfile.alpine create mode 100644 extensions/elastic-apm/8.4/Dockerfile.alpine diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e76f25c..5e1b69a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -142,7 +142,7 @@ jobs: - name: Run tests run: | docker run --rm \ - -v $(pwd)/tests/test.php:/opt/php/tests/test.php \ + -v $(pwd)/test.php:/opt/php/tests/test.php \ test-${{ env.GHCR_IMAGE }}:${{ env.TAG }}-${{ env.SHORT_SHA }}-${{ matrix.platform }} \ php /opt/php/tests/test.php ${{ matrix.extension }} diff --git a/Makefile b/Makefile index 7cda881..b8bfc18 100644 --- a/Makefile +++ b/Makefile @@ -34,16 +34,22 @@ build: . run-single-test: build - @set -e; \ - TEST_IMAGE=test-dockerphpext-local/$(extension)-$(php_version); \ + @TEST_IMAGE=test-dockerphpext-local/$(extension)-$(php_version); \ echo "###############################################"; \ echo "### Testing $(extension) PHP $(php_version)"; \ echo "###"; \ docker run --rm \ - -v $$(pwd)/tests/test.php:/opt/php/tests/test.php \ + -v $$(pwd)/test.php:/opt/php/tests/test.php \ $$TEST_IMAGE \ - php /opt/php/tests/test.php $(extension); \ - if docker run --rm $$TEST_IMAGE php -m 2>&1 | grep -Eqi 'Unable|Warning'; then \ + php /opt/php/tests/test.php $(extension) 2>&1; \ + TEST_EXIT=$$?; \ + if [ $$TEST_EXIT -ne 0 ]; then \ + echo "❌ Test script failed"; \ + exit $$TEST_EXIT; \ + fi; \ + docker run --rm $$TEST_IMAGE php -m 2>&1 | grep -Eqi 'Unable|Warning'; \ + EXT_ERROR=$$?; \ + if [ $$EXT_ERROR -eq 0 ]; then \ echo "❌ PHP extension load failed"; \ exit 1; \ fi; \ diff --git a/extensions/elastic-apm/8.0/Dockerfile.alpine b/extensions/elastic-apm/8.0/Dockerfile.alpine new file mode 100644 index 0000000..b960dcd --- /dev/null +++ b/extensions/elastic-apm/8.0/Dockerfile.alpine @@ -0,0 +1,24 @@ +FROM php:8.0-alpine + +ENV ELASTIC_APM_VERSION=1.16.0 +ENV ELASTIC_APM_BUILD_DIR=/tmp/elastic-apm +ENV PHP_INI_SCAN_DIR=/opt/php/conf.d + +RUN set -xe \ + && ARCH=$(uname -m) \ + && mkdir -p ${ELASTIC_APM_BUILD_DIR} \ + && curl -Ls -o ${ELASTIC_APM_BUILD_DIR}/elastic-apm.apk \ + https://github.com/elastic/apm-agent-php/releases/download/v${ELASTIC_APM_VERSION}/apm-agent-php_${ELASTIC_APM_VERSION}_${ARCH}.apk \ + && apk add --allow-untrusted ${ELASTIC_APM_BUILD_DIR}/elastic-apm.apk \ + && set -xe \ + && mkdir -p /opt/php/apm-agent-php/ \ + && mkdir -p /opt/php/extensions/ \ + && mkdir -p /opt/php/conf.d/ \ + && mv /opt/elastic/apm-agent-php/* /opt/php/apm-agent-php/ \ + && mv /opt/php/apm-agent-php/extensions/* /opt/php/extensions/ \ + && rm -rf /opt/php/apm-agent-php/bin \ + && rm -rf /opt/php/apm-agent-php/etc \ + && rm -rf /opt/php/apm-agent-php/docs \ + && rm -rf /opt/php/apm-agent-php/extensions \ + && echo 'extension=/opt/php/extensions/elastic_apm_loader.so' > /opt/php/conf.d/elastic-apm.ini \ + && echo "elastic_apm.bootstrap_php_part_file=/opt/php/apm-agent-php/src/bootstrap_php_part.php" >> /opt/php/conf.d/elastic-apm.ini diff --git a/extensions/elastic-apm/8.1/Dockerfile.alpine b/extensions/elastic-apm/8.1/Dockerfile.alpine new file mode 100644 index 0000000..6eef7e5 --- /dev/null +++ b/extensions/elastic-apm/8.1/Dockerfile.alpine @@ -0,0 +1,24 @@ +FROM php:8.1-alpine + +ENV ELASTIC_APM_VERSION=1.16.0 +ENV ELASTIC_APM_BUILD_DIR=/tmp/elastic-apm +ENV PHP_INI_SCAN_DIR=/opt/php/conf.d + +RUN set -xe \ + && ARCH=$(uname -m) \ + && mkdir -p ${ELASTIC_APM_BUILD_DIR} \ + && curl -Ls -o ${ELASTIC_APM_BUILD_DIR}/elastic-apm.apk \ + https://github.com/elastic/apm-agent-php/releases/download/v${ELASTIC_APM_VERSION}/apm-agent-php_${ELASTIC_APM_VERSION}_${ARCH}.apk \ + && apk add --allow-untrusted ${ELASTIC_APM_BUILD_DIR}/elastic-apm.apk \ + && set -xe \ + && mkdir -p /opt/php/apm-agent-php/ \ + && mkdir -p /opt/php/extensions/ \ + && mkdir -p /opt/php/conf.d/ \ + && mv /opt/elastic/apm-agent-php/* /opt/php/apm-agent-php/ \ + && mv /opt/php/apm-agent-php/extensions/* /opt/php/extensions/ \ + && rm -rf /opt/php/apm-agent-php/bin \ + && rm -rf /opt/php/apm-agent-php/etc \ + && rm -rf /opt/php/apm-agent-php/docs \ + && rm -rf /opt/php/apm-agent-php/extensions \ + && echo 'extension=/opt/php/extensions/elastic_apm_loader.so' > /opt/php/conf.d/elastic-apm.ini \ + && echo "elastic_apm.bootstrap_php_part_file=/opt/php/apm-agent-php/src/bootstrap_php_part.php" >> /opt/php/conf.d/elastic-apm.ini diff --git a/extensions/elastic-apm/8.2/Dockerfile.alpine b/extensions/elastic-apm/8.2/Dockerfile.alpine new file mode 100644 index 0000000..82592ac --- /dev/null +++ b/extensions/elastic-apm/8.2/Dockerfile.alpine @@ -0,0 +1,26 @@ +# There is a problem with apk tool v3 +# https://github.com/elastic/apm-agent-php/issues/1407 +FROM php:8.2-alpine3.22 + +ENV ELASTIC_APM_VERSION=1.16.0 +ENV ELASTIC_APM_BUILD_DIR=/tmp/elastic-apm +ENV PHP_INI_SCAN_DIR=/opt/php/conf.d + +RUN set -xe \ + && ARCH=$(uname -m) \ + && mkdir -p ${ELASTIC_APM_BUILD_DIR} \ + && curl -Ls -o ${ELASTIC_APM_BUILD_DIR}/elastic-apm.apk \ + https://github.com/elastic/apm-agent-php/releases/download/v${ELASTIC_APM_VERSION}/apm-agent-php_${ELASTIC_APM_VERSION}_${ARCH}.apk \ + && apk add --allow-untrusted ${ELASTIC_APM_BUILD_DIR}/elastic-apm.apk \ + && set -xe \ + && mkdir -p /opt/php/apm-agent-php/ \ + && mkdir -p /opt/php/extensions/ \ + && mkdir -p /opt/php/conf.d/ \ + && mv /opt/elastic/apm-agent-php/* /opt/php/apm-agent-php/ \ + && mv /opt/php/apm-agent-php/extensions/* /opt/php/extensions/ \ + && rm -rf /opt/php/apm-agent-php/bin \ + && rm -rf /opt/php/apm-agent-php/etc \ + && rm -rf /opt/php/apm-agent-php/docs \ + && rm -rf /opt/php/apm-agent-php/extensions \ + && echo 'extension=/opt/php/extensions/elastic_apm_loader.so' > /opt/php/conf.d/elastic-apm.ini \ + && echo "elastic_apm.bootstrap_php_part_file=/opt/php/apm-agent-php/src/bootstrap_php_part.php" >> /opt/php/conf.d/elastic-apm.ini diff --git a/extensions/elastic-apm/8.3/Dockerfile.alpine b/extensions/elastic-apm/8.3/Dockerfile.alpine new file mode 100644 index 0000000..b8aee99 --- /dev/null +++ b/extensions/elastic-apm/8.3/Dockerfile.alpine @@ -0,0 +1,26 @@ +# There is a problem with apk tool v3 +# https://github.com/elastic/apm-agent-php/issues/1407 +FROM php:8.3-alpine3.22 + +ENV ELASTIC_APM_VERSION=1.16.0 +ENV ELASTIC_APM_BUILD_DIR=/tmp/elastic-apm +ENV PHP_INI_SCAN_DIR=/opt/php/conf.d + +RUN set -xe \ + && ARCH=$(uname -m) \ + && mkdir -p ${ELASTIC_APM_BUILD_DIR} \ + && curl -Ls -o ${ELASTIC_APM_BUILD_DIR}/elastic-apm.apk \ + https://github.com/elastic/apm-agent-php/releases/download/v${ELASTIC_APM_VERSION}/apm-agent-php_${ELASTIC_APM_VERSION}_${ARCH}.apk \ + && apk add --allow-untrusted ${ELASTIC_APM_BUILD_DIR}/elastic-apm.apk \ + && set -xe \ + && mkdir -p /opt/php/apm-agent-php/ \ + && mkdir -p /opt/php/extensions/ \ + && mkdir -p /opt/php/conf.d/ \ + && mv /opt/elastic/apm-agent-php/* /opt/php/apm-agent-php/ \ + && mv /opt/php/apm-agent-php/extensions/* /opt/php/extensions/ \ + && rm -rf /opt/php/apm-agent-php/bin \ + && rm -rf /opt/php/apm-agent-php/etc \ + && rm -rf /opt/php/apm-agent-php/docs \ + && rm -rf /opt/php/apm-agent-php/extensions \ + && echo 'extension=/opt/php/extensions/elastic_apm_loader.so' > /opt/php/conf.d/elastic-apm.ini \ + && echo "elastic_apm.bootstrap_php_part_file=/opt/php/apm-agent-php/src/bootstrap_php_part.php" >> /opt/php/conf.d/elastic-apm.ini diff --git a/extensions/elastic-apm/8.4/Dockerfile.alpine b/extensions/elastic-apm/8.4/Dockerfile.alpine new file mode 100644 index 0000000..ffb0dd5 --- /dev/null +++ b/extensions/elastic-apm/8.4/Dockerfile.alpine @@ -0,0 +1,26 @@ +# There is a problem with apk tool v3 +# https://github.com/elastic/apm-agent-php/issues/1407 +FROM php:8.4-alpine3.22 + +ENV ELASTIC_APM_VERSION=1.16.0 +ENV ELASTIC_APM_BUILD_DIR=/tmp/elastic-apm +ENV PHP_INI_SCAN_DIR=/opt/php/conf.d + +RUN set -xe \ + && ARCH=$(uname -m) \ + && mkdir -p ${ELASTIC_APM_BUILD_DIR} \ + && curl -Ls -o ${ELASTIC_APM_BUILD_DIR}/elastic-apm.apk \ + https://github.com/elastic/apm-agent-php/releases/download/v${ELASTIC_APM_VERSION}/apm-agent-php_${ELASTIC_APM_VERSION}_${ARCH}.apk \ + && apk add --allow-untrusted ${ELASTIC_APM_BUILD_DIR}/elastic-apm.apk \ + && set -xe \ + && mkdir -p /opt/php/apm-agent-php/ \ + && mkdir -p /opt/php/extensions/ \ + && mkdir -p /opt/php/conf.d/ \ + && mv /opt/elastic/apm-agent-php/* /opt/php/apm-agent-php/ \ + && mv /opt/php/apm-agent-php/extensions/* /opt/php/extensions/ \ + && rm -rf /opt/php/apm-agent-php/bin \ + && rm -rf /opt/php/apm-agent-php/etc \ + && rm -rf /opt/php/apm-agent-php/docs \ + && rm -rf /opt/php/apm-agent-php/extensions \ + && echo 'extension=/opt/php/extensions/elastic_apm_loader.so' > /opt/php/conf.d/elastic-apm.ini \ + && echo "elastic_apm.bootstrap_php_part_file=/opt/php/apm-agent-php/src/bootstrap_php_part.php" >> /opt/php/conf.d/elastic-apm.ini diff --git a/test.php b/test.php index 1d21495..2edeade 100644 --- a/test.php +++ b/test.php @@ -3,14 +3,20 @@ $extension = $argv[1]; $customExtensionName = [ - 'opcache' => 'Zend OPcache', + 'opcache' => ['Zend OPcache'], + 'datadog' => ['ddtrace', 'datadog-profiling', 'ddappsec'], + 'elastic-apm' => ['elastic_apm'], ]; -$loadExtensionName = isset($customExtensionName[$extension]) ? $customExtensionName[$extension] : $extension; +$loadExtensionName = isset($customExtensionName[$extension]) ? $customExtensionName[$extension] : [$extension]; -if (!extension_loaded($loadExtensionName)) { - echo sprintf('FAIL: Extension "%s" is not loaded.', $loadExtensionName).PHP_EOL; - exit(1); +foreach ($loadExtensionName as $name) { + if (!extension_loaded($name)) { + echo sprintf('❌ FAIL: Extension "%s" is not loaded.', $name).PHP_EOL; + exit(1); + } else { + echo sprintf('✅ Extension "%s" is loaded.', $name).PHP_EOL; + } } exit(0);