分佈式監控系統開發【day37】:服務端生成配置數據(四)

1、目錄結構

2、引子與代碼

一、客戶端獲取服務列表接口

一、解決了什麼問題python

  1. 客戶端要給我獲取服務列表的的時候,他確定要告訴他是誰?他怎麼告訴我,客戶端必須有一個id號
  2. Saltsack你裝一個客戶端,客戶端配置一個server的ip地址,這樣服務器端就知道它是誰了
  3. 服務器端生成一個惟一值,告訴你這就是你,你記住之後就告訴我你的ID

二、實現代碼數據庫

總urlsdjango

from django.conf.urls import url,include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^api/', include("monitor.api_urls")),
]

監控app urlsjson

from django.conf.urls import url,include

from monitor import api_views

urlpatterns = [
    url(r'client/config/(\d+)/$',api_views.client_config),
    url(r'client/service/report/$',api_views.service_report),
]

二、試圖函數

一、解決了什麼問題api

  1. 傳一個ID過來,在這裏面乾的事情是什麼呀?
  2. 拿到ID根據ID到數據庫拿到主機關聯的模板,所關聯的主機組
  3. 模板關聯的服務,服務都有哪些指標
  4. 我要給客戶端返回的是一個json大字典,這個大字典長什麼?
    我在視圖裏倒入這個模塊,執行這個實例服務器

二、大字典長什麼樣?app

三、代碼實現函數

from django.shortcuts import render,HttpResponse
import json

from monitor.serializer import ClientHandler
# Create your views here.

def client_config(request,client_id):

    config_obj = ClientHandler(client_id)
    config = config_obj.fetch_configs()

    if config:
        return HttpResponse(json.dumps(config))

三、序列化函數

一、解決了什麼問題

一、我要給客戶端返回的是一個json大字典,這個大字典長什麼?
二、這個類都幹了寫什麼事情?oop

一、拿到這條記錄
二、找到這臺機器關聯的全部模板,把關聯全部的模板列出來,
三、把它變成列表,爲何要變成列表?
  由於主機組關聯的模板和主機關聯的模板有重合的部分
四、把這個主機關聯的全部主機組(由於一個主機關聯多個主機組)取出來
五、而後把主機組裏的模板,和我主機的模板拼接成一個大的列表
六、這些模板可能重複,我循環全部的模板,把全部的模板變成統一的服務列表
七、而後去重(每一個模板裏包含不少服務)測試

二、代碼實現

from monitor import models
import json, time
from django.core.exceptions import ObjectDoesNotExist


class ClientHandler(object):

    def __init__(self, client_id):
        self.client_id = client_id
        self.client_configs = {
            "services": {}
        }

    def fetch_configs(self):
        try:
            host_obj = models.Host.objects.get(id=self.client_id)
            template_list = list(host_obj.templates.select_related())

            for host_group in host_obj.host_groups.select_related():
                template_list.extend(host_group.templates.select_related())
            print(template_list)
            for template in template_list:
                # print(template.services.select_related())

                for service in template.services.select_related():  # loop each service
                    print(service)
                    self.client_configs['services'][service.name] = [service.plugin_name, service.interval]

        except ObjectDoesNotExist:
            pass

        return self.client_configs

3、測試截圖

獲取主機2服務列表

相關文章
相關標籤/搜索