Hyper方案 服务监控告警(Prometheus + Grafana)

张开发
2026/5/20 0:44:24 15 分钟阅读
Hyper方案 服务监控告警(Prometheus + Grafana)
Hyperf 官方内置 hyperf/metric原生支持 Prometheus零侵入自动采集。 --- 安装composerrequire hyperf/metric php bin/hyperf.php vendor:publish--idhyperf.metric ---1. 配置 config/autoload/metric.php?phpreturn[defaultenv(METRIC_DRIVER,prometheus),use_standalone_processtrue, // 独立进程采集不影响业务metric[prometheus[driver\Hyperf\Metric\Adapter\Prometheus\MetricFactory::class,mode\Hyperf\Metric\Adapter\Prometheus\Constants::SCRAPE_MODE,namespaceenv(APP_NAME,hyperf),scrape_host0.0.0.0,scrape_port9502,scrape_path/metrics,],],];---2. 自动采集零代码 框架自动采集以下指标无需任何代码 hyperf_http_requests_total# HTTP 请求总数hyperf_http_request_duration_ms# 请求耗时分布hyperf_db_query_duration_ms# DB 查询耗时hyperf_redis_commands_total# Redis 命令数hyperf_coroutine_count# 协程数量hyperf_worker_memory_bytes# Worker 内存---3. 业务自定义指标?php namespace App\Service;use Hyperf\Di\Annotation\Inject;use Hyperf\Metric\Contract\MetricFactoryInterface;class OrderService{#[Inject]private MetricFactoryInterface$metric;publicfunctioncreateOrder(int$userId, array$items): array{$timer$this-metric-makeHistogram(name:order_create_duration_ms, labelNames:[status],)-startTimer();try{$orderOrder::create([user_id$userId,totalcollect($items)-sum(price),]);// 订单计数$this-metric-makeCounter(orders_total,[status])-with(success)-add(1);// 订单金额分布$this-metric-makeHistogram(order_amount,[currency])-with(CNY)-observe($order-total);return$order-toArray();}catch(\Throwable$e){$this-metric-makeCounter(orders_total,[status])-with(failed)-add(1);throw$e;}finally{$timer-end([statusisset($order)?success:failed]);}}}---4. 告警中间件慢请求 错误率?php namespace App\Middleware;use Hyperf\Metric\Contract\MetricFactoryInterface;use Psr\Http\Message\ResponseInterface;use Psr\Http\Message\ServerRequestInterface;use Psr\Http\Server\MiddlewareInterface;use Psr\Http\Server\RequestHandlerInterface;class MetricMiddleware implements MiddlewareInterface{publicfunction__construct(private MetricFactoryInterface$metric){}publicfunctionprocess(ServerRequestInterface$request, RequestHandlerInterface$handler): ResponseInterface{$startmicrotime(true);$path$request-getUri()-getPath();try{$response$handler-handle($request);$status$response-getStatusCode();}catch(\Throwable$e){$status500;throw$e;}finally{$duration(microtime(true)-$start)*1000;$this-metric-makeHistogram(http_duration_ms,[path,status])-with($path,(string)$status)-observe($duration);$this-metric-makeCounter(http_requests_total,[path,status])-with($path,(string)$status)-add(1);}return$response;}}---5. Docker Compose完整监控栈 services: prometheus: image: prom/prometheus:latest volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml ports: -9090:9090grafana: image: grafana/grafana:latest ports: -3000:3000environment: GF_SECURITY_ADMIN_PASSWORD: admin volumes: - grafana_data:/var/lib/grafana alertmanager: image: prom/alertmanager:latest volumes: - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml ports: -9093:9093volumes: grafana_data: prometheus.yml global: scrape_interval: 15s scrape_configs: - job_name: hyperf static_configs: - targets:[host.docker.internal:9502]rule_files: - alerts.yml alerting: alertmanagers: - static_configs: - targets:[alertmanager:9093]---6. 告警规则 alerts.yml groups: - name: hyperf rules:# 错误率 5%- alert: HighErrorRate expr:|rate(http_requests_total{status~5..}[5m])/ rate(http_requests_total[5m])0.05for: 2m labels: severity: critical annotations: summary:Error rate {{$value| humanizePercentage }}# P99 延迟 1s- alert: SlowResponse expr:|histogram_quantile(0.99, rate(http_duration_ms_bucket[5m]))1000for: 5m labels: severity: warning annotations: summary:P99 latency {{$value}}ms# 内存 512MB- alert: HighMemory expr: hyperf_worker_memory_bytes536870912for: 5m labels: severity: warning alertmanager.yml钉钉/企微通知 route: receiver: dingtalk receivers: - name: dingtalk webhook_configs: - url:http://dingtalk-webhook/dingtalk/robot1/sendsend_resolved:true--- 核心要点 - use_standalone_process:true独立进程暴露 /metrics不占用业务端口 - 框架自动采集覆盖80% 场景只需对核心业务补充自定义指标 - 告警阈值错误率5%、P991s、内存512MB 是生产常用起点 - Grafana 直接导入 Dashboard ID11316Hyperf 社区模板

更多文章