#1164 backend: more resilient redis logging
Merged 4 years ago by msuchy. Opened 4 years ago by praiskup.

file modified
+1 -1
@@ -35,7 +35,7 @@

          raise AttributeError("no such status id: {0} ".format(number))

  

  

- LOG_PUB_SUB = "copr:backend:log:pubsub::"

+ LOG_REDIS_FIFO = "copr:backend:log:fifo::"

  

  default_log_format = Formatter(

      '[%(asctime)s][%(levelname)6s][PID:%(process)d][%(name)10s][%(filename)s:%(funcName)s:%(lineno)d] %(message)s')

@@ -71,9 +71,7 @@

          setproctitle("RedisLogHandler")

  

          rc = helpers.get_redis_connection(self.opts)

-         channel = rc.pubsub(ignore_subscribe_messages=True)

-         channel.subscribe(constants.LOG_PUB_SUB)

- 

-         for raw in channel.listen():

-             if raw is not None and raw.get("type") == "message" and "data" in raw:

-                 self.handle_msg(raw)

+         while True:

+             # indefinitely wait for next entry

+             (_, raw_message) = rc.blpop([constants.LOG_REDIS_FIFO])

+             self.handle_msg(raw_message)

file modified
+1 -1
@@ -420,7 +420,7 @@

          record.args = ()

  

          try:

-             self.rc.publish(constants.LOG_PUB_SUB, json.dumps(record.__dict__))

+             self.rc.rpush(constants.LOG_REDIS_FIFO, json.dumps(record.__dict__))

          # pylint: disable=W0703

          except Exception as error:

              _, _, ex_tb = sys.exc_info()

file modified
+9 -12
@@ -7,7 +7,7 @@

  from backend.exceptions import BuilderError

  from backend.helpers import get_redis_logger, get_chroot_arch, \

          format_filename, get_redis_connection

- from backend.constants import LOG_PUB_SUB

+ from backend.constants import LOG_REDIS_FIFO

  

  """

  SOME TESTS REQUIRES RUNNING REDIS
@@ -24,9 +24,9 @@

              redis_port=7777,

          )

  

-         rc = get_redis_connection(self.opts)

-         self.channel = rc.pubsub(ignore_subscribe_messages=True)

-         self.channel.subscribe(LOG_PUB_SUB)

+         self.rc = get_redis_connection(self.opts)

+         # remove leftovers from previous tests

+         self.rc.delete(LOG_REDIS_FIFO)

  

      def teardown_method(self, method):

          pass
@@ -38,14 +38,11 @@

          except Exception as err:

              log.exception("error occurred: {}".format(err))

  

-         # read only one message

-         for raw in self.channel.listen():

-             assert raw.get("type") == "message"

-             data = json.loads(raw['data'])

-             assert data.get("who") == "test"

-             assert data.get("levelno") == logging.ERROR

-             assert 'backend.exceptions.BuilderError: foobar\n' in data['msg']

-             break

+         (_, raw_message) = self.rc.blpop([LOG_REDIS_FIFO])

+         data = json.loads(raw_message)

+         assert data.get("who") == "test"

+         assert data.get("levelno") == logging.ERROR

+         assert 'backend.exceptions.BuilderError: foobar\n' in data['msg']

  

      def test_get_chroot_arch(self):

          assert get_chroot_arch("fedora-26-x86_64") == "x86_64"

rebased onto 557dd2ed14f3067a7d0f48eaa2fe3c28432b4e03

4 years ago

rebased onto 3f11cd590eb693ca685bccf40cac49d15f1a1588

4 years ago

rebased onto 1751afa1b5b183e55e8c5d39bd5308ca24663936

4 years ago

rebased onto 48c101e

4 years ago

Commit 48c101e fixes this pull-request

Pull-Request has been merged by msuchy

4 years ago

Pull-Request has been merged by msuchy

4 years ago