通過本教程,您將學習如何將ACK集群下的Python應用接入ARMS應用監控,體驗應用性能分析和調用鏈分析等功能,并配置告警。
如需將其他環境下的應用接入應用監控,請參見應用接入。
使用流程
為應用安裝探針。
安裝ack-onepilot組件:ack-onepilot是阿里云容器服務Kubernetes提供的系統組件,可以讓部署在容器服務Kubernetes中的Java、Golang或Python應用接入ARMS。
更新Dockerfile:下載aliyun-bootstrap探針安裝器,安裝探針后使用探針啟動Python應用。
更新YAML:通過在應用的YAML中添加
labels
,開啟監控并配置應用在ARMS中的展示名稱。
查看監控數據。
為監控數據配置告警。
準備環境和資源
ACK:
創建Kubernetes集群。具體操作,請參見創建ACK托管集群。
創建Python應用。
Python版本要求,請參見Python探針兼容性要求。
Python應用需使用Gunicorn啟動,例如:
gunicorn -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000 app:app
如果有使用gevent協程,則需要設置環境變量
GEVENT_ENABLE=true
。
如果您沒有可以使用的Python應用,可以參考以下示例YAML創建。具體操作,請參見創建無狀態工作負載Deployment。
說明示例YAML創建了以下資源:
空間名稱:arms-demo。以下所有資源均創建在arms-demo命名空間下。
無狀態應用:arms-python-client和arms-python-server。
服務:arms-python-client-svc和arms-python-server-svc。
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 spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/private-mesh/arms-python-demo: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 spec: containers: - env: - name: CLIENT_URL value: 'http://arms-python-client-svc:8000' - image: registry.cn-hangzhou.aliyuncs.com/private-mesh/arms-python-demo: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 uid: 91f94804-594e-495b-9f57-9def1fdc7c1d 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
其中,arms-python-server和arms-python-client的應用代碼分別為:
from fastapi import FastAPI from langchain.llms.fake import FakeListLLM import uvicorn from langchain.chains import LLMChain from langchain.prompts import PromptTemplate app = FastAPI() llm = FakeListLLM(responses=["I'll callback later.", "You 'console' them!"]) template = """Question: {question} Answer: Let's think step by step.""" prompt = PromptTemplate(template=template, input_variables=["question"]) llm_chain = LLMChain(prompt=prompt, llm=llm) question = "What NFL team won the Super Bowl in the year Justin Beiber was born?" @app.get("/") def call_langchain(): res = llm_chain.run(question) return {"data": res} if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000)
import uvicorn from fastapi import FastAPI, HTTPException from logging import getLogger _logger = getLogger(__name__) import requests import os app = FastAPI() def call_client(): url = 'https://www.aliyun.com' # 替換為你的實際地址 call_url = os.environ.get("CLIENT_URL") if call_url is None or call_url == "": call_url = url response = requests.get(call_url) print(f"response code: {response.status_code} - {response.text}") return response.text @app.get("/") async def call(): call_client() return {"data": f"call"} if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000)
ARMS:
已開通應用監控計費版本。
應用監控每月提供50 GB的免費額度,當月未使用完的試用額度不會結轉至次月,當月超出免費額度的部分,按照寫入的數據量進行收費。收費詳情,請參見計費說明。
為應用安裝探針
1. 安裝ack-onepilot組件
在容器服務管理控制臺的集群列表頁面單擊目標集群名稱。
在左側導航欄選擇
,然后在右側頁面通過關鍵字搜索ack-onepilot。在ack-onepilot卡片上單擊安裝,然后在彈出的對話框單擊確定。
說明確保ack-onepilot版本在3.2.4及以上。
2. 更新Dockerfile
從PyPI倉庫下載探針安裝器。
pip3 install aliyun-bootstrap
使用aliyun-bootstrap安裝探針。
aliyun-bootstrap -a install
通過ARMS Python探針啟動應用。
aliyun-instrument 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
COPY ./app.py /app/app.py
# 暴露容器的8000端口
EXPOSE 8000
CMD ["python","app.py"]
# 使用官方的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"]
3. 更新YAML
在
頁面選擇應用所在的命名空間,然后在目標應用右側選擇 。在編輯YAML中將以下
labels
添加到spec.template.metadata層級下,然后單擊更新。labels: aliyun.com/app-language: python # Python應用必填,標明此應用是Python應用。 armsPilotAutoEnable: 'on' armsPilotCreateAppName: "<your-deployment-name>" #應用在ARMS中的展示名稱。
例如,在arms-python-client和arms-python-server應用的YAML中添加配置,開啟監控并配置在ARMS中的展示名稱分別為arms-python-client和arms-python-server。
arms-python-client應用
arms-python-server應用
待容器完成自動重新部署后,等待1~2分鐘,在ARMS控制臺的 頁面單擊應用名稱,查看應用的監控指標。更多信息,請參見查看監控詳情(新版)。
查看監控詳情
調用鏈分析
微服務場景:
調用鏈分析功能可以通過自由組合篩選條件與聚合維度進行實時分析,并支持通過錯/慢Trace分析功能,定位系統或應用產生錯、慢調用的原因。
調用鏈詳情:
針對大模型場景,您可以查看LLM領域的新版TraceView,更直觀地分析不同操作類型的輸入輸出、Token消耗等信息。
切換為大模型視圖:
大模型調用信息:
監控指標
應用概覽
應用拓撲
配置告警
通過配置告警,您可以制定針對特定應用的告警規則。當告警規則被觸發時,系統會以您指定的通知方式向告警聯系人或釘群發送告警信息,以提醒您采取必要的解決措施。具體操作,請參見應用監控告警規則。
釋放資源
完成教程后:
如果仍需要繼續監控當前應用,請確保賬戶不要欠費。
如果無需繼續監控當前應用,請卸載探針。具體操作,請參見卸載Python探針。
相關文檔
ARMS應用監控支持在應用的業務日志中關聯調用鏈的TraceId信息,從而在應用出現問題時,能夠通過調用鏈的TraceId快速關聯到業務日志,及時定位、分析并解決問題。更多信息,請參見業務日志關聯調用鏈的TraceId信息。
阿里云可觀測監控 Prometheus 版默認集成了ARMS應用監控數據源,您可以直接在可觀測監控 Prometheus 版下獲取應用監控相關數據、查看應用監控預置大盤,并根據需求進行二次開發。更多信息,請參見通過Prometheus監控獲取ARMS應用監控數據。