PHP使用OpenTelemetry自动插装时依赖关系不显示的问题
PHP + OpenTelemetry 追踪问题排查
我搭建了一套由PHP + OpenTelemetry(Otel)自动插装 + Elastic APM + Prometheus组成的技术栈,可从PHP应用中采集追踪与指标数据——追踪数据转发至Elastic Cloud的APM系统,指标数据发送至Prometheus。目前追踪功能仅部分生效,无法看到外部API(dog.ceo)的依赖关系。
以下是技术栈基础配置(未附上php.ini和.htaccess文件,认为其与问题无关):
index.php
<?php use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use Slim\Factory\AppFactory; use DI\Container; use GuzzleHttp\Client; require __DIR__ . '/vendor/autoload.php'; $container = new Container(); AppFactory::setContainer($container); $app = AppFactory::create(); $app->get('/', function (Request $request, Response $response) { $response->getBody()->write('<h3>RANDOM API</h3> <p>O que você gostaria de ver?</p> <ul> <li>Random dogs? <a href="/dogs">Clique</li> </ul>'); return $response; }); $app->get('/healthcheck', function (Request $request, Response $response) { return $response->withStatus(204); }); $app->get('/dogs', function (Request $request, Response $response) { $client = new Client(); try { $apiResponse = $client->get('https://dog.ceo/api/breeds/image/random'); $dogData = json_decode($apiResponse->getBody()); $response->getBody()->write('<img src="' . $dogData->message . '" alt="random dog" style="max-width: 500px"/>'); } catch (\Exception $e) { $response->getBody()->write($e->getMessage()); return $response->withStatus(500); } return $response; }); $app->run();
Dockerfile
FROM php:8.2 RUN set -xe; \ apt-get update; \ apt-get -y install g++ zlib1g-dev build-essential zlib1g-dev gcc make autoconf m4 perl git; \ curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer; \ pecl install grpc && docker-php-ext-enable grpc; \ pecl install opentelemetry-beta && docker-php-ext-enable opentelemetry ENV COMPOSER_ALLOW_SUPERUSER 1 ENV OTEL_PHP_AUTOLOAD_ENABLED=true ENV OTEL_SERVICE_NAME=your-service-name ENV OTEL_TRACES_EXPORTER=console ENV OTEL_METRICS_EXPORTER=otlp ENV OTEL_EXPORTER_OTLP_PROTOCOL=grpc ENV OTEL_EXPORTER_OTLP_ENDPOINT=http://127.0.0.1:4317 ENV OTEL_PROPAGATORS=baggage,tracecontext WORKDIR /usr/src/myapp COPY composer.json composer.lock* /usr/src/myapp/ RUN composer install --no-dev --no-scripts --no-autoloader COPY . /usr/src/myapp RUN composer dump-autoload --optimize --classmap-authoritative; \ composer require slim/slim:^4 slim/psr7:^1; \ composer require open-telemetry/exporter-otlp php-http/guzzle7-adapter; \ composer require open-telemetry/transport-grpc; \ composer config allow-plugins.php-http/discovery false; \ composer require open-telemetry/sdk open-telemetry/opentelemetry-auto-slim; \ php --ri opentelemetry COPY php.ini /usr/local/etc/php/php.ini CMD [ "php", "-S", "0.0.0.0:8080" ]
docker-compose.yml
services: otel_collector: networks: - backend image: otel/opentelemetry-collector-contrib:latest volumes: - "./otel-collector-config.yml:/etc/otelcol/otel-collector-config.yml" command: --config /etc/otelcol/otel-collector-config.yml ports: - "14278:14278" - "65535:65535" - "55677:55677" - "12345:12345" - "4318:4318" - "4317:4317" - "8889:8889" prometheus: networks: - backend image: prom/prometheus:latest volumes: - "./prometheus.yml:/etc/prometheus/prometheus.yml" ports: - "9090:9090" app-php: build: ./php image: app-php ports: - 8083:8080 container_name: app-php environment: OTEL_EXPORTER_OTLP_ENDPOINT: http://otel_collector:4317 OTEL_SERVICE_NAME: app-php OTEL_TRACES_EXPORTER: otlp networks: - backend networks: backend:
composer.json
{ "require": { "slim/slim": "4.*", "php-di/php-di": "^6.3", "guzzlehttp/guzzle": "^7.3", "open-telemetry/api": "^1.0.0", "open-telemetry/sdk": "^1.0.0" }, "minimum-stability": "dev" }
otel-collector-config.yml
receivers: otlp: protocols: grpc: {} http: {} exporters: prometheus: endpoint: "0.0.0.0:8889" logging: verbosity: detailed otlp/elastic: endpoint: "xxx-xxx-xxx" headers: Authorization: "xxx-xxx-xxx" processors: batch: {} service: pipelines: metrics: receivers: [otlp] processors: [batch] exporters: [prometheus, logging] traces: receivers: [otlp] processors: [batch] exporters: [otlp/elastic, logging]
prometheus.yml
global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: - job_name: aggregated-trace-metrics static_configs: - targets: ['otel_collector:8889']
内容的提问来源于stack exchange,提问作者Pablo Marques
相关产品推荐
相关产品推荐

