配置 Python 收集器

安装 Instana Python 收集器后,您无需手动配置即可进行监控。 它会自动开始收集与 Python 流程相关的关键指标和分布式跟踪。 不过,您可以根据具体要求配置各个组件。

常规配置

Instana Python 包旨在成为完全无接触的 Python 监视自动解决方案,但在需要时仍完全可配置。 以下选项可用于配置此软件包。

启用 AutoProfile

AutoProfile 会自动且持续地向 Instana 生成和报告流程概要文件。 在 " 分析剖面 "部分了解有关剖面的更多信息。

要启用 AutoProfile,请设置环境变量 INSTANA_AUTOPROFILE=true。 AutoProfile 仅支持手动安装。 确保 Instana 传感器在主线程中初始化。

建立主机代理通信

Instana Python 软件包会尝试通过 IP 127.0.0.1 与 Instana 代理通信,对于容器化环境,则通过主机的默认网关进行通信。 如果这些位置都没有代理,可以使用环境变量来配置在哪里查找 Instana 主机代理。

环境变量必须在运行进程的环境中设置。

export INSTANA_AGENT_HOST = '127.0.0.1'
export INSTANA_AGENT_PORT = '42699'

另请参阅:

设置服务名称

默认情况下,Instana 会尽最大努力为您的服务进行适当命名。 如果出于某种原因想要自定义服务的命名方式,可以通过设置环境变量来实现:

export INSTANA_SERVICE_NAME=myservice

另请参阅一般参考:语言传感器的环境变量

设置进程名称

使用 INSTANA_PROCESS_NAME 来为表示 Python 进程的基础结构实体设置定制标签。

数据包配置

Instana 软件包中包含一个运行时配置模块,用于管理各种组件的配置。

随着软件包的发展,还会增加更多的选项。

from instana.configurator import config

# To enable tracing context propagation across Asyncio ensure_future and create_task calls
# Default is false
config['asyncio_task_context_propagation']['enabled'] = True

调试和更多冗余

INSTANA_DEBUG 设置为非零值可获得更多日志输出,这通常对开发和故障排除非常有用。

export INSTANA_DEBUG="true"

另请参阅一般参考:语言传感器的环境变量

禁用自动仪器

此 Instana 软件包中包含在装入包时初始化的自动检测。 此检测向 Instana 仪表板提供分布式跟踪信息。 要查看自动仪器的完整列表,请参阅支持的版本文档。

通过设置环境变量 INSTANA_DISABLE_AUTO_INSTR可抑制加载内置于跟踪器中的仪器。

export INSTANA_DISABLE_AUTO_INSTR="true"

追踪根出口跨度而不包含入口跨度

默认情况下,Instana Python Tracer 仅捕获具有活动入口跨度(entry span)的出口跨度(exit span)。 然而,在某些情况下,您需要追踪那些没有对应入口跨度而出现的出口跨度。

要配置 Tracer Python 以追踪独立退出跨度,请 INSTANA_ALLOW_ROOT_EXIT_SPAN 将环境变量设置为 1true ,如下所示:

export INSTANA_ALLOW_ROOT_EXIT_SPAN=1

此功能在以下场景中非常实用:

  • 来自不受支持的消息库的传入消息。
  • 通过不受支持的协议(如原始 Transmission Control Protocol TCP或 WebSocket )发起的请求。
  • 由其他应用程序内部启动的定时任务。
  • 脚本 Python 的执行。

Kubernetes

在该平台的某些情况下, Python 传感器可能无法自动定位和联系 Instana 主机代理。 要解决这个问题,请参阅文档中的配置代理网络访问 Kubernetes 部分。

另请参阅:

框架

您可以配置 Instana Python 收集器,以监控和收集来自以下框架的数据:

Django (手册)

设置 AUTOWRAPT_BOOTSTRAP=instana 环境变量后,必须自动检测 Django 框架并对其进行检测。 如果出于某种原因,您希望或需要手动检测 Django,那么可以改为将 instana.instrumentation.django.middleware.InstanaMiddleware 添加到 settings.py中的 MIDDLEWARE 列表:

import os
import instana

# ... <snip> ...

