【问题标题】:Cloud Foundry, fetching app events from NATS message busCloud Foundry,从 NATS 消息总线获取应用程序事件
【发布时间】: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


    【解决方案1】:

    Odil,您说得对,云控制器负责事件。 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 与云控制器通信以启动/停止应用程序。

    【讨论】:

    • 应用程序的最初目标基本上是收集来自 NATS 框的所有消息并将它们推送到 Elastic Search。我想我们选择使用 Java Spring Boot 应用程序是为了方便(部署一个 jar 文件,将他作为服务,安装 crontab 并偶尔监控一次)。但随后我们注意到,如果我们请求某些主题,我们可以获得一些非常有用且更重要的是有关液滴/应用程序状态的相关信息,我们可以再次将其推送到 Elastic Search,甚至使用 Kibana 的工具对其进行可视化,例如内存使用情况随着时间的推移
    • 字符用完了 :)... 我只是想,既然我们已经处理了一大堆 NATS 消息,最好也收集有关“应用程序事件”的信息,所以稍后我们可以提供有关我们应用程序的足够统计数据。我们选择 Java 的其他原因,因为它不是 Ruby;)我们公司最近采用了 CF,我们仍在寻找 CF 及其特性的有用用例。正如 crhino 指出的那样,我可以直接使用 API 调用,但在这种情况下,应用程序将是 NATS 消息处理逻辑和 RESTful API 调用处理逻辑的混合体。
    • 我编辑了我的帖子,提供了有关 NAT 主题的更多信息,希望对您有所帮助!
    • 非常感谢,crhino。您发布的主题列表非常有用。
    猜你喜欢
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    相关资源
    最近更新 更多