kopano-cachestat 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #!/usr/bin/python -u
  2. from collections import defaultdict
  3. from datetime import datetime
  4. import kopano
  5. from MAPI.Tags import PR_EC_STATSTABLE_SYSTEM, PR_DISPLAY_NAME_W, PR_EC_STATS_SYSTEM_VALUE, PR_EC_STATS_SYSTEM_DESCRIPTION
  6. """
  7. provides an easy-to read overview of the kopano-server cache statistics,
  8. as compared to the more low-level "kopano-stats --system"
  9. """
  10. options, _ = kopano.parser('ksp').parse_args()
  11. server = kopano.Server(options=options, auth_user='SYSTEM', auth_pass='')
  12. # XXX: When python-kopano supports sorting, simplify the loop by sorting on display_name in descending order.
  13. table = server.table(PR_EC_STATSTABLE_SYSTEM, columns=[PR_DISPLAY_NAME_W, PR_EC_STATS_SYSTEM_VALUE, PR_EC_STATS_SYSTEM_DESCRIPTION])
  14. cstat = defaultdict(dict)
  15. for row in table.rows():
  16. name, value, _ = row
  17. name = name.value
  18. value = value.value
  19. if name == 'server_start_date':
  20. serverstarttime = value
  21. # Skip non cache items
  22. if not name.startswith('cache_'):
  23. continue
  24. if name.endswith('_hit'):
  25. name = name[6:-4]
  26. cstat[name]['hits'] = int(value)
  27. if name.endswith('_req'):
  28. name = name[6:-4]
  29. cstat[name]['requests'] = int(value)
  30. if name.endswith('_size'):
  31. name = name[6:-5]
  32. cstat[name]['size'] = int(value)
  33. if name.endswith('_maxsz'):
  34. name = name[6:-6]
  35. cstat[name]['maxsz'] = int(value)
  36. print('Kopano Cache Statistics')
  37. print(' Server start time: %s' % ( serverstarttime ))
  38. print(' Current time : %s' % ( datetime.now().strftime('%c') ))
  39. print('')
  40. print('%10s %24s %24s' % ('Cache', 'Hit ratio', 'Mem usage ratio'))
  41. for name, data in cstat.items():
  42. if data['requests']:
  43. percentage = '%d%%' % (data['hits'] * 100 / data['requests'])
  44. else:
  45. percentage = 'N/A'
  46. if data['maxsz']:
  47. persize = '%d%%' % (data['size'] * 100 / data['maxsz'])
  48. else:
  49. persize = 'N/A'
  50. print('%10s (%12d/%12d) (%3s) (%12d/%12d) (%3s)' % (name, data['hits'], data['requests'], percentage, data['size'], data['maxsz'], persize))