MIDDLEWARE = [
    'instana.instrumentation.django.middleware.InstanaMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Pyramid

从 Instana Python 3.0.0 开始,金字塔仪器将自动运行。

从 1.22.0 到 2.5.3 版开始,Instana Python 软件包包括对 Pyramid 的手动支持。 要为基于 Pyramid 的应用程序添加可见性,请完成以下步骤:

  1. 确保 instana 软件包已添加到 requirements.txt ,并已安装到虚拟环境或容器中。
  2. import instana 添加到 Pyramid 应用程序的 __init__.py 文件开头。
  3. 将 Instana Instrumentation Tween 添加到配置中。
import instana

with Configurator(settings=settings) as config:
    # ...
    config.include('instana.instrumentation.pyramid.tweens')
    # ...

下图显示了 Pyramid 配置中 Instana 仪器的示例:

金字塔

如果在 production.ini 配置中设置了 pyramid.tweens 选项,请确保 instana.instrumentation.pyramid.tweens.InstanaTweenFactory 是以下列表中的第一个条目:

pyramid.tweens =
    instana.instrumentation.pyramid.tweens.InstanaTweenFactory
    # other tweens

WSGI 和 ASGI 堆栈

Instana Python 软件包包括网络服务器网关接口(WSGI)和异步服务器网关接口(ASGI)中间件,可添加到任何兼容堆栈中。 各种堆栈均可使用自动添加功能,但对于 Instana 尚未提供自动支持的堆栈,也可以手动添加。

安装 Instana Python 软件包后,使用以下命令:

import instana

from instana.middleware import InstanaWSGIMiddleware
# or
from instana.middleware import InstanaASGIMiddleware

# Wrap the wsgi app in Instana middleware (InstanaWSGIMiddleware)
wsgiapp = InstanaWSGIMiddleware(MyWSGIApplication())

Instana 正在努力实现所有主要框架的自动仪器化,但与此同时,对于 Instana 尚未提供自动支持的堆栈,请查看一些特定的快速入门指南。

瓶 WSGI

使用以下命令对 Bottle WSGI 进行检测:

# Import Instana and the Instana WSGI middleware wrapper
import instana
from instana.middleware import InstanaWSGIMiddleware

from bottle import Bottle, run

app = Bottle()

@app.route('/hello')
def hello():
    return "Hello World!"

# Wrap the application with the Instana WSGI Middleware
app = InstanaWSGIMiddleware(app)

# Alternative method for reference
# app = InstanaWSGIMiddleware(bottle.default_app())

run(app, host='localhost', port=8080)

CherryPy WSGI

使用以下命令对 CherryPy WSGI 进行检测:

import cherrypy

# Import Instana and the Instana WSGI middleware wrapper
import instana
from instana.middleware import InstanaWSGIMiddleware

# My CherryPy application
class Root(object):
    @cherrypy.expose
    def index(self):
        return "hello world"

cherrypy.config.update({'engine.autoreload.on': False})
cherrypy.server.unsubscribe()
cherrypy.engine.start()

# Wrap the application with the Instana WSGI Middleware
wsgiapp = InstanaWSGIMiddleware(cherrypy.tree.mount(Root()))

在本例中,我们使用 uwsgi 作为网络服务器,并以

uwsgi --socket 127.0.0.1:8080 --enable-threads --protocol=http --wsgi-file mycherry.py --callable wsgiapp -H ~/.local/share/virtualenvs/cherrypyapp-C1BUba0z

其中 ~/.local/share/virtualenvs/cherrypyapp-C1BUba0z 是从 pipenv 到本地 virtualenv 的路径

猎鹰 WSGI

Falcon 框架也可以通过 WSGI 封装器进行工具化:

import falcon

# Import Instana and the Instana WSGI middleware wrapper
import instana
from instana.middleware import InstanaWSGIMiddleware

app = falcon.API()

# ...

# Wrap the application with the Instana WSGI Middleware
app = InstanaWSGIMiddleware(app)

然后,以启动堆栈 uwsgi --http :9000 --enable-threads --module=myfalcon.app 为例

基于 Gevent 的应用程序

Instana 支持基于 gevent 1.4 及更高版本的应用程序。

如果手动导入 Instana Python 包,那么请确保首先执行 gevent 导入和 Monkey 修补。

    from gevent import monkey
    monkey.patch_all()
    import instana # <--- after the gevent monkey patching of stdlib

在 Instana Python Tracer 2.5.0 之前,基于 gevent 的应用程序不得使用不修改代码激活软件包的方法(该方法使用 AUTOWRAPT_BOOTSTRAP 环境变量)。 由于 gevent 的一阶猴子修补要求(如前所述),这种方法行不通。 在这种情况下,请使用更改代码激活方法。

从 Instana Python Tracer 2.5.0 开始,当使用 AutoTrace 网络钩子无需更改代码的激活方法时,跟踪器会自动执行 monkey.patch_all() 。 您可以通过设置 INSTANA_GEVENT_MONKEY_OPTIONS 环境变量。 使用这个以逗号分隔的列表,您可以指定要从猴子补丁中包含或排除的模块,作为 MONKEY OPTIONS 给 gevent 的 gevent.monkey.main 功能。

下面的示例显示了为猴子补丁定制模块的可用选项:

export INSTANA_GEVENT_MONKEY_OPTIONS='--no-socket, --dns, --no-time, --select, --no-ssl'
export INSTANA_GEVENT_MONKEY_OPTIONS='no-socket, dns, no-time, select, no-ssl'
export INSTANA_GEVENT_MONKEY_OPTIONS='no-socket,dns,no-time,select,no-ssl'

如果将 Djangogevent 和 Instana 自动跟踪一起使用,请确保在自动跟踪启动前设置 DJANGO_SETTINGS_MODULE 环境变量。 有关 DJANGO_SETTINGS_MODULE 环境变量的更多信息,请参阅 Django 文档。

如果这种自定义程度仍然不够,则可使用更改代码激活法激活软件包。

工具

您可以配置 Instana Python 收集器,以监控和收集来自不同工具的数据。

Web 服务器

以下配置可用于监控不同的网络服务器:

uWSGI 网络服务器

确保为 uwsgi 启用 enable-threads

线程

Python 仪器会创建一个轻量级后台线程,定期收集和报告进程指标。 默认情况下,在 uWSGI 下禁用 GIL 和线程。 如果要对在 uWSGI, 下运行的应用程序进行检测,请确保通过 --enable-threads 命令(或 INI 风格的 enable-threads = true )启用线程。 更多信息,请参阅 uWSGI 文档

uWSGI 例子命令行

uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi -p 4 --enable-threads

uWSGI 示例:INI 文件

[uwsgi]
http = :5000
master = true
processes = 4
enable-threads = true # required

Gunicorn 网络服务器

要对在 Gunicorn 下运行的应用程序进行检测,请确保将 --preload 作为参数。

预装入

Python 仪器会创建一个轻量级后台线程,定期收集和报告进程指标。 默认情况下,在 Gunicorn 中分叉 Worker 后的应用程序代码进程。 如果要对在 Gunicorn 下运行的应用程序进行检测,请确保通过 --preload 命令启用预加载。 更多信息,请参阅 Gunicorn 文档

Gunicorn 示例命令行

要在预加载的情况下运行 Gunicorn,请使用本例中显示的以下命令:

gunicorn -w 4 --preload "file:app"

Gunicorn 示例配置文件

要在配置文件中使用 Gunicorn,请在 Python 文件中使用以下变量。 在 Gunicorn 命令中添加 -c file_name.py

bind = "0.0.0.0:8000"
workers = 4
preload_app = true  # required

最终用户监视 (EUM)

Instana 提供深度终端用户监控,将服务器端跟踪与浏览器事件联系起来,为您提供从服务器到浏览器的完整视图。

更多详情,请参阅最终用户监控页面。

忽略端点

从 Python Tracer 3.3.0 开始,您可以使用该功能过滤掉不必要的跟踪或调用,以减少总体数据摄取量。 例如,您可以排除对特定端点的跟踪,如 redis.get

此功能适用于以下受支持的库:

Instana Python 软件包版本
Redis >= 3.3.0
DynamoDB >= 3.3.0
Kafka >= 3.5.0

过滤规则

过滤范围的规则如下:

  • 当一个跨度被忽略时,所有后续的下游跨度也将被忽略。
  • 使用通配符 * 忽略所有端点或方法。
  • 端点值(如 Kafka 主题名称)在不同服务中保持一致。
  • 方法名称可能因编程语言和技术而异。 请参考 Instana 用户界面来确定您服务的正确方法和端点。

以下 Instana UI 屏幕截图为识别正确的配置方法和端点提供了可视化参考:

用户界面中的方法与终点
图 1。 用户界面中的方法与终点

忽略端点功能仅支持精确的方法名称。 请确保使用正确的要过滤的方法名称。 本文档使用来自 - Python send 包 Kafka 的 方法。

配置端点排除

您可以通过以下任一选项启用端点排除功能:

如果同时使用一种以上的方法, Python Tracer 会按以下顺序优先处理:环境变量、代码内配置和代理配置。

环境变量

您可以通过以下环境变量配置忽略的端点,以按服务过滤端点:

  • INSTANA_IGNORE_ENDPOINTS_PATH通过外部YAML文件配置过滤规则。
  • INSTANA_IGNORE_ENDPOINTS仅根据方法名排除代码段。
使用 INSTANA_IGNORE_ENDPOINTS_PATH

通过此环境变量,您可以像以下示例所示,通过外部 YAML 文件配置过滤规则:

INSTANA_IGNORE_ENDPOINTS_PATH=/absolute/path/to/config.yaml

在上例中,文件 config.yaml 必须采用绝对路径,并遵循指定的配置结构。

按方法过滤

要指定要排除的端点,请设置 INSTANA_IGNORE_ENDPOINTS 环境变量:

tracing:
  ignore-endpoints:
    redis:
      - get
      - type
    dynamodb:
      - query
    kafka:
      - send 

此配置过滤以下跨度:

  • GET 以及 TYPE 命令用于 Redis
  • QUERY 命令用于 DynamoDB
  • SEND 方法用于 Kafka 以及所有下游跨度

按方法和端点过滤

要指定要排除的端点,请设置 INSTANA_IGNORE_ENDPOINTS 环境变量:

tracing:
  ignore-endpoints:
    kafka: 
      - methods: ["consume"]
        endpoints: ["topic1", "topic2"]

      - methods: ["consume", "send"]
        endpoints: ["topic3"]

      - methods: ["*"] # Applied to all methods
        endpoints: ["topic4"]

      - methods: ["consume"]
        endpoints: ["*"] # Applied to all endpoints

此配置过滤以下跨度:

  • CONSUME 方法用于 topic1topic2 在 Kafka 以及所有下游跨度
  • CONSUME 以及 Kafka 在 topic3 所有下游 SEND 跨度中的方法
  • 所有位于 topic4 中的(*)方法 Kafka 以及所有下游跨度
  • CONSUME 对所有(*)主题及其 Kafka 所有下游跨度的方法

您可以在同一个配置文件中同时使用两种过滤选项(仅方法过滤和方法与端点过滤)。

此配置与代理 configuration.yaml 结构兼容。

使用 INSTANA_IGNORE_ENDPOINTS

通过此环境变量,您可以仅根据方法名排除跨度,如下例所示:

INSTANA_IGNORE_ENDPOINTS=redis:get,type

此配置过滤以下跨度:

  • GET 以及 TYPE 命令用于 Redis

要 Redis 完全过滤,可使用以下配置:

INSTANA_IGNORE_ENDPOINTS=redis

要过滤多个服务,可以使用以下配置:

INSTANA_IGNORE_ENDPOINTS=redis:get,type;dynamodb:query,scan;kafka:send

此配置过滤以下跨度:

  • GET 以及 TYPE 命令在 Redis
  • QUERY 以及 SCAN 命令在 DynamoDB
  • SEND 命令在 Kafka

代码内配置

要使用代码内配置方法忽略端点,请将以下配置传递到 src/instana/configurator.py 文件:

config["tracing"]["ignore_endpoints"] = { "redis": ["get", "type"] }

此配置将排除 包 Redis 中的 和 TYPE 命令 GET 的跟踪。

要忽略包 Redis 中的所有端点,请将以下配置传递给文件 src/instana/configurator.py

config["tracing"]["ignore_endpoints"] = { "redis": [] }

要过滤多个服务,可以使用以下配置:

config["tracing"]["ignore_endpoints"] = {
    "redis": ["get", "type"], 
    "dynamodb": ["query", "scan"], 
    "kafka": ["send"]
}

此配置过滤以下跨度:

  • GET 以及 TYPE 命令在 Redis
  • QUERY 以及 SCAN 命令在 DynamoDB
  • SEND 方法在 Kafka 以及所有下游跨度中

以下示例展示了按方法和端点进行过滤:

config["tracing"]["ignore_endpoints"] = {
    "kafka": [
        { methods: ["consume"], endpoints: ["topic1", "topic2"] },
        { methods: ["send"], endpoints: ["topic3"] }
    ]
}

此配置过滤以下跨度:

  • CONSUME 方法用于 topic1topic2 在 Kafka 以及所有下游跨度
  • SEND 方法用于 topic3 在所有下游 Kafka 跨度中

您可以在同一配置中同时使用两种过滤选项(仅方法过滤和方法与端点过滤)。

代理配置

要使用代理配置方法排除端点,请在代理 configuration.yaml 文件中添加 ignore-endpoints 配置。 更多信息,请参阅忽略端点部分。

配置 Kafka 跟踪相关性标头

通过痕迹相关性,跨度在分布式跨度创建之间保持关联关系。 例如,当启用跟踪相关性时,生产者跨度和消费者跨度将具有相同的跟踪ID。 当禁用跟踪关联时,生产者和消费者的跨度具有不同的跟踪ID,导致它们之间无法建立关联。

要完全禁用 Kafka 跟踪相关性,您可以使用以下任何配置选项:

  • 环境变量:将环境变量设置 INSTANA_KAFKA_TRACE_CORRELATIONfalse

  • 系统属性:使用以下配置:

    config["tracing"]["kafka"] = { "trace_correlation": False }
    
  • 代理配置: 在Instana主机代理级别配置跟踪 Kafka 关联选项。

有关更多信息,请参阅 Kafka 标题迁移

其他信息