推荐服务
此服务负责根据用户正在浏览的现有产品 ID,获取用户推荐产品的列表。
自动仪表化
此基于 Python 的服务利用 OpenTelemetry 的 Python 自动插桩器,通过使用 opentelemetry-instrument Python 包装器来运行脚本。这可以在服务的 Dockerfile 的 ENTRYPOINT 命令中完成。
ENTRYPOINT [ "opentelemetry-instrument", "python", "recommendation_server.py" ]
追踪
初始化追踪
OpenTelemetry SDK 在 __main__ 代码块中初始化。这段代码将创建一个跟踪器提供程序,并建立一个 Span Processor 来使用。导出终结点、资源属性和服务名称将由 OpenTelemetry 自动插桩器根据环境变量自动设置。
tracer = trace.get_tracer_provider().get_tracer("recommendation")
为自动仪表化的 Span 添加属性
在自动仪表化代码的执行过程中,您可以从上下文中获取当前的 Span。
span = trace.get_current_span()
通过 Span 对象的 set_attribute 来添加属性到 Span。在 ListRecommendations 函数中,一个属性被添加到了 Span 中。
span.set_attribute("app.products_recommended.count", len(prod_list))
创建新跨度
可以使用 OpenTelemetry Tracer 对象中的 start_as_current_span 来创建新的 Span 并将其置于活动上下文中。当与 with 块一起使用时,Span 将在块结束执行时自动结束。这在 get_product_list 函数中完成。
with tracer.start_as_current_span("get_product_list") as span:
指标
初始化指标
OpenTelemetry SDK 在 __main__ 代码块中初始化。这段代码将创建一个 Meter Provider。导出终结点、资源属性和服务名称将由 OpenTelemetry 自动插桩器根据环境变量自动设置。
meter = metrics.get_meter_provider().get_meter("recommendation")
自定义指标
目前提供以下自定义指标
app_recommendations_counter:每次服务调用推荐的产品数量的累积计数
自动检测的指标
以下指标可通过自动插桩获得,这得益于 opentelemetry-instrumentation-system-metrics,它作为 opentelemetry-bootstrap 的一部分在构建推荐服务 Docker 镜像时安装。
runtime.cpython.cpu_timeruntime.cpython.memoryruntime.cpython.gc_count
日志
初始化日志
OpenTelemetry SDK 在 __main__ 代码块中初始化。以下代码使用批处理处理器、OTLP 日志导出器和日志记录处理程序创建一个日志记录提供程序。最后,它创建一个供应用程序使用的日志记录器。
logger_provider = LoggerProvider(
resource=Resource.create(
{
'service.name': service_name,
}
),
)
set_logger_provider(logger_provider)
log_exporter = OTLPLogExporter(insecure=True)
logger_provider.add_log_record_processor(BatchLogRecordProcessor(log_exporter))
handler = LoggingHandler(level=logging.NOTSET, logger_provider=logger_provider)
logger = logging.getLogger('main')
logger.addHandler(handler)
创建日志记录
使用日志记录器创建日志。示例可以在 ListRecommendations 和 get_product_list 函数中找到。
logger.info(f"Receive ListRecommendations for product ids:{prod_list}")
如您所见,初始化后,日志记录的创建方式与标准 Python 相同。OpenTelemetry 库会自动为每个日志记录添加跟踪 ID 和 Span ID,从而能够关联日志和跟踪。
备注
Python 的日志功能仍处于实验阶段,可能会有一些变动。此服务中的实现遵循 Python 日志示例。