speakol-ads / elastic-apm-php-agent
Elastic APM v2 的 PHP 代理
v7.1.3
2019-07-22 14:59 UTC
Requires
- php: >= 7.0
- ext-curl: *
- guzzlehttp/guzzle: 6.*
- ralouphie/getallheaders: 2.0.5
- ramsey/uuid: ^3.7
Requires (Dev)
- phpunit/phpunit: 6.*
Suggests
- ext-xdebug: Required for processing of request headers
README
这是 Elastic.co APM 产品的 PHP 代理:[Elastic APM](https://elastic.ac.cn/solutions/apm)。Laravel & Lumen 包:[Elastic APM Laravel](https://github.com/speakol-ads/elastic-apm-laravel)
注意
这是从原始包分叉而来,以添加对 APM API v2
的支持
安装
推荐通过 Composer 安装代理。
运行以下 composer 命令
php composer.phar require speakol-ads/elastic-apm-php-agent
安装后,您需要引入 Composer 的自动加载器
require 'vendor/autoload.php';
用法
使用最小配置初始化代理
$agent = new \PhilKra\Agent( [ 'appName' => 'demo' ] );
在创建代理时,您可以直接注入共享上下文,如用户、标签和自定义。
$agent = new \PhilKra\Agent( [ 'appName' => 'with-custom-context' ], [ 'user' => [ 'id' => 12345, 'email' => 'email@acme.com', ], 'tags' => [ // ... more key-values ], 'custom' => [ // ... more key-values ] ] );
捕获错误和异常
代理可以捕获从接口 Throwable
实现的所有类型错误和异常(https://php.ac.cn/manual/en/class.throwable.php)。
// start a new transaction or use an existing one $transaction = $agent->startTransaction($trxName); $agent->captureThrowable( new Exception(), [], $transaction ); $agent->send();
添加跨度
添加跨度(https://elastic.ac.cn/guide/en/apm/server/current/transactions.html#transaction-spans)很简单。请根据您的具体需求查阅文档。以下是一个添加 MySQL 跨度的示例。
$trxName = 'GET /some/transaction/name'; // create the agent $agent = new \PhilKra\Agent(['appName' => 'Demo with Spans']); // start a new transaction $transaction = $agent->startTransaction($trxName); // create a span $spans = []; $spans[] = [ 'name' => 'Your Span Name. eg: ORM Query', 'type' => 'db.mysql.query', 'start' => 300, // when did tht query start, relative to the transaction start, in milliseconds 'duration' => 23, // duration, in milliseconds 'stacktrace' => [ [ 'function' => "\\YourOrMe\\Library\\Class::methodCall()", 'abs_path' => '/full/path/to/file.php', 'filename' => 'file.php', 'lineno' => 30, 'library_frame' => false, // indicated whether this code is 'owned' by an (external) library or not 'vars' => [ 'arg1' => 'value', 'arg2' => 'value2', ], 'pre_context' => [ // lines of code leading to the context line '<?php', '', '// executing query below', ], 'context_line' => '$result = mysql_query("select * from non_existing_table")', // source code of context line 'post_context' => [// lines of code after to the context line '', '$table = $fakeTableBuilder->buildWithResult($result);', 'return $table;', ], ], ], 'context' => [ 'db' => [ 'instance' => 'my_database', // the database name 'statement' => 'select * from non_existing_table', // the query being executed 'type' => 'sql', 'user' => 'root', // the user executing the query (don't use root!) ], ], ]; // add the array of spans to the transaction $transaction->setSpans($spans); // Do some stuff you want to watch ... sleep(1); $agent->stopTransaction($trxName); // send our transactions to te apm $agent->send();
没有最小元数据和上下文的交易
$trxName = 'Demo Simple Transaction'; $agent->startTransaction( $trxName ); // Do some stuff you want to watch ... $agent->stopTransaction( $trxName );
具有元数据和上下文的交易
$trxName = 'Demo Transaction with more Data'; $agent->startTransaction( $trxName ); // Do some stuff you want to watch ... $agent->stopTransaction( $trxName, [ 'result' => '200', 'type' => 'demo' ] ); $agent->getTransaction( $trxName )->setUserContext( [ 'id' => 12345, 'email' => "hello@acme.com", ] ); $agent->getTransaction( $trxName )->setCustomContext( [ 'foo' => 'bar', 'bar' => [ 'foo1' => 'bar1', 'foo2' => 'bar2' ] ] ); $agent->getTransaction( $trxName )->setTags( [ 'k1' => 'v1', 'k2' => 'v2' ] );
交易示例
此示例说明了您如何监控对另一个 Web 服务的调用。
$agent = new \PhilKra\Agent( [ 'appName' => 'example' ] ); $endpoint = 'https://acme.com/api/'; $payload = [ 'foo' => 'bar' ]; $trxName = sprintf('POST %s', $endpoint); $client = new GuzzleHttp\Client(); // Start the Transaction $agent->startTransaction( $trxName ); // Do the call via curl/Guzzle e.g. $response = $client->request('POST', $endpoint, [ 'json' => $payload ]); // Stop the Transaction tracing, attach the Status and the sent Payload $agent->stopTransaction( $trxName, [ 'status' => $response->getStatusCode(), 'payload' => $payload, ] ); // Send the collected Traces to the APM server $agent->send();
配置
appName : Name of this application, Required
appVersion : Application version, Default: ''
serverUrl : APM Server Endpoint, Default: 'http://127.0.0.1:8200'
secretToken : Secret token for APM Server, Default: null
hostname : Hostname to transmit to the APM Server, Default: gethostname()
active : Activate the APM Agent, Default: true
timeout : Guzzle Client timeout, Default: 5
apmVersion : APM Server Intake API version, Default: 'v2'
env : $_SERVER vars to send to the APM Server, empty set sends all. Keys are case sensitive, Default: []
cookies : Cookies to send to the APM Server, empty set sends all. Keys are case sensitive, Default: []
httpClient : Extended GuzzleHttp\Client Default: []
backtraceLimit: Depth of a transaction backtrace, Default: unlimited
有关 GuzzleHttp\Client
的详细配置选项,请参阅此处。
扩展配置示例
$config = [ 'appName' => 'My WebApp', 'appVersion' => '1.0.42', 'serverUrl' => 'http://apm-server.example.com', 'secretToken' => 'DKKbdsupZWEEzYd4LX34TyHF36vDKRJP', 'hostname' => 'node-24.app.network.com', 'env' => ['DOCUMENT_ROOT', 'REMOTE_ADDR'], 'cookies' => ['my-cookie'], 'httpClient' => [ 'verify' => false, 'proxy' => 'tcp://:8125' ], ]; $agent = new \PhilKra\Agent($config);
测试
vendor/bin/phpunit
知识库
禁用 CLI 代理
如果您想为混合 SAPI 使用动态禁用代理,请使用以下代码片段。
'active' => PHP_SAPI !== 'cli'
针对 Laravel APM 提供程序的案例
'active' => PHP_SAPI !== 'cli' && env('ELASTIC_APM_ACTIVE', false)
感谢 @jblotus(philkra/elastic-apm-laravel#19)