为Camptocamp WSGI应用程序提供常用工具
项目描述
Camptocamp WSGI utilities
这是一个Python 3库(>=3.5),为Camptocamp WSGI应用程序提供常用工具
- 提供Prometheus度量
- 允许使用主/从PostgreSQL配置
- CEE/UDP日志的记录处理程序
- 一个可选视图,用于更改运行时的日志级别
- SQL性能分析器,用于调试数据库性能问题,默认禁用。警告,它将减慢一切。
- 获取应用程序和已安装包的版本信息的视图
- 实现健康检查服务的框架
- 错误处理程序,在出现错误时向客户端发送JSON消息
- cornice服务,用于设置CORS的替代品
还提供编写验收测试的工具
- 一个类,可以从pytest fixture中使用来控制组合
- 一个类,可以从pytest fixture中使用来测试REST API
作为一个如何在使用Docker镜像提供的应用程序中使用它的例子,你可以查看acceptance_tests/app中的测试应用程序。要了解如何测试此类应用程序,请查看acceptance_tests/tests。
安装
自定义Docker镜像(来自PYPI库)
在这里,我们没有进行c2cwsgiutils的最小安装,而是放置了在集成和生产环境中监视应用程序所需的一切。
此库可在PYPI中找到:https://pypi.python.org/pypi/c2cwsgiutils
将模板配置文件复制并修改到您的项目中
- production.ini;
- gunicorn.conf.py。然后替换
c2cwsgiutils_app
为您的包名。
您应该使用您用于管理pip依赖项的工具安装c2cwsgiutils
。
在Dockerfile
中,您应添加以下行
# Generate the version file.
RUN c2cwsgiutils-genversion $(git rev-parse HEAD)
CMD ["gunicorn", "--paste=/app/production.ini"]
# Default values for the environment variables
ENV \
DEVELOPMENT=0 \
SQLALCHEMY_POOL_RECYCLE=30 \
SQLALCHEMY_POOL_SIZE=5 \
SQLALCHEMY_MAX_OVERFLOW=25 \
SQLALCHEMY_SLAVE_POOL_RECYCLE=30 \
SQLALCHEMY_SLAVE_POOL_SIZE=5 \
SQLALCHEMY_SLAVE_MAX_OVERFLOW=25\
LOG_TYPE=console \
OTHER_LOG_LEVEL=WARNING \
GUNICORN_LOG_LEVEL=WARNING \
SQL_LOG_LEVEL=WARNING \
C2CWSGIUTILS_LOG_LEVEL=WARNING \
LOG_LEVEL=INFO
添加到您的main
函数中。
config.include("c2cwsgiutils.pyramid")
dbsession = c2cwsgiutils.db.init(config, "sqlalchemy", "sqlalchemy_slave")
config.scan(...)
# Initialize the health checks
health_check = c2cwsgiutils.health_check.HealthCheck(config)
health_check.add_db_session_check(dbsession)
health_check.add_alembic_check(dbsession, "/app/alembic.ini", 1)
相关环境变量
DEVELOPMENT
:设置为1
以启用开发模式,默认为0
。SQLALCHEMY_URL
:SQLAlchemy URL,如postgresql://user:password@host:port/dbname
。SQLALCHEMY_POOL_RECYCLE
:SQLAlchemy池回收,默认为30
。SQLALCHEMY_POOL_SIZE
:SQLAlchemy池大小,默认为5
。SQLALCHEMY_MAX_OVERFLOW
:SQLAlchemy最大溢出,默认为25
。SQLALCHEMY_SLAVE_URL
:SQLAlchemy从属(只读)URL,如postgresql://user:password@host:port/dbname
。SQLALCHEMY_SLAVE_POOL_RECYCLE
:SQLAlchemy从属池回收,默认为30
。SQLALCHEMY_SLAVE_POOL_SIZE
:SQLAlchemy从属池大小,默认为5
。SQLALCHEMY_SLAVE_MAX_OVERFLOW
:SQLAlchemy从属最大溢出,默认为25
。GUNICORN_WORKERS
:工作进程的数量,默认为2
。GUNICORN_THREADS
:每个工作进程的线程数,默认为10
。LOG_TYPE
:日志类型,默认为console
,在kubernetes上应使用json
以与elk协同工作。LOG_LEVEL
:应用程序日志级别,默认为INFO
。SQL_LOG_LEVEL
:SQL查询日志级别,WARNING
:不记录日志,INFO
:记录查询,DEBUG
也记录结果,默认为WARNING
。GUNICORN_ERROR_LOG_LEVEL
:Gunicorn错误日志级别,默认为WARNING
。C2CWSGIUTILS_CONFIG
:gunicorn使用的备用ini文件,默认为production.ini
。C2CWSGIUTILS_LOG_LEVEL
:c2c WSGI工具日志级别,默认为WARNING
。OTHER_LOG_LEVEL
:所有其他日志记录器的日志级别,默认为WARNING
。
这些环境变量可用于调查生产环境。
Docker(已弃用)
或(已弃用)作为基础Docker镜像:camptocamp/c2cwsgiutils:release_5或ghcr.io/camptocamp/c2cwsgiutils:release_5
如果您需要一个具有更小足迹的镜像,请使用以-light
开头标记。这些镜像没有GDAL和构建工具。
我们废弃Docker镜像的原因是:
- 项目希望选择基础镜像。
- 项目锁定依赖的不同版本。
通用配置
通常,配置可以通过环境变量(首先使用)或通过production.ini
文件中的条目来完成。
您可以使用名为C2C_BASE_PATH
的环境变量或在production.ini
文件中名为c2c.base_path
的属性来配置访问由c2cwsgiutils提供的视图的基础URL。
添加了一些REST API,可以通过此URL查看:{C2C_BASE_PATH}
。
一些API由一个秘密保护。这个秘密在C2C_SECRET
变量或c2c.secret
属性中指定。它可以作为secret
查询参数或X-API-Key
头传递。一旦使用正确的秘密访问,就会存储一个cookie,可以省略秘密。
使用C2C_SECRET
的替代方案是使用GitHub上的身份验证,创建GitHub应用程序。
使用环境变量C2C_JSON_PRETTY_PRINT
和C2C_JSON_SORT_KEYS
或属性c2c.json.pretty_print
和c2c.json.sort_keys
配置json渲染器。默认为false
。
然后,如果尚未认证(使用C2C_AUTH_GITHUB_CLIENT_ID
、C2C_AUTH_GITHUB_CLIENT_SECRET
和C2C_AUTH_GITHUB_SCOPE
),它将重定向用户到GitHub身份验证表单。
然后,我们将检查用户是否有权访问应用程序,为此我们将检查用户是否有足够的GitHub仓库权限(使用C2C_AUTH_GITHUB_REPOSITORY
和C2C_AUTH_GITHUB_REPOSITORY_ACCESS_TYPE
)。
最后,我们将会在加密cookie中存储会话信息(使用C2C_AUTH_SECRET
和C2C_AUTH_COOKIE
)。
配置细节
使用环境变量C2C_AUTH_GITHUB_REPOSITORY
或配置键c2c.auth.github.repository
来定义相关的GitHub仓库(必需)。
使用环境变量C2C_AUTH_GITHUB_ACCESS_TYPE
或配置键c2c.auth.github.access_type
来定义所需的访问类型可以是pull
、push
或admin
(默认是push
)
使用环境变量C2C_AUTH_GITHUB_CLIENT_ID
或配置键c2c.auth.github.client_id
来定义GitHub应用程序ID(必需)
使用环境变量C2C_AUTH_GITHUB_CLIENT_SECRET
或配置键c2c.auth.github.client_secret
来定义GitHub应用程序秘密(必需)
使用环境变量C2C_AUTH_GITHUB_SCOPE
或配置键c2c.auth.github.scope
来定义GitHub作用域(默认是repo
),请参阅GitHub文档
使用环境变量C2C_AUTH_GITHUB_SECRET
或配置键c2c.auth.github.auth.secret
来定义用于JWD加密的使用的秘密(必需,长度至少为16)
使用环境变量C2C_AUTH_GITHUB_COOKIE
或配置键c2c.auth.github.auth.cookie
来定义使用的cookie名称(默认为c2c-auth-jwt
)
使用环境变量C2C_AUTH_GITHUB_AUTH_URL
或配置键c2c.auth.github.auth_url
来定义GitHub身份验证URL(默认为https://github.com/login/oauth/authorize
)
使用环境变量C2C_AUTH_GITHUB_TOKEN_URL
或配置键c2c.auth.github.token_url
来定义GitHub身份验证URL(默认为https://github.com/login/oauth/access_token
)
使用环境变量C2C_AUTH_GITHUB_USER_URL
或配置键c2c.auth.github.user_url
来定义GitHub身份验证URL(默认为https://api.github.com/user
)
使用环境变量C2C_AUTH_GITHUB_REPO_URL
或配置键c2c.auth.github.repo_url
来定义GitHub身份验证URL(默认为https://api.github.com/repo
)
使用环境变量 C2C_AUTH_GITHUB_PROXY_URL
或配置键 c2c.auth.github.auth.proxy_url
来定义 GitHub 和我们的应用程序之间的重定向代理,以便在 GitHub 上共享 OAuth2 应用程序(默认不使用代理)。适用于 此代理。
使用环境变量 C2C_USE_SESSION
或配置键 c2c.use_session
来定义是否使用会话。目前,我们可以在 OAuth2 登录期间使用会话来存储状态,用于防止 CSRF(默认为 false
)
Pyramid
所有环境变量都可以在配置文件中使用类似 %(ENV_NAME)s
的方式使用。
要启用 c2cwsgiutils 的大多数功能,您需要将此行添加到您的 WSGI 主配置中
import c2cwsgiutils.pyramid
config.include(c2cwsgiutils.pyramid.includeme)
将错误捕获视图放入位置,以便以 JSON 格式返回错误。
提供了一个自定义加载器,用于在包含环境变量的配置文件上运行 pyramid 脚本。
proutes c2c://production.ini # relative path
proutes c2c:///app/production.ini # absolute path
自动安装了一个过滤器来处理常见代理设置的 HTTP 头部,并在请求对象中具有正确的值(例如 request.client_addr
)。此过滤器相当于 PasteDeploy#prefix
(减去前缀部分),但还支持较新的头部(如 Forwarded
)。如果您需要为路由添加前缀,可以使用 Configurator
构造函数的 route_prefix
参数。
日志记录
提供了两个新的日志后端
c2cwsgiutils.pyramid_logging.PyramidCeeSysLogHandler
:通过 UDP 将 @cee 格式的日志发送到 syslog。c2cwsgiutils.pyramid_logging.JsonLogHandler
:将(在 stdout 或 stderr 上)输出 JSON 格式的日志。
请查看 acceptance_tests/app/production.ini 中的日志配置部分,以了解 paste 和命令行。
日志配置由 gunicorn 自动导入,可以通过设置环境变量 DEBUG_LOGCONFIG=1
来可视化字典配置。
您可以使用环境变量 C2C_LOG_VIEW_ENABLED
启用一个视图来配置实时系统上的日志级别。然后,可以通过对 {C2C_BASE_PATH}/logging/level?secret={C2C_SECRET}&name={logger_name}
的 GET 请求查询当前日志记录器的状态,并使用 {C2C_BASE_PATH}/logging/level?secret={C2C_SECRET}&name={logger_name}&level={level}
进行更改。如果配置了 C2C_REDIS_URL
(c2c.redis_url
)或 C2C_REDIS_SENTINELS
,则覆盖将存储在 Redis 中。
数据库维护
您可以使用环境变量 C2C_DB_MAINTENANCE_VIEW_ENABLED
启用一个视图来强制使用从引擎。然后,可以使用 {C2C_BASE_PATH}/db/maintenance?secret={C2C_SECRET}&readonly=true
将数据库设置为“只读”。如果配置了 C2C_REDIS_URL
(c2c.redis_url
)或 C2C_REDIS_SENTINELS
,则当前状态将存储在 Redis 中。
请求跟踪
为了跟踪所有服务(考虑为单独的进程)生成的请求日志,c2cwsgiutils 试图标记每一项请求 ID。此字段可以来自输入请求头部(如 X-Request-ID
、X-Correlation-ID
、Request-ID
或 X-Varnish
)或默认为 UUID。您可以通过定义环境变量 C2C_REQUEST_ID_HEADER
(c2c.request_id_header
)来添加额外的请求头部作为来源。
在 JSON 记录格式中,自动添加 request_id
字段。
您可以通过设置环境变量 C2C_SQL_REQUEST_ID(或在 .ini 文件中 c2c.sql_request_id)来启用(默认禁用,因为它可能有一定的成本)SQL 请求的标记。这将使用应用程序名称来传递请求 ID。如果您这样做,则必须通过设置 log_line_prefix
为类似 "%a "
(别忘了空格)的方式来在 PostgreSQL 日志中包含应用程序名称。
然后,在您的应用程序中,建议将请求ID传递给外部REST API。例如,使用X-Request-ID
HTTP头。请求ID的值可以通过添加到Pyramid请求对象的c2c_request_id
属性来访问。已修补requests
模块以自动添加此头。
此外,requests
模块也被修补以监控没有超时的请求。在这种情况下,您可以使用C2C_REQUESTS_DEFAULT_TIMEOUT
环境变量(c2c.requests_default_timeout
)配置默认超时。如果没有指定超时和默认值,则发出警告。
SQL分析器
必须使用C2C_SQL_PROFILER_ENABLED
环境变量配置SQL分析器。这启用了一个视图来查询分析器的状态({C2C_BASE_PATH}/sql_profiler?secret={C2C_SECRET}
)或启用/禁用它({C2C_BASE_PATH}/sql_profiler?secret={C2C_SECRET}&enable={1|0}
)。
如果启用,对于每个由SQLAlchemy发送的SELECT
查询,都会执行另一个带有EXPLAIN ANALYZE
前缀的查询。结果被发送到c2cwsgiutils.sql_profiler
记录器。
不要在繁忙的生产系统上启用它。它会杀死您的性能。
分析器
C2cwsgiutils提供了一种轻松分析应用程序的方法
使用装饰器
from c2cwsgiutils.profile import Profiler
@Profile('/my_file.prof')
my_function():
...
或使用with
语句
from c2cwsgiutils.profile import Profiler
with Profile('/my_file.prof'):
...
然后使用SnakeViz打开您的文件
docker cp container_name:/my_file.prof .
pip install --user snakeviz
snakeviz my_file.prof
数据库会话
c2cwsgiutils.db.init
允许您设置一个数据库会话,该会话有两个引擎用于访问主/从PostgreSQL配置。从引擎(只读)将自动用于GET
和OPTIONS
请求,而主引擎(读写)将用于其他查询。
要使用它,您的production.ini
必须如下所示
sqlalchemy.url = %(SQLALCHEMY_URL)s
sqlalchemy.pool_recycle = %(SQLALCHEMY_POOL_RECYCLE)s
sqlalchemy.pool_size = %(SQLALCHEMY_POOL_SIZE)s
sqlalchemy.max_overflow = %(SQLALCHEMY_MAX_OVERFLOW)s
sqlalchemy_slave.url = %(SQLALCHEMY_SLAVE_URL)s
sqlalchemy_slave.pool_recycle = %(SQLALCHEMY_SLAVE_POOL_RECYCLE)s
sqlalchemy_slave.pool_size = %(SQLALCHEMY_SLAVE_POOL_SIZE)s
sqlalchemy_slave.max_overflow = %(SQLALCHEMY_SLAVE_MAX_OVERFLOW)s
并且初始化数据库连接的代码如下所示
import c2cwsgiutils.db
def main(config):
c2cwsgiutils.db.init(config, 'sqlalchemy', 'sqlalchemy_slave', force_slave=[
"POST /api/hello"
])[0]
您可以使用force_slave
和force_master
参数覆盖默认值并强制路由使用主引擎或从引擎。
健康检查
要启用健康检查,必须在您的WSGI主中添加一些设置(通常在数据库连接设置之后)。例如
from c2cwsgiutils.health_check import HealthCheck
def custom_check(request):
global not_happy
if not_happy:
raise Exception("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_check?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.01 },
"alembic_app_alembic.ini_alembic": { "timing": 0.005, "result": "4a8c1bb4e775" }
},
"failures": {
"custom": {
"message": "I'm not happy",
"timing": 0.001
}
}
}
级别如下
- 0:在此级别不添加检查。此max_level用于执行简单的ping。
- 1:检查对服务有用性的任何关键事项(数据库、redis、...)。这是默认的max_level,并被负载均衡器用于确定服务是否存活。
- >=2:根据您的方便使用这些级别。Pingdom和CO通常设置为max_level=100。所以请保持在下面。
可以使用URL {C2C_BASE_PATH}/health_check?checks=<check_name>
来运行某些检查的健康检查,以逗号分隔的列表。
在实例化HealthCheck
类时,可能自动启用两个检查
- 如果配置了redis,检查redis是否可访问。
- 如果配置了redis且版本信息可用,则检查所有实例之间的版本是否匹配。
有关更多信息,请参阅c2cwsgiutils.health_check.HealthCheck
类的文档。
SQLAlchemy模型图
提供了一个命令,可以生成SQLAlchemy ORM模型的Doxygen图。请参阅acceptance_tests/app/models_graph.py了解其用法。
版本信息
如果存在/app/versions.json
,则添加了一个视图({C2C_BASE_PATH}/versions.json
)来查询应用程序的当前版本。该文件通过调用命令行c2cwsgiutils-genversion [$GIT_TAG] $GIT_HASH
生成。通常在WSGI应用程序的Dockerfile中执行。
Prometheus
在c2cwsgiutils中集成了Prometheus客户端。
它将以多进程模式运行,具体限制请参见prometheus_client
文档。
要启用它,您应提供C2C_PROMETHEUS_PORT
环境变量。出于安全考虑,此端口号不应暴露。
我们可以使用以下环境变量进行自定义:
C2C_PROMETHEUS_PREFIX
:用于自定义前缀,默认为c2cwsggiutils-
。C2C_PROMETHEUS_PACKAGES
:将在版本信息中出现的包,默认为c2cwsgiutils,pyramid,gunicorn,sqlalchemy
。C2C_PROMETHEUS_APPLICATION_PACKAGE
:将在版本信息中作为应用出现的包。
您应在gunicorn.conf.py
中添加以下内容:
from prometheus_client import multiprocess
def on_starting(server):
from c2cwsgiutils import prometheus
del server
prometheus.start()
def post_fork(server, worker):
from c2cwsgiutils import prometheus
del server, worker
prometheus.cleanup()
def child_exit(server, worker):
del server
multiprocess.mark_process_dead(worker.pid)
在您的Dockerfile
中,您应添加:
RUN mkdir -p /prometheus-metrics \
&& chmod a+rwx /prometheus-metrics
ENV PROMETHEUS_MULTIPROC_DIR=/prometheus-metrics
添加自定义度量收集器
请参阅官方文档。
与Unix进程相关。
from c2cwsgiutils import broadcast, prometheus
prometheus.MULTI_PROCESS_COLLECTOR_BROADCAST_CHANNELS.append("prometheus_collector_custom")
broadcast.subscribe("c2cwsgiutils_prometheus_collect_gc", _broadcast_collector_custom)
my_custom_collector_instance = MyCustomCollector()
def _broadcast_collector_custom() -> List[prometheus.SerializedGauge]:
"""Get the collected GC gauges."""
return prometheus.serialize_collected_data(my_custom_collector_instance)
与主机相关,请在gunicorn.conf.py
中使用该信息。
def on_starting(server):
from c2cwsgiutils import prometheus
del server
registry = CollectorRegistry()
registry.register(MyCollector())
prometheus.start(registry)
数据库度量
如果您想生成关于行计数的统计数据(度量),请查看c2cwsgiutils-stats-db
实用程序。
度量使用
由于c2cwsgiutils的每个实例(Pod)都有自己的度量,因此我们需要将它们聚合起来,以便得到您可能需要的服务的度量,您可以使用sum by (<fields>) (<metric>)
来获取度量(特别是计数器)。
自定义脚本
要使用脚本初始化应用程序,您应使用c2cwsgiutils.setup_process.bootstrap_application_from_options
函数。
main
函数的示例
def main() -> None:
parser = argparse.ArgumentParser(description="My scrypt.")
# Add your argument here
c2cwsgiutils.setup_process.fill_arguments(parser)
args = parser.parse_args()
env = c2cwsgiutils.setup_process.bootstrap_application_from_options(args)
settings = env["registry"].settings
# Add your code here
如果您需要访问数据库,您应添加:
engine = c2cwsgiutils.db.get_engine(settings)
session_factory = c2cwsgiutils.db.get_session_factory(engine)
with transaction.manager:
# Add your code here
如果您需要不带应用程序上下文的数据库连接,您可以替换为:
env = c2cwsgiutils.setup_process.bootstrap_application_from_options(args)
settings = env["registry"].settings
由
loader = pyramid.scripts.common.get_config_loader(args.config_uri)
loader.setup_logging(parse_vars(args.config_vars) if args.config_vars else None)
settings = loader.get_settings()
调试
要启用调试界面,您必须设置C2C_DEBUG_VIEW_ENABLED
环境变量。然后您可以看到一些事物的转储
- 每个线程的堆栈跟踪:
{C2C_BASE_PATH}/debug/stacks?secret={C2C_SECRET}
- 内存使用:
{C2C_BASE_PATH}/debug/memory?secret={C2C_SECRET}&limit=30&analyze_type=builtins.dict&python_internals_map=false
- 对象引用:
{C2C_BASE_PATH}/debug/show_refs.dot?secret={C2C_SECRET}&analyze_type=gunicorn.app.wsgiapp.WSGIApplication&analyze_id=12345&max_depth=3&too_many=10&filter=1024&no_extra_info&backrefs
analyze_type
和analyze_id
不应同时使用,您可以使用它如下curl "<URL>" > /tmp/show_refs.dot dot -Lg -Tpng /tmp/show_refs.dot > /tmp/show_refs.png
- 调用另一个API时的内存增加:
{C2C_BASE_PATH}/debug/memory_diff?path={path_info}&secret={C2C_SECRET}&limit=30&no_warmup
- 暂停给定数量的秒数(用于测试负载均衡器超时):
{C2C_BASE_PATH}/debug/sleep?secret={C2C_SECRET}&time=60.2
- 查看WSGI接收到的HTTP头:
{C2C_BASE_PATH}/debug/headers?secret={C2C_SECRET}&status=500
- 返回HTTP错误:
{C2C_BASE_PATH}/debug/error?secret={C2C_SECRET}&status=500
为了便于本地开发,当文件更改时,视图会自动重新加载。此外,文件系统由docker-compose.override.yaml
文件挂载。请确保不要在生产环境中使用此类文件/机制。
广播
一些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_profiler
配置参数是:
C2C_REDIS_URL
(c2c.redis_url
):要使用的Redis单实例的URLC2C_REDIS_OPTIONS
:Redis选项,以逗号分隔的等号列表,值作为YAML解析C2C_REDIS_SENTINELS
:要使用的逗号分隔的Redis主机:端口哨兵实例列表C2C_REDIS_SERVICENAME
:在使用哨兵的情况下使用的redis服务名称C2C_REDIS_DB
:在使用哨兵的情况下使用的redis数据库编号C2C_BROADCAST_PREFIX
(c2c.broadcast_prefix
):要添加到正在使用的通道的前缀(对于2个不同的服务必须不同)
如果没有配置,只有接收请求的进程受到影响。
CORS
为了具有CORS兼容的视图,请像这样定义您的视图
from c2cwsgiutils import services
hello_service = services.create("hello", "/hello", cors_credentials=True)
@hello_service.get()
def hello_get(request):
return {'hello': True}
异常处理
c2cwsgiutils可以安装异常处理视图,这些视图将捕获应用程序视图抛出的任何异常,并将其转换为包含相应错误HTTP状态的JSON响应。
您可以通过将C2C_ENABLE_EXCEPTION_HANDLING
(c2c.enable_exception_handling
)设置为"1"来启用此功能。
在开发模式(DEVELOPMENT=1
)下,所有详细信息(SQL语句、堆栈跟踪等)都将发送到客户端。在生产模式下,您可以通过发送在查询中定义的C2C_SECRET
中的秘密来获取它们。
如果您想使用pyramid_debugtoolbar,则需要禁用异常处理并按如下方式配置
pyramid.includes =
pyramid_debugtoolbar
debugtoolbar.enabled = true
debugtoolbar.hosts = 0.0.0.0/0
debugtoolbar.intercept_exc = debug
debugtoolbar.show_on_exc_only = true
c2c.enable_exception_handling = 0
JSON美化打印
一些JSON渲染器可用
json
:正常的JSON渲染器(默认)。fast_json
:使用ujson的更快JSON渲染器。cornice_json
:围绕cornice CorniceRenderer的普通JSON渲染器。cornice_fast_json
:围绕cornice CorniceRenderer的更快JSON渲染器。
两者都美化了渲染的JSON。虽然这会增加大量的空白,但由于gzip压缩,网络传输的字节数差异可以忽略不计。
fast_json
渲染器使用ujson,这更快,但无法更改某些类型的渲染(json.dumps的default
参数)。这将与papyrus
等产生不良交互。
应使用cornice版本以避免"‘JSON’对象没有属性'render_errors'"错误。
Sentry集成
堆栈跟踪可以发送到sentry.io服务进行收集。要启用它,您必须将SENTRY_URL
(c2c.sentry_url
)设置为指向项目的公共DSN。
可以使用一些其他环境变量来调整每个报告发送的信息
SENTRY_EXCLUDES
(c2c.sentry.excludes
):要排除的记录器列表(冒号分隔,不带空格)GIT_HASH
(c2c.git_hash
):将用于版本SENTRY_CLIENT_RELEASE
:如果不等于"latest",将代替GIT_HASH用于版本SENTRY_CLIENT_ENVIRONMENT
:环境(dev、int、prod等)SENTRY_CLIENT_IGNORE_EXCEPTIONS
:要忽略的异常列表(逗号分隔,默认为SystemExit)SENTRY_TAG_...
:添加其他自定义标签SENTRY_LEVEL
:从哪个日志级别开始将事件发送到Sentry(默认为ERROR)SENTRY_TRACES_SAMPLE_RATE
:为了计算性能,发送到Sentry的事件百分比。值在0到1之间,默认为0。
开发者信息
您需要在机器上安装docker
(>=1.12.0)、docker-compose
(>=1.10.0)和make
才能与该项目互动。使用apt-get policy docker-engine
检查docker-engine
的可用版本,并最终使用类似于apt-get install docker-engine=1.12.3-0~xenial
的命令强制安装最新版本。
要检查和测试一切,请运行以下命令
make
确保您对版本号很严格
- 错误修复版本更改:API中没有添加、删除或更改任何内容,只是依赖项的错误修复版本号更改
- 次要版本更改:API必须保持向后兼容,并且依赖项只有次要版本号更改
- 主版本变更:API 和依赖项不向后兼容
发布版本
- 在 setup.py 中更改版本。
- 提交并推送到 master 分支。
- 标记 Git 提交。
- 在
.github/workflows/rebuild.yaml
和.github/workflows/audit.yaml
文件中添加新的分支名称。
测试
屏幕截图
要测试屏幕截图,您需要使用 npm
安装 node
,为此,请将以下行添加到您的 Dockerfile
中
RUN --mount=type=cache,target=/var/lib/apt/lists \
--mount=type=cache,target=/var/cache,sharing=locked \
apt-get install --yes --no-install-recommends gnupg \
&& . /etc/os-release \
&& echo "deb https://deb.nodesource.com/node_18.x ${VERSION_CODENAME} main" > /etc/apt/sources.list.d/nodesource.list \
&& curl --silent https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - \
&& apt-get update \
&& apt-get install --assume-yes --no-install-recommends 'nodejs=18.*' \
libx11-6 libx11-xcb1 libxcomposite1 libxcursor1 \
libxdamage1 libxext6 libxi6 libxtst6 libnss3 libcups2 libxss1 libxrandr2 libasound2 libatk1.0-0 \
libatk-bridge2.0-0 libpangocairo-1.0-0 libgtk-3.0 libxcb-dri3-0 libgbm1 libxshmfence1
要进行图像测试,请调用 check_screenshot
,例如
from c2cwsgiutils.acceptance import image
def test_screenshot(app_connection):
image.check_screenshot(
app_connection.base_url + "my-path",
width=800,
height=600,
result_folder="results",
expected_filename=os.path.join(os.path.dirname(__file__), "my-check.expected.png"),
)
贡献
安装预提交钩子
pip install pre-commit
pre-commit install --allow-missing-config
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪一个,请了解有关安装包的更多信息。
源代码分发
构建分发
c2cwsgiutils-6.0.8.tar.gz的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | b416a20a8490e30deed307811fba1b93d662c5d849fc36b0f94927f0440f2048 |
|
MD5 | 137f11acbb44b1791472a8de278b74bc |
|
BLAKE2b-256 | cbf3d0d1443b435bd2fd1bc82f33438bbcb979c630283e4a783a5745c66f4d06 |