跳转到主要内容

为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

将模板配置文件复制并修改到您的项目中

您应该使用您用于管理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_5ghcr.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_PRINTC2C_JSON_SORT_KEYS或属性c2c.json.pretty_printc2c.json.sort_keys配置json渲染器。默认为false

然后,如果尚未认证(使用C2C_AUTH_GITHUB_CLIENT_IDC2C_AUTH_GITHUB_CLIENT_SECRETC2C_AUTH_GITHUB_SCOPE),它将重定向用户到GitHub身份验证表单。

然后,我们将检查用户是否有权访问应用程序,为此我们将检查用户是否有足够的GitHub仓库权限(使用C2C_AUTH_GITHUB_REPOSITORYC2C_AUTH_GITHUB_REPOSITORY_ACCESS_TYPE)。

最后,我们将会在加密cookie中存储会话信息(使用C2C_AUTH_SECRETC2C_AUTH_COOKIE)。

配置细节

使用环境变量C2C_AUTH_GITHUB_REPOSITORY或配置键c2c.auth.github.repository来定义相关的GitHub仓库(必需)。

使用环境变量C2C_AUTH_GITHUB_ACCESS_TYPE或配置键c2c.auth.github.access_type来定义所需的访问类型可以是pullpushadmin(默认是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_URLc2c.redis_url)或 C2C_REDIS_SENTINELS,则覆盖将存储在 Redis 中。

数据库维护

您可以使用环境变量 C2C_DB_MAINTENANCE_VIEW_ENABLED 启用一个视图来强制使用从引擎。然后,可以使用 {C2C_BASE_PATH}/db/maintenance?secret={C2C_SECRET}&readonly=true 将数据库设置为“只读”。如果配置了 C2C_REDIS_URLc2c.redis_url)或 C2C_REDIS_SENTINELS,则当前状态将存储在 Redis 中。

请求跟踪

为了跟踪所有服务(考虑为单独的进程)生成的请求日志,c2cwsgiutils 试图标记每一项请求 ID。此字段可以来自输入请求头部(如 X-Request-IDX-Correlation-IDRequest-IDX-Varnish)或默认为 UUID。您可以通过定义环境变量 C2C_REQUEST_ID_HEADERc2c.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配置。从引擎(只读)将自动用于GETOPTIONS请求,而主引擎(读写)将用于其他查询。

要使用它,您的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_slaveforce_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_typeanalyze_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单实例的URL
  • C2C_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

项目详情


发布历史 发布通知 | RSS 源

下载文件

下载适用于您的平台的文件。如果您不确定选择哪一个,请了解有关安装包的更多信息。

源代码分发

c2cwsgiutils-6.0.8.tar.gz (106.3 kB 查看散列值)

上传时间 源代码

构建分发

c2cwsgiutils-6.0.8-py3-none-any.whl (117.1 kB 查看散列值)

上传时间 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面