分布式监控系统开发【day37】:服务端生成配置数据(四)
一、目录结构
二、引子与代码
1、客户端获取服务列表接口
1、解决了什么问题
- 客户端要给我获取服务列表的的时候,他肯定要告诉他是谁?他怎么告诉我,客户端必须有一个id号
- Saltsack你装一个客户端,客户端配置一个server的ip地址,这样服务器端就知道它是谁了
- 服务器端生成一个唯一值,告诉你这就是你,你记住以后就告诉我你的ID
2、实现代码
总urls
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 urls
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), ]
2、试图函数
1、解决了什么问题
- 传一个ID过来,在这里面干的事情是什么呀?
- 拿到ID根据ID到数据库拿到主机关联的模板,所关联的主机组
- 模板关联的服务,服务都有哪些指标
-
我要给客户端返回的是一个json大字典,这个大字典长什么?
我在视图里倒入这个模块,执行这个实例
2、大字典长什么样?
3、代码实现
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))
3、序列化函数
1、解决了什么问题
1、我要给客户端返回的是一个json大字典,这个大字典长什么?
2、这个类都干了写什么事情?
1、拿到这条记录
2、找到这台机器关联的所有模板,把关联所有的模板列出来,
3、把它变成列表,为什么要变成列表?
因为主机组关联的模板和主机关联的模板有重合的部分
4、把这个主机关联的所有主机组(因为一个主机关联多个主机组)取出来
5、然后把主机组里的模板,和我主机的模板拼接成一个大的列表
6、这些模板可能重复,我循环所有的模板,把所有的模板变成统一的服务列表
7、然后去重(每个模板里包含很多服务)
2、代码实现
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
三、测试截图
获取主机2服务列表
作者:罗阿红
出处:http://www.cnblogs.com/luoahong/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。