我正在尝试调试在Google Appengine灵活环境中运行的Flask / Python应用。
但是,我在Google Console的Stackdriver Debug界面中看到一条警告消息,无法设置任何断点。
警告显示:
没有为GAE Flex上的python运行时设置Stackdriver Debugger
对我做错了什么的想法?
我'已经:
main.py(app.yaml中定义的应用入口点)
from werkzeug.serving import run_simple
from werkzeug.wsgi import DispatcherMiddleware
from wsgi import api, frontend, manage
try:
import googleclouddebugger
googleclouddebugger.AttachDebugger()
except ImportError:
pass
app = DispatcherMiddleware(frontend.create_app(), {
'/api': api.create_app(),
'/manage': manage.create_app()
})
if __name__ == '__main__':
run_simple('0.0.0.0', 5000, app, use_reloader=True, use_debugger=True)
的app.yaml
runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app
runtime_config:
python_version: 2
manual_scaling:
instances: 1
resources:
cpu: 1
memory_gb: 0.5
disk_size_gb: 10
env_variables:
SQLALCHEMY_DATABASE_URI: "postgresql+psycopg2://myusername:mypassword!@/instancename?host=/cloudsql/instancename"
beta_settings:
cloud_sql_instances: "instancename"
在评论并注意到urllib导入错误后,我想知道我的应用程序的wsgi性质是否导致问题。我回到documentation,看到一条关于Django框架做类似事情的说明并更改了以下内容:
googleclouddebugger.AttachDebugger()
到
googleclouddebugger.enable()
这解决了urllib导入错误,但尚未解决整体问题。
答案 0 :(得分:1)
我认为此配置没有任何问题,但这里有一些建议:
打开GCP控制台调试页面后,请确保在开始调试会话之前从顶部下拉菜单中选择了正确版本的应用程序。它可能指向一个不可调试的旧应用程序版本,或者页面和下拉列表可能需要刷新才能显示最新版本。
同样,请检查您的Stackdriver stderr
日志是否包含这样的行:
2017-12-24 15:14:14.000 PST I1224 23:14:14.600462 12 gcp_hub_client.py:335] Debuggee registered successfully, ID: gcp:1025611681465:7144dac417e43025
这意味着调试器实际上已正常设置/工作,并且很可能表示UI需要刷新或从下拉列表中选择正确的应用程序版本。
确保google-python-cloud-debugger
文件中包含requirements.txt
。
考虑在print
/ try
块中为调试器添加一个简单的except
语句,如下所示:
... except ImportError as e: print 'Failed to import Google Cloud Debugger: %s' % str(e) pass
然后,检查Stackdriver Logging上的stderr
日志,看看是否打印出任何异常。
我不知道werkzeug,但您可能想尝试通过传递use_debugger=False
来禁用默认调试器,以避免可能的冲突。
尝试部署一个更简单的烧瓶应用程序(例如,从here启动Flex的hello world,但修改它以使用python_version: 2
)并查看调试器是否适合您。< / p>