command-line-interface - Cloud Foundry,从 NATS 消息总线获取应用程序事件

标签 command-line-interface cloud-foundry

我是 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/

相关文章:

linux - 如何从一个文件中获取包含在另一个文件中的内容

C++控制台插入文本而不覆盖

mysql - 使用自定义参数在 CLI 中查找 MySQL 内置函数的输出

c# - PCF 和服务栈

java - 无法在简单的java程序中读取cloud foundry env变量(不使用spring)

spring-security - 关键 CloudFoundry : Enforcing HTTPS (SSL)

node.js - 如何将 QuickReport .QRP 文件转换为 XML、HTML 或文本?

windows - 如何将多行命令行命令复制/粘贴到命令提示符中?

Docker:将镜像直接推送到 Pivotal Cloud Foundry

cloud-foundry - 将 Google Chrome Puppeteer 应用程序推送到 Predix 时出错