Python应用监控

对于部署在ACK集群中的Python应用(例如使用Django、Flask、FastAPI框架构建的Web应用或基于LlamaIndex、Langchain等开发的AI、LLM应用),通过安装ack-onepilot组件并调整Dockerfile,即可利用应用实时监控服务 ARMS(Application Real-Time Monitoring Service)实现应用性能监控,包括应用拓扑、链路追踪、接口调用分析、异常检测等功能以及针对大型模型交互过程中的细致跟踪记录。

前提条件

步骤一:安装ARMS应用监控接入组件ack-onepilot

重要

ACK旧版应用监控组件arms-pilot已不再维护,您可以安装升级后的ack-onepilot组件用于监控您的应用,ack-onepilot完全兼容arms-pilot,您无需修改应用配置即可无缝接入ack-onepilot。更多信息,请参见如何安装ack-onepilot和卸载arms-pilot

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

  3. 组件管理页面,搜索关键字ack-onepilot

    重要

    请确保ack-onepilot的版本为3.2.4及以上。

  4. ack-onepilot卡片上单击安装,并在弹出的页面中可以配置相关的参数,建议使用默认值,然后单击确定

    说明

    ack-onepilot组件默认支持1000个Pod规模,集群Pod每超过1000个,ack-onepilot资源对应的CPU请增加0.5核、内存请增加512MB。

    安装完成后,您可以在组件管理页面升级、配置或卸载ack-onepilot组件。

步骤二:授予ARMS资源的访问权限

  • 如需监控ACK集群应用,但ACK集群中不存在addon.arms.token,请执行以下操作手动为集群授予ARMS资源的访问权限。如果已经存在addon.arms.token,则无需执行授权操作。

    说明

    当ACK集群中存在addon.arms.token时,ARMS能够自动完成免密授权过程。通常情况下,ACK托管集群默认配备了addon.arms.token。然而,对于一些较早创建的ACK托管集群来说,可能存在缺少addon.arms.token的情形。

    1. 检查addon.arms.token是否存在。

      查看集群是否存在addon.arms.token

      1. 登录容器服务管理控制台,在左侧导航栏选择集群

      2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择配置管理 > 保密字典

      3. 保密字典页面,选择命名空间kube-system,查看addon.arms.token是否存在。

    2. 如果addon.arms.token存在,无需执行后续授权操作。否则,请执行以下操作手动为集群授予ARMS资源的访问权限。

      1. 登录容器服务管理控制台,在左侧导航栏选择集群

      2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择集群信息

      3. 基本信息页签下,单击集群资源区域内的Worker RAM角色右侧的链接。

      4. 角色页面的权限管理页签上,单击新增授权

      5. 选择权限为AliyunARMSFullAccess,然后单击确定

  • 如需监控对接了ECI的ACK托管集群应用,请在云资源访问授权页面完成授权,然后重启ack-onepilot组件下的所有Pod。

步骤三:集成ARMS Python探针至Dockerfile

修改Dockerfile,在您的Python应用程序中集成ARMS Python探针,以启动Python应用。

  1. 从PyPI仓库下载探针安装器。

    pip3 install aliyun-bootstrap
  2. 使用aliyun-bootstrap安装探针。

    aliyun-bootstrap -a install
  3. 通过ARMS Python探针启动应用。

    aliyun-instrument python app.py
  4. 构建镜像。

完整的Dockerfile示例如下:

    修改前的Dockerfile

    # 使用Python 3.10基础镜像
    FROM docker.m.daocloud.io/python:3.10
    
    # 设置工作目录
    WORKDIR /app
    
    # 复制requirements.txt文件到工作目录
    COPY requirements.txt .
    
    # 使用pip安装依赖
    RUN pip install --no-cache-dir -r requirements.txt
    
    COPY ./app.py /app/app.py
    # 暴露容器的8000端口
    EXPOSE 8000
    CMD ["python","app.py"]

    修改后的Dockerfile

    # 使用官方的Python 3.10基础镜像
    FROM docker.m.daocloud.io/python:3.10
    
    # 设置工作目录
    WORKDIR /app
    
    # 复制requirements.txt文件到工作目录
    COPY requirements.txt .
    
    # 使用pip安装依赖
    RUN pip install --no-cache-dir -r requirements.txt
    #########################安装aliyun python 探针###############################
    RUN pip3 install aliyun-bootstrap && aliyun-bootstrap -a install
    ##########################################################
    
    COPY ./app.py /app/app.py
    
    
    # 暴露容器的8000端口
    EXPOSE 8000
    #########################################################
    CMD ["aliyun-instrument","python","app.py"]

