当我们通过Kubernetes部署基于Ruby的Passenger独立应用程序时
遇到了失去监控它们的能力的问题
passenger-status
。有一个telegraf
plugin
或passenger exporter转发指标,需要访问的输出
passenger-status
二进制文件。
遵循每个Container使用一个(主要)进程的理念
收集指标的Sidecar容器在部署时是合理的
Kubernetes。从另一个容器访问passenger-status
的输出是一个挑战。将文件链接到另一个容器not supported。为容器和复制可执行文件设置目录似乎过于复杂。
一个Pod中容器之间的通信通过环回网络工作。因此,通过HTTP公开指标是导出这些指标的常见模式。因此,我们正在研究通过HTTP公开passenger-status
指标的不同方式:
通过 Kernel#` 运行命令会破坏监控它的目的。只有当有足够的乘客流程可以回答此请求时,才会返回此选项。一旦乘客队列满了,监控也将不再起作用,这正是我们想要在这里看到的。
由于nginx仅支持FastCGI,因此必须使用类似fcgiwrap的内容来执行脚本。 fciwrap本身需要运行另一个进程,它本身需要监视。此外,它违反了每个容器有一个进程的想法。
这样的lua片段可能会有效:
location /passenger-status {
content_by_lua_block {
os.execute("/opt/ruby/bin/passenger-status")
}
}
然而,为此目的将Lua脚本添加到每个生产容器中似乎是用大锤敲碎核桃。
将第二个小红宝石脚本作为监控的乘客端点也可能有效:
http {
...
server {
listen 80;
server_name _;
root /app;
passenger_enabled on;
...
}
server {
listen 8080;
server_name _;
root /monitoring;
passenger_enabled on;
...
}
...
}
总而言之,我发现这些方法都不令人满意。您对此主题有何看法或解决方案?
答案 0 :(得分:-1)
我们采用了“第二乘客实例”的方法,并有一个second ruby process group within passenger。如问题所述,已经通过在您的nginx.conf
中添加如下代码段来进行集成:
server {
server_name _;
listen 0.0.0.0:10254;
root '/monitor/public';
passenger_app_root '/monitor';
passenger_app_group_name 'Prometheus exporter';
passenger_spawn_method direct;
passenger_enabled on;
passenger_min_instances 1;
passenger_load_shell_envvars off;
}
这将启动另一个在http://<ip-of-this-server>:10254/metrics
上为prometheus端点提供服务的ruby进程,该进程公开由常规Kubernetes监视基础结构收集的乘客指标。对此的响应可能类似于:
# HELP passenger_capacity Capacity used
# TYPE passenger_capacity gauge
passenger_capacity{supergroup_name="/app (development)",group_name="/app (development)",hostname="my-container"} 1
# HELP passenger_wait_list_size Requests in the queue
# TYPE passenger_wait_list_size gauge
passenger_wait_list_size{supergroup_name="/app (development)",group_name="/app (development)",hostname="my-container"} 0
# HELP passenger_processes_active Active processes
# TYPE passenger_processes_active gauge
passenger_processes_active{supergroup_name="/app (development)",group_name="/app (development)",hostname="my-container"} 0