Python gRPC サービスと通信する Flask アプリがあり、どちらも Google Cloud Run にデプロイされています。アプリをインストルメント化した後、Google Trace でトレースを確認できますが、それらはすべて異なるトレース ID を持っているように見えます。これは、トレースが 2 つのサービス間でリンクされていないことを意味します。これは、両側に grpc/Flask インストルメンターがセットアップされている両方のサービスでトレースするための私のセットアップ コードです。
import logging
from opentelemetry import trace
from opentelemetry.exporter.cloud_trace import CloudTraceSpanExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import SimpleExportSpanProcessor
from opentelemetry.propagators import set_global_textmap
from opentelemetry.tools.cloud_trace_propagator import CloudTraceFormatPropagator
from google.auth.exceptions import DefaultCredentialsError
logger = logging.getLogger(__name__)
def setup_tracing():
"""
Setup Tracing on Google Cloud. The Service Account Roles must have `Cloud Trace Agent`
Role added for traces to be ingested.
"""
trace.set_tracer_provider(TracerProvider())
try:
# If running on Google Cloud, will use instance metadata service account credentials to initialize
trace.get_tracer_provider().add_span_processor(
SimpleExportSpanProcessor(CloudTraceSpanExporter())
)
# Using the X-Cloud-Trace-Context header
set_global_textmap(CloudTraceFormatPropagator())
logger.info("Tracing Setup. Exporting Traces to Google Cloud.")
except DefaultCredentialsError:
# Not running on Google Cloud so will use console exporter
from opentelemetry.sdk.trace.export import ConsoleSpanExporter
trace.get_tracer_provider().add_span_processor(
SimpleExportSpanProcessor(ConsoleSpanExporter())
)
logger.info("Tracing Setup. Exporting Traces to Console.")
ConsoleSpanExporter を使用して、両方のサービスのトレース ID が一致していることをローカルで確認できますが、Google Cloud Run では、明らかに Google Trace で個別のトレースが生成されないため、ネットワークがサービス間のヘッダーを削除するか、他の何かが削除されるかどうか疑問に思っています。発生しているということは、Trace ID が伝播されていないことを意味しますか?
追加のメモとして、Cloud Run の Trace/Span ID の前にあるロード バランサーが CloudTraceSpanFormatPropagator() を使用して伝播されていないことにも気付きました。これにより、ログがリクエストに対してネストされていないため、ログが乱雑になります。