推荐服务
该服务负责根据用户正在浏览的现有产品ID获取推荐产品列表。
自动仪表化
这个基于Python的服务使用了OpenTelemetry的Python自动仪表化工具,通过opentelemetry-instrument
Python包装器运行脚本。在服务的Dockerfile
的ENTRYPOINT
命令中可以完成此操作。
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)
创建日志记录
使用日志记录器创建日志。示例可以在ListRecommendations
和get_product_list
函数中找到。
logger.info(f"接收到产品ID的ListRecommendations请求:{prod_list}")
如您所见,在初始化后,可以以与标准Python相同的方式创建日志记录。OpenTelemetry库会自动为每条日志记录添加跟踪ID和span ID,从而实现对日志和跟踪的关联。
注意事项
Python的日志功能仍处于试验阶段,可能会有一些变化。此服务中的实现遵循Python日志示例。