mistral-extra/mistral_extra/monitoring/jobs/delayed_calls_recovery.py

68 lines
2.4 KiB
Python

# Copyright 2023 - NetCracker Technology Corp.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from mistral.db.v2 import api as db_api
from mistral_extra.monitoring import base
import collections
import datetime
from oslo_config import cfg
from oslo_log import log as logging
CONF = cfg.CONF
LOG = logging.getLogger(__name__)
class DelayedCallsRecoveryJob(base.MonitoringJob):
def __init__(self):
super(DelayedCallsRecoveryJob, self).__init__(
interval=CONF.recovery_job.recovery_interval, first_execute=True)
def get_name(self):
return "delayed calls recovery"
def execute(self):
with db_api.transaction():
self._process_delayed_calls(
template_success_message="Recovered calls",
fail_message="There are no calls for recovery"
)
def _process_delayed_calls(self, template_success_message, fail_message):
calls = db_api.get_calls_for_recovery(
datetime.timedelta(seconds=CONF.recovery_job.hang_interval)
)
if len(calls):
log = str(datetime.datetime.now())
recovered = collections.Counter()
for call in calls:
call.processing = False
recovered[call.target_method_name] += 1
log += "\n{message}. ID: {0}, key: {1}, " \
"factory method: {2}, target method: {3}, " \
"method_arguments: {4}, execution time: {5}, " \
"updated_at: {6}". \
format(call.id, call.key,
call.factory_method_path, call.target_method_name,
call.method_arguments, call.execution_time,
call.updated_at,
message=template_success_message)
LOG.info(log)
else:
LOG.debug(fail_message)