umbrellio / event-tracker
Requires
- php: >=7.4
- influxdb/influxdb-php: ^1.15
- laravel/framework: >=6.0
- promphp/prometheus_client_php: ^2.6
Requires (Dev)
- ext-json: *
- php-coveralls/php-coveralls: ^2.5
- phpunit/phpunit: ^9.0
- umbrellio/code-style-php: ^1.0
This package is auto-updated.
Last update: 2024-09-08 09:53:44 UTC
README
这是一个用于跟踪任何自定义事件并将它们记录到Laravel框架中的influxdb或prometheus的包。
安装
- 安装
composer require umbrellio/event-tracker
特性
- 它有几个现成的跟踪器
- 响应时间 - 用于记录不同端点的响应时间的中间件
- 作业时长 - 一组用于记录所有作业执行时间的监听器
- 作业日志 - 一组用于记录所有已执行的作业的监听器
- 通过多功能类(EventRepository和PrometheusRepository)记录任何您想要记录的内容
- 直接记录到influxdb或通过telegraf记录
- Prometheus支持
- 应用程序指标导出器
已知问题
- Prometheus集成。如果您的应用程序部署到Kubernetes,并且有多个Pod,其中Prometheus获取指标,那么您的指标将会加倍。这是因为有一个用于指标的存储(Redis)。Prometheus从每个fpm Pod请求指标,它们给出相同的指标,Prometheus将它们加起来。
集成
通用
- 在您的
config
目录中执行php artisan vendor:publish
以发布配置示例 - 在配置中写入您的凭据和设置。如果您不需要某些连接或跟踪器,您可以删除它们。
Prometheus
您的应用程序的每个实例都必须有自己的指标存储。您不能使用与您的应用程序多个副本共享的存储。在这种情况下,抓取将返回当前副本和其他副本的指标。
如果您只有一个fpm副本,您仍然可以使用共享存储。
在Kubernetes等分布式系统中,您的应用程序可能以多个实例和不同的模式(fpm,horizon)运行。每个实例都会产生指标,并且每个实例都必须由Prometheus监控。此包提供的导出器将解决上述问题。正确的设置应包括
- 每个副本都有自己的(本地)redis实例来存储指标
- 每个副本都有自己的导出器,该导出器公开
/metrics
-端点并从redis实例中获取指标。提供的导出器可用:[event-tracker/exporter](https://github.com/umbrellio/event-tracker/blob/HEAD/ghcr.io/umbrellio/event-tracker/exporter:latest) - 应用程序将指标写入该本地redis实例
event_tracker.php
配置具有本地redis的正确凭据
return [ 'connection' => 'prometheus', 'connections' => [ 'prometheus' => [ 'redis' => [ 'client' => env('EVENT_TRACKER_REDIS_CLIENT', 'phpredis'), 'credentials' => [ 'host' => env('EVENT_TRACKER_REDIS_HOST', 'localhost'), 'username' => env('EVENT_TRACKER_REDIS_USERNAME', 'redis'), 'password' => env('EVENT_TRACKER_REDIS_PASSWORD'), 'port' => env('EVENT_TRACKER_REDIS_PORT', '6379'), 'database' => env('EVENT_TRACKER_REDIS_DATABASE', 0), ], ], ], ], ];
跟踪器
响应时间跟踪器
此跟踪器收集有关您的应用程序在各个端点处理请求所花费时间的详细信息。
要集成此跟踪器,您只需在路由列表中包含中间件ResponseTimeTrackerMiddleware
。此中间件必须是最后一个中间件。使用Laravel的功能
Influx
记录具有以下格式:
app_prefix.response_time,action=ExampleController@index val=1608201916"
,其中url
是标签的名称,val是字段的名称。
Prometheus
- 在配置中可以配置桶
- 指标具有以下格式:
app_prefix_response_time_bucket{namespace="app-nc",action="ExampleController@index",le="1"} 1
您可以在配置中的trackers
块中更改测量名称而不是'response_time'。所有跟踪器都有这个机会。
作业时长跟踪器
此功能收集应用程序中作业的持续时间指标。
Influx
此跟踪器将以以下格式写入记录:
app_prefix.jobs_duration,jobName=App\Example\JobName val=160820191
。
Prometheus
- 在配置中可以配置桶
- 指标格式如下:app_prefix_jobs_duration_bucket{namespace="app-ns",jobName="App\Jobs\JobName",le="1"} 2
此跟踪器允许您通过配置跳过任何不需要跟踪的作业。
作业日志
此功能收集应用程序中每种类型作业的数量信息。
Influx
写入格式为:
app_prefix.jobs_log,event=processing,jobName=App\Example\JobName
Prometheus
指标格式如下:app_prefix_jobs_log{namespace="app-ns",jobName="App\Jobs\JobName",eventName="processed"} 2
您可以通过类似于上一个跟踪器的方式跳过任何作业。
外部API响应
此功能收集应用程序向外部API发送的请求信息。
要集成此跟踪器,您需要创建所有GuzzleClient实例时带有on_stats
配置。在您的ServiceProvider中创建GuzzleClient时,您需要写入如下内容:
$callbackCreator = app(Umbrellio\EventTracker\Trackers\ExternalApiResponse\GuzzleClientOnStatsCallbackCreator);
$client = new GuzzleHttp\Client(['on_stats' => $callbackCreator->create()]);
在这种情况下,您可以按需修改客户端。但如果您不需要,您可以创建新的ServiceProvider并使用跟踪器的绑定器。
class GuzzleClientServiceProvider extends ServiceProvider
{
public function boot(Umbrellio\EventTracker\Trackers\ExternalApiResponse\GuzzleClientBinder $binder): void
{
$binder->bind($this->app);
}
}
Influx
写入格式为:
为:app_prefix.external_api_response,host=api.domain.com,status=200,total_time=1.0,connect_time=0.5,namelookup_time=0.5 val=1.0
Prometheus
- 在配置中可以配置桶
- 指标格式如下:app_prefix_external_api_response_bucket{namespace="app-ns",host="domain.com",status=200,le="2"} 1
您可以通过配置metrics
选项中的最后三个标签来配置,如果您不需要某些内容。除了这些标签外,您还可以指定GuzzleHttp\TransferStats对象中的handlerStats属性中的任何字段。
默认情况下,group_redirects_in_one_request
选项设置为false
。这意味着每个请求都将被跟踪。即使它是一个带有重定向状态码的响应。但是,如果您想跟踪响应的常见时间,请将此选项设置为true
。
val
字段可以通过main_metric
选项进行配置。此字段必须是metrics
选项中的列表之一。
自定义跟踪器
Influx
您可以创建自己的EventRepository类封装,并从您的应用程序中记录任何自定义事件。通过在write
方法中传递timestamp
属性来使用特定事件的特定时间,而不是当前时间。请使用纳秒来指定时间。例如 - 1612369449000000000。
Prometheus
类似于Influx的情况,您还可以使用PrometheusRepositoryContract来写入自定义指标。每个Prometheus指标类型(计数器、仪表盘、直方图、摘要)都有相应的方法。
要禁用所有跟踪器,请使用包配置中的enabled
字段。
连接
Influx
此连接允许您直接向InfluxDB发送事件。这种方法不建议使用,因为它可能存在性能问题。
Telegraf
此连接与上一个连接类似,但所有事件都发送到Telegraf守护程序。这种方法比以前的方法更快、更优化。
Prometheus
此连接使用Redis来临时存储指标。您的事件将被写入Redis。所有指标都可以通过/metrics
端点(它将自动添加到您的路由)获取。您可以配置端点名称。