简体   繁体   English

如何在带有 mongoengine 的 Flask 项目中使用 pymongo.monitoring

[英]How to use pymongo.monitoring in a Flask project with mongoengine

I am trying to add some monitoring to a simple REST web service with flask and mongoengine and have come across what I think is a lack of understanding on my part of how imports and mongoengine is working in flask applications. I am trying to add some monitoring to a simple REST web service with flask and mongoengine and have come across what I think is a lack of understanding on my part of how imports and mongoengine is working in flask applications. I'm following pymongo's documentation on monitoring: https://pymongo.readthedocs.io/en/3.7.2/api/pymongo/monitoring.html我正在关注 pymongo 关于监控的文档: https://pymongo.readthedocs.io/en/3.7.2/api/pymongo/monitoring.html

I defined the following CommandListener in a separate file:我在一个单独的文件中定义了以下 CommandListener:

import logging
from pymongo import monitoring

log = logging.getLogger('my_logger')


class CommandLogger(monitoring.CommandListener):
    def started(self, event):
        log.debug("Command {0.command_name} with request id "
                   "{0.request_id} started on server "
                   "{0.connection_id}".format(event))

monitoring.register(CommandLogger())

I made an application_builder.py file to create my flask App, code looks something like this:我创建了一个 application_builder.py 文件来创建我的 flask 应用程序,代码如下所示:

from flask_restful import Api
from flask import Flask

from command_logger import CommandLogger # <----
from db import initialize_db
from routes import initialize_routes

def create_app():
    app = Flask(__name__)
    api = Api(app)
    initialize_db(app)
    initialize_routes(api)
    return app

The monitoring only seems to works if I import: CommandLogger in application_builder.py.如果我导入以下命令,监控似乎才有效:application_builder.py 中的CommandLogger I'd like to understand what is going on here, how does the import affect the monitoring registration?我想了解这里发生了什么,导入如何影响监控注册?

Also I'd like to extract monitoring.register(CommandLogger()) as a function and call it at a latter stage in my code something like def register(): monitoring.register(CommandLogger()) But this doesn't seem to work, "registration' only works when it is in the same file as the CommandLogger class...另外我想将monitoring.register(CommandLogger())提取为 function 并在我的代码的后期调用它,例如def register(): monitoring.register(CommandLogger())但这似乎没有工作,“注册”仅在与CommandLogger class 位于同一文件中时才有效...

From the MongoEngine's doc , it seems important that the listener gets registered before connecting mongoengine从 MongoEngine 的文档中,在连接 mongoengine 之前注册监听器似乎很重要

To use pymongo.monitoring with MongoEngine, you need to make sure that you are registering the listeners before establishing the database connection (ie calling connect)要将 pymongo.monitoring 与 MongoEngine 一起使用,您需要确保在建立数据库连接之前注册监听器(即调用 connect)

This worked for me.这对我有用。 I'm just initializing/registering it the same way as I did other modules to avoid circular imports.我只是以与其他模块相同的方式初始化/注册它以避免循环导入。

# admin/logger.py

import logging
from pymongo import monitoring

log = logging.getLogger()
log.setLevel(logging.DEBUG)
logging.basicConfig(level=logging.DEBUG)


class CommandLogger(monitoring.CommandListener):

    # def methods... 

class ServerLogger(monitoring.ServerListener):
    
    # def methods

class HeartbeatLogger(monitoring.ServerHeartbeatListener):
   
   # def methods

def initialize_logger():
    monitoring.register(CommandLogger())
    monitoring.register(ServerLogger())
    monitoring.register(HeartbeatLogger())
    monitoring.register(TopologyLogger())


# /app.py

from flask import Flask

from admin.toolbar import initialize_debugtoolbar
from admin.admin import initialize_admin
from admin.views import initialize_views
from admin.logger import initialize_logger
from database.db import initialize_db
from flask_restful import Api
from resources.errors import errors


app = Flask(__name__)

# imports requiring app
from resources.routes import initialize_routes

api = Api(app, errors=errors)

# Logger before db
initialize_logger()

# Database and Routes
initialize_db(app)
initialize_routes(api)

# Admin and Development
initialize_admin(app)
initialize_views()
initialize_debugtoolbar(app)


# /run.py

from app import app

app.run(debug=True)

then in any module...然后在任何模块中...

from admin.logger import log
from db.models import User

# inside some class/view/queryset or however your objects are written...
log.info('Saving an item through MongoEngine...')
User(name='Foo').save()

What I'm trying to figure out now is how to integrate Flask DebuggerToolbar's Logging panel with the monitoring messages from these listeners...我现在想弄清楚的是如何将 Flask DebuggerToolbar 的 Logging 面板与来自这些侦听器的监控消息集成......

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM