我有一个与Python服务对话的Flask应用程序,两者都部署在Google运行中。在对应用程序进行检测之后,我可以在Google上看到跟踪,但它们似乎都有不同的跟踪I,这意味着两个服务之间没有将跟踪链接在一起。这是我的安装代码,用于在两个服务上使用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运行时,它们显然不会在Google上产生单独的跟踪,所以我想知道网络是否删除了服务之间的头,或者其他什么事情正在发生--这意味着跟踪ID没有被传播?
另外,我还注意到,Cloud的跟踪/跨I前面的负载均衡器没有使用CloudTraceSpanFormatPropagator()传播,这也使我的日志变得混乱,因为日志不是嵌套在一起的请求。
发布于 2021-03-05 07:07:55
经过几个小时的调试,结果证明是Python上糟糕的文档。对于不安全(localhost)通道,文档工作,客户端被检测。为了获得安全通道(如Google运行所需的那样),您需要在channel_type='secure'中传递。我不知道为什么它是这样设计的,并在模块上提出了一个问题:https://github.com/open-telemetry/opentelemetry-python-contrib/issues/365
此外,您还需要使用X-Cloud-Trace-Context头来确保您的跟踪使用与Google运行中的负载平衡器和AppServer相同的跟踪ID,并且所有链接都在Google中,但是它们的传播程序的默认实现使用的大写字母不能在gRPC元数据键中使用,因此会引发验证错误。我上了下面的课,把所有的小写字母都写好了,现在一切都很好了:
最后,在将日志链接到Google日志上的跟踪时,我遇到了一个长期的问题,文档中说使用十六进制跟踪ID和十六进制跨度ID,但是它们没有工作,因为我使用了错误的OpenTelemetry函数来格式化它们。但是,这段代码可以工作,现在我可以在Google的跟踪列表视图中看到我的日志和我的跟踪!
from opentelemetry import trace
from opentelemetry.trace.span import get_hexadecimal_trace_id, get_hexadecimal_span_id
current_span = trace.get_current_span()
if current_span:
trace_id = current_span.get_span_context().trace_id
span_id = current_span.get_span_context().span_id
if trace_id and span_id:
logging_fields['logging.googleapis.com/trace'] = f"projects/{self.gce_project}/traces/{get_hexadecimal_trace_id(trace_id)}"
logging_fields['logging.googleapis.com/spanId'] = f"{get_hexadecimal_span_id(span_id)}"
logging_fields['logging.googleapis.com/trace_sampled'] = True花了一段时间,但我想这是我的错,我选择了一个阿尔法(刚刚转变为Beta)框架(OpenTelemetry)在一个新的,不是很好的文档(在这个领域) Google服务。但是,有了这些修复,现在一切都可以工作了,并且更容易调试问题,并查看整个端到端请求!
https://stackoverflow.com/questions/66357827
复制相似问题