Crater服务监控指标:自定义指标收集与分析
在企业级应用中,服务监控是保障系统稳定性的关键环节。Crater作为面向个人和企业的开源发票解决方案(Open Source Invoicing Solution),其服务可用性直接影响财务流程的连续性。本文将从监控指标体系构建、自定义数据采集到可视化分析,提供一套适用于Crater的完整监控方案,帮助管理员实时掌握系统健康状态。
指标体系设计:从基础设施到业务逻辑
Crater的监控指标需覆盖三层架构:基础设施层(服务器资源)、应用层(Laravel框架指标)和业务层(发票流程指标)。通过分析config/logging.php中的日志配置和app/Http/Kernel.php的中间件栈,可识别出关键监控节点。
核心指标分类:
- 资源类:CPU使用率(阈值<80%)、内存占用(关注storage/framework/sessions/会话存储增长)、磁盘I/O(监控public/目录下附件上传速度)
- 应用类:请求响应时间(通过app/Http/Middleware/实现计时)、异常发生率(关联app/Exceptions/Handler.php错误捕获)、队列任务延迟(跟踪app/Jobs/目录下PDF生成任务)
- 业务类:日发票创建量、支付确认延迟、客户访问转化率(需结合app/Models/Invoice.php和app/Models/Payment.php的数据模型)
自定义指标采集实现
Crater基于Laravel框架开发,可通过中间件和事件监听实现无侵入式指标采集。以下是三个关键指标的采集方案:
1. 请求性能指标
在app/Http/Middleware/目录下创建PerformanceMonitor.php中间件,记录每个API端点的响应时间:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Log;
class PerformanceMonitor
{
public function handle($request, Closure $next)
{
$startTime = microtime(true);
$response = $next($request);
$duration = microtime(true) - $startTime;
$endpoint = $request->getPathInfo();
// 记录慢请求(>500ms)到专用日志文件
if ($duration > 0.5) {
Log::channel('slow_queries')->warning([
'endpoint' => $endpoint,
'duration' => number_format($duration, 3),
'timestamp' => Carbon::now()->format('Y-m-d H:i:s')
]);
}
return $response;
}
}
2. 队列任务监控
针对app/Jobs/GenerateInvoicePdfJob.php等耗时任务,通过重写handle()方法注入执行时间记录:
public function handle()
{
$startTime = microtime(true);
// 原有PDF生成逻辑...
$executionTime = microtime(true) - $startTime;
// 存储指标到InfluxDB或Prometheus
$this->recordMetric('invoice_pdf_generation_seconds', $executionTime, [
'template' => $this->invoice->template_name,
'customer_id' => $this->invoice->customer_id
]);
}
3. 业务流程指标
利用Laravel事件系统,在关键业务节点触发指标采集。修改app/Models/Invoice.php的saved事件:
protected static function booted()
{
static::saved(function ($invoice) {
// 新发票创建时触发计数
if ($invoice->wasRecentlyCreated) {
\Metrics::increment('invoice_created_total', 1, [
'status' => $invoice->status,
'currency' => $invoice->currency->code
]);
}
});
}
数据采集实现:从日志到时序数据库
Crater默认日志配置(config/logging.php)采用daily驱动,需扩展为结构化日志格式以便指标提取。通过修改channels配置启用JSON格式化:
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => 'debug',
'days' => 14,
'formatter' => \Monolog\Formatter\JsonFormatter::class,
],
日志采集架构:
- Filebeat监控storage/logs/目录,过滤包含
[METRIC]标签的日志行 - 输出到Promtail,通过Pipeline解析JSON字段(如
invoice_id、processing_time) - 存储到Loki,关联docker-compose.yml中定义的服务标签
对于实时指标,推荐使用Telegraf的exec插件,定时执行artisan命令采集队列状态:
telegraf --config /etc/telegraf/telegraf.conf --input-filter exec \
--exec-command "php /data/web/disk1/git_repo/gh_mirrors/cr/crater/artisan queue:status"
可视化与告警配置
基于Grafana构建Crater专属仪表盘,需导入以下三个数据源:
- Prometheus:收集系统指标(通过node_exporter)
- Loki:查询storage/logs/laravel.log中的应用日志
- MySQL:直接查询业务数据(配置database.php中的连接参数)
关键仪表盘面板:
- 请求监控面板:展示app/Http/Controllers/InvoiceController.php的接口吞吐量,按
/api/invoices等端点分组 - 队列监控面板:显示app/Jobs/GenerateInvoicePdfJob.php任务的等待时长分布,设置>5分钟告警
- 业务指标面板:对比不同国家(关联database/migrations/2017_05_06_173745_create_countries_table.php数据)的发票创建量
告警规则示例:
groups:
- name: crater_alerts
rules:
- alert: HighErrorRate
expr: sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) > 0.05
for: 2m
labels:
severity: critical
annotations:
summary: "API错误率超过5%"
description: "最近5分钟内,{{ $value | humanizePercentage }}的请求失败"
高级实践:自定义监控中间件开发
对于复杂监控需求,可开发专用监控中间件。以app/Http/Middleware/MetricsMiddleware.php为例,实现多维度指标采集:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\DB;
class MetricsMiddleware
{
public function handle($request, Closure $next)
{
$start = microtime(true);
$response = $next($request);
// 记录数据库查询次数
$queryCount = DB::getQueryLog() ? count(DB::getQueryLog()) : 0;
// 发送指标到Pushgateway
$this->sendToPrometheus([
'endpoint' => $request->route()->uri ?? 'unknown',
'status_code' => $response->getStatusCode(),
'query_count' => $queryCount,
'duration_ms' => (microtime(true) - $start) * 1000
]);
return $response;
}
private function sendToPrometheus($data)
{
$client = new \GuzzleHttp\Client();
$client->post('http://prometheus:9091/metrics/job/crater/instance/' . gethostname(), [
'body' => "crater_http_requests_total{endpoint=\"{$data['endpoint']}\",status=\"{$data['status_code']}\"} 1\n" .
"crater_db_queries_total{endpoint=\"{$data['endpoint']}\"} {$data['query_count']}\n" .
"crater_request_duration_ms{endpoint=\"{$data['endpoint']}\"} {$data['duration_ms']}\n"
]);
}
}
启用中间件需修改app/Http/Kernel.php的$middlewareGroups数组,将其添加到api组中。
监控方案部署清单
为确保监控系统可靠运行,部署时需完成以下检查项:
| 检查项目 | 配置路径 | 标准值 |
|---|---|---|
| 日志轮转 | config/logging.php | 保留14天日志 |
| 监控权限 | docker-compose/nginx/nginx.conf | 限制Prometheus访问IP |
| 指标采样率 | app/Providers/AppServiceProvider.php | 生产环境10%采样 |
| 告警渠道 | config/mail.php | 配置SMTP用于告警邮件 |
| 数据保留 | Prometheus配置 | 指标数据保留15天 |
通过实施本文所述方案,管理员可全面掌握Crater系统的运行状态。建议配合docker-compose.yml中的服务编排,将监控组件(Prometheus、Grafana、Alertmanager)与Crater主服务一同部署,形成完整的可观测性平台。定期审查storage/logs/metrics.log中的指标数据,持续优化监控策略,确保财务业务系统7×24小时稳定运行。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



