Appearance
Python应用接入
1. 前提条件
1.1. 安装
python >=3.x
Shell
pip install --force-reinstall flyme_metrics_sdk_python-latest-py3-none-any.whl
1.2. 环境变量
ROJECT_NAME
在Flyme云 FCOP 开通的应用名称
PROJECT_LICENSE_KEY
在Flyme云 FCOP 开通生成的秘钥
Flyme云 、AI中台部署 的 ECI 应用,不需要设置,可以绑定使用。
2. SDK使用
前提:初始化
环境变量为metrics-sdk-python必须设置的参数,上面介绍过2个环境变量的使用。
也可以通过 api 设置:
Python
from com.flyme.metrics.otel import MetricsSDK
# 应用服务版本
MetricsSDK.set_global_config(project_version=_your_app_version.version)
# 初始化
MetricsSDK.initialize()
推荐使用以上API设置你的PROJECT_VERSION
,这样可以动态获取项目版本。
API 比 环境变量 优先级高
2.1. 指标Metrics
业务只需要 调用 MetricsPlugin
的api 即可埋点,已经封装了一些常用的组件埋点标准。
MetricsPlugin
的第一个参数time_consuming_seconds
是 耗时(秒/s) ,第二个参数是 tag
,即埋点****指标的标签
简单来说就是:
Python
from com.flyme.metrics.plugin.api_metrics import MetricsPlugin
# tag
from com.flyme.metrics.plugin.function import FunctionTag
from com.flyme.metrics.plugin.http import HttpServerTag, HttpClientTag
from com.flyme.metrics.plugin.redis import RedisTag
from com.flyme.metrics.plugin.sql import SqlTag
from com.flyme.metrics.plugin.rpc import RpcServerTag, RpcClientTag
start_time = time.time()
"""
你的逻辑代码 xxx
"""
end_time = time.time()
# 埋点
MetricsPlugin.metrics_xxxx(end_time - start_time, xxxx_tag)
HTTP
flask、fastapi、Django 可以使用 middleware 进行埋点
HTTP服务端
Python
# 作为HTTP服务端 ,埋点哪些接口被调用
# 自定义 慢http请求 时间, 即超过 5s ,即会记录为一条慢HTTP请求; 默认是 3s
HttpServerConfig.config_slow_http_server_time_seconds(5)
start_time = time.time()
# 指标的标签
tag = HttpServerTag(request_uri="/get/user", request_method="GET",exception="具体异常",status_code="200")
# your method
# tag.exception = "valueError" 根据具体情况设置
# tag.status_code="200"
end_time = time.time()
MetricsPlugin.metrics_http_server(end_time - start_time, tag)
HTTP客户端
Python
# 作为HTTP客户端端 ,记录调用了哪些第三方接口
start_time = time.time()
tag = HttpClientTag(request_uri="/get/gpt/response", request_method="GET", server_name="chatgpt")
# 调用第三方API接口
# response = getFromGPT_ok_http("https://chatgpt.com/open/api" , "GET")
# tag.status = response.status
# tag.exception = response.exception
end_time = time.time()
# 记录耗时,标签
tag.client = MetricsPlugin.metrics_http_client(end_time - start_time, tag)
SQL
Python
# SQL
# 自定义 慢SQL 时间, 即超过 10s ,即会记录为一条慢SQL;默认是 5s
SqlConfig.config_slow_sql_time_seconds(10)
# sql 必须是预编译的
sql_tag = SqlTag(sql="select count(*) from testDB.t_test where id = %s", db_type="MySQL", operate_type="select",
db_host="localhost", db_port="3306", db="testDB")
MetricsPlugin.metrics_sql(end_time - start_time, sql_tag)
Redis
Python
redis_tag = RedisTag(redis_cmd="get", redis_host="127.0.0.1", redis_type="aioredis")
MetricsPlugin.metrics_redis(end_time - start_time, redis_tag )
RPC
RPC Server
Python
# RPC Server
# 当前应用作为 rpc 服务端 , uc-cloud 应用调用了我,它的 ip 是 192.168.0.1 。 耗时是 0.02 秒
rpc_server_tag = RpcServerTag(service_class="com.flyme.api.pay.payservice", service_method="pay",
origin_app="uc-cloud",
origin_ip="192.168.0.1", rpc_type="grpc", exception="NoneTypeException")
MetricsPlugin.metrics_rpc_server(end_time - start_time, rpc_server_tag)
RPC Client
Python
# RPC Client
# 当前应用作为 rpc 客户端 , 我调用了 pay-app 服务端,它的 ip 是 192.168.0.2 ,耗时是 0.005 秒
rpc_client_tag = RpcClientTag(service_class="com.flyme.api.pay.payservice", service_method="pay",
dest_app="pay-app",
dest_ip="192.168.0.2", rpc_type="grpc")
MetricsPlugin.metrics_rpc_client(end_time - start_time, rpc_client_tag)
Function
function 用作方法埋点,以上场景不满足的情况下,可以使用该埋点方法耗时
Python
# function
function_tag = FunctionTag(function_name="generateModule",exception="你的异常")
# generateModule()
# tag.exception = "validParameterError" 可以根据实际的异常记录
MetricsPlugin.metrics_function(end_time - start_time, function_tag)
自定义指标
sdk 支持自定义指标埋点,共提供四种类型的制度量:
- Histogram(直方图),常用于记录请求延迟、响应时间等指标
- Counter(计数器):一个不断递增的整数值,如请求的数量、错误的次数等
- UpDownCounter(增减计数器):它既可以递增也可以递减,适用于记录增减型的指标,如当前连接数、任务队列长度等
- Gauge(测量值):即时的数值,用于表示某个瞬时状态或数值,如内存使用率、CPU 占用率等
使用例子:
python
metricsSDK = MetricsSDK.initialize()
tags = {
"uri": "/get/users",
"method": "GET"
}
# histogram
histogram = metricsSDK.create_histogram(metrics_name="agent.rpc.server.requests", unit="seconds")
histogram.record(2)
histogram.record(2.5)
# counter
counter = metricsSDK.create_counter(metrics_name="agent.http.server.requests", unit="seconds")
counter.record(1)
counter.record(2)
# UpDownCounter
up_down_counter = metricsSDK.create_up_down_counter(metrics_name="agent.http.server.thread.nums", unit="")
up_down_counter.record(10)
up_down_counter.record(-3)
# gauge
gauge = metricsSDK.create_gauge(metrics_name="agent.http.server.request.max", unit="")
gauge.record(9.99, tags)
tags['uri'] = "/metrics/agent"
gauge.record(9.88, tags)
2.2. 链路Trace
python
def do_work():
# 父层 链路
with MetricsSDK.get_tracer().start_as_current_span(name="parent", kind=SpanKind.SERVER) as parent:
# 获取span 添加自定义内键值对
current_span = trace.get_current_span()
current_span.set_attribute("function", "do_work - parent")
# 子层 链路
with MetricsSDK.get_tracer().start_as_current_span("child") as child:
current_span = trace.get_current_span()
current_span.set_attribute("function", "do_work - child")
2.3. 日志Log
sdk同时提供了一个日志配置
你可以使用该 logger(from com.flyme.metrics.common.log import logger
)直接打印日志
默认写入到 /data/log/app/server.log
,级别为INFO
,以天为单位归档。强烈推荐使用
使用方式:
YAML
from logging
from com.flyme.metrics.common.log import logger
#你也可以自定义日志的路径和级别,默认是 /data/log/app/server.log
#MetricsSDK.config_log("/data/log/app/", "server.log", logging.INFO)
#MetricsSDK.initialize()
# 和普通的 logger、logging 一样的用法
logger.info("xxxxx")
日志样例如下:
YAML
2024-05-17 16:25:25,967 [INFO ] [] - [186408] - [MainThread] - [log.py ][68 ] : use metrics-sdk log config , see log : /data/log/app/server.log
2024-05-17 16:25:26,362 [WARNING] [] - [186408] - [MainThread] - [otel_sdk_config.py ][107] : use MetricsConfig.config() setting will replace ENV , recommend using ENV to set 'project_name' and 'project_license_key'
2024-05-17 16:25:26,882 [INFO ] [] - [186408] - [MainThread] - [nacos.py ][65 ] : [add-naming-instance] ip:172.16.40.25, port:8073, service_name:metrics-sdk-python-local, namespace:one-agent, server response:b'ok'
2024-05-17 16:25:27,149 [INFO ] [] - [186408] - [MainThread] - [otel_sdk_config.py ][321] : fcop config lists,project_name : metrics-sdk-python-local,project_license_key : mce,project_version : 1.0.0,sidecar endpoint : http://172.16.187.55:4317
2024-05-17 16:25:27,149 [INFO ] [] - [186408] - [MainThread] - [otel_sdk_config.py ][325] : metrics-sdk init successfully , use flyme-fcop-python-meter-sdk and flyme-fcop-python-tracer-sdk
3. 打包说明
以下是一个 flask 应用的 dockerfile demo :
Dockerfile
FROM python:3.8-slim
COPY ./ /app/
WORKDIR /app/python-business-demo-web
# 环境变量,AI中台部署不需要
ENV PROJECT_NAME=python-business-demo-web
ENV PROJECT_LICENSE_KEY=mce
# 应用版本 建议使用 SDK api 设置
ENV PROJECT_VERSION="1.0.2-beta"
# 下载sdk
RUN apt update \
&& apt install wget -y \
&& wget --no-cache https://szfos.flyme.com/flyme-fcop-metrics-sdk-python/latest/flyme_metrics_sdk_python-latest-py3-none-any.whl
# 安装 本地 的 metrics-sdk-python 以及 依赖包
RUN pip install --force-reinstall ./flyme_metrics_sdk_python-latest-py3-none-any.whl \
&& pip install --no-cache-dir -r requirements.txt \
&& pip install gunicorn
WORKDIR /app/python-business-demo-web/web
CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8080", "main:app"]