1. 程式人生 > >Bosh Health Monitor原始碼

Bosh Health Monitor原始碼

Bosh Health Monitor原始碼

Bosh HealthMonitorBHM)是Bosh裡面的一個元件,負責收集BoshAgent收集到的各個元件的資訊,比如cpu,mem,disk等。BHM有兩種事件,一種是Bosh::Monitor::HeartBeat以及Bosh::Monitor::Alert。另外一個概念是plugin,在BHM裡面有很多外掛,這些外掛負責具體地怎麼去處理一個HeartBeat或者Alert事件。在health_monitor.yml檔案中有一個plugins選項:

plugins:
- name: logger
  events:
 - alert

- name: tsdb

 events:

- alert

- heartbeat

options:

host: 10.134.16.220

port: 4242


這個plugins選項負責設定某一個外掛對什麼事件感興趣,比如tsdb選項對alertheartbeat事件都感興趣。

在原始碼裡面儲存這樣一個數組@plugins,這裡儲存了事件和外掛的對應關係。

@plugins[''alert]=['logger','heartbeat'],當收到某一個事件的時候就比如alert時候,就會查詢這個陣列,然後分別呼叫相應loggerPlugin::process方法。

AgentManger類是負責管理所有客戶端的agent以及deployments選項。

DirectorMonitor負責訂閱hm.director.alert訊息,觀察director的宣告週期,當

director出現問題的時候,發生alert資訊。HA的第四層可用性中會用到這點。

EventProcesser是所有外掛處理器的一個通用介面,所有的事件經過這個處理器。然後呼叫各種各樣的c外掛。

在啟動的時候AgentManger::setup_events時候,

@processor.add_plugin(lookup_plugin(plugin["name"],plugin["options"]), plugin["events"])

lookup_plugin會根據這個建立一個plugininstance

訂閱hm.agent.heartbeat.*hm.agent.alert.*

hm.agent.shutdown.*等訊息。

這些訊息的處理函式都會呼叫AgentManger::process_event

process_event(kind,subject, payload = {})

kind—alert,heartbeart

subject—hm.agent.heartbeat.<agent_id> 提取最後一個欄位就可以知道是那一個agent

case kind.to_s

然後根據訊息的型別,呼叫相應的處理函式

when "alert"

on_alert(agent,message)

when "heartbeat"

on_heartbeat(agent,message)

when "shutdown"

on_shutdown(agent,message)

else

@logger.warn("Nohandler found for `#{kind}' event")

end

on_alerton_heartbeat都是可以通過呼叫EventProcesser來處理這些事件。

on_shutdown只是remove_agent將其從AgentManger::agents裡面移除。

定時操作:

在啟動的時候BHM會啟動幾個定時器操作。

EM.add_periodic_timer(@intervals.poll_director) { poll_director }

poll_director會從director獲得deployment以及agent_id名稱,然後根據AgentManger自身維護的@deployments以及@agent_id決定留下deployments以及agent_id

poll_director函式主要負責去director裡面取出資料,填充到@agents@developments裡面

Dirrctor::fetch_deployments

獲取部署的名稱。

AgentManger::sync_deployments來同步deployments

sync_deployments把從director裡面拿部署叢集的名稱,和在@deployments裡面儲存的名稱進行比較,如果發現@deployments沒有的staledeployment那麼就從@deployments裡面刪除。同時從@agent裡面刪除這個staledeployment的所有agent

AgentManger::sync_agents(deployment_name,vms)

Director::get_deployment_vms(deployment_name)獲取部署名稱所對應的vms,在get_deployment_vms獲取的資料是這樣的,eg:

