test_db_log_parser.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. # Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
  2. # This source code is licensed under both the GPLv2 (found in the
  3. # COPYING file in the root directory) and Apache 2.0 License
  4. # (found in the LICENSE.Apache file in the root directory).
  5. from advisor.db_log_parser import DatabaseLogs, Log, NO_COL_FAMILY
  6. from advisor.rule_parser import Condition, LogCondition
  7. import os
  8. import unittest
  9. class TestLog(unittest.TestCase):
  10. def setUp(self):
  11. self.column_families = ['default', 'col_fam_A']
  12. def test_get_column_family(self):
  13. test_log = (
  14. "2018/05/25-14:34:21.047233 7f82ba72e700 [db/flush_job.cc:371] " +
  15. "[col_fam_A] [JOB 44] Level-0 flush table #84: 1890780 bytes OK"
  16. )
  17. db_log = Log(test_log, self.column_families)
  18. self.assertEqual('col_fam_A', db_log.get_column_family())
  19. test_log = (
  20. "2018/05/25-14:34:21.047233 7f82ba72e700 [db/flush_job.cc:371] " +
  21. "[JOB 44] Level-0 flush table #84: 1890780 bytes OK"
  22. )
  23. db_log = Log(test_log, self.column_families)
  24. db_log.append_message('[default] some remaining part of log')
  25. self.assertEqual(NO_COL_FAMILY, db_log.get_column_family())
  26. def test_get_methods(self):
  27. hr_time = "2018/05/25-14:30:25.491635"
  28. context = "7f82ba72e700"
  29. message = (
  30. "[db/flush_job.cc:331] [default] [JOB 10] Level-0 flush table " +
  31. "#23: started"
  32. )
  33. test_log = hr_time + " " + context + " " + message
  34. db_log = Log(test_log, self.column_families)
  35. self.assertEqual(db_log.get_message(), message)
  36. remaining_message = "[col_fam_A] some more logs"
  37. db_log.append_message(remaining_message)
  38. self.assertEqual(
  39. db_log.get_human_readable_time(), "2018/05/25-14:30:25.491635"
  40. )
  41. self.assertEqual(db_log.get_context(), "7f82ba72e700")
  42. self.assertEqual(db_log.get_timestamp(), 1527258625)
  43. self.assertEqual(
  44. db_log.get_message(), str(message + '\n' + remaining_message)
  45. )
  46. def test_is_new_log(self):
  47. new_log = "2018/05/25-14:34:21.047233 context random new log"
  48. remaining_log = "2018/05/25 not really a new log"
  49. self.assertTrue(Log.is_new_log(new_log))
  50. self.assertFalse(Log.is_new_log(remaining_log))
  51. class TestDatabaseLogs(unittest.TestCase):
  52. def test_check_and_trigger_conditions(self):
  53. this_path = os.path.abspath(os.path.dirname(__file__))
  54. logs_path_prefix = os.path.join(this_path, 'input_files/LOG-0')
  55. column_families = ['default', 'col-fam-A', 'col-fam-B']
  56. db_logs = DatabaseLogs(logs_path_prefix, column_families)
  57. # matches, has 2 col_fams
  58. condition1 = LogCondition.create(Condition('cond-A'))
  59. condition1.set_parameter('regex', 'random log message')
  60. # matches, multiple lines message
  61. condition2 = LogCondition.create(Condition('cond-B'))
  62. condition2.set_parameter('regex', 'continuing on next line')
  63. # does not match
  64. condition3 = LogCondition.create(Condition('cond-C'))
  65. condition3.set_parameter('regex', 'this should match no log')
  66. db_logs.check_and_trigger_conditions(
  67. [condition1, condition2, condition3]
  68. )
  69. cond1_trigger = condition1.get_trigger()
  70. self.assertEqual(2, len(cond1_trigger.keys()))
  71. self.assertSetEqual(
  72. {'col-fam-A', NO_COL_FAMILY}, set(cond1_trigger.keys())
  73. )
  74. self.assertEqual(2, len(cond1_trigger['col-fam-A']))
  75. messages = [
  76. "[db/db_impl.cc:563] [col-fam-A] random log message for testing",
  77. "[db/db_impl.cc:653] [col-fam-A] another random log message"
  78. ]
  79. self.assertIn(cond1_trigger['col-fam-A'][0].get_message(), messages)
  80. self.assertIn(cond1_trigger['col-fam-A'][1].get_message(), messages)
  81. self.assertEqual(1, len(cond1_trigger[NO_COL_FAMILY]))
  82. self.assertEqual(
  83. cond1_trigger[NO_COL_FAMILY][0].get_message(),
  84. "[db/db_impl.cc:331] [unknown] random log message no column family"
  85. )
  86. cond2_trigger = condition2.get_trigger()
  87. self.assertEqual(['col-fam-B'], list(cond2_trigger.keys()))
  88. self.assertEqual(1, len(cond2_trigger['col-fam-B']))
  89. self.assertEqual(
  90. cond2_trigger['col-fam-B'][0].get_message(),
  91. "[db/db_impl.cc:234] [col-fam-B] log continuing on next line\n" +
  92. "remaining part of the log"
  93. )
  94. self.assertIsNone(condition3.get_trigger())