2015-09-18 19 views
2

我在Cloud Foundry中頗爲新穎,對一件事感到好奇。我知道Cloud Foundry使用NATS作爲其作業之間的消息傳遞總線。通過Java NATS連接器連接到CF的NATS盒我設法獲得了關於部署在CF上的應用程序,飛沫信息,健康管理器報告等等的大量有用信息。我的目標之一是要求「dea.find.droplet」服從NATS,這會導致作業隨着時間的推移返回應用程序的CPU,內存和磁盤使用量。Cloud Foundry,從NATS消息總線獲取應用事件

現在我必須從NATS消息中獲得有關所謂的「事件」的信息。使用CF CLI工具,我們可以調用「cf events APP_NAME」來獲取這些信息。一個特徵件針對「CF事件」是這樣的

2015-09-15T10:37:35.00-0400 audit.app.update [email protected]    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

我已經創建了運行遠程服務器上的行家罐子的應用程序,收集所有的NATS郵件,過濾他們推到彈性搜索進一步分析。

String reqMessage = "{\"include_stats\": true," 
 
\t \t \t \t \t \t //+ "\"states\": [\"RUNNING\"]," 
 
\t \t \t \t \t \t + "\"version\": \"" + version + "\"," 
 
\t \t \t \t \t \t + "\"droplet\": \"" + droplet + "\"}"; 
 

 

 
public void requestAppStats(String subject, String reqMessage) throws JSONException{ 
 
    \t \t \t // Requests 
 
    \t \t \t //subject: "dea.find.droplet", 
 
    \t \t \t natsConnector.request(subject, reqMessage, 1, TimeUnit.MINUTES, 1, new MessageHandler() { 
 
    \t \t \t  @Override 
 
    \t \t \t  public void onMessage(Message message) { 
 
    \t \t \t   //LOGGER.info("Got a response: {}", message); 
 
    \t \t \t  \t try { 
 
    \t \t \t  \t \t 
 
    \t \t \t  \t \t if (new JSONObject(message.getBody()).has("stats")){ 
 
    \t \t \t \t \t \t 
 
    \t \t \t  \t \t \t updateAppMetaDataList(message.getBody()); 
 
    \t \t \t \t \t \t } 
 
    \t \t \t  \t \t 
 
    \t \t \t \t \t } catch (JSONException e) { 
 
    \t \t \t \t \t \t e.printStackTrace(); 
 
    \t \t \t \t \t } 
 
    \t \t \t  } 
 
    \t \t \t });

有一種方式來獲得「事件」,從CCDB數據庫實例的信息,但這種做法是相當緩慢的,並把應用額外的負擔。所以我想知道是否有辦法從NATS消息中捕獲「事件」信息,就像我對應用程序使用信息做的一樣?

natsConnector.request(subject, reqMessage);

正如你可以爲了得到應用的地位看,資源使用情況,我們不得不要求‘dea.find.droplet’用JSON請求消息。

很高興知道從CF CLI工具調用「cf events APP_NAME」時會發生什麼。我查了一下CF CLI工具的源代碼(https://github.com/cloudfoundry/cli),它將我帶到CloudController作業(https://github.com/cloudfoundry/cloud_controller_ng)。看起來CloudController負責返回應用程序事件信息。儘管這是純粹的猜測。

也許至少我可以模仿這一步來融入我的應用程序。任何幫助,將不勝感激。

回答

2

奧迪爾,你是對的,雲控制器負責事件。由Cloud Foundry定義的應用事件完全存在於CC數據庫中,當您更新/刪除/創建/等您的應用時,它們只是記錄事件,所以它們絕不會通過NAT消息總線。我想知道更多關於API如何緩慢運行的細節。

一般來說,我想知道爲什麼你需要直接連接到NAT。使用cf app [APPNAME]可以通過cf CLI顯示應用程序使用情況統計信息。應用的狀態也通過API公開,例如跑步/ CRASHED /已停止。

編輯:

的是CF使用系統內所有的NAT主題Here is a compiled list。但是請注意,CF正在慢慢離開NAT的使用,例如, new Diego runtime通過HTTP與雲控制器進行通信以啓動/停止應用程序。

+1

該應用程序的初始目標基本上是收集來自NATS框的所有消息並將它們推送到彈性搜索。我想我們選擇使用Java Spring Boot應用程序來實現這一目的,因爲方便(部署一個jar文件,將其作爲服務,放在crontab中,並且偶爾監視它)。但是後來我們注意到,如果我們要求某些主題,我們可以獲得一些非常有用且更重要的有關液滴/應用程序狀態的相關信息,我們可以使用Kibana的工具再次推送到彈性搜索,甚至可以對其進行visalize, – Odil

+1

跑出字符:)...我只是想,既然我們已經處理了大量的NATS消息,那麼也很好地收集關於「應用事件」的信息,所以稍後我們可以提供關於我們的足夠的統計信息應用。 我們選擇Java的其他原因,因爲它不是Ruby;) 我們公司最近採用了CF,我們仍然在尋找CF及其功能的有用用例。 正如crhino指出的,我可以直接使用API​​調用,但在這種情況下,應用程序將是NATS消息處理邏輯和RESTful API調用處理邏輯的混合。 – Odil

+0

我編輯了我的帖子,提供了一些有關NAT主題的更多信息,希望有所幫助! – crhino