samuelbednarcik/elastic-apm-agent

此包已被弃用且不再维护。作者建议使用philkra/elastic-apm-php-agent包。

Elastic APM的PHP代理

v0.2.1 2018-11-21 14:36 UTC

This package is auto-updated.

Last update: 2020-05-22 08:31:53 UTC


README

Packagist Scrutinizer PHP from Packagist

非官方的Elastic APM PHP代理(>=6.5)。该包已不再维护,请使用包代替。

此包还包含易于与现有项目和库(如Doctrine、Guzzle等)集成的助手。

收集器

安装

composer require samuelbednarcik/elastic-apm-agent

使用

创建一个代理配置对象

$config = new AgentConfiguration();
$config->setServiceName('name-of-your-project');
$config->setServerUrl('https://:8200'); // elastic apm server

// create metadata which will be applied to the transaction
$metadata = new Metadata();
$metadata->setService(
    MetadataBuilder::buildService($config->getServiceName())
);
$config->setMetadata($metadata);

创建代理实例

$agent = new Agent(
    $config,
    new Client(),
    new ElasticAPMSerializer()
);

尽可能早地在代码中调用start方法。请求启动时间从服务器变量REQUEST_TIME_FLOAT获取。如果不提供请求实例,它将根据全局变量创建。start方法还将返回一个事务实例。

$transaction = $agent->start($request);

在代码结束时调用stop函数。如果使用symfony请求/响应,可以使用事务构建器为事务生成上下文。通过调用stop方法,将收集所有收集器中的span。此函数还将返回一个事务。

$transaction = $agent->stop();
$transaction->setContext(
    TransactionBuilder::buildContext($request, $response)
);

之后,可以调用sendAll方法,将所有信息发送到APM服务器。

try {
    $agent->sendAll();
} catch (GuzzleException $e) {
    // log an error
}

Span收集器

Span收集器用于提取关于在外部库(如doctrine或guzzle)中发生的事件的信息。

在创建代理实例时可以注册收集器

$agent = new Agent(
    $config,
    new Client(),
    new ElasticAPMSerializer(),
    [
        new MyCollector()
    ]
);

在调用stop方法后,代理将收集所有注册收集器的span。

分布式跟踪

代理会自动处理分布式跟踪头,您只需在您想跟踪的请求中发送elastic-traceparent-header即可。

$traceparent = new TraceParent(
    $transaction->getTraceId(),
    $transaction->getId(),
    '01'
);

$request->withHeader(
    TraceParent::HEADER_NAME,
    $traceparent->__toString()
);

如果您使用Guzzle客户端,可以使用TracingGuzzleMiddleware来为您注入头信息。

$middleware = new TracingGuzzleMiddleware($agent)

$stack = HandlerStack::create();
$stack->push($middleware());
$client = new Client(['handler' => $stack])

许可证

MIT