文档简介:
简介
权限说明
设置应用性能观测


查看函数应用性能观测配置

查看函数及所在业务系统健康情况
查看函数所在业务系统健康情况

函数调用链路分析




SCF 自定义参数及含义
Key
|
含义
|
示例
|
fass.status_code
|
函数执行 状态码。
|
200
|
component
|
固定字段,填 scf。
|
scf
|
faas.namespace
|
函数所在命名空间。
|
default
|
faas.alias
|
触发的函数别名,可能为空。
|
$DEFAULT
|
faas.version
|
触发的函数版本。
|
$LATEST
|
faas.runtime
|
函数运行环境。
|
Python3.6
|
faas.trigger
|
函数触发源。
|
YUNAPI
|
faas.request_id
|
函数请求 id。
|
97fa4d93-xxxx-xxxx-xxxx-66e60cdcb977
|
faas.async_execution
|
异步执行函数标识,true 表示是,false 表示否。
|
false
|
faas.websocket
|
websocket 函数标识,true 表示是,false 表示否。
|
false
|
faas.function_type
|
函数类型,事件函数或 Web 函数。
|
Event
|
faas.region
|
函数所在地域,参考函数 支持地域。
|
ap-guangzhou
|
faas.retrynum
|
请求重试次数。
|
0
|
faas.coldstart
|
是否为冷启动调用,true 表示是,false 表示否。
|
true
|
自定义埋点上报
获取 TraceId
自定义上报 Span
'use strict';const initTracer = require('jaeger-client').initTracer;const spanContext = require('jaeger-client').SpanContext;function sleep (time) {return new Promise((resolve) => setTimeout(resolve, time));}const config = {serviceName: 'namespace/functionname', // 服务名称,根据业务需要自行修改,
对应 APM 业务系统中的应用名称,SCF 默认上报应用名称命名规范为 命名空间/函数名称
sampler: {type: 'const',param: 1},reporter: {logSpans: true,collectorEndpoint: 'http://ap-shanghai.apm.tencentcs.com:14268/api/traces' //应用性能观测配置中的接入点信息}};const options = {tags: {token: 'IJc**************aQ'//应用性能观测配置中的 Token 信息}};// ******** 初始化 tracer 实例对象 ********const tracer = initTracer(config, options);exports.main_handler = async (event, context) => {// ******** 获取 context 中 trace 信息,未启用应用性能观测状态下,该信息不存在 ********const obj = JSON.parse(context['function_trace'])const TraceId = obj['Uber-Trace-Id'][0]// ******** 自定义创建一个子 span,命名为 custom-span ********const ScfSpanContext = spanContext.fromString(TraceId)const span = tracer.startSpan('custom-span', {childOf: ScfSpanContext})sleep(200).then(() => {console.log("custom span");// ******** 标记 Span 结束 ********span.finish();tracer.close();})// ******** 自定义设置 span 的标签(可选,支持多个)********//span.setTag('span.kind', 'server');//span.setTag('tagName', 'tagValue');//span.log({ event: 'timestamp', value: Date.now() });return ("hello from SCF");}
4. 函数调用后,各 Span 信息会上报至指定的 APM 业务系统。
Python
注意
Jaeger 最新版 Python SDK 已经不支持 HTTP 协议上报,因此在 Python 运行环境下,推荐使用 Open Telemetry SDK。
Open Telemetry SDK 仅支持 Python 3.7 及以上版本,本文提供基于镜像部署的自定义上报示例。
请参考 使用镜像部署函数 完成前提条件准备。
参考以下示例代码准备镜像函数源码。
index.py
from flask import Flask, request
import time
from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.resources import Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.trace import NonRecordingSpan, SpanContext, TraceFlags
from opentelemetry.trace import set_span_in_context
class OpenTelemetrySLSProvider(object):
def __init__(self, service="", token="", endpoint=""):
'''
:param service: Your Application Service Name
:param service: server name
:param token: scf project
'''
self.sls_otel_endpoint = endpoint
self.resource = Resource(attributes={
"service.name": service,
"token": token})
def initTracer(self):
trace.set_tracer_provider(TracerProvider(resource=self.resource))
otlp_exporter = OTLPSpanExporter(endpoint=self.sls_otel_endpoint)
trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(otlp_exporter))
server = "namespace/functionname" # 服务名称,根据业务需要自行修改,对应 APM 业务系统中的应用名称,SCF 默认上报应用名称命名规范为 命名空间/函数名称
endpoint = "ap-shanghai.apm.tencentcs.com:4317" # 应用性能观测配置中的接入点信息
instance = "apm-Q*******Q" # 应用性能观测配置中的业务系统 ID 信息
token = "Tr***********a" # 应用性能观测配置中的 Token 信息
# ******** 初始化 tracer 实例对象 ********
sls_ot_provider = OpenTelemetrySLSProvider(service=server, token=token, endpoint=endpoint)
sls_ot_provider.initTracer()
tracer = trace.get_tracer("__name__")
app = Flask(__name__)
# ******** 事件函数 ********
@app.route('/event-invoke', methods=['POST'])
def invoke():
# ******** 获取请求 header 中 trace 信息,未启用应用性能观测状态下,该信息不存在 ********
TraceId = request.headers.get("Uber-Trace-Id", "")
SCF_span = TraceId.split(":")
tid = int(SCF_span[0], 16)
sid = int(SCF_span[1], 16)
fid = int(SCF_span[3], 16)
span_context = trace.SpanContext(
trace_id=tid,
span_id=sid,
is_remote=True,
trace_flags=trace.TraceFlags(fid),
)
ctx = trace.set_span_in_context(NonRecordingSpan(span_context))
# ******** 自定义创建一个子 span,命名为 custom-span ********
child = tracer.start_span("custom-span", context=ctx)
time.sleep(0.2)
print("child")
# ******** 标记 Span 结束 ********
child.end()
return "hello from SCF"
# ******** Web 函数 ********
@app.route('/web-invoke/python-flask-http', methods=['POST', 'GET'])
def web_invoke():
# ******** 获取请求 header 中 trace 信息,未启用应用性能观测状态下,该信息不存在 ********
TraceId = request.headers.get("Uber-Trace-Id", "")
SCF_span = TraceId.split(":")
tid = int(SCF_span[0], 16)
sid = int(SCF_span[1], 16)
fid = int(SCF_span[3], 16)
span_context = trace.SpanContext(
trace_id=tid,
span_id=sid,
is_remote=True,
trace_flags=trace.TraceFlags(fid),
)
ctx = trace.set_span_in_context(NonRecordingSpan(span_context))
# ******** 自定义创建一个子 span,命名为 custom-span ********
child = tracer.start_span("custom-span", context=ctx)
time.sleep(0.2)
print("child")
# ******** 标记 Span 结束 ********
child.end()
return "hello from SCF"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9000)
requirements.txt
Flask==1.1.2
opentelemetry-api==1.7.1
opentelemetry-exporter-jaeger==1.7.1
opentelemetry-exporter-jaeger-proto-grpc==1.7.1
opentelemetry-exporter-jaeger-thrift==1.7.1
opentelemetry-exporter-otlp==1.7.1
opentelemetry-instrumentation-flask==0.26b1
opentelemetry-instrumentation-requests==0.26b1
opentelemetry-sdk==1.7.1
opentelemetry-semantic-conventions==0.26b1
dockerfile
FROM python:3.7.12-slim
WORKDIR /usr/src/app
COPY ./requirements.txt ./
RUN python -m pip install --upgrade pip && pip install --no-cache-dir -r ./requirements.txt
COPY . .
CMD [ "python", "-u", "./index.py" ]
将步骤2中的 index.py、requirements.txt、dockerfile 文件放在同一目录下,参考 使用控制台创建函数 完成镜像构建与函数创建。上述示例代码执行后上报的链路详情如下: