我是 Cloud Foundry 的新手,对一件事感到好奇。我知道 Cloud Foundry 使用 NATS 作为作业之间的消息传递总线。通过 Java NATS 连接器连接到 CF 的 NATS 盒,我设法获得了有关 CF 上部署的应用程序的大量有用信息、Droplet 信息、Health Manager 报告等等。我的目标之一是请求受 NATS 约束的“dea.find.droplet”,这会导致作业随着时间的推移返回应用程序的 CPU、内存和磁盘使用情况。
现在我必须从 NATS 消息中获取有关所谓“事件”的信息。使用 CF CLI 工具,我们可以调用“cf events APP_NAME”来获取此信息。对“cf events”的典型响应是这样的
2015-09-15T10:37:35.00-0400 audit.app.update <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="187d797c79756b587b776e716b71766c367b7775" rel="noreferrer noopener nofollow">[email protected]</a> state: STARTED
2015-09-03T10:43:08.00-0400 audit.app.restage troy
2015-08-26T14:26:58.00-0400 app.crash s-platform index: 1, reason: CRASHED, exit_description: failed to start, exit_status: -1
我已经创建了一个在远程服务器上运行的 Maven jar 应用程序,它收集所有 NATS 消息,过滤它们并推送到 Elastic Search 进行进一步分析。
String reqMessage = "{\"include_stats\": true,"
//+ "\"states\": [\"RUNNING\"],"
+ "\"version\": \"" + version + "\","
+ "\"droplet\": \"" + droplet + "\"}";
public void requestAppStats(String subject, String reqMessage) throws JSONException{
// Requests
//subject: "dea.find.droplet",
natsConnector.request(subject, reqMessage, 1, TimeUnit.MINUTES, 1, new MessageHandler() {
@Override
public void onMessage(Message message) {
//LOGGER.info("Got a response: {}", message);
try {
if (new JSONObject(message.getBody()).has("stats")){
updateAppMetaDataList(message.getBody());
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
有一种方法可以从 CCDB 数据库实例中获取“事件”信息,但这种方法非常慢并且会给应用程序带来额外的负担。所以我想知道是否有一种方法可以从 NATS 消息中捕获“事件”信息,就像我处理这样的应用程序使用信息一样?
natsConnector.request(subject, reqMessage);
正如您所看到的,为了获取应用程序的状态、资源使用情况,我们必须使用 JSON 请求消息请求“dea.find.droplet”。
很高兴知道当我从 CF CLI 工具调用“cf events APP_NAME”时会发生什么。我查找了 CF CLI 工具 ( https://github.com/cloudfoundry/cli ) 的源代码,这将我带到了 CloudController 作业 ( https://github.com/cloudfoundry/cloud_controller_ng )。看起来 CloudController 负责返回应用程序事件信息。但这纯粹是猜测。
也许至少我可以模仿这个步骤来集成到我的应用程序中。任何帮助将不胜感激。
最佳答案
Odil,你说得对,云 Controller 负责事件。 Cloud Foundry 定义的应用程序事件完全存在于 CC 数据库中,它们只是在您更新/删除/创建等应用程序时记录的事件,因此它们永远不会通过 NAT 消息总线。我有兴趣了解有关 API 为何缓慢的更多细节。
总的来说,我想知道为什么需要直接连接到 NAT。可以使用 cf app [APPNAME]
通过 cf
CLI 显示应用程序使用情况统计信息。应用程序的状态也通过 API 公开,例如正在运行/崩溃/停止。
编辑:
Here is a compiled list CF 在系统内部使用的所有 NAT 主题。但请注意,CF 正在慢慢摆脱 NAT 的使用,例如new Diego runtime通过 HTTP 与云 Controller 通信以启动/停止应用程序。
关于command-line-interface - Cloud Foundry,从 NATS 消息总线获取应用程序事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32653565/