Skip to content
大纲

Python应用接入

1. 前提条件

1.1. 安装

python >=3.x

下载 https://szfos.flyme.com/flyme-fcop-metrics-sdk-python/latest/flyme_metrics_sdk_python-latest-py3-none-any.whl

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"]