[{"agent_id":"a3e91d0a-a5a3-41ca-abe3-57d256d28e45","cid":"vm-a34c83e0-209c-467c-8eec-e26470997a0c","job":"mysql_node_100","index":0},

{"agent_id":"11fd6005-5d84-4819-8d62-89a9cdd1c15b","cid":"vm-0c503d2a-f1cf-4685-a581-9744afcb3cf9","job":"dea","index":2},

{"agent_id":"16b9dddc-9c2d-426d-88e7-7aaaba703a65","cid":"vm-7d150ca7-4a19-4993-abf2-db654ed3853e","job":"stager","index":0},

有一個agent_id,cid,job,index這些選項。

@deployment[deployname][agentdid]這一系列陣列。@deploymenst是一個Hashdeployment=>agentids

另外一個定時操作是analyze_agents

一次性分析所有agents

首先獲取所有的#Agents from managed deployments

AgentManger::@[email protected],對於這些多出來的agent

[email protected][agent_id]---Bosh::Monitor::Agent

Agent有兩個方法,time_out?以及rogue?

time_out?用現在的時間減去上次更新的時間(hearbeat更新時間)如果大於在health_monitor.yml裡面的agent_timeout的時間,那麼就超時了

rogue?比較難理解

rogue?現在時間減去[email protected]_at如果超過了rogue_agent_alert時間並且未出現在任何deployment中,那麼他就是rouge@discovered_at是如何更新的?

Agent.new的時候也更新@discovered_at

Agent.new在同步sync_agents時候出現,

在定期poll_director時候會出現,會根據poll_director的結果來更新@deployments,一切以poll_director的結果為基準,沒有的就刪除。

HeartBeat更新發現新的id會放在@agent裡面

定期地analyze_agent

儲存在@deployments儲存的id和在@agent裡面的id進行分析。

(@agents.keys.to_set -processed).each do |agent_id|
@logger.warn("Agent#{agent_id} is not a part of any deployment")
analyze_agent(agent_id)
count += 1
end

多出來的id就立刻進行分析,呼叫analyze_agent

發現新id,但是已經超時了,那麼就發出一個alert事件。

如果發現這個agent_id沒有存在任何deployment,也就是deploymentnull,通過HeartBeat發現的新id都沒有deployment,如果超過rogue_agent_alert時間那麼就是rogue;

相關推薦

Bosh Health Monitor原始碼

Bosh Health Monitor原始碼 Bosh HealthMonitor(BHM)是Bosh裡面的一個元件,負責收集BoshAgent收集到的各個元件的資訊,比如cpu,mem,disk等。BHM有兩種事件,一種是Bosh::Monitor::HeartBeat

轉 Oracle Cluster Health Monitor(CHM)簡介

linu dump nload mas inux database tar.gz 命令操作 ogg Cluster Health Monitor(以下簡稱CHM)是一個Oracle提供的工具,用來自動收集操作系統的資源(CPU、內存、SWAP、進程、I/O以及網絡等)的

以小見大,從Kafka Monitor原始碼解讀看如何做好黑盒監控

Kafka Monitor介紹   Kafka Monitor是由Linkedin開源的一款非常優秀的針對Kafka的黑盒監控軟體。它通過模擬客戶端行為,生產和消費資料並採集訊息的延遲、錯誤率和重複率等效能和可用性指標,來達到黑盒監控的目的。   Kafka的主要

Ceph Monitor原始碼機制分析(一)—— 概述

0 前言 最近終於有點時間可以看看Ceph的程式碼了,接下來準備就Ceph monitor這個Ceph叢集中最重要的元件進行深入的分析。 1 Monitor的作用 Monitor在Ceph叢集中扮演著管理者的角色,維護了整個叢集的狀態(抽象成幾張map,包括osdmap、m

ORACLE:Health Monitor

轉載之:http://space.itpub.net/9466564/viewspace-609039 1. Health Monitor簡介     Health Monitor是11g裡新增加的特性,用於資料庫的各層和各個組建的診斷檢查。例如可以檢查:檔案損壞、物理邏輯

spring-boot-admin原始碼分析及單機監控spring-boot-monitor的實現(三)

SpringBootMonitor spring-boot-admin原始碼分析及單機監控spring-boot-monitor的實現(一) spring-boot-admin原始碼分析及單機監控spring-boot-monitor的實現(二)

spring-boot-admin原始碼分析及單機監控spring-boot-monitor的實現(二)

SpringBootMonitor spring-boot-admin原始碼分析及單機監控spring-boot-monitor的實現(一) spring-boot-admin原始碼分析及單機監控spring-boot-monitor的實現(二)

spring-boot-admin原始碼分析及單機監控spring-boot-monitor的實現(一)

SpringBootMonitor spring-boot-admin原始碼分析及單機監控spring-boot-monitor的實現(一) spring-boot-admin原始碼分析及單機監控spring-boot-monitor的實現(二) spring-boot-ad

actuator 中health這個endpoint的原始碼解剖

       用過spring boot的都應該知道里面有一個actuator的starter,這個actuator其實非常有用,它提供了很多監控的endpoint,比如今天要講的health,info。。。。最近在弄的spring boot admin2.0其實也是以這個j

如何利用eclipse編譯除錯linux原始碼--以gnome-system-monitor 為例

一、          下載原始碼包gnome-system-monitor-3.8.2.1-6.el7.src.rpm,解壓。這裡就不要贅述了。 二、          在終端下進去解壓的目錄下,執行指令:./configure       過程中會遇到電腦找不到各種庫的

小夥伴們的ceph原始碼分析二——monitor啟動流程

程式碼位置:src/ceph_mon.cc 首先help看下ceph-mon的usage usage: ceph-mon -i monid [--mon-data=pathtodata][flags] --debug_mon n     debug monitor l

小夥伴們的ceph原始碼分析三——monitor訊息處理流程

筆者在讀程式碼初期非常想理清楚的就是ceph這麼個系統在服務端與客戶端是怎麼響應與發起請求的。 本人主要負責monitor部分,而且追了一會cephx認證的程式碼,所以拿這塊舉例,後續osd部分主要是對同事分享的學習。 本篇會講到src/mon/monitor.cc中 c

使用performance monitor 查看 每一個cpu core的cpu time

images cor 使用 man 100% cnblogs tor for img 使用performance monitor 查看 每一個cpu core的cpu time: 打開performance monitor,添加 counter 如下

redis命令monitor詳解

monitor 窗口 inf 做了 命令 linux blog linux中 技術分享 通過monitor這個命令可以查看數據庫在當前做了什麽操作,對於管理redis數據庫有這很大的幫助 如圖示,在redis客戶端進行操作顯示info,另一個窗口打

Monitor簡單3步監控中間件ActiveMQ

觀察 執行 info 純java 重要 處理 代理 方式 images Apache ActiveMQ是一個基於JMX規範的純Java消息中間件,它為應用系統提供高效、靈活的消息同步與異步傳輸處理、存儲轉發、可靠傳輸的特性。 消息隊列對於應用的健康運行非常重要,作為運維人員

dubbo+dubbo-monitor+nexus+sonar+svn+jenkins+linux-dash搭建項目開發平臺

開發 .com ci系統 文件 下載 還在 sonar hosts 所有 什麽是持續集成:http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html 持續集成的好處:https://zhuanlan.

electronic cigarette harmful to human health?

all nes tel child not find acc trie heat init Do students smoke cigarettes, electronic cigarettes(Smoant Box Mod) harmful to huma

C#中Monitor和Lock以及區別

能夠 program tor 試圖 tro 指定 object span () 原文地址:http://www.cnblogs.com/chengxingliang/p/3150731.html   Monitor對象   1.Monitor.Enter(object)方法

C#多線程的用法5-線程間的協作Monitor

ole 所有 pri sum 接下來 變化 customer sta 進入 之前我們使用lock快捷方式,實現了多線程對同一資源的共享。在C#中lock實際上是Monitor操作的簡化版本。 下面使用Monitor來完成之前的lock功能,你可以在此做一下對照: priv

monitor.go

pac isl style 初始化 esp quest for top 地址 package mainimport ( "fmt" "net/http")// 查詢監控信息的接口func statsHandler(w http.ResponseWriter, r