hellofresh / stats-php
Requires
- php: >= 7.3
- ext-intl: >= 2.0
- psr/http-message: ^1.0
- psr/log: ^1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.16
- league/statsd: ^1.5
- phpunit/phpunit: ^8.4
Suggests
- league/statsd: Required for statsd backend
- dev-master
- 2.0.0
- 1.x-dev
- 1.4.1
- 1.4.0
- 1.3.0
- 1.2.0
- v1.1.1
- v1.1
- v1.0
- dev-dependabot/composer/phpunit/phpunit-tw-11.3
- dev-dependabot/composer/friendsofphp/php-cs-fixer-tw-3.59
- dev-dependabot/composer/league/statsd-tw-2.0
- dev-dependabot/composer/psr/log-tw-3.0
- dev-features/APPSEC-618
- dev-APPSEC-480/stats-php_dependabot_config
- dev-fix/PO-2958_v1.1.2
- dev-minor/EES-5413-remove-the-zappr-files
- dev-minor/EES-5570-remove-the-comply-files
This package is not auto-updated.
Last update: 2024-09-11 02:14:25 UTC
README
PHP编写的通用统计库
这是一个通用的统计库,我们HelloFresh在项目中使用它来收集服务的统计数据,然后创建监控仪表板以跟踪活动和问题。
支持的PHP版本
stats-php 版本 1.x 支持以下PHP版本: 7.0、7.1、7.2。如果您打算使用较新的PHP版本,请考虑使用版本 2.x+。
从版本 2.x 开始,此库开始使用内置的 intl PHP扩展,而不是 behat/transliterator
主要特性
- 多个统计后端
log用于开发环境statsd用于生产memory用于测试目的,跟踪单元测试中的统计操作noop用于不需要收集任何统计信息的环境
- 对所有指标使用固定的指标部分计数,以便在
grafana中轻松设置监控/警报 - 易于构建HTTP请求指标 - 时间和计数
- 泛化或修改HTTP请求指标 - 例如,跳过ID部分
依赖项
版本 1.x
php: >= 7.0behat/transliterator: ^1.2
版本 2.x
php: >= 7.3ext-intl: >= 2.0
安装
composer require hellofresh/stats-php
使用
实例创建
连接DSN具有以下格式: <type>://<connection params>/<connection path>?<connection options>。
<type>- 支持的后端之一:log、statsd、memory、noop<connection params>- 仅用于statsd后端,用于定义主机和端口<connection path>- 仅用于statsd后端,用于定义前缀/命名空间<connection options>- 仅用于statsd后端timeout- statsd请求超时(秒),如果未设置,则使用ini_get('default_socket_timeout')error- 抛出连接错误异常,默认值为true
<?php use HelloFresh\Stats\Factory; $statsdClient = Factory::build('statsd://statsd-host:8125/prefix?timeout=2.5&error=1', $logger); // php parse_url does not support url with only schema part set $logClient = Factory::build('log://log', $logger); // php parse_url does not support url with only schema part set $noopClient = Factory::build('noop://noop', $logger); // php parse_url does not support url with only schema part set $memoryClient = Factory::build('memory://memory', $logger); // php parse_url does not support url with only schema part set $statsClient = Factory::build(getenv('STATS_DSN'), $logger);
手动计数指标
<?php use HelloFresh\Stats\Bucket\MetricOperation; use HelloFresh\Stats\Factory; $statsClient = Factory::build(getenv('STATS_DSN'), $logger); $section = 'ordering'; $timer = $statsClient->buildTimer()->start(); $operation = new MetricOperation(['orders', 'order', 'create']); try { OrdersService::create(...); $statsClient->trackOperation($section, $operation, true, $timer); } catch (\Exception $e) { $statsClient->trackOperation($section, $operation, false, $timer); } $statsClient->trackMetric('requests', $operation); $ordersInTheLast24Hours = OrdersService::count(60 * 60 * 24); $statsClient->trackState($section, $operation, $ordersInTheLast24Hours);
通过类型泛化资源并删除资源ID
在某些情况下,您不需要收集所有唯一请求的指标,但需要一个类似类型的请求的单一指标,例如,具体用户页面的访问时间并不重要,但平均访问时间很重要。hellofresh/stats-php 允许修改HTTP请求指标并支持开箱即用的ID过滤,因此您可以得到泛化指标 get.users.-id- 而不是成千上万的指标,如 get.users.1、get.users.13、get.users.42 等,这可能导致您的 graphite 过载。
要使用第二级路径ID的泛化指标,可以将 HelloFresh\Stats\HTTPMetricAlterCallback\HasIDAtSecondLevel 实例传递给 HelloFresh\Stats\Client::setHTTPMetricAlterCallback()。此外,还有一个构建方法 HelloFresh\Stats\HTTPMetricAlterCallback\HasIDAtSecondLevel::createFromStringMap(),可以从字符串映射构建回调实例,因此您可以从配置中获取这些值。它接受以下格式的测试回调的列表:<section>:<test-callback-name>。您可以使用双冒号或换行符作为部分-回调对的分隔符,因此以下所有形式都是正确的
<section-0>:<test-callback-name-0>:<section-1>:<test-callback-name-1>:<section-2>:<test-callback-name-2><section-0>:<test-callback-name-0>\n<section-1>:<test-callback-name-1>\n<section-2>:<test-callback-name-2><section-0>:<test-callback-name-0>:<section-1>:<test-callback-name-1>\n<section-2>:<test-callback-name-2>
目前实现了以下测试回调函数:
true- 第二层路径总是被处理为ID,例如/users/13->users.-id-,/users/search->users.-id-,/users->users.-id-numeric- 只有数字形式的第二层路径被解释为ID,例如/users/13->users.-id-,/users/search->users.searchnot_empty- 只有非空的第二层路径被解释为ID,例如/users/13->users.-id-,/users->users.-
您可以使用 HelloFresh\Stats\HTTPMetricAlterCallback\HasIDAtSecondLevel::registerSectionTest() 实例方法或构建方法的第二个参数注册您自己的测试回调函数 - 构建方法会验证测试回调函数是否与已注册的列表匹配。
<?php use HelloFresh\Stats\Factory; use HelloFresh\Stats\HTTPMetricAlterCallback\HasIDAtSecondLevel; $statsClient = Factory::build(getenv('STATS_DSN'), $logger); // STATS_IDS=users:numeric:search:not_empty $callback = HasIDAtSecondLevel::createFromStringMap(getenv('STATS_IDS')); $statsClient->setHTTPMetricAlterCallback($callback); $timer = $statsClient->buildTimer()->start(); // GET /users/42 -> get.users.-id- // GET /users/edit -> get.users.edit // POST /users -> post.users.- // GET /search -> get.search.- // GET /search/friday%20beer -> get.search.-id- $statsClient->trackRequest($request, $timer, true);