【发布时间】:2015-09-18 13:42:08
【问题描述】:
我是 Cloud Foundry 的新手,对一件事感到好奇。我知道 Cloud Foundry 使用 NATS 作为作业之间的消息传递总线。通过 Java NATS 连接器连接到 CF 的 NATS 盒后,我设法获得了很多关于部署在 CF 上的应用程序的有用信息、液滴信息、健康管理器报告等等。我的目标之一是请求受 NATS 约束的“dea.find.droplet”,这会导致作业随着时间的推移返回应用程序的 CPU、内存和磁盘使用情况。
现在我必须从 NATS 消息中获取有关所谓“事件”的信息。使用 CF CLI 工具,我们可以调用“cf events APP_NAME”来获取此信息。对“cf events”的典型响应是这样的
2015-09-15T10:37:35.00-0400 audit.app.update eadams@covisint.com 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 负责返回应用程序事件信息。不过,这纯属猜测。
也许至少我可以模仿这个步骤来集成到我的应用程序中。任何帮助将不胜感激。
【问题讨论】:
标签: command-line-interface cloud-foundry