【发布时间】:2021-10-04 18:45:05
【问题描述】:
我在 Cloud Run 上运行 Python gRPC 服务器并尝试添加检测以捕获跟踪信息。我目前有一个基本设置,但是我无法使用 OpenTelemetry docs 中所示的传播。
入站请求具有 x-cloud-trace-context 标头,我可以在我一直使用的 gRPC 方法中记录标头值,但是 OpenTelemetry 库创建的跟踪始终具有与请求中的跟踪 ID 不同的 ID标题。
这是我创建的简单tracing.py 模块,用于提供对当前Tracer 实例的配置和访问:
"""Utility functions for tracing."""
import opentelemetry.exporter.cloud_trace as cloud_trace
import opentelemetry.propagate as propagate
import opentelemetry.propagators.cloud_trace_propagator as cloud_trace_propagator
import opentelemetry.trace as trace
from opentelemetry.sdk import trace as sdk_trace
from opentelemetry.sdk.trace import export
import app_instance
def get_tracer() -> trace.Tracer:
"""Function that provides an object for tracing.
Returns:
trace.Tracer instance.
"""
return trace.get_tracer(__name__)
def configure_tracing() -> None:
trace.set_tracer_provider(sdk_trace.TracerProvider())
if app_instance.IS_LOCAL:
print("Configuring local tracing.")
span_exporter: export.SpanExporter = export.ConsoleSpanExporter()
else:
print(f"Configuring cloud tracing in environment {app_instance.ENVIRONMENT}.")
span_exporter = cloud_trace.CloudTraceSpanExporter()
propagate.set_global_textmap(cloud_trace_propagator.CloudTraceFormatPropagator())
trace.get_tracer_provider().add_span_processor(export.SimpleSpanProcessor(span_exporter))
这个configure_tracing 函数由在容器启动时运行的入口点脚本调用,因此它在处理任何请求之前执行。在 Google Cloud 中运行时,CloudTraceFormatPropagator 应该是确保跟踪传播所必需的,但它似乎对我不起作用。
这是我一直使用的简单 gRPC 方法:
import grpc
from opentelemetry import trace
import stripe
from common import cloud_logging, datastore_utils, proto_helpers, tracing
from services.payment_service import payment_service_pb2
from third_party import stripe_client
def GetStripeInvoice(
self, request: payment_service_pb2.GetStripeInvoiceRequest, context: grpc.ServicerContext
) -> payment_service_pb2.StripeInvoiceResponse:
tracer: trace.Tracer = tracing.get_tracer()
with tracer.start_as_current_span('GetStripeInvoice'):
print(f"trace ID from header: {dict(context.invocation_metadata()).get('x-cloud-trace-context')}")
cloud_logging.info(f"Getting Stripe invoice.")
order = datastore_utils.get_pb_with_pb_key(request.order)
try:
invoice: stripe.Invoice = stripe_client.get_invoice(
invoice_id=order.stripe_invoice_id
)
cloud_logging.info(f"Retrieved Stripe invoice. Amount due: {invoice['amount_due']}")
except stripe.error.StripeError as e:
cloud_logging.error(
f"Failed to retrieve invoice: {e}"
)
context.abort(code=grpc.StatusCode.INTERNAL, details=str(e))
return payment_service_pb2.StripeInvoiceResponse(
invoice=proto_helpers.create_struct(invoice)
)
我什至将x-cloud-trace-context 标头添加到本地客户端请求,但无济于事 - 开始跟踪时不使用包含的值。
我不确定我在这里遗漏了什么 - 我可以在 Cloud Trace 仪表板中看到跟踪,因此我相信基本检测是正确的,但是 CloudTraceFormatPropagator 的配置/使用显然有问题。
【问题讨论】:
标签: python grpc google-cloud-run open-telemetry