camptocamp wsgi应用程序的通用实用程序
c2cwsgiutils的Python项目详细描述
camptocamp wsgi实用程序
<表><广告>这是一个python 3库(>;=3.5),为camptocamp wsgi提供通用工具 应用程序:
- 提供一个小框架,用于收集有关 Web应用程序(STATSD协议)
- 允许使用主/从PostgreSQL配置
- cee/udp日志的日志处理程序
- 更改运行时日志级别的可选视图
- SQL探查器调试数据库性能问题,默认情况下禁用。警告,它会减慢速度。
- 获取有关应用程序和已安装软件包的版本信息的视图
- 实现健康检查服务的框架
- 错误处理程序在发生错误时向客户端发送json消息
- 用檐口服务代替设置CORS
也为wr提供工具ITing验收测试:
- 可以从py.test fixture中使用的类来控制 成分
- 一个类,可以从py.text fixture中用来测试rest api
作为如何在Docker映像提供的应用程序中使用它的示例,您可以查看 在验收测试/app中测试应用程序。 要了解如何测试这样的应用程序,请查看验收测试。
安装
该库在pypi中可用: https://pypi.python.org/pypi/c2cwsgiutils
使用pip:
pip install c2cwsgiutils
或(首选)作为基本Docker图像: 营地/c2cwsgiutils:2
如果您需要一个带有较小脚印的图像,请使用前缀为-light
的标记。那些是没有的
gdal和没有构建工具。
常规配置
通常,可以使用环境变量(首先获取)或
production.ini
文件。
您可以使用环境变量配置访问c2cwsgiutils提供的视图的基本url
命名为c2c_base_path
或在production.ini
文件中,属性名为c2c.base_path
添加了一些restapi,可以通过以下url看到它们:
{c2c_base_path}
有些api受秘密保护。此机密在c2c_secret
变量或c2c.secret
财产。它要么作为secret
查询参数传递,要么作为x-api-key
头传递。一次
使用一个好的机密访问,将存储一个cookie,并且可以省略该机密。
棱锥体
提供了一个命令行(c2cwsgiutils_run
)来启动带有wsgi应用程序的http服务器(gunicorn)。
默认情况下,它将加载在/app/production.ini
中配置的应用程序,但您可以使用
环境变量。所有的环境变量在配置中都是可用的
使用%(env_name)s
要启用c2cwsgiutils的大部分功能,您需要将这一行添加到wsgi main:
importc2cwsgiutils.pyramidconfig.include(c2cwsgiutils.pyramid.includeme)
错误捕获视图将被放置到位,以json形式返回错误。
提供了一个自定义加载程序,用于对包含环境变量的配置文件运行棱锥体脚本:
proutes c2c://production.ini # relative path proutes c2c:///app/production.ini # absolute path
自动安装一个过滤器来处理由公共代理设置的http头并具有正确的值
在请求对象中(例如,request.client_addr
)。这个过滤器相当于
pastedeploy prefix
(减去前缀部分)可以,但也支持较新的头(forwarded
)。
如果需要为路由加前缀,可以使用configurator
构造函数的route\u prefix
参数。
日志记录
提供了两个新的日志记录后端:
c2cwsgiutils.pyramidu logging.pyramidcesysloghandler
:通过udp将@cee格式的日志发送到syslog。c2cwsgiutils.pyramid_logging.jsonloghandler
:输出(在stdout或stderr上)json格式的日志。
查看的日志配置部分 验收测试/app/production.ini以获取用法示例。
您可以使用c2c_logu view_enabled
环境启用一个视图来配置实时系统上的日志记录级别
变量。然后,可以使用get-on查询记录器的当前状态
{c2c_base_path}/日志记录/级别?secret={c2c_secret}&name={logger_name}
并可以使用更改
{c2c_base_path}/日志记录/级别?secret={c2c_secret}&name={logger_name}&level={level}
。凌乱的存储在
redis,如果配置了c2c redis url(c2c.redis url
)。
请求跟踪
为了跟踪请求在所有服务中生成的日志(考虑不同的进程),
c2cwsgiutils尝试用请求id标记averything。此字段可以作为请求头来自输入
(x-request-id
,x-correlation-id
,request-id
或x-varnish
)或默认为uuid。您可以添加
通过定义环境变量
(c2c.request_id_header
)。
在json日志格式中,会自动添加一个请求id
字段。
您还可以通过以下方式启用(默认情况下禁用,因为它可能会产生成本)SQL请求的标记
设置c2c_sql_request_id环境变量(或.ini文件中的c2c.sql_request_id)。这将使用
要传递请求ID的应用程序名称。如果这样做,则必须在
postgresql通过将log_line_prefix
设置为类似"%a"
(不要忘记空格)的值来记录日志。
然后,在您的应用程序中,建议将请求id传输到外部restapi。使用
例如,x-request-id
http头。请求id的值可以通过添加
c2c_request_id
金字塔请求对象的属性。请求
模块被自动修补为
添加此标题。
还修补了请求模块,以监视在不超时的情况下完成的请求。那样的话,你可以
使用环境变量配置默认超时
(c2c.requests_default_timeout
)。如果未指定超时和默认值,则会发出警告。
指标
要启用和配置度量框架,可以使用:
- stats视图(c2c.stats视图):如果定义了,将启用stats视图
{c2c_base_path}/stats.json
- statsd_address(c2c.statsd_address):如果定义了stats,则将stats发送到给定的statsd服务器
- statsd_prefix(c2c.statsd_prefix):添加到每个度量名称的前缀
- statsd_use_标记:如果为true,则自动度量将使用标记
- statsd_tag{tag_name}:为服务设置全局标记
如果启用,则会自动生成一些度量:
- {statsd_prefix}.route.{verb}.{route_name}.{status}:处理查询的时间(包括呈现)
- {statsd_prefix}.render.{verb}.{route_name}.{status}:呈现查询的时间
- {statsd_prefix}.sql.{query}:执行给定sql查询的时间(简化和规范化)
- {statsd_prefix}.请求。{scheme}.{hostname}.{port}.{verb}.{status}:执行http请求的时间 外部服务(仅从发送请求开始到消息头 背上一大块身体)
- {statsd_prefix}.redis.{command}:执行给定redis命令的时间
您可以手动测量花在此类事情上的时间:
fromc2cwsgiutilsimportstatswithstats.timer_context(['toto','tutu']):do_something()
如果成功,它只会添加一个计时器事件。如果您想衡量成功与失败,请执行以下操作:
fromc2cwsgiutilsimportstatswithstats.outcome_timer_context(['toto','tutu']):do_something()
还存在其他生成度量的函数。查看c2cwsgiutils.stats
模块。
如果要生成有关 行数。
SQL探查器
SQL事件探查器必须配置为启用了c2c\u sql\u profiler\u的环境变量。使视图
要查询探查器的状态(
{c2c_base_path}/sql_profiler?secret={c2c_secret}
)或
启用/禁用它({c2c_base_path}/sql_profiler?secret={c2c_secret}&enable={1 0}
)。
如果启用,则对于由sqlalchemy发送的每个查询,选择另一个查询完成解释分析
准备好了。结果将发送到
c2cwsgiutils.sql_profiler
logger。
不要在繁忙的生产系统上启用此功能。它会扼杀你的表演。
剖面仪
如果设置了环境变量c2c_profiler_path,您将启用一个profiler,它将在 给定的路径。由于所用库的限制,路径必须位于应用程序的根目录(它 不能包含斜线)。您还可以定义c2c_profiler_模块,这是一个用空格分隔的python列表 包有一个饼图,显示在给定包中花费的时间。
即使配置了探查器,在应用程序启动时也会被禁用。为了实现它你必须 访问其页面。
如果要使用此功能,必须安装Linesman
软件包。
数据库会话
c2cwsgiutils.db.setup_会话允许您设置一个db会话,该会话有两个引擎用于访问
主/从PostgreSQL设置。从发动机(只读)将自动用于get
和选项
请求和主引擎(读写)将用于其他查询。
要使用它,production.ini必须像这样:
sqlalchemy.url=%(SQLALCHEMY_URL)ssqlalchemy.pool_recycle=30sqlalchemy.pool_size=5sqlalchemy.max_overflow=25sqlalchemy_slave.url=%(SQLALCHEMY_URL_SLAVE)ssqlalchemy_slave.pool_recycle=30sqlalchemy_slave.pool_size=5sqlalchemy_slave.max_overflow=25
初始化数据库连接的代码必须如下所示:
fromc2cwsgiutils.dbimportsetup_sessiondefinit(config):globalDBSessionDBSession=setup_session(config,'sqlalchemy','sqlalchemy_slave',force_slave=["POST /api/hello"])[0]
您可以使用force_slave
和force_master
参数覆盖默认值并强制路由使用
主引擎或从引擎。
健康检查
要启用运行状况检查,必须在wsgi main中添加一些设置(通常在db连接 设置)。例如:
fromc2cwsgiutils.health_checkimportHealthCheckdefcustom_check(request):globalnot_happyifnot_happy:raiseException("I'm not happy")return"happy"health_check=HealthCheck(config)health_check.add_db_session_check(models.DBSession,at_least_one_model=models.Hello)health_check.add_url_check('http://localhost:8080/api/hello')health_check.add_custom_check('custom',custom_check,2)health_check.add_alembic_check(models.DBSession,'/app/alembic.ini',3)
然后,url{c2c_base_path}/health_检查?max_level=3
可用于运行运行运行状况检查并获取报告
看起来是这样的(万一出错):
{"status":500,"successes":{"db_engine_sqlalchemy":{"timing":0.002},"db_engine_sqlalchemy_slave":{"timing":0.003},"http://localhost/api/hello":{"timing":0.010},"alembic_app_alembic.ini_alembic":{"timing":0.005,"result":"4a8c1bb4e775"}},"failures":{"custom":{"message":"I'm not happy","timing":0.001}}}
级别为:
- 0:不在此级别添加支票。此最高级别用于执行简单的ping操作。
- 1:检查对服务有用性至关重要的东西(db、redis等等)。这是最高级别集 默认情况下,由负载平衡器用于确定服务是否处于活动状态。
- >;=2:方便时使用。pingdom和co通常设置为max_level=100。所以呆在下面。
url{c2c_base_path}/health_检查?checks=<;check_name>;
可用于对某些
检查,昏迷分离列表。
当您实例化healthcheck
类时,可能会自动启用两个检查:
- 如果已配置redis,请检查redis是否可访问。
- 如果已配置redis并且版本信息可用,请检查版本是否匹配 访问所有实例。
有关详细信息,请参阅c2cwsgiutils.health_check.healthcheck类的文档。
sqlalchemy模型图
提供了一个命令,可以生成sqlalchemy orm模型的doxygen图。 请参阅验收测试/a p p/models\u graph.py" rel="nofollow">验收测试/app/models\u graph.py使用方法。
版本信息
如果存在/app/versions.json
,则添加一个视图({c2c_base_path}/versions.json
)来查询当前
应用程序的版本。此文件是通过调用c2cwsgiutils\u genversion.py[$git\u标记]$git\u哈希生成的
命令行。通常在wsgi应用程序的dockerfile文件中完成。
调试
要启用调试接口,必须将c2c_debug_view_enabled
环境变量设置为enabled。然后你可以
有一些垃圾:
- 每个线程的堆栈跟踪:
{c2c_base_path}/debug/stacks?secret={c2c_secret}
- 内存使用:
{c2c_base_path}/debug/memory?secret={c2c_secret}&limit=30
- 调用时内存增加正在使用另一个api:
{c2c_base_path}/debug/memory_diff?path={path\u info}&secret={c2c\u secret}&limit=30
- 休眠给定的秒数(测试负载平衡器超时):
{c2c_base_path}/debug/sleep?secret={c2c_secret}&time=60.2
- 查看wsgi接收的http头:
{c2c_base_path}/debug/headers?secret={c2c_secret}
- 返回一个http错误:
{c2c_base_path}/debug/error?secret={c2c_secret}&status=500
只要更改本地python代码,就可以自动重新加载gunicorn。为了这个你需要 对docker compose.yml进行特殊调整::
pip install c2cwsgiutils
0
gunicorn_参数有--reload
参数,您的本地python代码是
安装(只读)到容器中。
广播
一些c2cwsgiutils api影响或查询wsgi服务器的状态。因为5个进程中只有一个 (默认情况下)当服务器的数量得到一个查询时,只有这个服务器会受到影响。为了避免,你 可以配置c2cwsgiutils使用redis pub/sub来广播这些请求并收集答案。
受影响的api是:
{c2c_base_path}/debug/stacks
{c2c_base_path}/debug/memory
{c2c_base_path}/logging/level
{c2c_base_path}/sql_分析器
配置参数为:
c2c_redis_url
(c2c.redis_url
):要使用的redis实例的urlc2c_broadcast_prefix
(c2c.broadcast_prefix
):要添加到正在使用的频道的前缀(必须是 两种服务不同)
如果未配置,则仅影响接收请求的进程。
cors
要使用符合CORS的视图,请按如下方式定义视图:
pip install c2cwsgiutils
1
异常处理
默认情况下,c2cwsgiutils将安装异常处理视图,该视图将捕获 应用程序查看并将其转换为json响应,其http状态与错误对应。
您可以通过将c2c_disable_exception_handling
(c2c.disable_exception_handling
)设置为"1"来禁用此功能。
在开发模式(development=1
)中,所有详细信息(sql语句、stacktrace,…)都发送到
客户端。在生产模式下,您仍然可以通过发送查询中c2c_secret
中定义的机密来获取它们。
如果要使用棱锥调试工具栏,则需要禁用异常处理并进行如下配置:
pip install c2cwsgiutils
2
json漂亮打印
两个json呈现器可用:
json
:普通的json呈现程序(默认值)快速json
:更快的json呈现程序 调整方式不同。
两个漂亮的打印了呈现的json。虽然这会增加大量的空白,但是 由于gzip压缩,网络上传输的字节可以忽略不计。
fast_json
渲染器使用的是速度更快的ujson,但不提供更改渲染的功能
一些类型(json.dumps的default
参数)。这将严重影响纸草
等。
岗哨整合
stacktraces可以发送到sentry.io服务进行收集。要启用它,您必须设置sentry\u url
(c2c.sentry_url
)指向项目的公共DSN。
其他一些环境变量可用于调整随每个报告一起发送的信息:
哨兵排除
(c2c.sentry.excludes
):要排除哨兵的伐木者列表(冒号分隔,不带空格)git_hash
(c2c.git_hash
):将用于版本sentry_client_release
:如果不等于"最新",则将为该版本而不是git_hash哨兵客户端环境
:环境(dev、int、prod,…)sentry_client_ignore_exceptions
:列出要忽略的异常(以ComA分隔)(默认为SystemExit)岗哨标签
:添加其他自定义标签岗哨级别
:从哪个日志级别开始向岗哨发送事件(默认为错误)
开发人员信息
您需要docker
(>;=1.12.0)、docker compose
(>;=1.10.0)和
make
安装在计算机上以播放此项目。
使用
apt get policy docker engine
并最终强制安装
使用类似于
apt get install docker engine=1.12.3-0~xenial
要对所有内容进行lint和测试,请运行以下命令:
pip install c2cwsgiutils
3
确保对版本号严格要求:
- 错误修复版本更改:在api中没有添加、删除或更改任何内容,只有错误修复 依赖项中的版本号更改
- 次要版本更改:api必须保持向后兼容,并且只能是次要版本 依赖项中的数字更改
- 主要版本更改:API和依赖项不向后兼容
发布:
- 在setup.py中更改版本
- 提交并推送到主控台。
- 标记git提交。
- 将
release{major{version}
分支重新定位到此提交,并推动release{major{version}
和 github的标签。一定要同时这样做,这样詹金斯可以在构建标签时看到它 分行。
我们需要发布${major}
分支,这样jenkins可以为major构建一个新的docker映像
每晚都有版本。