推荐服务

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

推荐服务源码

自动仪表化

这个基于Python的服务使用了OpenTelemetry的Python自动仪表化工具,通过opentelemetry-instrument Python包装器运行脚本。在服务的DockerfileENTRYPOINT命令中可以完成此操作。

ENTRYPOINT [ "opentelemetry-instrument", "python", "recommendation_server.py" ]

跟踪

初始化跟踪

__main__代码块中初始化了OpenTelemetry SDK。此代码将创建一个跟踪器提供器,并建立使用的Span Processor。导出端点、资源属性和服务名将根据环境变量自动设置。

tracer = trace.get_tracer_provider().get_tracer("推荐服务")

向自动仪表化跟踪添加属性

在自动仪表化代码的执行过程中,您可以从上下文中获取当前的span。

span = trace.get_current_span()

通过在span对象上使用set_attribute方法来向span添加属性。在ListRecommendations函数中,向span添加了一个属性。

span.set_attribute("app.products_recommended.count", len(prod_list))

创建新的span

可以使用OpenTelemetry Tracer对象的start_as_current_span方法创建新的span,并将其放入活动上下文中。当与with块一起使用时,当块执行结束时,span将自动结束。这在get_product_list函数中完成。

with tracer.start_as_current_span("get_product_list") as span:

指标

初始化指标

__main__代码块中初始化了OpenTelemetry SDK。此代码将创建一个指标提供器。导出端点、资源属性和服务名将根据环境变量自动设置。

meter = metrics.get_meter_provider().get_meter("推荐服务")

自定义指标

目前提供以下自定义指标:

  • app_recommendations_counter:每次服务调用的推荐产品数的累积计数

自动仪表化指标

以下指标是通过自动仪表化提供的,这得益于在构建推荐服务的Docker镜像期间,作为opentelemetry-bootstrap的一部分安装的opentelemetry-instrumentation-system-metrics

  • runtime.cpython.cpu_time
  • runtime.cpython.memory
  • runtime.cpython.gc_count

日志

初始化日志

__main__代码块中初始化了OpenTelemetry SDK。以下代码创建了一个带有批处理器、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"接收到产品ID的ListRecommendations请求:{prod_list}")

如您所见,在初始化后,可以以与标准Python相同的方式创建日志记录。OpenTelemetry库会自动为每条日志记录添加跟踪ID和span ID,从而实现对日志和跟踪的关联。

注意事项

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

最后修改 December 10, 2023: translate (a4350d6e)