Compare commits
9 Commits
2b635be17e
...
15fe9fa8cf
Author | SHA1 | Date |
---|---|---|
Jorge Pastor | 15fe9fa8cf | |
Jorge Pastor | e1edd4f546 | |
Jorge Pastor | 01f8ac5481 | |
Jorge Pastor | 7ec7d18544 | |
Jorge Pastor | 4cfbf57428 | |
Jorge Pastor | dc2927bc88 | |
Jorge Pastor | 3d8fddfd9e | |
Jorge Pastor | 031a290390 | |
Jorge Pastor | 1716ea36d0 |
|
@ -0,0 +1 @@
|
|||
default_app_config = 'orchestra.contrib.apps.MetricsConfig'
|
|
@ -0,0 +1,3 @@
|
|||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
|
@ -0,0 +1,7 @@
|
|||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class MetricsConfig(AppConfig):
|
||||
name = 'orchestra.contrib.metrics'
|
||||
|
||||
|
|
@ -0,0 +1,99 @@
|
|||
from prometheus_client import start_http_server, Gauge
|
||||
import random
|
||||
|
||||
from orchestra.contrib.accounts.models import Account
|
||||
from orchestra.contrib.websites.models import Website
|
||||
from orchestra.contrib.databases.models import Database
|
||||
from orchestra.contrib.resources.models import ResourceData
|
||||
from orchestra.contrib.mailboxes.models import Mailbox
|
||||
from orchestra.contrib.lists.models import List
|
||||
from orchestra.contrib.saas.models import SaaS
|
||||
|
||||
|
||||
# Crear métricas de tipo Gauge con etiquetas
|
||||
usuarios_metrica = Gauge('usuarios', 'Número total de usuarios', ['tipo', 'estado'])
|
||||
websites_metrica = Gauge('websites_server', 'Número total de websites en server', ['target_server', 'estado'])
|
||||
databases_metrica = Gauge('databases', 'Número total de websites en server', ['target_server'])
|
||||
mailboxes_metrica = Gauge('mailbox', 'Número total de mailbox', ['estado'])
|
||||
lists_metrica = Gauge('lists', 'Número total de listas')
|
||||
saas_metrica = Gauge('saas', 'Número total de saas', ['service', 'estado'])
|
||||
|
||||
usuarios_top_size_metrica = Gauge('usuarios_top_size', 'Top 10 cuentas ocupan espacio', ['object'])
|
||||
databases_top_size_metrica = Gauge('databases_top_size', 'Top 10 databases ocupan espacio', ['object'])
|
||||
mailboxes_top_size_metrica = Gauge('mailboxes_top_size', 'Top 10 mailboxes ocupan espacio', ['object'])
|
||||
saas_top_size_metrica = Gauge('saas_top_size', 'Top 10 saas ocupan espacio', ['object'])
|
||||
|
||||
|
||||
def get_size_resourcedata(id_resource, metrica):
|
||||
top_resources = ResourceData.objects.filter(resource_id=id_resource, used__isnull=False).order_by('-used')[:10]
|
||||
for resourcedata in top_resources:
|
||||
metrica.labels(object=resourcedata.content_object_repr).set(resourcedata.used)
|
||||
|
||||
def get_data_objects_with_active(model, field_type):
|
||||
objects = model.objects.all()
|
||||
|
||||
object_dict = {}
|
||||
for obj in objects:
|
||||
key = getattr(obj, field_type)
|
||||
if key not in object_dict:
|
||||
object_dict[key] = {'activo':0, 'inactivo':0}
|
||||
if getattr(obj, 'is_active'):
|
||||
object_dict[key]['activo'] += 1
|
||||
else:
|
||||
object_dict[key]['inactivo'] += 1
|
||||
|
||||
return object_dict
|
||||
|
||||
|
||||
def actualizar_metrica_usuarios():
|
||||
get_size_resourcedata(4, usuarios_top_size_metrica)
|
||||
user_dict = get_data_objects_with_active(Account, 'type')
|
||||
|
||||
# envia metrica por cada tipo de usuario num de activos y inactivos
|
||||
for type, value in user_dict.items():
|
||||
usuarios_metrica.labels(tipo=type, estado='activo').set(value['activo'])
|
||||
usuarios_metrica.labels(tipo=type, estado='no_activo').set(value['inactivo'])
|
||||
|
||||
|
||||
def actualizar_metrica_websites():
|
||||
website_dict = get_data_objects_with_active(Website, 'target_server')
|
||||
for server, value in website_dict.items():
|
||||
websites_metrica.labels(target_server=server, estado='activo').set(value['activo'])
|
||||
websites_metrica.labels(target_server=server, estado='no_activo').set(value['inactivo'])
|
||||
|
||||
|
||||
def actualizar_metrica_databases():
|
||||
get_size_resourcedata(5, databases_top_size_metrica)
|
||||
databases = Database.objects.all()
|
||||
|
||||
data = {}
|
||||
for database in databases:
|
||||
if database.target_server.name not in data.keys():
|
||||
data[database.target_server.name] = {'total':0}
|
||||
data[database.target_server.name]['total'] += 1
|
||||
|
||||
for server, value in data.items():
|
||||
databases_metrica.labels(target_server=server).set(value['total'])
|
||||
|
||||
|
||||
def actualizar_metrica_mailboxes():
|
||||
get_size_resourcedata(1, mailboxes_top_size_metrica)
|
||||
mailboxes = Mailbox.objects.all()
|
||||
|
||||
mailbox_activos = sum(1 for mailbox in mailboxes if mailbox.is_active)
|
||||
mailbox_inactivos = len(mailboxes) - mailbox_activos
|
||||
|
||||
mailboxes_metrica.labels(estado='activo').set(mailbox_activos)
|
||||
mailboxes_metrica.labels(estado='no_activo').set(mailbox_inactivos)
|
||||
|
||||
|
||||
def actualizar_metrica_lists():
|
||||
lists = List.objects.all()
|
||||
lists_metrica.set(len(lists))
|
||||
|
||||
def actualizar_metrica_saas():
|
||||
get_size_resourcedata(23, saas_top_size_metrica)
|
||||
saas_dict = get_data_objects_with_active(SaaS, 'service')
|
||||
for servicio, value in saas_dict.items():
|
||||
saas_metrica.labels(service=servicio, estado='activo').set(value['activo'])
|
||||
saas_metrica.labels(service=servicio, estado='no_activo').set(value['inactivo'])
|
|
@ -0,0 +1,3 @@
|
|||
from django.db import models
|
||||
|
||||
# Create your models here.
|
|
@ -0,0 +1,3 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
|
@ -0,0 +1,27 @@
|
|||
from django.shortcuts import render
|
||||
from django.http import HttpResponse
|
||||
from django.views.decorators.http import require_GET
|
||||
from prometheus_client.exposition import generate_latest
|
||||
from prometheus_client import REGISTRY, CONTENT_TYPE_LATEST
|
||||
from .custom_metrics import (
|
||||
actualizar_metrica_usuarios,
|
||||
actualizar_metrica_websites,
|
||||
actualizar_metrica_databases,
|
||||
actualizar_metrica_mailboxes,
|
||||
actualizar_metrica_lists,
|
||||
actualizar_metrica_saas,
|
||||
)
|
||||
|
||||
@require_GET
|
||||
def metrics_view(request):
|
||||
# Actualizar métricas antes de generar el contenido
|
||||
actualizar_metrica_usuarios()
|
||||
actualizar_metrica_websites()
|
||||
actualizar_metrica_databases()
|
||||
actualizar_metrica_mailboxes()
|
||||
actualizar_metrica_lists()
|
||||
actualizar_metrica_saas()
|
||||
|
||||
# Devolver las métricas exportadas como respuesta HTTP
|
||||
output = generate_latest(REGISTRY)
|
||||
return HttpResponse(output, content_type=CONTENT_TYPE_LATEST)
|
|
@ -7,6 +7,7 @@ from orchestra.views import serve_private_media
|
|||
|
||||
from . import api
|
||||
from .utils.apps import isinstalled
|
||||
from orchestra.contrib.metrics.views import metrics_view
|
||||
|
||||
|
||||
admin.autodiscover()
|
||||
|
@ -23,8 +24,14 @@ urlpatterns = [
|
|||
url(r'^api-token-auth/', obtain_auth_token, name='api-token-auth'),
|
||||
url(r'^media/(.+)/(.+)/(.+)/(.+)/(.+)$', serve_private_media, name='private-media'),
|
||||
# url(r'search', 'orchestra.views.search', name='search'),
|
||||
|
||||
# METRICS Prometheus
|
||||
# url(r'^metrics/', include('django_prometheus.urls')),
|
||||
url(r'^custom_metrics/', metrics_view, name='metrics'),
|
||||
|
||||
# MUSICIAN
|
||||
path('panel/', include('orchestra.contrib.musician.urls')),
|
||||
|
||||
]
|
||||
|
||||
|
||||
|
|
|
@ -22,3 +22,4 @@ django-localflavor==3.1
|
|||
amqp
|
||||
anyjson
|
||||
pytz
|
||||
prometheus-client==0.19.0
|
||||
|
|
Loading…
Reference in New Issue