Przeglądaj źródła

feat: 添加sls统计

许家凯 1 rok temu
rodzic
commit
6432e7ecf1

+ 1 - 1
JobMain.py

@@ -21,7 +21,7 @@ base_topic = env.str("base_topic", "rt_other_dim")
 source_topic = env.str("source_topic", base_topic)  # "rt_company_dim"
 target_topic = env.str("target_topic", base_topic)  # "rt_company_dim"
 
-max_concurrency = env.int("concurrency", 20)
+max_concurrency = env.int("concurrency", 1)
 
 
 async def handle(producer, data: dict):

+ 3 - 3
data_clean/dim_handle_registry.py

@@ -85,13 +85,13 @@ class DimHandleRegistry:
         pass
 
     @exception_handle
-    async def execute_dim(self, dim_data: list):
+    async def execute_dim(self, dim_data: list, session_id=None) -> list:
         if "prefix_func" in self._obj_list:
             await self._obj_list["prefix_func"](dim_data)
 
         result_list = []
         for row in dim_data:
-            row_data = await self._exec_row(row)
+            row_data = await self._exec_row(row, session_id)
             if row_data is not None:
                 result_list.append(row_data)
 
@@ -101,7 +101,7 @@ class DimHandleRegistry:
         return result_list
 
     @exception_handle
-    async def _exec_row(self, row_data: dict):
+    async def _exec_row(self, row_data: dict, session_id=None) -> dict:
         for func in self._row_func:
             row_data = await func(row_data)
             if row_data is None:

+ 53 - 17
data_clean/exception/exception_handle.py

@@ -3,18 +3,20 @@
 # @Author : XuJiakai
 # @File : exception_handle
 # @Software: PyCharm
+import traceback
 from functools import update_wrapper
 
 from data_clean.api.mongo_api import insert_one
 from data_clean.exception.fetch_exception import FetchException
 from data_clean.exception.ruler_validation_exception import RulerValidationException
+from data_clean.statistic.data_clean_statistic import ruler_error, error
 from data_clean.utils import get_log
 from data_clean.utils.date_utils import get_now_datetime
 
 log = get_log("exception_handler")
 
 
-async def ruler_valid_exception_sink(ex: RulerValidationException, tn: str, data: list):
+async def ruler_valid_exception_sink(ex: RulerValidationException, tn: str, data: list, session_id):
     """
     该异常为业务逻辑异常,出现该异常往往是上游数据源的异常,需要通知到上游数据源重新解析
     :param ex:
@@ -26,6 +28,7 @@ async def ruler_valid_exception_sink(ex: RulerValidationException, tn: str, data
     doc = {
         "ruler_code": ex.ruler_code,
         "tn": tn,
+        "session_id": session_id,
         "exception": str(ex),
         "create_time": get_now_datetime(),
         "data": data
@@ -34,7 +37,7 @@ async def ruler_valid_exception_sink(ex: RulerValidationException, tn: str, data
     pass
 
 
-async def fetch_exception_sink(ex: FetchException, tn: str, data: list):
+async def fetch_exception_sink(ex: FetchException, tn: str, data: list, session_id):
     """
     拉取数据异常,出现该异常一般为网络异常,无需手动介入,直接读取转换为正确格式重新发回队列。
     :param ex:
