通過vsphere golang webservice sdk 擷取vmware主機、虛擬機器的監控資料【一】

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

目前正在使用prometheus對我們的openstack雲環境進行監控,但過了半年測試環境的主機資源遲遲未到位,因此和基架溝通是否有傳統環境的需求可以做,提到了cmdb和商業監控的替換。但基架又不想我們再到每台虛擬機器上去安裝agent,因此需要通過vSphere Web Service API抓取測試環境34台主機、1600台虛擬機器的監控資料。

經過兩個星期的研究,第一稿監控vmware vcenter的prometheus exporter開發完成,一次抓取1600多台主機、虛擬機器的cpu mhz、mem mb、disk io、net io大概耗時在1分鐘左右。

exporter使用go語言編寫,使用vsphere的govmomi sdk。
sdk地址:https://github.com/vmware/govmomi
api文檔:https://code.vmware.com/apis/42/vsphere#doc

監控

使用go sdk擷取串連

func Refresh_connect() {ctx, _ := context.WithCancel(context.Background())u, err := soap.ParseURL(cfg.Vsphere_url) # webservice地址,類似:https://10.50.82.155/sdkif err != nil {log.Fatal(err)return}u.User = url.UserPassword(cfg.Vsphere_user, cfg.Vsphere_passwd)c, err := govmomi.NewClient(ctx, u, true)if err != nil {log.Fatal(err)}connect = &Connect{connect: c,context: ctx,}}

擷取主機

func Get_hosts() ([]mo.HostSystem) {c := get_connect()client := c.connectm := view.NewManager(client.Client)v, err := m.CreateContainerView(c.context, client.ServiceContent.RootFolder, []string{"HostSystem"}, true)log_process("create container view ")if err != nil {log.Fatal(err)}var hss []mo.HostSystemerr = v.Retrieve(c.context, []string{"HostSystem"}, []string{"summary", "vm" , "datastore"}, &hss)if err != nil {log.Fatal(err)}log_process("retrieve host data ")return hss}

擷取主機資訊

通過mo.HostSystem對象可以擷取主機的cpu mhz速度、當前使用的mhz,最大記憶體、當前使用的記憶體資訊,如果想要擷取disk和net io,得通過查詢監控資料才能擷取。

host_cpu_speed := hs.Summary.Hardware.CpuMhzcpu_capacity := float64(int64(hs.Summary.Hardware.CpuMhz) * int64(hs.Summary.Hardware.NumCpuCores))cpu_usage := float64(hs.Summary.QuickStats.OverallCpuUsage)mem_capacity := float64(hs.Summary.Hardware.MemorySize / (1024 * 1024))mem_usage := float64(hs.Summary.QuickStats.OverallMemoryUsage)

擷取主機磁碟空間使用方式

主機的磁碟資訊主要是mo.Datastore對象,但hostSystem.Datastore擷取到的是[]types.ManagedObjectReference,需要做一次轉換

func Get_Host_disk_info(mos []types.ManagedObjectReference) (int64, int64, []*DiskInfo) {c := get_connect()pc := property.DefaultCollector(c.connect.Client)dss := []mo.Datastore{}err := pc.Retrieve(c.context, mos, []string{"summary"}, &dss)if err != nil {log.Error("get host datastore info error ", err)}var (capacity  int64free      int64diskInfos []*DiskInfo)for _, ds := range dss {capacity += ds.Summary.Capacityfree += ds.Summary.FreeSpacediskInfos = append(diskInfos, &DiskInfo{Capacity: ds.Summary.Capacity / utils.GB,Free:     ds.Summary.FreeSpace / utils.GB,Path:     ds.Summary.Name,})}return capacity / utils.GB, free / utils.GB, diskInfos}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.