Composer install 本身不暴露 Prometheus 指标,需用 shell 包装脚本捕获 --profile 输出、PHP HTTP server 暴露解析后的耗时指标,并通过文件锁、清缓存、固定环境等确保数据可信。

Composer 安装本身不产生 Prometheus 可采集的指标——composer install 是一次性 CLI 命令,没有 HTTP 接口、不暴露 /metrics、也不运行守护进程。想监控安装耗时,必须绕过“自动采集”幻想,用外部手段捕获并上报。
为什么不能直接用 promphp/prometheus-client 监控 composer install
因为 Composer 不是长期运行的服务,它不加载 PHP 扩展、不启动 HTTP 服务、不调用 CollectorRegistry::getDefault()。你在 composer.json 里 require promphp/prometheus-client,只是把库放进 vendor/,对 composer install 自身的执行过程零影响。
常见误操作包括:
- 在
post-install-cmd脚本里 new 一个 Counter 就以为能打点——但脚本执行完进程就退出,指标根本没机会被拉取 - 试图在
composer install过程中调用$counter->inc()——此时 autoload 尚未完成,Prometheus\Counter类根本不可用 - 把
composer install --profile输出重定向到文件后,幻想 Prometheus 能自动解析它——Prometheus 只认标准文本格式的/metrics端点,不读日志文件
真正可行的耗时采集方式:shell + curl + 自定义 exporter
核心思路是:把 composer install --profile -v 的输出解析成指标,由一个轻量 HTTP 服务暴露出去,再让 Prometheus 定期拉取。这需要三步闭环:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 写一个 CLI 包装脚本(如
bin/composer-monitor),用time composer install --profile -v 2>&1捕获完整输出,提取Time:行和各阶段耗时(如Resolving dependencies) - 用 PHP 启一个最小 HTTP server(如
php -S localhost:8081 -t public/),在public/index.php中读取上一步写入的 JSON 文件(如tmp/composer-last-run.json),用Prometheus\CollectorRegistry注册Gauge并set()耗时值 - 配置 Prometheus 的
scrape_configs,添加 job 抓取http://localhost:8081/metrics,注意设scrape_interval: 60s(避免频繁触发安装)
关键细节:
-
composer install必须加--no-plugins,否则第三方插件可能干扰--profile输出结构 - 耗时单位统一为秒(
Time: 12.45s→$gauge->set(12.45)),别用毫秒,否则直方图 buckets 对不上 - 别在
/metrics路由里重新跑composer install——会阻塞抓取,且并发下数据错乱
如何避免指标失真:时间戳、环境隔离与锁机制
直接跑两次 composer install 得到的耗时不可比,因为磁盘缓存、OPcache 状态、网络 DNS 缓存都在变。要得到可信对比数据,必须控制变量:
- 每次采集前清空 Composer 缓存:
composer clear-cache,否则Downloading阶段会被缓存掩盖真实网络耗时 - 固定 PHP 版本与扩展状态:用
php7.4或php8.2显式指定,禁用 xdebug(php -d zend_extension= -d xdebug.mode=off /usr/bin/composer install) - 用文件锁防止并发安装覆盖指标:
flock -x /tmp/composer.lockfile -c "bin/composer-monitor",避免多个 CI Job 同时写同一份 JSON - 指标必须带时间戳标签:
composer_install_duration_seconds{env="ci",php_version="8.2",lock_hash="abc123"},否则你无法区分是哪次安装产生的数据
最易被忽略的一点:Prometheus 默认每 15 秒拉一次,但 composer install 可能持续 2 分钟。如果没做锁或状态持久化,你会看到一串重复的旧值,然后突然跳变——这不是监控失效,是你没告诉 Prometheus “这次安装还没结束”。

















