Nginx 通过http公开phusion乘客状态

Nginx 通过http公开phusion乘客状态,nginx,kubernetes,passenger,Nginx,Kubernetes,Passenger,当通过Kubernetes部署基于Ruby的独立应用程序时,我们 遇到了失去通过 乘客状态。有一个 或转发指标,这些指标需要访问 乘客状态二进制 遵循使用 在部署到时,收集度量的Sidecar容器是合理的 库伯内特斯。从另一个容器访问乘客状态的输出是这里的挑战。需要将文件链接到另一个容器中。为容器和复制可执行文件设置目录似乎过于复杂 一个吊舱内集装箱之间的通信通过环回网络进行。因此,通过HTTP公开度量是导出这些度量的常见模式。因此,我们正在研究通过HTTP公开乘客状态的不同方法: 通过应用程序

当通过Kubernetes部署基于Ruby的独立应用程序时,我们 遇到了失去通过
乘客状态
。有一个 或转发指标,这些指标需要访问
乘客状态
二进制

遵循使用 在部署到时,收集度量的Sidecar容器是合理的 库伯内特斯。从另一个容器访问
乘客状态
的输出是这里的挑战。需要将文件链接到另一个容器中。为容器和复制可执行文件设置目录似乎过于复杂

一个吊舱内集装箱之间的通信通过环回网络进行。因此,通过HTTP公开度量是导出这些度量的常见模式。因此,我们正在研究通过HTTP公开乘客状态的不同方法:

通过应用程序 通过某种方式运行命令违背了监视它的目的。只有当有足够的乘客流程可自由响应此请求时,才会返回此消息。一旦乘客队列排满,监控也将不再工作,这正是我们想要看到的

CGI脚本 由于nginx只支持FastCGI,因此必须有类似于执行脚本的东西。fciwrap本身需要另一个进程运行,这本身就需要监控。此外,它违反了每个容器有一个进程的想法

Lua脚本 类似这样的lua片段可能会起作用:

location /passenger-status {
  content_by_lua_block {
    os.execute("/opt/ruby/bin/passenger-status")
  }
}
http {
    ...

    server {
        listen 80;
        server_name _;
        root /app;
        passenger_enabled on;
        ...
    }

    server {
        listen 8080;
        server_name _;
        root /monitoring;
        passenger_enabled on;
        ...
    }

    ...
}
然而,仅仅为了这个目的向每个生产容器添加Lua脚本似乎是大锤砸核桃

第二个乘客实例 使用第二个小ruby脚本作为监控端点也可能会起作用:

location /passenger-status {
  content_by_lua_block {
    os.execute("/opt/ruby/bin/passenger-status")
  }
}
http {
    ...

    server {
        listen 80;
        server_name _;
        root /app;
        passenger_enabled on;
        ...
    }

    server {
        listen 8080;
        server_name _;
        root /monitoring;
        passenger_enabled on;
        ...
    }

    ...
}

总而言之,我觉得这些方法都不令人满意。您对这个话题有什么想法或解决方案?

我们采取了“第二乘客实例”的方法,并进行了讨论。正如问题中所述,通过向
nginx.conf
中添加这样的代码片段,集成就可以工作了:

服务器{
服务器名称;
听0.0.0.0:10254;
根“/monitor/public”;
乘客/应用程序根“/监视器”;
乘客组名称为“普罗米修斯出口商”;
乘客产卵法直接;
乘客_开启;
乘客(1);;
乘客\装载\外壳\环境关闭;
}
这将启动另一个ruby进程,该进程在
http://:10254/metrics
上为prometheus端点提供服务,该进程公开了将由常用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
在上找到项目