如何用Prometheus监控Heroku多dynos应用?如何获取所有dynos的IP?
Hey,我之前在Heroku上维护多dyno应用的时候,正好踩过这个监控的坑,给你分享几个实战过的方案,分两部分来拆解你的问题:
1. 优先选Heroku官方Prometheus集成(最省心)
这是我最推荐的方案,完全不用折腾IP的事儿——Heroku官方提供的Prometheus Add-on已经帮你解决了多dyno的服务发现问题,会自动识别并拉取所有运行中dyno的监控指标。
操作步骤很简单:
- 启用Prometheus add-on:在终端运行对应命令,免费版用
hobby规格就行heroku addons:create prometheus:hobby --app your-app-name - 确保你的应用暴露了Prometheus metrics端点(比如
/metrics),用对应语言的客户端库(Python的prometheus-client、Go的prometheus包之类的)生成指标 - 之后直接通过
heroku addons:open prometheus打开监控面板,就能看到所有dyno的指标数据了
这个方案省掉了所有动态IP维护、服务发现的麻烦,和Heroku生态整合得非常丝滑。
2. 自定义Prometheus部署+动态服务发现(适合需自主控制的场景)
如果因为公司现有监控体系的要求,必须自己部署Prometheus实例,那核心就是解决dyno动态IP的服务发现问题,这就得先搞定怎么自动获取所有dyno的IP(也就是你的第二个问题)。
Heroku dyno的IP是动态变化的(重启、缩放都会变),所以不能静态配置,得用动态方式获取:
1. 临时查看:用Heroku CLI快速获取
要是你只是临时查一下当前的dyno IP,一条命令就能搞定:
heroku ps:info --app your-app-name
输出里每个dyno条目下的IP字段,就是该dyno的公网IP。
2. 自动化获取:调用Heroku API
要实现动态服务发现,就得通过API定期拉取dyno列表和IP,步骤如下:
- 生成Heroku API令牌:在Heroku账户设置里创建一个带
view权限的API token,或者用命令生成:heroku authorizations:create --description "Prometheus service discovery" - 调用API获取dyno信息:用curl或者脚本发起请求,返回的JSON里包含所有dyno的IP:
其中curl -H "Authorization: Bearer YOUR_HEROKU_API_TOKEN" \ -H "Accept: application/vnd.heroku+json; version=3" \ https://api.heroku.com/apps/your-app-name/dynosip是公网IP,private_ip是私网IP(如果你的Prometheus部署在Heroku内部或能访问Heroku私网,用私网IP更稳定)
3. 集成到Prometheus动态服务发现
拿到dyno IP后,写个简单的脚本(Python/Shell都行),定期调用API并生成Prometheus的file_sd格式JSON文件(比如heroku_dynos_targets.json),格式示例:
[ { "targets": ["dyno-1-ip:9090", "dyno-2-ip:9090"], "labels": { "app": "your-app-name", "env": "production" } } ]
然后在Prometheus配置里添加file_sd配置,让它自动刷新targets:
scrape_configs: - job_name: 'heroku-app' file_sd_configs: - files: - '/path/to/heroku_dynos_targets.json' refresh_interval: 1m
这样Prometheus会每隔1分钟自动更新目标列表,适配dyno的动态变化。
如果没有特殊需求,真的优先用官方的Prometheus add-on,省掉太多维护成本;要是必须自己搭,API+file_sd的方案是实战中最靠谱的动态服务发现方式。
内容的提问来源于stack exchange,提问作者Zdeněk Hásek

