camptocamp wsgi应用程序的通用实用程序

c2cwsgiutils的Python项目详细描述


camptocamp wsgi实用程序

<表><广告>分支 <词>要求 静态分析 < /广告><正文>大师级构建主节点需求主Codacy徽章释放装置3构建发布嫘1需求发布3版本2(不推荐)构建发布庘1需求发布'src=

这是一个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-idx-correlation-idrequest-idx-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-idhttp头。请求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_profilerlogger。

不要在繁忙的生产系统上启用此功能。它会扼杀你的表演。

剖面仪

如果设置了环境变量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_slaveforce_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_urlc2c.redis_url):要使用的redis实例的url
  • c2c_broadcast_prefixc2c.broadcast_prefix):要添加到正在使用的频道的前缀(必须是 两种服务不同)

如果未配置,则仅影响接收请求的进程。

cors

要使用符合CORS的视图,请按如下方式定义视图:

pip install c2cwsgiutils
1

异常处理

默认情况下,c2cwsgiutils将安装异常处理视图,该视图将捕获 应用程序查看并将其转换为json响应,其http状态与错误对应。

您可以通过将c2c_disable_exception_handlingc2c.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 urlc2c.sentry_url)指向项目的公共DSN。

其他一些环境变量可用于调整随每个报告一起发送的信息:

  • 哨兵排除c2c.sentry.excludes):要排除哨兵的伐木者列表(冒号分隔,不带空格)
  • git_hashc2c.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映像 每晚都有版本。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java类。getConstructor找不到兼容的构造函数   java单元测试自定义输入和输出格式   javascript Java UI线程内存不足错误被阻止   多线程在Java并发API中从线程池中选择线程的逻辑是什么?   java在MySQL数据库上存储歌曲(BLOb支持)   java快速且可扩展的IO传递   jsf c:forEach-inside-primeface(例如p:panelgrid)inside-ui:repeat   tomcat与JavaServlet3.0文件上传,如何获取maxfilesize值   java JNI,加载2次相同的dll(不同的名称),如何选择使用哪一个?   java将InputStream复制到OutputStream将停止,除非我也向系统写入。出来   java Set反向安全约束   比如在java中使用整数时?   java使用@接口抑制IntelliJ中的某些警告   java我的ASCII艺术在JLabel上是错误的   JavaSpring工具源代码(或带有SpringIde的Eclipse)崩溃   向片段添加ListView时出现java错误   循环Java循环错误需要重新审视   JavaAspectJ:匹配GenericServlet。带注释子类实例的init()调用