步骤四:启用Python应用的ARMS应用监控

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  3. 在目标应用的右侧选择更多 > 查看Yaml

  4. 在YAML文件中将以下labels添加到spec.template.metadata层级下。

    labels:
      aliyun.com/app-language: python # Python应用必填,标明此应用是Python应用。
      armsPilotAutoEnable: 'on'
      armsPilotCreateAppName: "<your-deployment-name>"    #应用在ARMS中的展示名称

    image

    创建无状态(Deployment)应用并开启ARMS应用监控的完整YAML示例模板如下:

    展开查看完整示例YAML文件

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: arms-python-client
      name: arms-python-client
      namespace: arms-demo
    spec:
      progressDeadlineSeconds: 600
      replicas: 1
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: arms-python-client
      strategy:
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 25%
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: arms-python-client
            aliyun.com/app-language: python # Python应用必填,表示此应用是Python应用。
            armsPilotAutoEnable: 'on'
            armsPilotCreateAppName: "arms-python-client"    # 应用在ARMS中的展示名称。
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/arms-default/python-agent:arms-python-client
              imagePullPolicy: Always
              name: client
              resources:
                requests:
                  cpu: 250m
                  memory: 300Mi
              terminationMessagePath: /dev/termination-log
              terminationMessagePolicy: File
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
    
    ---
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: arms-python-server
      name: arms-python-server
      namespace: arms-demo
    spec:
      progressDeadlineSeconds: 600
      replicas: 1
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: arms-python-server
      strategy:
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 25%
        type: RollingUpdate
      template:
        metadata:
          labels:
            app: arms-python-server
            aliyun.com/app-language: python # Python应用必填,表示此应用是Python应用。
            armsPilotAutoEnable: 'on'
            armsPilotCreateAppName: "arms-python-server"    # 应用在ARMS中的展示名称。
        spec:
          containers:
            - env:
              - name: CLIENT_URL
                value: 'http://arms-python-client-svc:8000'
              image: registry.cn-hangzhou.aliyuncs.com/arms-default/python-agent:arms-python-server
              imagePullPolicy: Always
              name: server
              resources:
                requests:
                  cpu: 250m
                  memory: 300Mi
              terminationMessagePath: /dev/termination-log
              terminationMessagePolicy: File
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
    
    ---
    
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: arms-python-server
      name: arms-python-server-svc
      namespace: arms-demo
    spec:
      internalTrafficPolicy: Cluster
      ipFamilies:
        - IPv4
      ipFamilyPolicy: SingleStack
      ports:
        - name: http
          port: 8000
          protocol: TCP
          targetPort: 8000
      selector:
        app: arms-python-server
      sessionAffinity: None
      type: ClusterIP
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: arms-python-client-svc
      namespace: arms-demo
    spec:
      internalTrafficPolicy: Cluster
      ipFamilies:
        - IPv4
      ipFamilyPolicy: SingleStack
      ports:
        - name: http
          port: 8000
          protocol: TCP
          targetPort: 8000
      selector:
        app: arms-python-client
      sessionAffinity: None
      type: ClusterIP
    

步骤五:查看监控详情

  1. 等待约一分钟后,在ARMS控制台应用监控 > 应用列表页面查看Python应用及其上报的数据。

    image

  2. 单击应用名称,进入ARMS控制台的应用监控页面查看监控详情。更多信息,请参见应用总览

(可选)步骤六:释放资源

您不再需要使用ARMS监控您的Python应用时,可以通过卸载ARMS Python探针停止监控。具体操作,请参见卸载Python探针

相关文档

如需了解如何将ACK集群下的Java应用或Golang应用接入ARMS应用监控,请参见Java应用监控Golang应用监控