如何在Heroku同网络中部署OpenTelemetry Collector用于Rails应用?
解决方案
1. 在同一个Dyno中同时运行Rails API和OpenTelemetry Collector
这是最直接的免费方案,同一Dyno内的进程共享本地网络栈,完全可以通过localhost通信,无需额外身份验证。
实现步骤:
- 编写启动脚本(比如
bin/start),先后台启动Collector,再启动Rails服务器:
#!/bin/bash # 后台启动OpenTelemetry Collector ./otelcol-contrib --config=otel-config.yaml & # 启动Rails服务器,绑定Heroku分配的端口 bundle exec rails server -p $PORT
- 给脚本添加执行权限:
chmod +x bin/start
- 修改
Procfile,让web进程指向这个启动脚本:
web: bin/start
- 将
otel-config.yaml配置文件提交到代码仓库,确保Collector监听localhost的对应端口(比如默认4317用于gRPC、4318用于HTTP),然后在Rails的OpenTelemetry配置中设置导出端点为http://localhost:4318/v1/traces即可。
注意:需确保Collector二进制文件(如otelcol-contrib)已包含在代码仓库,或通过Heroku多buildpack在构建阶段自动安装。
2. 使用Heroku Private Spaces(付费方案)
若需要分离进程但仍保持私有网络环境,可升级到Heroku Private Spaces。Private Spaces内的所有Dynos处于同一私有网络,你可以部署单独的Collector Dyno,然后在Rails API中通过Collector Dyno的内部名称直接访问,无需身份验证。
配置要点:
- 将Collector部署为独立Dyno(比如命名为
otel-collector) - 在Rails的OpenTelemetry配置中设置导出端点为
http://otel-collector:4318/v1/traces(利用Heroku内部服务发现,同一Private Space内的Dyno可通过名称直接通信)
3. Heroku Exec临时调试(仅用于测试)
如果只是临时验证配置,可通过heroku ps:exec进入API Dyno,手动启动Collector进程,这样也能通过localhost连接,但Dyno重启后进程会消失,仅适合临时测试场景。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

