From c293fc340aa5b3aed021ef1e51c9e67a792ee355 Mon Sep 17 00:00:00 2001 From: Tom Carrio Date: Wed, 21 Dec 2022 18:12:39 -0500 Subject: [PATCH 1/4] feat: added OTel hook for OpenFeature - new statically registerable OTel hook for OpenFeature - move hooks and providers into independent directories - enable PHP 8.2 runner - disable integration tests since none exist - utilize test wrapper script definition in CI Ref: #6 Signed-off-by: Tom Carrio Signed-off-by: Tom Carrio --- .github/workflows/php-ci.yaml | 36 ++--- .gitmodules | 5 +- .gitsplit.yml | 8 +- README.md | 9 +- hooks/.gitkeep | 0 .../.github/workflows/release-please.yml | 0 .../OpenTelemetry}/.gitignore | 0 .../.release-please-manifest.json | 0 hooks/OpenTelemetry/README.md | 56 ++++++++ hooks/OpenTelemetry/composer.json | 136 ++++++++++++++++++ .../OpenTelemetry}/examples/.gitignore | 0 .../OTelManualInstrumentation/README.md | 3 + .../OTelManualInstrumentation/composer.json | 21 +++ .../OTelManualInstrumentation/src/main.php | 3 + .../OpenTelemetry}/phpcs.xml.dist | 0 .../OpenTelemetry}/phpstan.neon.dist | 0 .../OpenTelemetry}/phpunit.xml.dist | 0 .../OpenTelemetry}/psalm-baseline.xml | 0 .../OpenTelemetry}/psalm.xml | 0 .../OpenTelemetry}/release-please-config.json | 0 hooks/OpenTelemetry/src/OpenTelemetryHook.php | 91 ++++++++++++ hooks/OpenTelemetry/src/TracerHelper.php | 40 ++++++ hooks/OpenTelemetry/tests/TestCase.php | 40 ++++++ .../tests/unit/OpenTelemetryHookTest.php | 26 ++++ providers/.gitkeep | 0 .../.github/workflows/release-please.yml | 0 {src/Flagd => providers/CloudBees}/.gitignore | 0 .../CloudBees}/.release-please-manifest.json | 0 {src => providers}/CloudBees/README.md | 0 {src => providers}/CloudBees/composer.json | 0 .../CloudBees}/examples/.gitignore | 0 .../CloudBees/examples/CloudBees/README.md | 0 .../examples/CloudBees/composer.json | 0 .../CloudBees/examples/CloudBees/src/main.php | 0 .../CloudBees}/phpcs.xml.dist | 0 .../CloudBees}/phpstan.neon.dist | 0 .../CloudBees}/phpunit.xml.dist | 0 .../CloudBees}/psalm-baseline.xml | 0 {src/Split => providers/CloudBees}/psalm.xml | 0 .../CloudBees/release-please-config.json | 0 .../scripts/scaffold-integration-tests.py | 0 .../CloudBees/scripts/seed-data.json | 0 .../CloudBees/src/CloudBeesProvider.php | 0 .../CloudBees/src/context/ContextAdapter.php | 0 .../src/errors/InvalidJsonTypeException.php | 0 .../src/errors/JsonParseException.php | 0 .../src/transformers/IdentityTransformer.php | 0 .../src/transformers/JsonTransformer.php | 0 .../CloudBees/tests/TestCase.php | 0 .../integration/CloudBeesProviderTest.php | 0 .../tests/unit/JsonTransformerTest.php | 0 .../.github/workflows/release-please.yml | 0 {src/Split => providers/Flagd}/.gitignore | 0 .../Flagd}/.release-please-manifest.json | 0 {src => providers}/Flagd/README.md | 0 {src => providers}/Flagd/composer.json | 0 .../Flagd}/examples/.gitignore | 0 .../Flagd/examples/Grpc/README.md | 0 .../Flagd/examples/Grpc/composer.json | 0 .../Flagd/examples/Grpc/src/main.php | 0 .../Flagd/examples/Http/README.md | 0 .../Flagd/examples/Http/composer.json | 0 .../Flagd/examples/Http/src/main.php | 0 {src/Split => providers/Flagd}/phpcs.xml.dist | 0 {src => providers}/Flagd/phpstan.neon.dist | 0 {src => providers}/Flagd/phpunit.xml.dist | 0 {src => providers}/Flagd/proto/README.md | 0 .../php/GPBMetadata/Schema/V1/Schema.php | Bin .../php/Schema/V1/EventStreamResponse.php | 0 .../php/Schema/V1/ResolveBooleanRequest.php | 0 .../php/Schema/V1/ResolveBooleanResponse.php | 0 .../php/Schema/V1/ResolveFloatRequest.php | 0 .../php/Schema/V1/ResolveFloatResponse.php | 0 .../proto/php/Schema/V1/ResolveIntRequest.php | 0 .../php/Schema/V1/ResolveIntResponse.php | 0 .../php/Schema/V1/ResolveObjectRequest.php | 0 .../php/Schema/V1/ResolveObjectResponse.php | 0 .../php/Schema/V1/ResolveStringRequest.php | 0 .../php/Schema/V1/ResolveStringResponse.php | 0 .../proto/php/Schema/V1/ServiceClient.php | 0 .../Flagd}/psalm-baseline.xml | 0 {src => providers}/Flagd/psalm.xml | 0 .../Flagd/release-please-config.json | 0 {src => providers}/Flagd/schemas | 0 .../Flagd/src/FlagdProvider.php | 0 .../common/EvaluationContextArrayFactory.php | 0 .../src/common/ResponseCodeErrorCodeMap.php | 0 .../Flagd/src/common/SafeArrayAccessor.php | 0 .../Flagd/src/config/Config.php | 0 .../Flagd/src/config/ConfigFactory.php | 0 .../Flagd/src/config/Defaults.php | 0 .../Flagd/src/config/HttpConfig.php | 0 .../Flagd/src/config/IConfig.php | 0 .../Flagd/src/config/IHttpConfig.php | 0 .../Flagd/src/config/Protocols.php | 0 .../Flagd/src/config/Validator.php | 0 .../src/errors/InvalidConfigException.php | 0 .../Flagd/src/errors/InvalidTypeException.php | 0 .../src/errors/RequestBuildException.php | 0 .../Flagd/src/grpc/GrpcService.php | 0 .../grpc/ResponseResolutionDetailsAdapter.php | 0 .../Flagd/src/grpc/ResponseValidator.php | 0 .../FlagdResponseResolutionDetailsAdapter.php | 0 .../Flagd/src/http/FlagdResponseValidator.php | 0 .../Flagd/src/http/GrpcWebEndpoint.php | 0 .../Flagd/src/http/HttpService.php | 0 {src => providers}/Flagd/src/http/Method.php | 0 .../Flagd/src/service/ServiceFactory.php | 0 .../Flagd/src/service/ServiceInterface.php | 0 {src => providers}/Flagd/tests/TestCase.php | 0 .../Flagd/tests/unit/FlagdProviderTest.php | 0 .../.github/workflows/release-please.yml | 18 +++ providers/Split/.gitignore | 3 + providers/Split/.release-please-manifest.json | 3 + {src => providers}/Split/README.md | 0 {src => providers}/Split/composer.json | 0 providers/Split/examples/.gitignore | 2 + .../Split/examples/SplitSDK/README.md | 0 .../Split/examples/SplitSDK/composer.json | 0 .../Split/examples/SplitSDK/src/main.php | 0 providers/Split/phpcs.xml.dist | 28 ++++ providers/Split/phpstan.neon.dist | 9 ++ providers/Split/phpunit.xml.dist | 28 ++++ providers/Split/psalm-baseline.xml | 2 + providers/Split/psalm.xml | 17 +++ providers/Split/release-please-config.json | 12 ++ .../Split/src/SplitProvider.php | 0 .../errors/InvalidTreatmentTypeException.php | 0 .../errors/SplitFactoryCreationException.php | 0 .../errors/TargetingKeyMissingException.php | 0 .../Split/src/treatments/TreatmentParser.php | 0 .../src/treatments/TreatmentValidator.php | 0 {src => providers}/Split/tests/TestCase.php | 0 .../tests/integration/SplitProviderTest.php | 0 .../Split/tests/integration/files/splits.yml | 0 .../Split/tests/unit/SplitProviderTest.php | 0 136 files changed, 571 insertions(+), 25 deletions(-) create mode 100644 hooks/.gitkeep rename {src/CloudBees => hooks/OpenTelemetry}/.github/workflows/release-please.yml (100%) rename {src/CloudBees => hooks/OpenTelemetry}/.gitignore (100%) rename {src/CloudBees => hooks/OpenTelemetry}/.release-please-manifest.json (100%) create mode 100644 hooks/OpenTelemetry/README.md create mode 100644 hooks/OpenTelemetry/composer.json rename {src/CloudBees => hooks/OpenTelemetry}/examples/.gitignore (100%) create mode 100644 hooks/OpenTelemetry/examples/OTelManualInstrumentation/README.md create mode 100644 hooks/OpenTelemetry/examples/OTelManualInstrumentation/composer.json create mode 100644 hooks/OpenTelemetry/examples/OTelManualInstrumentation/src/main.php rename {src/CloudBees => hooks/OpenTelemetry}/phpcs.xml.dist (100%) rename {src/CloudBees => hooks/OpenTelemetry}/phpstan.neon.dist (100%) rename {src/CloudBees => hooks/OpenTelemetry}/phpunit.xml.dist (100%) rename {src/CloudBees => hooks/OpenTelemetry}/psalm-baseline.xml (100%) rename {src/CloudBees => hooks/OpenTelemetry}/psalm.xml (100%) rename {src/Split => hooks/OpenTelemetry}/release-please-config.json (100%) create mode 100644 hooks/OpenTelemetry/src/OpenTelemetryHook.php create mode 100644 hooks/OpenTelemetry/src/TracerHelper.php create mode 100644 hooks/OpenTelemetry/tests/TestCase.php create mode 100644 hooks/OpenTelemetry/tests/unit/OpenTelemetryHookTest.php create mode 100644 providers/.gitkeep rename {src/Flagd => providers/CloudBees}/.github/workflows/release-please.yml (100%) rename {src/Flagd => providers/CloudBees}/.gitignore (100%) rename {src/Flagd => providers/CloudBees}/.release-please-manifest.json (100%) rename {src => providers}/CloudBees/README.md (100%) rename {src => providers}/CloudBees/composer.json (100%) rename {src/Flagd => providers/CloudBees}/examples/.gitignore (100%) rename {src => providers}/CloudBees/examples/CloudBees/README.md (100%) rename {src => providers}/CloudBees/examples/CloudBees/composer.json (100%) rename {src => providers}/CloudBees/examples/CloudBees/src/main.php (100%) rename {src/Flagd => providers/CloudBees}/phpcs.xml.dist (100%) rename {src/Split => providers/CloudBees}/phpstan.neon.dist (100%) rename {src/Split => providers/CloudBees}/phpunit.xml.dist (100%) rename {src/Flagd => providers/CloudBees}/psalm-baseline.xml (100%) rename {src/Split => providers/CloudBees}/psalm.xml (100%) rename {src => providers}/CloudBees/release-please-config.json (100%) rename {src => providers}/CloudBees/scripts/scaffold-integration-tests.py (100%) rename {src => providers}/CloudBees/scripts/seed-data.json (100%) rename {src => providers}/CloudBees/src/CloudBeesProvider.php (100%) rename {src => providers}/CloudBees/src/context/ContextAdapter.php (100%) rename {src => providers}/CloudBees/src/errors/InvalidJsonTypeException.php (100%) rename {src => providers}/CloudBees/src/errors/JsonParseException.php (100%) rename {src => providers}/CloudBees/src/transformers/IdentityTransformer.php (100%) rename {src => providers}/CloudBees/src/transformers/JsonTransformer.php (100%) rename {src => providers}/CloudBees/tests/TestCase.php (100%) rename {src => providers}/CloudBees/tests/integration/CloudBeesProviderTest.php (100%) rename {src => providers}/CloudBees/tests/unit/JsonTransformerTest.php (100%) rename {src/Split => providers/Flagd}/.github/workflows/release-please.yml (100%) rename {src/Split => providers/Flagd}/.gitignore (100%) rename {src/Split => providers/Flagd}/.release-please-manifest.json (100%) rename {src => providers}/Flagd/README.md (100%) rename {src => providers}/Flagd/composer.json (100%) rename {src/Split => providers/Flagd}/examples/.gitignore (100%) rename {src => providers}/Flagd/examples/Grpc/README.md (100%) rename {src => providers}/Flagd/examples/Grpc/composer.json (100%) rename {src => providers}/Flagd/examples/Grpc/src/main.php (100%) rename {src => providers}/Flagd/examples/Http/README.md (100%) rename {src => providers}/Flagd/examples/Http/composer.json (100%) rename {src => providers}/Flagd/examples/Http/src/main.php (100%) rename {src/Split => providers/Flagd}/phpcs.xml.dist (100%) rename {src => providers}/Flagd/phpstan.neon.dist (100%) rename {src => providers}/Flagd/phpunit.xml.dist (100%) rename {src => providers}/Flagd/proto/README.md (100%) rename {src => providers}/Flagd/proto/php/GPBMetadata/Schema/V1/Schema.php (100%) rename {src => providers}/Flagd/proto/php/Schema/V1/EventStreamResponse.php (100%) rename {src => providers}/Flagd/proto/php/Schema/V1/ResolveBooleanRequest.php (100%) rename {src => providers}/Flagd/proto/php/Schema/V1/ResolveBooleanResponse.php (100%) rename {src => providers}/Flagd/proto/php/Schema/V1/ResolveFloatRequest.php (100%) rename {src => providers}/Flagd/proto/php/Schema/V1/ResolveFloatResponse.php (100%) rename {src => providers}/Flagd/proto/php/Schema/V1/ResolveIntRequest.php (100%) rename {src => providers}/Flagd/proto/php/Schema/V1/ResolveIntResponse.php (100%) rename {src => providers}/Flagd/proto/php/Schema/V1/ResolveObjectRequest.php (100%) rename {src => providers}/Flagd/proto/php/Schema/V1/ResolveObjectResponse.php (100%) rename {src => providers}/Flagd/proto/php/Schema/V1/ResolveStringRequest.php (100%) rename {src => providers}/Flagd/proto/php/Schema/V1/ResolveStringResponse.php (100%) rename {src => providers}/Flagd/proto/php/Schema/V1/ServiceClient.php (100%) rename {src/Split => providers/Flagd}/psalm-baseline.xml (100%) rename {src => providers}/Flagd/psalm.xml (100%) rename {src => providers}/Flagd/release-please-config.json (100%) rename {src => providers}/Flagd/schemas (100%) rename {src => providers}/Flagd/src/FlagdProvider.php (100%) rename {src => providers}/Flagd/src/common/EvaluationContextArrayFactory.php (100%) rename {src => providers}/Flagd/src/common/ResponseCodeErrorCodeMap.php (100%) rename {src => providers}/Flagd/src/common/SafeArrayAccessor.php (100%) rename {src => providers}/Flagd/src/config/Config.php (100%) rename {src => providers}/Flagd/src/config/ConfigFactory.php (100%) rename {src => providers}/Flagd/src/config/Defaults.php (100%) rename {src => providers}/Flagd/src/config/HttpConfig.php (100%) rename {src => providers}/Flagd/src/config/IConfig.php (100%) rename {src => providers}/Flagd/src/config/IHttpConfig.php (100%) rename {src => providers}/Flagd/src/config/Protocols.php (100%) rename {src => providers}/Flagd/src/config/Validator.php (100%) rename {src => providers}/Flagd/src/errors/InvalidConfigException.php (100%) rename {src => providers}/Flagd/src/errors/InvalidTypeException.php (100%) rename {src => providers}/Flagd/src/errors/RequestBuildException.php (100%) rename {src => providers}/Flagd/src/grpc/GrpcService.php (100%) rename {src => providers}/Flagd/src/grpc/ResponseResolutionDetailsAdapter.php (100%) rename {src => providers}/Flagd/src/grpc/ResponseValidator.php (100%) rename {src => providers}/Flagd/src/http/FlagdResponseResolutionDetailsAdapter.php (100%) rename {src => providers}/Flagd/src/http/FlagdResponseValidator.php (100%) rename {src => providers}/Flagd/src/http/GrpcWebEndpoint.php (100%) rename {src => providers}/Flagd/src/http/HttpService.php (100%) rename {src => providers}/Flagd/src/http/Method.php (100%) rename {src => providers}/Flagd/src/service/ServiceFactory.php (100%) rename {src => providers}/Flagd/src/service/ServiceInterface.php (100%) rename {src => providers}/Flagd/tests/TestCase.php (100%) rename {src => providers}/Flagd/tests/unit/FlagdProviderTest.php (100%) create mode 100644 providers/Split/.github/workflows/release-please.yml create mode 100644 providers/Split/.gitignore create mode 100644 providers/Split/.release-please-manifest.json rename {src => providers}/Split/README.md (100%) rename {src => providers}/Split/composer.json (100%) create mode 100644 providers/Split/examples/.gitignore rename {src => providers}/Split/examples/SplitSDK/README.md (100%) rename {src => providers}/Split/examples/SplitSDK/composer.json (100%) rename {src => providers}/Split/examples/SplitSDK/src/main.php (100%) create mode 100644 providers/Split/phpcs.xml.dist create mode 100644 providers/Split/phpstan.neon.dist create mode 100644 providers/Split/phpunit.xml.dist create mode 100644 providers/Split/psalm-baseline.xml create mode 100644 providers/Split/psalm.xml create mode 100644 providers/Split/release-please-config.json rename {src => providers}/Split/src/SplitProvider.php (100%) rename {src => providers}/Split/src/errors/InvalidTreatmentTypeException.php (100%) rename {src => providers}/Split/src/errors/SplitFactoryCreationException.php (100%) rename {src => providers}/Split/src/errors/TargetingKeyMissingException.php (100%) rename {src => providers}/Split/src/treatments/TreatmentParser.php (100%) rename {src => providers}/Split/src/treatments/TreatmentValidator.php (100%) rename {src => providers}/Split/tests/TestCase.php (100%) rename {src => providers}/Split/tests/integration/SplitProviderTest.php (100%) rename {src => providers}/Split/tests/integration/files/splits.yml (100%) rename {src => providers}/Split/tests/unit/SplitProviderTest.php (100%) diff --git a/.github/workflows/php-ci.yaml b/.github/workflows/php-ci.yaml index 5741bae3..8b55123e 100644 --- a/.github/workflows/php-ci.yaml +++ b/.github/workflows/php-ci.yaml @@ -12,8 +12,12 @@ jobs: strategy: matrix: operating-system: [ubuntu-latest] - php-version: ['7.4', '8.0', '8.1'] - project: ['Flagd', 'Split', 'CloudBees'] + php-version: ['7.4', '8.0', '8.1', '8.2'] + project-dir: + - hooks/OpenTelemetry + - providers/Flagd + - providers/Split + - providers/CloudBees # todo exclude some matrix combinations based on php version requirements # https://docs.github.com/en/actions/using-jobs/using-a-matrix-for-your-jobs#excluding-matrix-configurations @@ -40,55 +44,51 @@ jobs: id: composer-cache uses: actions/cache@v3 with: - path: src/${{ matrix.project }}/vendor + path: ${{ matrix.project-dir }}/vendor key: ${{ runner.os }}-${{ matrix.php-version }}-php-${{ hashFiles('**/composer.json') }} restore-keys: | ${{ runner.os }}-${{ matrix.php-version }}-php- - name: Install dependencies if: steps.composer-cache.outputs.cache-hit != 'true' - working-directory: src/${{ matrix.project }} + working-directory: ${{ matrix.project-dir }} run: composer install --prefer-dist --no-progress --no-suggest - name: Validate Packages composer.json - working-directory: src/${{ matrix.project }} + working-directory: ${{ matrix.project-dir }} run: composer validate - name: Check Style - working-directory: src/${{ matrix.project }} + working-directory: ${{ matrix.project-dir }} run: vendor/bin/phpcs - name: Run Phan - working-directory: src/${{ matrix.project }} + working-directory: ${{ matrix.project-dir }} env: PHAN_DISABLE_XDEBUG_WARN: 1 run: vendor/bin/phan - name: Run Psalm - working-directory: src/${{ matrix.project }} + working-directory: ${{ matrix.project-dir }} run: vendor/bin/psalm --output-format=github --php-version=${{ matrix.php-version }} - name: Run Phpstan - working-directory: src/${{ matrix.project }} + working-directory: ${{ matrix.project-dir }} run: vendor/bin/phpstan analyse --error-format=github - name: Run PHPUnit (unit tests) - working-directory: src/${{ matrix.project }} + working-directory: ${{ matrix.project-dir }} run: | - composer run dev:test:unit:setup - vendor/bin/phpunit --coverage-text --coverage-clover=coverage.clover --testsuite unit - composer run dev:test:unit:teardown + composer run dev:test:unit - name: Run PHPUnit (integration tests) - working-directory: src/${{ matrix.project }} + working-directory: ${{ matrix.project-dir }} run: | - composer run dev:test:integration:setup - vendor/bin/phpunit --coverage-text --coverage-clover=coverage.clover --testsuite integration - composer run dev:test:integration:teardown + composer run dev:test:integration ### TODO: Enable codecov support # - name: Code Coverage - # working-directory: src/${{ matrix.project }} + # working-directory: ${{ matrix.project-dir }} # run: bash <(curl -s https://codecov.io/bash) -F ${{ matrix.php-version }} ### TODO: Replicate any necessary package checks diff --git a/.gitmodules b/.gitmodules index 0e03a2f9..4c5f1304 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "schemas"] - path = src/Flagd/schemas + path = providers/Flagd/schemas + url = https://github.com/tcarrio/schemas/ +[submodule "providers/Flagd/schemas"] + path = providers/Flagd/schemas url = https://github.com/tcarrio/schemas/ diff --git a/.gitsplit.yml b/.gitsplit.yml index 607974d4..9318e9e3 100644 --- a/.gitsplit.yml +++ b/.gitsplit.yml @@ -6,11 +6,13 @@ project_url: "https://github.com/open-feature/php-sdk-contrib.git" # List of splits. splits: - - prefix: "src/Flagd" + - prefix: "hooks/OpenTelemetry" + target: "https://${GH_TOKEN}@github.com/open-feature-php/otel-hook.git" + - prefix: "providers/Flagd" target: "https://${GH_TOKEN}@github.com/open-feature-php/flagd-provider.git" - - prefix: "src/Split" + - prefix: "providers/Split" target: "https://${GH_TOKEN}@github.com/open-feature-php/split-provider.git" - - prefix: "src/CloudBees" + - prefix: "providers/CloudBees" target: "https://${GH_TOKEN}@github.com/open-feature-php/cloudbees-provider.git" # List of references to split (defined as regexp) diff --git a/README.md b/README.md index 6e744c7e..68bd13aa 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,12 @@ The `php-contrib-sdk` repository is a monorepository containing various providers and hooks for OpenFeature's PHP SDK. Packages include: -- [Flagd](./src/Flagd/README.md) -- [Split](./src/Split/README.md) -- [CloudBees](./src/CloudBees/README.md) +- Providers + - [Flagd](./providers/Flagd/README.md) + - [Split](./providers/Split/README.md) + - [CloudBees](./providers/CloudBees/README.md) +- Hooks + - [OpenTelemetry](./hooks/OpenTelemetry/README.md) ### Status diff --git a/hooks/.gitkeep b/hooks/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/src/CloudBees/.github/workflows/release-please.yml b/hooks/OpenTelemetry/.github/workflows/release-please.yml similarity index 100% rename from src/CloudBees/.github/workflows/release-please.yml rename to hooks/OpenTelemetry/.github/workflows/release-please.yml diff --git a/src/CloudBees/.gitignore b/hooks/OpenTelemetry/.gitignore similarity index 100% rename from src/CloudBees/.gitignore rename to hooks/OpenTelemetry/.gitignore diff --git a/src/CloudBees/.release-please-manifest.json b/hooks/OpenTelemetry/.release-please-manifest.json similarity index 100% rename from src/CloudBees/.release-please-manifest.json rename to hooks/OpenTelemetry/.release-please-manifest.json diff --git a/hooks/OpenTelemetry/README.md b/hooks/OpenTelemetry/README.md new file mode 100644 index 00000000..67f80885 --- /dev/null +++ b/hooks/OpenTelemetry/README.md @@ -0,0 +1,56 @@ +# OpenFeature OpenTelemetry Hook + +[![a](https://img.shields.io/badge/slack-%40cncf%2Fopenfeature-brightgreen?style=flat&logo=slack)](https://cloud-native.slack.com/archives/C0344AANLA1) +[![Latest Stable Version](http://poser.pugx.org/open-feature/otel-hook/v)](https://packagist.org/packages/open-feature/otel-hook) +[![Total Downloads](http://poser.pugx.org/open-feature/otel-hook/downloads)](https://packagist.org/packages/open-feature/otel-hook) +![PHP 7.4+](https://img.shields.io/badge/php->=7.4-blue.svg) +[![License](http://poser.pugx.org/open-feature/otel-hook/license)](https://packagist.org/packages/open-feature/otel-hook) + +## Overview + +OpenTelemetry is an open specification for distributed tracing, metrics, and logging. It defines a semantic convention for feature flagging which is utilized in this hook to report flag evaluations. + +This package also builds on various PSRs (PHP Standards Recommendations) such as the Logger interfaces (PSR-3) and the Basic and Extended Coding Standards (PSR-1 and PSR-12). + +### OpenTelemetry Package Status + +The OpenTelemetry package for PHP is still in beta, so there could be changes required. However, it exposes global primitives for span retrieval that should not require any configuration upfront for the provider to just work. + +## Installation + +``` +$ composer require open-feature/otel-hook // installs the latest version +``` + +## Usage + +The `OpenTelemetryHook` should be registered to the OpenFeatureAPI globally for use across all evaluations. + +It makes use of the `open-telemetry/api` packages `Globals` utility for current span retrieval, thus has +no dependency on configuration or injection of tracers. + +```php +use OpenFeature\Hooks\OpenTelemetry\OpenTelemetryHook; + +OpenTelemetryHook::register(); +``` + +For more information on OpenTelemetry, check out [their documentation](https://opentelemetry.io/docs/instrumentation/php/). + +## Development + +### PHP Versioning + +This library targets PHP version 7.4 and newer. As long as you have any compatible version of PHP on your system you should be able to utilize the OpenFeature SDK. + +This package also has a `.tool-versions` file for use with PHP version managers like `asdf`. + +### Installation and Dependencies + +Install dependencies with `composer install`. `composer install` will update the `composer.lock` with the most recent compatible versions. + +We value having as few runtime dependencies as possible. The addition of any dependencies requires careful consideration and review. + +### Testing + +Run tests with `composer run test`. \ No newline at end of file diff --git a/hooks/OpenTelemetry/composer.json b/hooks/OpenTelemetry/composer.json new file mode 100644 index 00000000..a3819459 --- /dev/null +++ b/hooks/OpenTelemetry/composer.json @@ -0,0 +1,136 @@ +{ + "name": "open-feature/split-provider", + "description": "The Split provider package for OpenFeature", + "license": "Apache-2.0", + "type": "library", + "keywords": [ + "featureflags", + "featureflagging", + "openfeature", + "split", + "splitio", + "provider" + ], + "authors": [ + { + "name": "OpenFeature PHP Maintainers", + "homepage": "https://github.com/orgs/open-feature/teams/php-maintainer" + }, + { + "name": "open-feature/php-sdk-contrib Contributors", + "homepage": "https://github.com/open-feature/php-sdk-contrib/graphs/contributors" + } + ], + "require": { + "php": "^7.4 || ^8", + "open-feature/sdk": "^1.1.0", + "open-telemetry/api": "^0.0.17", + "splitsoftware/split-sdk-php": "^7.1" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.25", + "friendsofphp/php-cs-fixer": "^3.13", + "hamcrest/hamcrest-php": "^2.0", + "mdwheele/zalgo": "^0.3.1", + "mikey179/vfsstream": "v1.6.11", + "mockery/mockery": "^1.5", + "phan/phan": "^5.4", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "~1.9.0", + "phpstan/phpstan-mockery": "^1.0", + "phpstan/phpstan-phpunit": "^1.1", + "psalm/plugin-mockery": "^0.9.1", + "psalm/plugin-phpunit": "^0.18.0", + "ramsey/coding-standard": "^2.0.3", + "ramsey/composer-repl": "^1.4", + "ramsey/conventional-commits": "^1.3", + "roave/security-advisories": "dev-latest", + "spatie/phpunit-snapshot-assertions": "^4.2", + "vimeo/psalm": "~4.30.0" + }, + "minimum-stability": "dev", + "prefer-stable": true, + "autoload": { + "psr-4": { + "OpenFeature\\Hooks\\OpenTelemetry\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "OpenFeature\\Hooks\\OpenTelemetry\\Test\\": "tests" + } + }, + "config": { + "allow-plugins": { + "phpstan/extension-installer": true, + "dealerdirect/phpcodesniffer-composer-installer": true, + "ergebnis/composer-normalize": true, + "captainhook/plugin-composer": true, + "ramsey/composer-repl": true + }, + "sort-packages": true + }, + "extra": { + "captainhook": { + "force-install": false + } + }, + "scripts": { + "dev:analyze": [ + "@dev:analyze:phpstan", + "@dev:analyze:psalm" + ], + "dev:analyze:phpstan": "phpstan analyse --ansi --debug --memory-limit=512M", + "dev:analyze:psalm": "psalm", + "dev:build:clean": "git clean -fX build/", + "dev:lint": [ + "@dev:lint:syntax", + "@dev:lint:style" + ], + "dev:lint:fix": "phpcbf", + "dev:lint:style": "phpcs --colors", + "dev:lint:syntax": "parallel-lint --colors src/ tests/", + "dev:test": [ + "@dev:lint", + "@dev:analyze", + "@dev:test:unit", + "@dev:test:integration" + ], + "dev:test:coverage:ci": "phpunit --colors=always --coverage-text --coverage-clover build/coverage/clover.xml --coverage-cobertura build/coverage/cobertura.xml --coverage-crap4j build/coverage/crap4j.xml --coverage-xml build/coverage/coverage-xml --log-junit build/junit.xml", + "dev:test:coverage:html": "phpunit --colors=always --coverage-html build/coverage/coverage-html/", + "dev:test:unit": [ + "@dev:test:unit:setup", + "phpunit --colors=always --testdox --testsuite=unit", + "@dev:test:unit:teardown" + ], + "dev:test:unit:debug": "phpunit --colors=always --testdox -d xdebug.profiler_enable=on", + "dev:test:unit:setup": "echo 'Setup for unit tests...'", + "dev:test:unit:teardown": "echo 'Tore down for unit tests...'", + "dev:test:integration": [ + "@dev:test:integration:setup", + "echo 'No integration tests to run'", + "@dev:test:integration:teardown" + ], + "dev:test:integration:debug": "phpunit --colors=always --testdox -d xdebug.profiler_enable=on", + "dev:test:integration:setup": "echo 'Setup for integration tests...'", + "dev:test:integration:teardown": "echo 'Tore down integration tests...'", + "test": "@dev:test" + }, + "scripts-descriptions": { + "dev:analyze": "Runs all static analysis checks.", + "dev:analyze:phpstan": "Runs the PHPStan static analyzer.", + "dev:analyze:psalm": "Runs the Psalm static analyzer.", + "dev:build:clean": "Cleans the build/ directory.", + "dev:lint": "Runs all linting checks.", + "dev:lint:fix": "Auto-fixes coding standards issues, if possible.", + "dev:lint:style": "Checks for coding standards issues.", + "dev:lint:syntax": "Checks for syntax errors.", + "dev:test": "Runs linting, static analysis, and unit tests.", + "dev:test:coverage:ci": "Runs unit tests and generates CI coverage reports.", + "dev:test:coverage:html": "Runs unit tests and generates HTML coverage report.", + "dev:test:unit": "Runs unit tests.", + "test": "Runs linting, static analysis, and unit tests." + } +} diff --git a/src/CloudBees/examples/.gitignore b/hooks/OpenTelemetry/examples/.gitignore similarity index 100% rename from src/CloudBees/examples/.gitignore rename to hooks/OpenTelemetry/examples/.gitignore diff --git a/hooks/OpenTelemetry/examples/OTelManualInstrumentation/README.md b/hooks/OpenTelemetry/examples/OTelManualInstrumentation/README.md new file mode 100644 index 00000000..9e88acd4 --- /dev/null +++ b/hooks/OpenTelemetry/examples/OTelManualInstrumentation/README.md @@ -0,0 +1,3 @@ +# OpenFeature OpenTelemetry Hook example + +This example provides an example of bootstrapping and using the OpenTelemetry hook for OpenFeature. diff --git a/hooks/OpenTelemetry/examples/OTelManualInstrumentation/composer.json b/hooks/OpenTelemetry/examples/OTelManualInstrumentation/composer.json new file mode 100644 index 00000000..7894e958 --- /dev/null +++ b/hooks/OpenTelemetry/examples/OTelManualInstrumentation/composer.json @@ -0,0 +1,21 @@ +{ + "name": "open-feature/otel-manual-instrumentation-example", + "description": "An example of using the OpenTelemetry hook for OpenFeature with manual instrumentation", + "type": "project", + "license": "Apache-2.0", + "autoload": { + "psr-4": { + "OpenFeature\\Providers\\Examples\\SplitSdkExample\\": "src/" + } + }, + "authors": [ + { + "name": "Tom Carrio", + "email": "tom@carrio.dev" + } + ], + "require": { + "open-feature/sdk": "^1.1.2", + "open-telemetry/api": "^0.0.17" + } +} diff --git a/hooks/OpenTelemetry/examples/OTelManualInstrumentation/src/main.php b/hooks/OpenTelemetry/examples/OTelManualInstrumentation/src/main.php new file mode 100644 index 00000000..207eebfb --- /dev/null +++ b/hooks/OpenTelemetry/examples/OTelManualInstrumentation/src/main.php @@ -0,0 +1,3 @@ +addHooks(self::$instance); + self::$registeredHook = true; + } + + private static ?OpenTelemetryHook $instance = null; + private static bool $registeredHook = false; + + public function before(HookContext $context, HookHints $hints): ?EvaluationContext + { + return null; + } + + public function after(HookContext $context, ResolutionDetails $details, HookHints $hints): void + { + $span = Span::getCurrent(); + + $span->addEvent(self::EVENT_NAME, [ + self::FLAG_KEY => $context->getFlagKey(), + self::FLAG_PROVIDER_NAME => OpenFeatureAPI::getInstance()->getProvider()->getMetadata()->getName(), + self::FLAG_VARIANT => $details->getVariant(), + ]); + } + + public function error(HookContext $context, Throwable $error, HookHints $hints): void + { + $span = Span::getCurrent(); + + $span->recordException($error, [ + self::FLAG_KEY => $context->getFlagKey(), + self::FLAG_PROVIDER_NAME => OpenFeatureAPI::getInstance()->getProvider()->getMetadata()->getName(), + ]); + } + + public function finally(HookContext $context, HookHints $hints): void + { + // no-op + } + + public function supportsFlagValueType(string $flagValueType): bool + { + return true; + } +} diff --git a/hooks/OpenTelemetry/src/TracerHelper.php b/hooks/OpenTelemetry/src/TracerHelper.php new file mode 100644 index 00000000..5d08c4b5 --- /dev/null +++ b/hooks/OpenTelemetry/src/TracerHelper.php @@ -0,0 +1,40 @@ +has(TracerInterface::class)) { + /** @var TracerInterface|null $maybeTracer */ + $maybeTracer = $container->get(TracerInterface::class); + + if ($maybeTracer instanceof TracerInterface) { + return $maybeTracer; + } + } + } + + return Globals::tracerProvider()->getTracer('open-feature/otel-hook', '0.0.1'); + } +} diff --git a/hooks/OpenTelemetry/tests/TestCase.php b/hooks/OpenTelemetry/tests/TestCase.php new file mode 100644 index 00000000..21e59867 --- /dev/null +++ b/hooks/OpenTelemetry/tests/TestCase.php @@ -0,0 +1,40 @@ + $class + * @param mixed ...$arguments + * + * @return T & MockInterface + * + * @template T + * + * phpcs:disable SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint + */ + public function mockery(string $class, ...$arguments) + { + /** @var T & MockInterface $mock */ + $mock = Mockery::mock($class, ...$arguments); + + return $mock; + } +} diff --git a/hooks/OpenTelemetry/tests/unit/OpenTelemetryHookTest.php b/hooks/OpenTelemetry/tests/unit/OpenTelemetryHookTest.php new file mode 100644 index 00000000..c793d9d4 --- /dev/null +++ b/hooks/OpenTelemetry/tests/unit/OpenTelemetryHookTest.php @@ -0,0 +1,26 @@ +assertNotEmpty($api->getHooks()); + $this->assertInstanceOf(Hook::class, $api->getHooks()[0]); + } +} diff --git a/providers/.gitkeep b/providers/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/src/Flagd/.github/workflows/release-please.yml b/providers/CloudBees/.github/workflows/release-please.yml similarity index 100% rename from src/Flagd/.github/workflows/release-please.yml rename to providers/CloudBees/.github/workflows/release-please.yml diff --git a/src/Flagd/.gitignore b/providers/CloudBees/.gitignore similarity index 100% rename from src/Flagd/.gitignore rename to providers/CloudBees/.gitignore diff --git a/src/Flagd/.release-please-manifest.json b/providers/CloudBees/.release-please-manifest.json similarity index 100% rename from src/Flagd/.release-please-manifest.json rename to providers/CloudBees/.release-please-manifest.json diff --git a/src/CloudBees/README.md b/providers/CloudBees/README.md similarity index 100% rename from src/CloudBees/README.md rename to providers/CloudBees/README.md diff --git a/src/CloudBees/composer.json b/providers/CloudBees/composer.json similarity index 100% rename from src/CloudBees/composer.json rename to providers/CloudBees/composer.json diff --git a/src/Flagd/examples/.gitignore b/providers/CloudBees/examples/.gitignore similarity index 100% rename from src/Flagd/examples/.gitignore rename to providers/CloudBees/examples/.gitignore diff --git a/src/CloudBees/examples/CloudBees/README.md b/providers/CloudBees/examples/CloudBees/README.md similarity index 100% rename from src/CloudBees/examples/CloudBees/README.md rename to providers/CloudBees/examples/CloudBees/README.md diff --git a/src/CloudBees/examples/CloudBees/composer.json b/providers/CloudBees/examples/CloudBees/composer.json similarity index 100% rename from src/CloudBees/examples/CloudBees/composer.json rename to providers/CloudBees/examples/CloudBees/composer.json diff --git a/src/CloudBees/examples/CloudBees/src/main.php b/providers/CloudBees/examples/CloudBees/src/main.php similarity index 100% rename from src/CloudBees/examples/CloudBees/src/main.php rename to providers/CloudBees/examples/CloudBees/src/main.php diff --git a/src/Flagd/phpcs.xml.dist b/providers/CloudBees/phpcs.xml.dist similarity index 100% rename from src/Flagd/phpcs.xml.dist rename to providers/CloudBees/phpcs.xml.dist diff --git a/src/Split/phpstan.neon.dist b/providers/CloudBees/phpstan.neon.dist similarity index 100% rename from src/Split/phpstan.neon.dist rename to providers/CloudBees/phpstan.neon.dist diff --git a/src/Split/phpunit.xml.dist b/providers/CloudBees/phpunit.xml.dist similarity index 100% rename from src/Split/phpunit.xml.dist rename to providers/CloudBees/phpunit.xml.dist diff --git a/src/Flagd/psalm-baseline.xml b/providers/CloudBees/psalm-baseline.xml similarity index 100% rename from src/Flagd/psalm-baseline.xml rename to providers/CloudBees/psalm-baseline.xml diff --git a/src/Split/psalm.xml b/providers/CloudBees/psalm.xml similarity index 100% rename from src/Split/psalm.xml rename to providers/CloudBees/psalm.xml diff --git a/src/CloudBees/release-please-config.json b/providers/CloudBees/release-please-config.json similarity index 100% rename from src/CloudBees/release-please-config.json rename to providers/CloudBees/release-please-config.json diff --git a/src/CloudBees/scripts/scaffold-integration-tests.py b/providers/CloudBees/scripts/scaffold-integration-tests.py similarity index 100% rename from src/CloudBees/scripts/scaffold-integration-tests.py rename to providers/CloudBees/scripts/scaffold-integration-tests.py diff --git a/src/CloudBees/scripts/seed-data.json b/providers/CloudBees/scripts/seed-data.json similarity index 100% rename from src/CloudBees/scripts/seed-data.json rename to providers/CloudBees/scripts/seed-data.json diff --git a/src/CloudBees/src/CloudBeesProvider.php b/providers/CloudBees/src/CloudBeesProvider.php similarity index 100% rename from src/CloudBees/src/CloudBeesProvider.php rename to providers/CloudBees/src/CloudBeesProvider.php diff --git a/src/CloudBees/src/context/ContextAdapter.php b/providers/CloudBees/src/context/ContextAdapter.php similarity index 100% rename from src/CloudBees/src/context/ContextAdapter.php rename to providers/CloudBees/src/context/ContextAdapter.php diff --git a/src/CloudBees/src/errors/InvalidJsonTypeException.php b/providers/CloudBees/src/errors/InvalidJsonTypeException.php similarity index 100% rename from src/CloudBees/src/errors/InvalidJsonTypeException.php rename to providers/CloudBees/src/errors/InvalidJsonTypeException.php diff --git a/src/CloudBees/src/errors/JsonParseException.php b/providers/CloudBees/src/errors/JsonParseException.php similarity index 100% rename from src/CloudBees/src/errors/JsonParseException.php rename to providers/CloudBees/src/errors/JsonParseException.php diff --git a/src/CloudBees/src/transformers/IdentityTransformer.php b/providers/CloudBees/src/transformers/IdentityTransformer.php similarity index 100% rename from src/CloudBees/src/transformers/IdentityTransformer.php rename to providers/CloudBees/src/transformers/IdentityTransformer.php diff --git a/src/CloudBees/src/transformers/JsonTransformer.php b/providers/CloudBees/src/transformers/JsonTransformer.php similarity index 100% rename from src/CloudBees/src/transformers/JsonTransformer.php rename to providers/CloudBees/src/transformers/JsonTransformer.php diff --git a/src/CloudBees/tests/TestCase.php b/providers/CloudBees/tests/TestCase.php similarity index 100% rename from src/CloudBees/tests/TestCase.php rename to providers/CloudBees/tests/TestCase.php diff --git a/src/CloudBees/tests/integration/CloudBeesProviderTest.php b/providers/CloudBees/tests/integration/CloudBeesProviderTest.php similarity index 100% rename from src/CloudBees/tests/integration/CloudBeesProviderTest.php rename to providers/CloudBees/tests/integration/CloudBeesProviderTest.php diff --git a/src/CloudBees/tests/unit/JsonTransformerTest.php b/providers/CloudBees/tests/unit/JsonTransformerTest.php similarity index 100% rename from src/CloudBees/tests/unit/JsonTransformerTest.php rename to providers/CloudBees/tests/unit/JsonTransformerTest.php diff --git a/src/Split/.github/workflows/release-please.yml b/providers/Flagd/.github/workflows/release-please.yml similarity index 100% rename from src/Split/.github/workflows/release-please.yml rename to providers/Flagd/.github/workflows/release-please.yml diff --git a/src/Split/.gitignore b/providers/Flagd/.gitignore similarity index 100% rename from src/Split/.gitignore rename to providers/Flagd/.gitignore diff --git a/src/Split/.release-please-manifest.json b/providers/Flagd/.release-please-manifest.json similarity index 100% rename from src/Split/.release-please-manifest.json rename to providers/Flagd/.release-please-manifest.json diff --git a/src/Flagd/README.md b/providers/Flagd/README.md similarity index 100% rename from src/Flagd/README.md rename to providers/Flagd/README.md diff --git a/src/Flagd/composer.json b/providers/Flagd/composer.json similarity index 100% rename from src/Flagd/composer.json rename to providers/Flagd/composer.json diff --git a/src/Split/examples/.gitignore b/providers/Flagd/examples/.gitignore similarity index 100% rename from src/Split/examples/.gitignore rename to providers/Flagd/examples/.gitignore diff --git a/src/Flagd/examples/Grpc/README.md b/providers/Flagd/examples/Grpc/README.md similarity index 100% rename from src/Flagd/examples/Grpc/README.md rename to providers/Flagd/examples/Grpc/README.md diff --git a/src/Flagd/examples/Grpc/composer.json b/providers/Flagd/examples/Grpc/composer.json similarity index 100% rename from src/Flagd/examples/Grpc/composer.json rename to providers/Flagd/examples/Grpc/composer.json diff --git a/src/Flagd/examples/Grpc/src/main.php b/providers/Flagd/examples/Grpc/src/main.php similarity index 100% rename from src/Flagd/examples/Grpc/src/main.php rename to providers/Flagd/examples/Grpc/src/main.php diff --git a/src/Flagd/examples/Http/README.md b/providers/Flagd/examples/Http/README.md similarity index 100% rename from src/Flagd/examples/Http/README.md rename to providers/Flagd/examples/Http/README.md diff --git a/src/Flagd/examples/Http/composer.json b/providers/Flagd/examples/Http/composer.json similarity index 100% rename from src/Flagd/examples/Http/composer.json rename to providers/Flagd/examples/Http/composer.json diff --git a/src/Flagd/examples/Http/src/main.php b/providers/Flagd/examples/Http/src/main.php similarity index 100% rename from src/Flagd/examples/Http/src/main.php rename to providers/Flagd/examples/Http/src/main.php diff --git a/src/Split/phpcs.xml.dist b/providers/Flagd/phpcs.xml.dist similarity index 100% rename from src/Split/phpcs.xml.dist rename to providers/Flagd/phpcs.xml.dist diff --git a/src/Flagd/phpstan.neon.dist b/providers/Flagd/phpstan.neon.dist similarity index 100% rename from src/Flagd/phpstan.neon.dist rename to providers/Flagd/phpstan.neon.dist diff --git a/src/Flagd/phpunit.xml.dist b/providers/Flagd/phpunit.xml.dist similarity index 100% rename from src/Flagd/phpunit.xml.dist rename to providers/Flagd/phpunit.xml.dist diff --git a/src/Flagd/proto/README.md b/providers/Flagd/proto/README.md similarity index 100% rename from src/Flagd/proto/README.md rename to providers/Flagd/proto/README.md diff --git a/src/Flagd/proto/php/GPBMetadata/Schema/V1/Schema.php b/providers/Flagd/proto/php/GPBMetadata/Schema/V1/Schema.php similarity index 100% rename from src/Flagd/proto/php/GPBMetadata/Schema/V1/Schema.php rename to providers/Flagd/proto/php/GPBMetadata/Schema/V1/Schema.php diff --git a/src/Flagd/proto/php/Schema/V1/EventStreamResponse.php b/providers/Flagd/proto/php/Schema/V1/EventStreamResponse.php similarity index 100% rename from src/Flagd/proto/php/Schema/V1/EventStreamResponse.php rename to providers/Flagd/proto/php/Schema/V1/EventStreamResponse.php diff --git a/src/Flagd/proto/php/Schema/V1/ResolveBooleanRequest.php b/providers/Flagd/proto/php/Schema/V1/ResolveBooleanRequest.php similarity index 100% rename from src/Flagd/proto/php/Schema/V1/ResolveBooleanRequest.php rename to providers/Flagd/proto/php/Schema/V1/ResolveBooleanRequest.php diff --git a/src/Flagd/proto/php/Schema/V1/ResolveBooleanResponse.php b/providers/Flagd/proto/php/Schema/V1/ResolveBooleanResponse.php similarity index 100% rename from src/Flagd/proto/php/Schema/V1/ResolveBooleanResponse.php rename to providers/Flagd/proto/php/Schema/V1/ResolveBooleanResponse.php diff --git a/src/Flagd/proto/php/Schema/V1/ResolveFloatRequest.php b/providers/Flagd/proto/php/Schema/V1/ResolveFloatRequest.php similarity index 100% rename from src/Flagd/proto/php/Schema/V1/ResolveFloatRequest.php rename to providers/Flagd/proto/php/Schema/V1/ResolveFloatRequest.php diff --git a/src/Flagd/proto/php/Schema/V1/ResolveFloatResponse.php b/providers/Flagd/proto/php/Schema/V1/ResolveFloatResponse.php similarity index 100% rename from src/Flagd/proto/php/Schema/V1/ResolveFloatResponse.php rename to providers/Flagd/proto/php/Schema/V1/ResolveFloatResponse.php diff --git a/src/Flagd/proto/php/Schema/V1/ResolveIntRequest.php b/providers/Flagd/proto/php/Schema/V1/ResolveIntRequest.php similarity index 100% rename from src/Flagd/proto/php/Schema/V1/ResolveIntRequest.php rename to providers/Flagd/proto/php/Schema/V1/ResolveIntRequest.php diff --git a/src/Flagd/proto/php/Schema/V1/ResolveIntResponse.php b/providers/Flagd/proto/php/Schema/V1/ResolveIntResponse.php similarity index 100% rename from src/Flagd/proto/php/Schema/V1/ResolveIntResponse.php rename to providers/Flagd/proto/php/Schema/V1/ResolveIntResponse.php diff --git a/src/Flagd/proto/php/Schema/V1/ResolveObjectRequest.php b/providers/Flagd/proto/php/Schema/V1/ResolveObjectRequest.php similarity index 100% rename from src/Flagd/proto/php/Schema/V1/ResolveObjectRequest.php rename to providers/Flagd/proto/php/Schema/V1/ResolveObjectRequest.php diff --git a/src/Flagd/proto/php/Schema/V1/ResolveObjectResponse.php b/providers/Flagd/proto/php/Schema/V1/ResolveObjectResponse.php similarity index 100% rename from src/Flagd/proto/php/Schema/V1/ResolveObjectResponse.php rename to providers/Flagd/proto/php/Schema/V1/ResolveObjectResponse.php diff --git a/src/Flagd/proto/php/Schema/V1/ResolveStringRequest.php b/providers/Flagd/proto/php/Schema/V1/ResolveStringRequest.php similarity index 100% rename from src/Flagd/proto/php/Schema/V1/ResolveStringRequest.php rename to providers/Flagd/proto/php/Schema/V1/ResolveStringRequest.php diff --git a/src/Flagd/proto/php/Schema/V1/ResolveStringResponse.php b/providers/Flagd/proto/php/Schema/V1/ResolveStringResponse.php similarity index 100% rename from src/Flagd/proto/php/Schema/V1/ResolveStringResponse.php rename to providers/Flagd/proto/php/Schema/V1/ResolveStringResponse.php diff --git a/src/Flagd/proto/php/Schema/V1/ServiceClient.php b/providers/Flagd/proto/php/Schema/V1/ServiceClient.php similarity index 100% rename from src/Flagd/proto/php/Schema/V1/ServiceClient.php rename to providers/Flagd/proto/php/Schema/V1/ServiceClient.php diff --git a/src/Split/psalm-baseline.xml b/providers/Flagd/psalm-baseline.xml similarity index 100% rename from src/Split/psalm-baseline.xml rename to providers/Flagd/psalm-baseline.xml diff --git a/src/Flagd/psalm.xml b/providers/Flagd/psalm.xml similarity index 100% rename from src/Flagd/psalm.xml rename to providers/Flagd/psalm.xml diff --git a/src/Flagd/release-please-config.json b/providers/Flagd/release-please-config.json similarity index 100% rename from src/Flagd/release-please-config.json rename to providers/Flagd/release-please-config.json diff --git a/src/Flagd/schemas b/providers/Flagd/schemas similarity index 100% rename from src/Flagd/schemas rename to providers/Flagd/schemas diff --git a/src/Flagd/src/FlagdProvider.php b/providers/Flagd/src/FlagdProvider.php similarity index 100% rename from src/Flagd/src/FlagdProvider.php rename to providers/Flagd/src/FlagdProvider.php diff --git a/src/Flagd/src/common/EvaluationContextArrayFactory.php b/providers/Flagd/src/common/EvaluationContextArrayFactory.php similarity index 100% rename from src/Flagd/src/common/EvaluationContextArrayFactory.php rename to providers/Flagd/src/common/EvaluationContextArrayFactory.php diff --git a/src/Flagd/src/common/ResponseCodeErrorCodeMap.php b/providers/Flagd/src/common/ResponseCodeErrorCodeMap.php similarity index 100% rename from src/Flagd/src/common/ResponseCodeErrorCodeMap.php rename to providers/Flagd/src/common/ResponseCodeErrorCodeMap.php diff --git a/src/Flagd/src/common/SafeArrayAccessor.php b/providers/Flagd/src/common/SafeArrayAccessor.php similarity index 100% rename from src/Flagd/src/common/SafeArrayAccessor.php rename to providers/Flagd/src/common/SafeArrayAccessor.php diff --git a/src/Flagd/src/config/Config.php b/providers/Flagd/src/config/Config.php similarity index 100% rename from src/Flagd/src/config/Config.php rename to providers/Flagd/src/config/Config.php diff --git a/src/Flagd/src/config/ConfigFactory.php b/providers/Flagd/src/config/ConfigFactory.php similarity index 100% rename from src/Flagd/src/config/ConfigFactory.php rename to providers/Flagd/src/config/ConfigFactory.php diff --git a/src/Flagd/src/config/Defaults.php b/providers/Flagd/src/config/Defaults.php similarity index 100% rename from src/Flagd/src/config/Defaults.php rename to providers/Flagd/src/config/Defaults.php diff --git a/src/Flagd/src/config/HttpConfig.php b/providers/Flagd/src/config/HttpConfig.php similarity index 100% rename from src/Flagd/src/config/HttpConfig.php rename to providers/Flagd/src/config/HttpConfig.php diff --git a/src/Flagd/src/config/IConfig.php b/providers/Flagd/src/config/IConfig.php similarity index 100% rename from src/Flagd/src/config/IConfig.php rename to providers/Flagd/src/config/IConfig.php diff --git a/src/Flagd/src/config/IHttpConfig.php b/providers/Flagd/src/config/IHttpConfig.php similarity index 100% rename from src/Flagd/src/config/IHttpConfig.php rename to providers/Flagd/src/config/IHttpConfig.php diff --git a/src/Flagd/src/config/Protocols.php b/providers/Flagd/src/config/Protocols.php similarity index 100% rename from src/Flagd/src/config/Protocols.php rename to providers/Flagd/src/config/Protocols.php diff --git a/src/Flagd/src/config/Validator.php b/providers/Flagd/src/config/Validator.php similarity index 100% rename from src/Flagd/src/config/Validator.php rename to providers/Flagd/src/config/Validator.php diff --git a/src/Flagd/src/errors/InvalidConfigException.php b/providers/Flagd/src/errors/InvalidConfigException.php similarity index 100% rename from src/Flagd/src/errors/InvalidConfigException.php rename to providers/Flagd/src/errors/InvalidConfigException.php diff --git a/src/Flagd/src/errors/InvalidTypeException.php b/providers/Flagd/src/errors/InvalidTypeException.php similarity index 100% rename from src/Flagd/src/errors/InvalidTypeException.php rename to providers/Flagd/src/errors/InvalidTypeException.php diff --git a/src/Flagd/src/errors/RequestBuildException.php b/providers/Flagd/src/errors/RequestBuildException.php similarity index 100% rename from src/Flagd/src/errors/RequestBuildException.php rename to providers/Flagd/src/errors/RequestBuildException.php diff --git a/src/Flagd/src/grpc/GrpcService.php b/providers/Flagd/src/grpc/GrpcService.php similarity index 100% rename from src/Flagd/src/grpc/GrpcService.php rename to providers/Flagd/src/grpc/GrpcService.php diff --git a/src/Flagd/src/grpc/ResponseResolutionDetailsAdapter.php b/providers/Flagd/src/grpc/ResponseResolutionDetailsAdapter.php similarity index 100% rename from src/Flagd/src/grpc/ResponseResolutionDetailsAdapter.php rename to providers/Flagd/src/grpc/ResponseResolutionDetailsAdapter.php diff --git a/src/Flagd/src/grpc/ResponseValidator.php b/providers/Flagd/src/grpc/ResponseValidator.php similarity index 100% rename from src/Flagd/src/grpc/ResponseValidator.php rename to providers/Flagd/src/grpc/ResponseValidator.php diff --git a/src/Flagd/src/http/FlagdResponseResolutionDetailsAdapter.php b/providers/Flagd/src/http/FlagdResponseResolutionDetailsAdapter.php similarity index 100% rename from src/Flagd/src/http/FlagdResponseResolutionDetailsAdapter.php rename to providers/Flagd/src/http/FlagdResponseResolutionDetailsAdapter.php diff --git a/src/Flagd/src/http/FlagdResponseValidator.php b/providers/Flagd/src/http/FlagdResponseValidator.php similarity index 100% rename from src/Flagd/src/http/FlagdResponseValidator.php rename to providers/Flagd/src/http/FlagdResponseValidator.php diff --git a/src/Flagd/src/http/GrpcWebEndpoint.php b/providers/Flagd/src/http/GrpcWebEndpoint.php similarity index 100% rename from src/Flagd/src/http/GrpcWebEndpoint.php rename to providers/Flagd/src/http/GrpcWebEndpoint.php diff --git a/src/Flagd/src/http/HttpService.php b/providers/Flagd/src/http/HttpService.php similarity index 100% rename from src/Flagd/src/http/HttpService.php rename to providers/Flagd/src/http/HttpService.php diff --git a/src/Flagd/src/http/Method.php b/providers/Flagd/src/http/Method.php similarity index 100% rename from src/Flagd/src/http/Method.php rename to providers/Flagd/src/http/Method.php diff --git a/src/Flagd/src/service/ServiceFactory.php b/providers/Flagd/src/service/ServiceFactory.php similarity index 100% rename from src/Flagd/src/service/ServiceFactory.php rename to providers/Flagd/src/service/ServiceFactory.php diff --git a/src/Flagd/src/service/ServiceInterface.php b/providers/Flagd/src/service/ServiceInterface.php similarity index 100% rename from src/Flagd/src/service/ServiceInterface.php rename to providers/Flagd/src/service/ServiceInterface.php diff --git a/src/Flagd/tests/TestCase.php b/providers/Flagd/tests/TestCase.php similarity index 100% rename from src/Flagd/tests/TestCase.php rename to providers/Flagd/tests/TestCase.php diff --git a/src/Flagd/tests/unit/FlagdProviderTest.php b/providers/Flagd/tests/unit/FlagdProviderTest.php similarity index 100% rename from src/Flagd/tests/unit/FlagdProviderTest.php rename to providers/Flagd/tests/unit/FlagdProviderTest.php diff --git a/providers/Split/.github/workflows/release-please.yml b/providers/Split/.github/workflows/release-please.yml new file mode 100644 index 00000000..93659057 --- /dev/null +++ b/providers/Split/.github/workflows/release-please.yml @@ -0,0 +1,18 @@ +on: + push: + branches: + - main + +name: Run Release Please +jobs: + release-please: + runs-on: ubuntu-latest + + # Release-please creates a PR that tracks all changes + steps: + - uses: google-github-actions/release-please-action@v3 + id: release + with: + command: manifest + token: ${{secrets.GITHUB_TOKEN}} + default-branch: main diff --git a/providers/Split/.gitignore b/providers/Split/.gitignore new file mode 100644 index 00000000..e1efd914 --- /dev/null +++ b/providers/Split/.gitignore @@ -0,0 +1,3 @@ +/composer.lock +/vendor +/build \ No newline at end of file diff --git a/providers/Split/.release-please-manifest.json b/providers/Split/.release-please-manifest.json new file mode 100644 index 00000000..1332969b --- /dev/null +++ b/providers/Split/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "0.0.1" +} \ No newline at end of file diff --git a/src/Split/README.md b/providers/Split/README.md similarity index 100% rename from src/Split/README.md rename to providers/Split/README.md diff --git a/src/Split/composer.json b/providers/Split/composer.json similarity index 100% rename from src/Split/composer.json rename to providers/Split/composer.json diff --git a/providers/Split/examples/.gitignore b/providers/Split/examples/.gitignore new file mode 100644 index 00000000..149cf08d --- /dev/null +++ b/providers/Split/examples/.gitignore @@ -0,0 +1,2 @@ +/*/vendor +/*/composer.lock \ No newline at end of file diff --git a/src/Split/examples/SplitSDK/README.md b/providers/Split/examples/SplitSDK/README.md similarity index 100% rename from src/Split/examples/SplitSDK/README.md rename to providers/Split/examples/SplitSDK/README.md diff --git a/src/Split/examples/SplitSDK/composer.json b/providers/Split/examples/SplitSDK/composer.json similarity index 100% rename from src/Split/examples/SplitSDK/composer.json rename to providers/Split/examples/SplitSDK/composer.json diff --git a/src/Split/examples/SplitSDK/src/main.php b/providers/Split/examples/SplitSDK/src/main.php similarity index 100% rename from src/Split/examples/SplitSDK/src/main.php rename to providers/Split/examples/SplitSDK/src/main.php diff --git a/providers/Split/phpcs.xml.dist b/providers/Split/phpcs.xml.dist new file mode 100644 index 00000000..5ba48465 --- /dev/null +++ b/providers/Split/phpcs.xml.dist @@ -0,0 +1,28 @@ + + + + + + + + ./src + ./tests + + */tests/fixtures/* + */tests/*/fixtures/* + + + + + + + + + + + + + + + + diff --git a/providers/Split/phpstan.neon.dist b/providers/Split/phpstan.neon.dist new file mode 100644 index 00000000..93c5b2d2 --- /dev/null +++ b/providers/Split/phpstan.neon.dist @@ -0,0 +1,9 @@ +parameters: + tmpDir: ./build/cache/phpstan + level: max + paths: + - ./src + - ./tests + excludePaths: + - */tests/fixtures/* + - */tests/*/fixtures/* diff --git a/providers/Split/phpunit.xml.dist b/providers/Split/phpunit.xml.dist new file mode 100644 index 00000000..9d4740e1 --- /dev/null +++ b/providers/Split/phpunit.xml.dist @@ -0,0 +1,28 @@ + + + + + + ./tests/unit + + + ./tests/integration + + + + + + ./src + + + + + + + + diff --git a/providers/Split/psalm-baseline.xml b/providers/Split/psalm-baseline.xml new file mode 100644 index 00000000..ceaa5778 --- /dev/null +++ b/providers/Split/psalm-baseline.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/providers/Split/psalm.xml b/providers/Split/psalm.xml new file mode 100644 index 00000000..c3e6c03c --- /dev/null +++ b/providers/Split/psalm.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + diff --git a/providers/Split/release-please-config.json b/providers/Split/release-please-config.json new file mode 100644 index 00000000..5e4bef5f --- /dev/null +++ b/providers/Split/release-please-config.json @@ -0,0 +1,12 @@ +{ + "bootstrap-sha": "a694af0fb48146f386330b446274cc22a432e66d", + "packages": { + ".": { + "release-type": "php", + "prerelease": false, + "bump-minor-pre-major": true, + "bump-patch-for-minor-pre-major": true, + "include-v-in-tag": false + } + } +} \ No newline at end of file diff --git a/src/Split/src/SplitProvider.php b/providers/Split/src/SplitProvider.php similarity index 100% rename from src/Split/src/SplitProvider.php rename to providers/Split/src/SplitProvider.php diff --git a/src/Split/src/errors/InvalidTreatmentTypeException.php b/providers/Split/src/errors/InvalidTreatmentTypeException.php similarity index 100% rename from src/Split/src/errors/InvalidTreatmentTypeException.php rename to providers/Split/src/errors/InvalidTreatmentTypeException.php diff --git a/src/Split/src/errors/SplitFactoryCreationException.php b/providers/Split/src/errors/SplitFactoryCreationException.php similarity index 100% rename from src/Split/src/errors/SplitFactoryCreationException.php rename to providers/Split/src/errors/SplitFactoryCreationException.php diff --git a/src/Split/src/errors/TargetingKeyMissingException.php b/providers/Split/src/errors/TargetingKeyMissingException.php similarity index 100% rename from src/Split/src/errors/TargetingKeyMissingException.php rename to providers/Split/src/errors/TargetingKeyMissingException.php diff --git a/src/Split/src/treatments/TreatmentParser.php b/providers/Split/src/treatments/TreatmentParser.php similarity index 100% rename from src/Split/src/treatments/TreatmentParser.php rename to providers/Split/src/treatments/TreatmentParser.php diff --git a/src/Split/src/treatments/TreatmentValidator.php b/providers/Split/src/treatments/TreatmentValidator.php similarity index 100% rename from src/Split/src/treatments/TreatmentValidator.php rename to providers/Split/src/treatments/TreatmentValidator.php diff --git a/src/Split/tests/TestCase.php b/providers/Split/tests/TestCase.php similarity index 100% rename from src/Split/tests/TestCase.php rename to providers/Split/tests/TestCase.php diff --git a/src/Split/tests/integration/SplitProviderTest.php b/providers/Split/tests/integration/SplitProviderTest.php similarity index 100% rename from src/Split/tests/integration/SplitProviderTest.php rename to providers/Split/tests/integration/SplitProviderTest.php diff --git a/src/Split/tests/integration/files/splits.yml b/providers/Split/tests/integration/files/splits.yml similarity index 100% rename from src/Split/tests/integration/files/splits.yml rename to providers/Split/tests/integration/files/splits.yml diff --git a/src/Split/tests/unit/SplitProviderTest.php b/providers/Split/tests/unit/SplitProviderTest.php similarity index 100% rename from src/Split/tests/unit/SplitProviderTest.php rename to providers/Split/tests/unit/SplitProviderTest.php From 04d9aad5c2b4514fd959bfa34ba3fe7874fefa72 Mon Sep 17 00:00:00 2001 From: Tom Carrio Date: Mon, 26 Dec 2022 20:02:51 -0500 Subject: [PATCH 2/4] chore: revert composer script usage and add integration tests Signed-off-by: Tom Carrio --- .../integration/OpenTelemetryHookTest.php | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 hooks/OpenTelemetry/tests/integration/OpenTelemetryHookTest.php diff --git a/hooks/OpenTelemetry/tests/integration/OpenTelemetryHookTest.php b/hooks/OpenTelemetry/tests/integration/OpenTelemetryHookTest.php new file mode 100644 index 00000000..22bd101c --- /dev/null +++ b/hooks/OpenTelemetry/tests/integration/OpenTelemetryHookTest.php @@ -0,0 +1,26 @@ +assertNotEmpty($api->getHooks()); + $this->assertInstanceOf(Hook::class, $api->getHooks()[0]); + } +} From d5a04d8c78a64daeea79b84a7babfd44ccb2f227 Mon Sep 17 00:00:00 2001 From: Tom Carrio Date: Mon, 26 Dec 2022 20:10:09 -0500 Subject: [PATCH 3/4] ci: revert composer script usage for unit/integration tests Signed-off-by: Tom Carrio --- .github/workflows/php-ci.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/php-ci.yaml b/.github/workflows/php-ci.yaml index 8b55123e..b2188e20 100644 --- a/.github/workflows/php-ci.yaml +++ b/.github/workflows/php-ci.yaml @@ -79,12 +79,16 @@ jobs: - name: Run PHPUnit (unit tests) working-directory: ${{ matrix.project-dir }} run: | - composer run dev:test:unit + composer run dev:test:unit:setup + vendor/bin/phpunit --coverage-text --coverage-clover=coverage.clover --testsuite unit + composer run dev:test:unit:teardown - name: Run PHPUnit (integration tests) working-directory: ${{ matrix.project-dir }} run: | composer run dev:test:integration + vendor/bin/phpunit --coverage-text --coverage-clover=coverage.clover --testsuite integration + composer run dev:test:integration:teardown ### TODO: Enable codecov support # - name: Code Coverage From a685627e4259000351afebb134b171754215d64b Mon Sep 17 00:00:00 2001 From: Tom Carrio Date: Mon, 26 Dec 2022 20:11:57 -0500 Subject: [PATCH 4/4] ci: fix reference to integration setup Signed-off-by: Tom Carrio --- .github/workflows/php-ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/php-ci.yaml b/.github/workflows/php-ci.yaml index b2188e20..26f4d021 100644 --- a/.github/workflows/php-ci.yaml +++ b/.github/workflows/php-ci.yaml @@ -86,7 +86,7 @@ jobs: - name: Run PHPUnit (integration tests) working-directory: ${{ matrix.project-dir }} run: | - composer run dev:test:integration + composer run dev:test:integration:setup vendor/bin/phpunit --coverage-text --coverage-clover=coverage.clover --testsuite integration composer run dev:test:integration:teardown