|
5 | 5 | import pytz
|
6 | 6 | from cryptography import x509
|
7 | 7 | from django.conf import settings
|
8 |
| -from django.http import JsonResponse |
| 8 | +from django.http import JsonResponse, HttpResponse |
9 | 9 | from django.shortcuts import get_object_or_404
|
10 | 10 | from django.utils import timezone as djangotime
|
11 | 11 | from django.views.decorators.csrf import csrf_exempt
|
|
15 | 15 | from rest_framework.response import Response
|
16 | 16 | from rest_framework.views import APIView
|
17 | 17 |
|
18 |
| -from core.decorators import monitoring_view |
| 18 | +from core.decorators import monitoring_view, metrics_view |
19 | 19 | from core.utils import get_core_settings, sysd_svc_is_running, token_is_valid
|
20 | 20 | from logs.models import AuditLog
|
21 | 21 | from tacticalrmm.constants import AuditActionType, PAStatus
|
@@ -449,3 +449,45 @@ def status(request):
|
449 | 449 | "nginx": sysd_svc_is_running("nginx.service"),
|
450 | 450 | }
|
451 | 451 | return JsonResponse(ret, json_dumps_params={"indent": 2})
|
| 452 | + |
| 453 | +@csrf_exempt |
| 454 | +@metrics_view |
| 455 | +def metrics(request): |
| 456 | + from agents.models import Agent |
| 457 | + from clients.models import Client, Site |
| 458 | + cert_file, _ = get_certs() |
| 459 | + cert_bytes = Path(cert_file).read_bytes() |
| 460 | + cert = x509.load_pem_x509_certificate(cert_bytes) |
| 461 | + cert_expiration = cert.not_valid_after.timestamp() |
| 462 | + metrics = [ |
| 463 | + 'trmm_buildinfo{{version="{}"}} 1'.format(settings.TRMM_VERSION), |
| 464 | + 'trmm_meshinfo{{version="{}"}} 1'.format(settings.MESH_VER), |
| 465 | + 'trmm_natsinfo{{version="{}"}} 1'.format(settings.NATS_SERVER_VER), |
| 466 | + 'trmm_appinfo{{version="{}"}} 1'.format(settings.APP_VER), |
| 467 | + 'trmm_agent{{latest_version="{}"}} 1'.format(settings.LATEST_AGENT_VER), |
| 468 | + "trmm_agent_count {}".format(Agent.objects.count()), |
| 469 | + "trmm_client_count {}".format(Client.objects.count()), |
| 470 | + "trmm_site_count {}".format(Site.objects.count()), |
| 471 | + "trmm_cert_expiration_time {}".format(cert_expiration), |
| 472 | + ] |
| 473 | + |
| 474 | + if settings.DOCKER_BUILD: |
| 475 | + metrics.append("trmm_docker_build 1") |
| 476 | + else: |
| 477 | + metrics.append("trmm_docker_build 0") |
| 478 | + services = { |
| 479 | + "django": "rmm.service", |
| 480 | + "mesh": "meshcentral.service", |
| 481 | + "daphne": "daphne.service", |
| 482 | + "celery": "celery.service", |
| 483 | + "celerybeat": "celerybeat.service", |
| 484 | + "redis": "redis-server.service", |
| 485 | + "postgres": "postgresql.service", |
| 486 | + "mongo": "mongod.service", |
| 487 | + "nats": "nats.service", |
| 488 | + "nats-api": "nats-api.service", |
| 489 | + "nginx": "nginx.service", |
| 490 | + } |
| 491 | + for k,v in services.items(): |
| 492 | + metrics.append('trmm_service{{name="{}",unit="{}"}} {}'.format(k,v,int(sysd_svc_is_running(v)))) |
| 493 | + return HttpResponse(("\n").join(metrics),content_type="text/plain") |
0 commit comments