monitoring.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import os
  2. from time import sleep
  3. from app.config import HOST
  4. from app.extensions import db
  5. from app.log import LOG
  6. from app.models import Monitoring
  7. from server import create_app
  8. # the number of consecutive fails
  9. # if more than _max_nb_fails, alert
  10. # reset whenever the system comes back to normal
  11. # a system is considered fail if incoming_queue + active_queue > 50
  12. _nb_failed = 0
  13. _max_nb_fails = 10
  14. # the maximum number of emails in incoming & active queue
  15. _max_incoming = 50
  16. def get_stats():
  17. """Look at different metrics and alert appropriately"""
  18. incoming_queue = nb_files("/var/spool/postfix/incoming")
  19. active_queue = nb_files("/var/spool/postfix/active")
  20. deferred_queue = nb_files("/var/spool/postfix/deferred")
  21. LOG.d("postfix queue sizes %s %s %s", incoming_queue, active_queue, deferred_queue)
  22. Monitoring.create(
  23. host=HOST,
  24. incoming_queue=incoming_queue,
  25. active_queue=active_queue,
  26. deferred_queue=deferred_queue,
  27. )
  28. db.session.commit()
  29. global _nb_failed
  30. # alert when too many emails in incoming + active queue
  31. if incoming_queue > _max_incoming:
  32. _nb_failed += 1
  33. if _nb_failed > _max_nb_fails:
  34. # reset
  35. _nb_failed = 0
  36. LOG.exception(
  37. "Too many emails in incoming & active queue %s %s",
  38. incoming_queue,
  39. active_queue,
  40. )
  41. else:
  42. _nb_failed = 0
  43. def nb_files(directory) -> int:
  44. """return the number of files in directory and its sub-directories"""
  45. return sum(len(files) for _, _, files in os.walk(directory))
  46. if __name__ == "__main__":
  47. while True:
  48. app = create_app()
  49. with app.app_context():
  50. get_stats()
  51. # 1 min
  52. sleep(60)