robertogallea / laravel-metrics
用智能指标来监控您的Laravel应用程序
Requires
- php: ^7.2|^8.0
- illuminate/support: ^6|^7|^8
- spatie/test-time: ^1.1
Requires (Dev)
- doctrine/dbal: ^2
- mockery/mockery: ^1.2
- orchestra/testbench: ^5.0.1
- phpunit/phpunit: ^8.5.0
- sempro/phpunit-pretty-print: ^1.0
README
介绍
此包允许在您的laravel应用程序中记录指标并进行统计。
它还提供了实现简单警报机制的工具。
安装
为了安装此包,请运行
composer require robertogallea/laravel-metrics
Laravel自动发现将注册包ServiceProvider和别名。
配置
如果您想编辑包配置,请运行
php artisan vendor:publish --provider=robertogallea\\LaravelMetrics\\MetricsServiceProvider --tag=config
用法
该包依赖于Metric
的概念。指标是应用程序内部某些类型的度量。
目前支持两种类型的度量
标记
计时器
标记
就是其名称。这些可以用来确定事件在应用程序中发生了多少次。
计时器
跟踪事件持续时间。这些可以用来确定事件完成所需的时间。
保存指标
这是使用指标的最简单方式。在任何代码部分,您都可以按以下方式保存指标
- 标记
$registry = resolve(MetricRegistry::class); $marker = $registry->meter('metric-name'); $marker->mark(); // or you can use facade $marker = \Metrics::meter('metric-name'); $marker->mark();
- 计时器
$registry = resolve(MetricRegistry::class); $timer = $registry->meter('metric-name', MeterType::TIMER); $timerId = $timer->start(); // or you can use facade $timer = \Metrics::meter('metric-name', MeterType::TIMER); $timerId = $timer->start(); doSomething(); $timer->stop($timerId);
默认情况下,计时器使用秒
分辨率存储。然而,可以在停止计时器之前更改所需的分辨率
$timer->inMicrosceconds()->stop($timerId); $timer->inMilliseconds()->stop($timerId); $timer->inSeconds()->stop($timerId); $timer->inMinutes()->stop($timerId); $timer->inHours()->stop($timerId); $timer->inDays()->stop($timerId); $timer->inWeeks()->stop($timerId); $timer->inMonths()->stop($timerId); $timer->inYears()->stop($timerId);
存储元数据
如果需要,您还可以通过将数据数组传递给mark()
或start()/stop()
方法来在指标中存储额外的元数据
标记
$data = ['key' => 'value']; $marker->mark($data);
计时器
$data = ['key' => 'value']; $timerId = $timer->start($data); doSomething(); $timer->stop($timerId);
或
$timerId = $timer->start(); $data = doSomething(); $timer->stop($timerId, $data);
测量事件
您可以在事件分派过程中自动保存标记指标,通过以下三个步骤
- 实现
PerformsMetrics
接口; - 使用
Measurable
特质; - 定义
$meter
字段,使用您想要使用的指标名称。
class TestEvent implements PerformsMetrics { use Dispatchable; use Measurable; protected $meter = 'test'; }
现在,每当您分派事件时,标记会自动保存
event(new TestEvent());
创建可测量的事件
为了方便起见,已注册一个用于创建可测量事件的命令
php artisan make:measurable-event MyMeterEvent
测量请求
您还可以使用提供的两个中间件来监控您的请求
Route::get('/', 'HomeController@index')->middleware('mark:home-visits');
保存了一个带有home-visits
名称的标记
;
Route::get('/page/{page}', 'PagesController@show')->middleware('measure-time:page-visits-duration');
保存了一个带有page-visit-duration
名称的包含请求持续时间的计时器
。
Route::get('/details', 'DetailsController@index')->middleware('measure-time:details-duration,milliseconds');
计时器可以设置为一个特定的分辨率,使用第二个参数。
检索指标
有两种方法可以检索指标
- 使用
MetricRegistry
$registry = resolve(MetricRegistry::class); $meter = $registry->meter('meter-name'); $meter->get(); // gets the entire dataset for the meter $from = Carbon::yesterday(); $meter->after($from)->get(); // gets the dataset for meters recorded after $from $to = Carbon::tomorrow(); $meter->before($from)->get(); // gets the dataset for meters recorded before $to $meter->between($from, $to)->get(); // gets the dataset for meters recorded between $from and $to
- 直接查询
Metric
Eloquent模型。
时间序列
使用指标的一个重要方面是使用方便的统计方法从它们中提取时间序列。
目前支持的统计包括count
、average
、max
和min
。
$registry = resolve(MetricRegistry::class); $timer = $registry->meter('meter-name', MeterType::TIMER); $from = Carbon::now()->subYears(2); $to = Carbon::today(); $timeSeries = $this->timer->bySecond($from, $to, TimeSeriesStatistics::COUNT); $timeSeries = $this->timer->byMinute($from, $to, TimeSeriesStatistics::AVERAGE); $timeSeries = $this->timer->byHour($from, $to, TimeSeriesStatistics::MAX); $timeSeries = $this->timer->byMonth($from, $to, TimeSeriesStatistics::MIN); $timeSeries = $this->timer->byYear($from, $to, TimeSeriesStatistics::MIN);
时间序列以类型为MetricCollection
的自定义集合生成。
时间序列统计
一旦提取了时间序列,您就可以对其执行统计。除了标准Collection
方法,如mean()
、max()
、min()
、avg()
等之外,MetricCollection
类还添加了执行其他操作的方法。实际上,以下是被支持的
stDev()
- 计算值的方差variance()
- 计算值的方差cumulative()
- 计算离散概率密度函数(即累积和)histogram($nbins)
- 使用nbins
个柱状图来计算值。kolmSmirn($collection)
- 计算用于比较两个时间序列的 Kolmogorov-Smirnov 距离。
Treeware
您可以使用此包,但如果它进入您的生产环境,您需要为世界买一棵树。
众所周知,应对气候危机并保持我们的气温不升高超过1.5摄氏度,最好的工具之一就是 种植树木。如果您支持此包并向 Treeware 森林做出贡献,您将为当地家庭创造就业机会并恢复野生动物栖息地。
您可以在 offset.earth/treeware 购买树木。
有关 Treeware 的更多信息,请参阅 treeware.earth
问题、疑问和拉取请求
您可以在 问题部分 报告问题并提出疑问。请以 ISSUE: 开始您的问题,以 QUESTION 开始您的疑问。
如果您有问题,请首先查看已关闭的问题。随着时间的推移,我已经回答了相当多的问题。
要提交拉取请求,请先分叉此存储库,创建一个新的分支,并将您的新的/更新后的代码提交到其中。然后从您的新的分支打开拉取请求。有关更多信息,请参阅 此指南。