推荐服务

此服务负责根据用户正在浏览的现有产品 ID,获取用户推荐产品的列表。

推荐服务源代码

自动仪表化

此基于 Python 的服务利用 OpenTelemetry 的 Python 自动插桩器,通过使用 opentelemetry-instrument Python 包装器来运行脚本。这可以在服务的 DockerfileENTRYPOINT 命令中完成。

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_time
  • runtime.cpython.memory
  • runtime.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)

创建日志记录

使用日志记录器创建日志。示例可以在 ListRecommendationsget_product_list 函数中找到。

logger.info(f"Receive ListRecommendations for product ids:{prod_list}")

如您所见,初始化后,日志记录的创建方式与标准 Python 相同。OpenTelemetry 库会自动为每个日志记录添加跟踪 ID 和 Span ID,从而能够关联日志和跟踪。

备注

Python 的日志功能仍处于实验阶段,可能会有一些变动。此服务中的实现遵循 Python 日志示例


最后修改于 2025 年 3 月 4 日: [demo] 重命名 demo 服务 (#6438) (ae417344)