@@ -46,6 +49,7 @@ async def fetch_exception_sink(ex: FetchException, tn: str, data: list):
 
     doc = {
         "tn": tn,
+        "session_id": session_id,
         "data": data,
         "create_time": get_now_datetime(),
         "exception": str(ex),
@@ -54,7 +58,7 @@ async def fetch_exception_sink(ex: FetchException, tn: str, data: list):
     pass
 
 
-async def error_sink(ex: Exception, tn: str, data: list):
+async def error_sink(ex: Exception, tn: str, data: list, session_id):
     """
     未知异常写出,出现该异常需要手动介入查看原因。
     :param ex:
@@ -65,40 +69,72 @@ async def error_sink(ex: Exception, tn: str, data: list):
     col_pre = f"a_data_clean_error"
     doc = {
         "tn": tn,
+        "session_id": session_id,
         "create_time": get_now_datetime(),
-        "exception": repr(ex),
-        "data": data
+        "exception": str(ex),
+        "data": data,
+        "traceback": "".join(traceback.format_exception(ex))
     }
 
     await insert_one(col_pre, doc)
     pass
 
 
+def _handle(data, tn, session_id, ex: Exception):
+    content_type = 0
+    if not isinstance(data, list):
+        data = [data]
+        content_type = 1
+
+    data = {
+        "data": {
+            tn: data
+        },
+
+    }
+
+    if isinstance(ex, RulerValidationException):
+        ruler_error(
+            data=data,
+            session_id=session_id,
+            ex=ex,
+            content_type=content_type,
+            tn=tn
+        )
+    else:
+        error(data=data,
+              session_id=session_id,
+              ex=ex,
+              content_type=content_type,
+              tn=tn
+              )
+        pass
+    pass
+
+
 def exception_handle(func):
     async def wrapper(self, *args, **kwargs):
         # tn = pascal_case_to_snake_case(self.__class__.__name__)
         tn = self._name
+        session_id = args[1]
         result = None
         try:
             result = await func(self, *args, **kwargs)
         except RulerValidationException as ex:
-            log.warn("维度:%s ,detail: %s", tn, ex)
+            log.warn("session: %s 维度:%s ,detail: %s", session_id, tn, ex)
             data = args[0]
-            if not isinstance(data, list):
-                data = [data]
-            await ruler_valid_exception_sink(ex, tn, data)
+            _handle(data, tn, session_id, ex)
+            await ruler_valid_exception_sink(ex, tn, data, session_id)
         except FetchException as ex:
-            log.error("维度:%s ,detail: %s", tn, ex)
+            log.error("session: %s 维度:%s ,detail: %s", session_id, tn, ex)
             data = args[0]
-            if not isinstance(data, list):
-                data = [data]
-            await fetch_exception_sink(ex, tn, data)
+            _handle(data, tn, session_id, ex)
+            await fetch_exception_sink(ex, tn, data, session_id)
         except Exception as ex:
-            log.error("维度:%s ,出现未知异常:%s", tn, repr(ex))
+            log.error("session: %s 维度:%s ,出现未知异常:%s", session_id, tn, repr(ex))
             data = args[0]
-            if not isinstance(data, list):
-                data = [data]
-            await error_sink(ex, tn, data)
+            _handle(data, tn, session_id, ex)
+            await error_sink(ex, tn, data, session_id)
 
         return result
         pass

+ 6 - 0
data_clean/exception/ruler_validation_exception.py

@@ -19,6 +19,12 @@ class RulerValidationException(Exception):
     def __str__(self):
         return f"数据校验异常,ruler_code: {self.ruler_code} , msg : {self.msg}"
 
+    def get_ruler_code(self):
+        return self.ruler_code
+
+    def get_msg(self):
+        return self.msg
+
 
 if __name__ == '__main__':
     pass

+ 3 - 2
data_clean/handle/company_court_open_announcement.py

@@ -6,6 +6,7 @@
 import os
 
 from data_clean.dim_handle_registry import get_dim_handle
+from data_clean.exception.fetch_exception import FetchException
 from data_clean.exception.ruler_validation_exception import RulerValidationException
 from data_clean.utils.date_utils import *
 from data_clean.utils.party_name_verify_utils import person_name_verify
@@ -15,10 +16,10 @@ from data_clean.utils.str_utils import json_str_2_list
 dim_handle = get_dim_handle(os.path.basename(__file__))
 
 
-# @dim_handle.registry_prefix_func
+@dim_handle.registry_prefix_func
 async def prefix_func(dim_data: list):
     print("前置程序:", dim_data)
-    # raise ValueError("前置程序错误")
+    raise ValueError("前置程序错误")
 
     pass
 

+ 8 - 0
data_clean/statistic/__init__.py

@@ -0,0 +1,8 @@
+# -*- coding: utf-8 -*-
+# @Time : 2023/7/31 14:04
+# @Author : XuJiakai
+# @File : __init__.py
+# @Software: PyCharm
+
+if __name__ == '__main__':
+    pass

+ 80 - 0
data_clean/statistic/data_clean_statistic.py

@@ -0,0 +1,80 @@
+# -*- coding: utf-8 -*-
+# @Time : 2023/7/31 14:05
+# @Author : XuJiakai
+# @File : data_clean_statistic
+# @Software: PyCharm
+import sys
+import traceback
+from functools import update_wrapper
+
+from data_clean.exception.fetch_exception import FetchException
+from data_clean.exception.ruler_validation_exception import RulerValidationException
+from data_clean.statistic.sls_log import get_logger
+
+_log = get_logger()
+
+'''
+log template:
+{
+session_id: 一个session_id代表一条上传数据,可能包含多行记录或多个维度
+content: 原始数据
+content_type: 0list类型数据,即一个维度整体报错,一般为postfix_func和prefix_func报错
+                1record类型数据,即某维度的某一行报错,没有错误的数据仍然会上传
+tn: 维度名,如果发送成功,则不存在维度名
+successful: 1发送成功,0未发送
+error: 1存在异常,0不存在异常
+error_info: 
+        error_type:0 触发校验规则异常,即ruler_validation_exception,1 fetch_exception,9为其它未知异常
+        ruler_code:error_type为0时才有ruler_code
+        error_msg:报错的msg
+}
+'''
+
+
+def error(data, session_id, ex: Exception, content_type: int, tn: str):
+    error_type = 1 if isinstance(ex, FetchException) else 9
+
+    _log.error(msg={
+        "session_id": session_id,
+        "content": data,
+        "content_type": content_type,
+        "tn": tn,
+        "successful": 0,
+        "error": 1,
+        "error_info": {
+            "error_type": error_type,
+            "error_msg": str(ex),
+            "traceback": "".join(traceback.format_exception(ex))
+        }
+
+    }, stacklevel=2)
+    pass
+
+
+def ruler_error(data, session_id, ex: RulerValidationException, content_type: int, tn: str):
+    _log.warn(msg={
+        "session_id": session_id,
+        "content": data,
+        "content_type": content_type,
+        "tn": tn,
+        "successful": 0,
+        "error": 1,
+        "error_info": {
+            "error_type": 0,
+            "ruler_code": ex.get_ruler_code(),
+            "error_msg": ex.get_msg()
+        }
+
+    }, stacklevel=2)
+    pass
+
+
+def success(data, session_id):
+    _log.info(msg={
+        "session_id": session_id,
+        "content": data,
+        "successful": 1,
+        "error": 0,
+    }, stacklevel=1)
+
+    pass

+ 52 - 0
data_clean/statistic/sls_log.py

@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+# @Time : 2023/7/31 15:27
+# @Author : XuJiakai
+# @File : sls_log
+# @Software: PyCharm
+import logging.config, os
+import platform
+
+__version__ = '0.1.0'
+
+
+def __is_test_env():
+    return os.environ.get('SPIDER_TEST', False) or platform.system() == "Windows"
+
+
+def __get_endpoint():
+    if __is_test_env():
+        return "cn-shanghai.log.aliyuncs.com"
+    else:
+        return "cn-shanghai-intranet.log.aliyuncs.com"
+
+
+conf = {'version': 1,
+        'disable_existing_loggers': False,
+        'formatters': {'rawformatter': {'class': 'logging.Formatter',
+                                        'format': '%(message)s'}
+                       },
+        'handlers': {'sls_handler': {'()':
+                                         'aliyun.log.QueuedLogHandler',
+                                     'level': 'INFO',
+                                     'formatter': 'rawformatter',
+
+                                     # custom args:
+                                     'end_point': os.environ.get('ALIYUN_LOG_ENDPOINT', __get_endpoint()),
+                                     'access_key_id': os.environ.get('ALIYUN_LOG_ACCESSID', 'LTAI4GKTLebfci8tYSM1NFCN'),
+                                     'access_key': os.environ.get('ALIYUN_LOG_ACCESSKEY', 'v59Sy885c9GfXZ4me9caIxYHh9CPVc'),
+                                     'project': os.environ.get('ALIYUN_LOG_PROJECT', 'data-clean'),
+                                     'log_store': os.environ.get('ALIYUN_LOG_STORE', "clean"),
+                                     'extract_json': True,
+                                     'extract_json_prefix': 'dc_',
+                                     }
+                     },
+        'loggers': {'sls': {'handlers': ['sls_handler', ],
+                            'level': 'INFO',
+                            'propagate': False}
+                    }
+        }
+logging.config.dictConfig(conf)
+
+
+def get_logger():
+    return logging.getLogger("sls")

+ 8 - 1
data_clean/task_distributor.py

@@ -4,7 +4,10 @@
 # @File : task_distributor
 # @Software: PyCharm
 import os
+import uuid
+
 from data_clean.dim_handle_registry import get_class_dict
+from data_clean.statistic.data_clean_statistic import success
 
 scan_path = os.path.join(os.path.dirname(__file__), 'handle')
 
@@ -24,11 +27,12 @@ async def task_distribute(data: dict):
     :param data:
     :return:
     """
+    session_id = str(uuid.uuid4())
     tmp_data = data['data']
 
     for key in set(tmp_data.keys()):
         if key in class_dict:
-            result_data = await class_dict[key].execute_dim(tmp_data[key])
+            result_data = await class_dict[key].execute_dim(tmp_data[key], session_id)
             if result_data is None or len(result_data) == 0:
                 del tmp_data[key]
             else:
@@ -41,6 +45,9 @@ async def task_distribute(data: dict):
 
     if len(tmp_data) == 0:
         return None
+    else:
+        success(data, session_id)
+        pass
 
     return data
 

+ 526 - 15
poetry.lock

@@ -15,6 +15,11 @@ files = [
 aiormq = ">=6.7.5,<6.8.0"
 yarl = "*"
 
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
 [[package]]
 name = "aiohttp"
 version = "3.8.5"
@@ -123,6 +128,11 @@ yarl = ">=1.0,<2.0"
 [package.extras]
 speedups = ["Brotli", "aiodns", "cchardet"]
 
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
 [[package]]
 name = "aiokafka"
 version = "0.8.1"
@@ -169,6 +179,11 @@ lz4 = ["lz4"]
 snappy = ["python-snappy (>=0.5)"]
 zstd = ["zstandard"]
 
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
 [[package]]
 name = "aiormq"
 version = "6.7.7"
@@ -184,6 +199,11 @@ files = [
 pamqp = "3.2.1"
 yarl = "*"
 
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
 [[package]]
 name = "aiosignal"
 version = "1.3.1"
@@ -200,7 +220,31 @@ frozenlist = ">=1.1.0"
 
 [package.source]
 type = "legacy"
-url = "https://pypi.doubanio.com/simple"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
+[[package]]
+name = "aliyun-log-python-sdk"
+version = "0.7.13"
+description = "Aliyun log service Python client SDK"
+optional = false
+python-versions = "*"
+files = [
+    {file = "aliyun-log-python-sdk-0.7.13.tar.gz", hash = "sha256:d3292e25fa6eb32c0601f2888ff9610f1bca8d7a8e4fb61fff4cdc63b6679be4"},
+]
+
+[package.dependencies]
+dateparser = "*"
+elasticsearch = "*"
+jmespath = "*"
+protobuf = ">=3.4.0,<4.0.0"
+python-dateutil = "*"
+requests = "*"
+six = "*"
+
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
 reference = "douban"
 
 [[package]]
@@ -224,6 +268,11 @@ doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-
 test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"]
 trio = ["trio (<0.22)"]
 
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
 [[package]]
 name = "async-timeout"
 version = "4.0.2"
@@ -237,7 +286,7 @@ files = [
 
 [package.source]
 type = "legacy"
-url = "https://pypi.doubanio.com/simple"
+url = "https://mirror.baidu.com/pypi/simple"
 reference = "douban"
 
 [[package]]
@@ -260,7 +309,40 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte
 
 [package.source]
 type = "legacy"
-url = "https://pypi.doubanio.com/simple"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
+[[package]]
+name = "backports-zoneinfo"
+version = "0.2.1"
+description = "Backport of the standard library zoneinfo module"
+optional = false
+python-versions = ">=3.6"
+files = [
+    {file = "backports.zoneinfo-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc"},
+    {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722"},
+    {file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546"},
+    {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win32.whl", hash = "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08"},
+    {file = "backports.zoneinfo-0.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7"},
+    {file = "backports.zoneinfo-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac"},
+    {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf"},
+    {file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570"},
+    {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win32.whl", hash = "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b"},
+    {file = "backports.zoneinfo-0.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582"},
+    {file = "backports.zoneinfo-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987"},
+    {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1"},
+    {file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9"},
+    {file = "backports.zoneinfo-0.2.1-cp38-cp38-win32.whl", hash = "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328"},
+    {file = "backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6"},
+    {file = "backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"},
+]
+
+[package.extras]
+tzdata = ["tzdata"]
+
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
 reference = "douban"
 
 [[package]]
@@ -276,7 +358,7 @@ files = [
 
 [package.source]
 type = "legacy"
-url = "https://pypi.doubanio.com/simple"
+url = "https://mirror.baidu.com/pypi/simple"
 reference = "douban"
 
 [[package]]
@@ -363,6 +445,38 @@ files = [
     {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"},
 ]
 
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
+[[package]]
+name = "dateparser"
+version = "1.1.8"
+description = "Date parsing library designed to parse dates from HTML pages"
+optional = false
+python-versions = ">=3.7"
+files = [
+    {file = "dateparser-1.1.8-py2.py3-none-any.whl", hash = "sha256:070b29b5bbf4b1ec2cd51c96ea040dc68a614de703910a91ad1abba18f9f379f"},
+    {file = "dateparser-1.1.8.tar.gz", hash = "sha256:86b8b7517efcc558f085a142cdb7620f0921543fcabdb538c8a4c4001d8178e3"},
+]
+
+[package.dependencies]
+python-dateutil = "*"
+pytz = "*"
+regex = "<2019.02.19 || >2019.02.19,<2021.8.27 || >2021.8.27"
+tzlocal = "*"
+
+[package.extras]
+calendars = ["convertdate", "hijri-converter"]
+fasttext = ["fasttext"]
+langdetect = ["langdetect"]
+
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
 [[package]]
 name = "dnspython"
 version = "2.4.0"
@@ -386,6 +500,57 @@ idna = ["idna (>=2.1,<4.0)"]
 trio = ["trio (>=0.14,<0.23)"]
 wmi = ["wmi (>=1.5.1,<2.0.0)"]
 
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
+[[package]]
+name = "elastic-transport"
+version = "8.4.0"
+description = "Transport classes and utilities shared among Python Elastic client libraries"
+optional = false
+python-versions = ">=3.6"
+files = [
+    {file = "elastic-transport-8.4.0.tar.gz", hash = "sha256:b9ad708ceb7fcdbc6b30a96f886609a109f042c0b9d9f2e44403b3133ba7ff10"},
+    {file = "elastic_transport-8.4.0-py3-none-any.whl", hash = "sha256:19db271ab79c9f70f8c43f8f5b5111408781a6176b54ab2e54d713b6d9ceb815"},
+]
+
+[package.dependencies]
+certifi = "*"
+urllib3 = ">=1.26.2,<2"
+
+[package.extras]
+develop = ["aiohttp", "mock", "pytest", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "pytest-mock", "requests", "trustme"]
+
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
+[[package]]
+name = "elasticsearch"
+version = "8.9.0"
+description = "Python client for Elasticsearch"
+optional = false
+python-versions = ">=3.6, <4"
+files = [
+    {file = "elasticsearch-8.9.0-py3-none-any.whl", hash = "sha256:0795cbf0f61482070741c09ba02ac8fdf18f5984912fbd08b248fadd8a8c9952"},
+    {file = "elasticsearch-8.9.0.tar.gz", hash = "sha256:d3367fc013e04fc7aad349a6de9fad1ee04fb6d627b0e7896aa505c12fde5e04"},
+]
+
+[package.dependencies]
+elastic-transport = ">=8,<9"
+
+[package.extras]
+async = ["aiohttp (>=3,<4)"]
+requests = ["requests (>=2.4.0,<3.0.0)"]
+
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
 [[package]]
 name = "environs"
 version = "9.5.0"
@@ -409,7 +574,7 @@ tests = ["dj-database-url", "dj-email-url", "django-cache-url", "pytest"]
 
 [package.source]
 type = "legacy"
-url = "https://pypi.doubanio.com/simple"
+url = "https://mirror.baidu.com/pypi/simple"
 reference = "douban"
 
 [[package]]
@@ -426,6 +591,11 @@ files = [
 [package.extras]
 test = ["pytest (>=6)"]
 
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
 [[package]]
 name = "frozenlist"
 version = "1.4.0"
@@ -496,6 +666,11 @@ files = [
     {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"},
 ]
 
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
 [[package]]
 name = "h11"
 version = "0.14.0"
@@ -509,7 +684,7 @@ files = [
 
 [package.source]
 type = "legacy"
-url = "https://pypi.doubanio.com/simple"
+url = "https://mirror.baidu.com/pypi/simple"
 reference = "douban"
 
 [[package]]
@@ -533,6 +708,11 @@ sniffio = "==1.*"
 http2 = ["h2 (>=3,<5)"]
 socks = ["socksio (==1.*)"]
 
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
 [[package]]
 name = "idna"
 version = "3.4"
@@ -546,7 +726,23 @@ files = [
 
 [package.source]
 type = "legacy"
-url = "https://pypi.doubanio.com/simple"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
+[[package]]
+name = "jmespath"
+version = "1.0.1"
+description = "JSON Matching Expressions"
+optional = false
+python-versions = ">=3.7"
+files = [
+    {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"},
+    {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"},
+]
+
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
 reference = "douban"
 
 [[package]]
@@ -565,7 +761,7 @@ crc32c = ["crc32c"]
 
 [package.source]
 type = "legacy"
-url = "https://pypi.doubanio.com/simple"
+url = "https://mirror.baidu.com/pypi/simple"
 reference = "douban"
 
 [[package]]
@@ -588,6 +784,11 @@ docs = ["alabaster (==0.7.13)", "autodocsumm (==0.2.11)", "sphinx (==7.0.1)", "s
 lint = ["flake8 (==6.0.0)", "flake8-bugbear (==23.7.10)", "mypy (==1.4.1)", "pre-commit (>=2.4,<4.0)"]
 tests = ["pytest", "pytz", "simplejson"]
 
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
 [[package]]
 name = "motor"
 version = "3.2.0"
@@ -611,6 +812,11 @@ snappy = ["pymongo[snappy] (>=4.4,<5)"]
 srv = ["pymongo[srv] (>=4.4,<5)"]
 zstd = ["pymongo[zstd] (>=4.4,<5)"]
 
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
 [[package]]
 name = "multidict"
 version = "6.0.4"
@@ -696,7 +902,7 @@ files = [
 
 [package.source]
 type = "legacy"
-url = "https://pypi.doubanio.com/simple"
+url = "https://mirror.baidu.com/pypi/simple"
 reference = "douban"
 
 [[package]]
@@ -712,7 +918,7 @@ files = [
 
 [package.source]
 type = "legacy"
-url = "https://pypi.doubanio.com/simple"
+url = "https://mirror.baidu.com/pypi/simple"
 reference = "douban"
 
 [[package]]
@@ -732,7 +938,43 @@ testing = ["coverage", "flake8", "flake8-comprehensions", "flake8-deprecated", "
 
 [package.source]
 type = "legacy"
-url = "https://pypi.doubanio.com/simple"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
+[[package]]
+name = "protobuf"
+version = "3.20.3"
+description = "Protocol Buffers"
+optional = false
+python-versions = ">=3.7"
+files = [
+    {file = "protobuf-3.20.3-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f4bd856d702e5b0d96a00ec6b307b0f51c1982c2bf9c0052cf9019e9a544ba99"},
+    {file = "protobuf-3.20.3-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9aae4406ea63d825636cc11ffb34ad3379335803216ee3a856787bcf5ccc751e"},
+    {file = "protobuf-3.20.3-cp310-cp310-win32.whl", hash = "sha256:28545383d61f55b57cf4df63eebd9827754fd2dc25f80c5253f9184235db242c"},
+    {file = "protobuf-3.20.3-cp310-cp310-win_amd64.whl", hash = "sha256:67a3598f0a2dcbc58d02dd1928544e7d88f764b47d4a286202913f0b2801c2e7"},
+    {file = "protobuf-3.20.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:899dc660cd599d7352d6f10d83c95df430a38b410c1b66b407a6b29265d66469"},
+    {file = "protobuf-3.20.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e64857f395505ebf3d2569935506ae0dfc4a15cb80dc25261176c784662cdcc4"},
+    {file = "protobuf-3.20.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d9e4432ff660d67d775c66ac42a67cf2453c27cb4d738fc22cb53b5d84c135d4"},
+    {file = "protobuf-3.20.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:74480f79a023f90dc6e18febbf7b8bac7508420f2006fabd512013c0c238f454"},
+    {file = "protobuf-3.20.3-cp37-cp37m-win32.whl", hash = "sha256:b6cc7ba72a8850621bfec987cb72623e703b7fe2b9127a161ce61e61558ad905"},
+    {file = "protobuf-3.20.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8c0c984a1b8fef4086329ff8dd19ac77576b384079247c770f29cc8ce3afa06c"},
+    {file = "protobuf-3.20.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:de78575669dddf6099a8a0f46a27e82a1783c557ccc38ee620ed8cc96d3be7d7"},
+    {file = "protobuf-3.20.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee"},
+    {file = "protobuf-3.20.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:44246bab5dd4b7fbd3c0c80b6f16686808fab0e4aca819ade6e8d294a29c7050"},
+    {file = "protobuf-3.20.3-cp38-cp38-win32.whl", hash = "sha256:c02ce36ec760252242a33967d51c289fd0e1c0e6e5cc9397e2279177716add86"},
+    {file = "protobuf-3.20.3-cp38-cp38-win_amd64.whl", hash = "sha256:447d43819997825d4e71bf5769d869b968ce96848b6479397e29fc24c4a5dfe9"},
+    {file = "protobuf-3.20.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:398a9e0c3eaceb34ec1aee71894ca3299605fa8e761544934378bbc6c97de23b"},
+    {file = "protobuf-3.20.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf01b5720be110540be4286e791db73f84a2b721072a3711efff6c324cdf074b"},
+    {file = "protobuf-3.20.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:daa564862dd0d39c00f8086f88700fdbe8bc717e993a21e90711acfed02f2402"},
+    {file = "protobuf-3.20.3-cp39-cp39-win32.whl", hash = "sha256:819559cafa1a373b7096a482b504ae8a857c89593cf3a25af743ac9ecbd23480"},
+    {file = "protobuf-3.20.3-cp39-cp39-win_amd64.whl", hash = "sha256:03038ac1cfbc41aa21f6afcbcd357281d7521b4157926f30ebecc8d4ea59dcb7"},
+    {file = "protobuf-3.20.3-py2.py3-none-any.whl", hash = "sha256:a7ca6d488aa8ff7f329d4c545b2dbad8ac31464f1d8b1c87ad1346717731e4db"},
+    {file = "protobuf-3.20.3.tar.gz", hash = "sha256:2e3427429c9cffebf259491be0af70189607f365c2f41c7c3764af6f337105f2"},
+]
+
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
 reference = "douban"
 
 [[package]]
@@ -829,6 +1071,30 @@ ocsp = ["certifi", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identit
 snappy = ["python-snappy"]
 zstd = ["zstandard"]
 
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
+[[package]]
+name = "python-dateutil"
+version = "2.8.2"
+description = "Extensions to the standard Python datetime module"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
+files = [
+    {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"},
+    {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
+]
+
+[package.dependencies]
+six = ">=1.5"
+
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
 [[package]]
 name = "python-dotenv"
 version = "1.0.0"
@@ -845,7 +1111,23 @@ cli = ["click (>=5.0)"]
 
 [package.source]
 type = "legacy"
-url = "https://pypi.doubanio.com/simple"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
+[[package]]
+name = "pytz"
+version = "2023.3"
+description = "World timezone definitions, modern and historical"
+optional = false
+python-versions = "*"
+files = [
+    {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"},
+    {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"},
+]
+
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
 reference = "douban"
 
 [[package]]
@@ -897,6 +1179,175 @@ files = [
     {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"},
 ]
 
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
+[[package]]
+name = "regex"
+version = "2023.6.3"
+description = "Alternative regular expression module, to replace re."
+optional = false
+python-versions = ">=3.6"
+files = [
+    {file = "regex-2023.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:824bf3ac11001849aec3fa1d69abcb67aac3e150a933963fb12bda5151fe1bfd"},
+    {file = "regex-2023.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:05ed27acdf4465c95826962528f9e8d41dbf9b1aa8531a387dee6ed215a3e9ef"},
+    {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b49c764f88a79160fa64f9a7b425620e87c9f46095ef9c9920542ab2495c8bc"},
+    {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8e3f1316c2293e5469f8f09dc2d76efb6c3982d3da91ba95061a7e69489a14ef"},
+    {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43e1dd9d12df9004246bacb79a0e5886b3b6071b32e41f83b0acbf293f820ee8"},
+    {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4959e8bcbfda5146477d21c3a8ad81b185cd252f3d0d6e4724a5ef11c012fb06"},
+    {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af4dd387354dc83a3bff67127a124c21116feb0d2ef536805c454721c5d7993d"},
+    {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2239d95d8e243658b8dbb36b12bd10c33ad6e6933a54d36ff053713f129aa536"},
+    {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:890e5a11c97cf0d0c550eb661b937a1e45431ffa79803b942a057c4fb12a2da2"},
+    {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a8105e9af3b029f243ab11ad47c19b566482c150c754e4c717900a798806b222"},
+    {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:25be746a8ec7bc7b082783216de8e9473803706723b3f6bef34b3d0ed03d57e2"},
+    {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3676f1dd082be28b1266c93f618ee07741b704ab7b68501a173ce7d8d0d0ca18"},
+    {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:10cb847aeb1728412c666ab2e2000ba6f174f25b2bdc7292e7dd71b16db07568"},
+    {file = "regex-2023.6.3-cp310-cp310-win32.whl", hash = "sha256:dbbbfce33cd98f97f6bffb17801b0576e653f4fdb1d399b2ea89638bc8d08ae1"},
+    {file = "regex-2023.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:c5f8037000eb21e4823aa485149f2299eb589f8d1fe4b448036d230c3f4e68e0"},
+    {file = "regex-2023.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c123f662be8ec5ab4ea72ea300359023a5d1df095b7ead76fedcd8babbedf969"},
+    {file = "regex-2023.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9edcbad1f8a407e450fbac88d89e04e0b99a08473f666a3f3de0fd292badb6aa"},
+    {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcba6dae7de533c876255317c11f3abe4907ba7d9aa15d13e3d9710d4315ec0e"},
+    {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29cdd471ebf9e0f2fb3cac165efedc3c58db841d83a518b082077e612d3ee5df"},
+    {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12b74fbbf6cbbf9dbce20eb9b5879469e97aeeaa874145517563cca4029db65c"},
+    {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c29ca1bd61b16b67be247be87390ef1d1ef702800f91fbd1991f5c4421ebae8"},
+    {file = "regex-2023.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77f09bc4b55d4bf7cc5eba785d87001d6757b7c9eec237fe2af57aba1a071d9"},
+    {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ea353ecb6ab5f7e7d2f4372b1e779796ebd7b37352d290096978fea83c4dba0c"},
+    {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:10590510780b7541969287512d1b43f19f965c2ece6c9b1c00fc367b29d8dce7"},
+    {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e2fbd6236aae3b7f9d514312cdb58e6494ee1c76a9948adde6eba33eb1c4264f"},
+    {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:6b2675068c8b56f6bfd5a2bda55b8accbb96c02fd563704732fd1c95e2083461"},
+    {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74419d2b50ecb98360cfaa2974da8689cb3b45b9deff0dcf489c0d333bcc1477"},
+    {file = "regex-2023.6.3-cp311-cp311-win32.whl", hash = "sha256:fb5ec16523dc573a4b277663a2b5a364e2099902d3944c9419a40ebd56a118f9"},
+    {file = "regex-2023.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:09e4a1a6acc39294a36b7338819b10baceb227f7f7dbbea0506d419b5a1dd8af"},
+    {file = "regex-2023.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0654bca0cdf28a5956c83839162692725159f4cda8d63e0911a2c0dc76166525"},
+    {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:463b6a3ceb5ca952e66550a4532cef94c9a0c80dc156c4cc343041951aec1697"},
+    {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87b2a5bb5e78ee0ad1de71c664d6eb536dc3947a46a69182a90f4410f5e3f7dd"},
+    {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6343c6928282c1f6a9db41f5fd551662310e8774c0e5ebccb767002fcf663ca9"},
+    {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6192d5af2ccd2a38877bfef086d35e6659566a335b1492786ff254c168b1693"},
+    {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74390d18c75054947e4194019077e243c06fbb62e541d8817a0fa822ea310c14"},
+    {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:742e19a90d9bb2f4a6cf2862b8b06dea5e09b96c9f2df1779e53432d7275331f"},
+    {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8abbc5d54ea0ee80e37fef009e3cec5dafd722ed3c829126253d3e22f3846f1e"},
+    {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c2b867c17a7a7ae44c43ebbeb1b5ff406b3e8d5b3e14662683e5e66e6cc868d3"},
+    {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d831c2f8ff278179705ca59f7e8524069c1a989e716a1874d6d1aab6119d91d1"},
+    {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ee2d1a9a253b1729bb2de27d41f696ae893507c7db224436abe83ee25356f5c1"},
+    {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:61474f0b41fe1a80e8dfa70f70ea1e047387b7cd01c85ec88fa44f5d7561d787"},
+    {file = "regex-2023.6.3-cp36-cp36m-win32.whl", hash = "sha256:0b71e63226e393b534105fcbdd8740410dc6b0854c2bfa39bbda6b0d40e59a54"},
+    {file = "regex-2023.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bbb02fd4462f37060122e5acacec78e49c0fbb303c30dd49c7f493cf21fc5b27"},
+    {file = "regex-2023.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b862c2b9d5ae38a68b92e215b93f98d4c5e9454fa36aae4450f61dd33ff48487"},
+    {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:976d7a304b59ede34ca2921305b57356694f9e6879db323fd90a80f865d355a3"},
+    {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:83320a09188e0e6c39088355d423aa9d056ad57a0b6c6381b300ec1a04ec3d16"},
+    {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9427a399501818a7564f8c90eced1e9e20709ece36be701f394ada99890ea4b3"},
+    {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178bbc1b2ec40eaca599d13c092079bf529679bf0371c602edaa555e10b41c3"},
+    {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:837328d14cde912af625d5f303ec29f7e28cdab588674897baafaf505341f2fc"},
+    {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d44dc13229905ae96dd2ae2dd7cebf824ee92bc52e8cf03dcead37d926da019"},
+    {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d54af539295392611e7efbe94e827311eb8b29668e2b3f4cadcfe6f46df9c777"},
+    {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7117d10690c38a622e54c432dfbbd3cbd92f09401d622902c32f6d377e2300ee"},
+    {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bb60b503ec8a6e4e3e03a681072fa3a5adcbfa5479fa2d898ae2b4a8e24c4591"},
+    {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:65ba8603753cec91c71de423a943ba506363b0e5c3fdb913ef8f9caa14b2c7e0"},
+    {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:271f0bdba3c70b58e6f500b205d10a36fb4b58bd06ac61381b68de66442efddb"},
+    {file = "regex-2023.6.3-cp37-cp37m-win32.whl", hash = "sha256:9beb322958aaca059f34975b0df135181f2e5d7a13b84d3e0e45434749cb20f7"},
+    {file = "regex-2023.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fea75c3710d4f31389eed3c02f62d0b66a9da282521075061ce875eb5300cf23"},
+    {file = "regex-2023.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f56fcb7ff7bf7404becdfc60b1e81a6d0561807051fd2f1860b0d0348156a07"},
+    {file = "regex-2023.6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d2da3abc88711bce7557412310dfa50327d5769a31d1c894b58eb256459dc289"},
+    {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a99b50300df5add73d307cf66abea093304a07eb017bce94f01e795090dea87c"},
+    {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5708089ed5b40a7b2dc561e0c8baa9535b77771b64a8330b684823cfd5116036"},
+    {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:687ea9d78a4b1cf82f8479cab23678aff723108df3edeac098e5b2498879f4a7"},
+    {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d3850beab9f527f06ccc94b446c864059c57651b3f911fddb8d9d3ec1d1b25d"},
+    {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8915cc96abeb8983cea1df3c939e3c6e1ac778340c17732eb63bb96247b91d2"},
+    {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:841d6e0e5663d4c7b4c8099c9997be748677d46cbf43f9f471150e560791f7ff"},
+    {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9edce5281f965cf135e19840f4d93d55b3835122aa76ccacfd389e880ba4cf82"},
+    {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b956231ebdc45f5b7a2e1f90f66a12be9610ce775fe1b1d50414aac1e9206c06"},
+    {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:36efeba71c6539d23c4643be88295ce8c82c88bbd7c65e8a24081d2ca123da3f"},
+    {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:cf67ca618b4fd34aee78740bea954d7c69fdda419eb208c2c0c7060bb822d747"},
+    {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b4598b1897837067a57b08147a68ac026c1e73b31ef6e36deeeb1fa60b2933c9"},
+    {file = "regex-2023.6.3-cp38-cp38-win32.whl", hash = "sha256:f415f802fbcafed5dcc694c13b1292f07fe0befdb94aa8a52905bd115ff41e88"},
+    {file = "regex-2023.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:d4f03bb71d482f979bda92e1427f3ec9b220e62a7dd337af0aa6b47bf4498f72"},
+    {file = "regex-2023.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccf91346b7bd20c790310c4147eee6ed495a54ddb6737162a36ce9dbef3e4751"},
+    {file = "regex-2023.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b28f5024a3a041009eb4c333863d7894d191215b39576535c6734cd88b0fcb68"},
+    {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0bb18053dfcfed432cc3ac632b5e5e5c5b7e55fb3f8090e867bfd9b054dbcbf"},
+    {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a5bfb3004f2144a084a16ce19ca56b8ac46e6fd0651f54269fc9e230edb5e4a"},
+    {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c6b48d0fa50d8f4df3daf451be7f9689c2bde1a52b1225c5926e3f54b6a9ed1"},
+    {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051da80e6eeb6e239e394ae60704d2b566aa6a7aed6f2890a7967307267a5dc6"},
+    {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4c3b7fa4cdaa69268748665a1a6ff70c014d39bb69c50fda64b396c9116cf77"},
+    {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:457b6cce21bee41ac292d6753d5e94dcbc5c9e3e3a834da285b0bde7aa4a11e9"},
+    {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aad51907d74fc183033ad796dd4c2e080d1adcc4fd3c0fd4fd499f30c03011cd"},
+    {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0385e73da22363778ef2324950e08b689abdf0b108a7d8decb403ad7f5191938"},
+    {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c6a57b742133830eec44d9b2290daf5cbe0a2f1d6acee1b3c7b1c7b2f3606df7"},
+    {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3e5219bf9e75993d73ab3d25985c857c77e614525fac9ae02b1bebd92f7cecac"},
+    {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e5087a3c59eef624a4591ef9eaa6e9a8d8a94c779dade95d27c0bc24650261cd"},
+    {file = "regex-2023.6.3-cp39-cp39-win32.whl", hash = "sha256:20326216cc2afe69b6e98528160b225d72f85ab080cbdf0b11528cbbaba2248f"},
+    {file = "regex-2023.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:bdff5eab10e59cf26bc479f565e25ed71a7d041d1ded04ccf9aee1d9f208487a"},
+    {file = "regex-2023.6.3.tar.gz", hash = "sha256:72d1a25bf36d2050ceb35b517afe13864865268dfb45910e2e17a84be6cbfeb0"},
+]
+
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
+[[package]]
+name = "requests"
+version = "2.31.0"
+description = "Python HTTP for Humans."
+optional = false
+python-versions = ">=3.7"
+files = [
+    {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"},
+    {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"},
+]
+
+[package.dependencies]
+certifi = ">=2017.4.17"
+charset-normalizer = ">=2,<4"
+idna = ">=2.5,<4"
+urllib3 = ">=1.21.1,<3"
+
+[package.extras]
+socks = ["PySocks (>=1.5.6,!=1.5.7)"]
+use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
+
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
+[[package]]
+name = "six"
+version = "1.16.0"
+description = "Python 2 and 3 compatibility utilities"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+files = [
+    {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
+    {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
+]
+
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
+[[package]]
+name = "sls-json-fast"
+version = "0.1.2"
+description = "aliyun sls log python for json"
+optional = false
+python-versions = ">=3.6,<4.0"
+files = [
+    {file = "sls-json-fast-0.1.2.tar.gz", hash = "sha256:b5ecf096e557ea9dd6077014f9988d127b706308997fd23083ca2f8501092510"},
+    {file = "sls_json_fast-0.1.2-py3-none-any.whl", hash = "sha256:ac3d7d3ddde594801ebbea59bda883c2fb28af695718d017e076e623908b0a40"},
+]
+
+[package.dependencies]
+aliyun-log-python-sdk = ">=0.7,<0.8"
+protobuf = ">=3.4.0,<4.0.0"
+
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
 [[package]]
 name = "sniffio"
 version = "1.3.0"
@@ -910,7 +1361,67 @@ files = [
 
 [package.source]
 type = "legacy"
-url = "https://pypi.doubanio.com/simple"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
+[[package]]
+name = "tzdata"
+version = "2023.3"
+description = "Provider of IANA time zone data"
+optional = false
+python-versions = ">=2"
+files = [
+    {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"},
+    {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"},
+]
+
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
+[[package]]
+name = "tzlocal"
+version = "5.0.1"
+description = "tzinfo object for the local timezone"
+optional = false
+python-versions = ">=3.7"
+files = [
+    {file = "tzlocal-5.0.1-py3-none-any.whl", hash = "sha256:f3596e180296aaf2dbd97d124fe76ae3a0e3d32b258447de7b939b3fd4be992f"},
+    {file = "tzlocal-5.0.1.tar.gz", hash = "sha256:46eb99ad4bdb71f3f72b7d24f4267753e240944ecfc16f25d2719ba89827a803"},
+]
+
+[package.dependencies]
+"backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""}
+tzdata = {version = "*", markers = "platform_system == \"Windows\""}
+
+[package.extras]
+devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"]
+
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
+reference = "douban"
+
+[[package]]
+name = "urllib3"
+version = "1.26.16"
+description = "HTTP library with thread-safe connection pooling, file post, and more."
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*"
+files = [
+    {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"},
+    {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"},
+]
+
+[package.extras]
+brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"]
+secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"]
+socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
+
+[package.source]
+type = "legacy"
+url = "https://mirror.baidu.com/pypi/simple"
 reference = "douban"
 
 [[package]]
@@ -1002,10 +1513,10 @@ multidict = ">=4.0"
 
 [package.source]
 type = "legacy"
-url = "https://pypi.doubanio.com/simple"
+url = "https://mirror.baidu.com/pypi/simple"
 reference = "douban"
 
 [metadata]
 lock-version = "2.0"
 python-versions = "^3.8"
-content-hash = "c9162f03076888e29683033e980e3b021a59c8684990b7afa00334b2c3beab84"
+content-hash = "8858208196907b01bfc2244648124c1651cbdbec9f32bd9fdeab39a3c3584d1d"

+ 1 - 0
pyproject.toml

@@ -14,6 +14,7 @@ motor = "^3.2.0"
 pyyaml = "^6.0.1"
 environs = "^9.5.0"
 aio-pika = "^9.1.5"
+sls-json-fast = "^0.1.2"
 
 
 [build-system]