You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 15:48:10