来自 Python 应用的 Opencensus Stackdriver 跟踪未出现在 GCP 的跟踪列表中

Opencensus Stackdriver traces from Python app not appearing in the Trace list in GCP

我正在使用 OpenCensus 比较不同的跟踪后端。 我已经有了使用 Zipkin 和 Azure Monitor 的简单 OpenCensus.io python 示例 运行。

现在我正在尝试使用 GCP 的 Stackdriver 进行测试...

我已经设置了来自 Opencensus 的测试代码 https://opencensus.io/exporters/supported-exporters/python/stackdriver/如下:

#!/usr/bin/env python

import os

from opencensus.common.transports.async_ import AsyncTransport
from opencensus.ext.stackdriver.trace_exporter import StackdriverExporter
from opencensus.trace.tracer import Tracer

def main():
    sde = StackdriverExporter(
        project_id=os.environ.get("GCP_PROJECT_ID"),
        transport=AsyncTransport)

    tracer = Tracer(exporter=sde)
    with tracer.span(name="doingWork") as span:
        for i in range(10):
            pass

if __name__ == "__main__":
    main()

我已经为 GCP_PROJECT_ID 设置了环境变量,并且还在 中设置了我的服务帐户 JSON 文件的密钥文件路径]GOOGLE_APPLICATION_CREDENTIALS.

服务帐户具有 “云跟踪代理” 角色。

我的代码运行没有错误,但我在 GCP 控制台的跟踪下或监控仪表板中看不到任何信息。

我是不是漏掉了什么?

环境说明: 我正在使用 Python 3.7.2

从我的本地 Windows 机器上测试这个

我能够按照步骤 mentioned here.

在 GCP 中设置 OpenCensus(在项目的一个实例中)

为了快速设置,这里是我 运行 在 b运行d new Ubuntu instance

中的命令
sudo apt-get install python3
sudo apt install python3-pip
wget https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/opencensus/requirements.txt
pip3 install -r requirements.txt
wget https://raw.githubusercontent.com/GoogleCloudPlatform/python-docs-samples/master/opencensus/metrics_quickstart.py
python3 metrics_quickstart.py

文档中不是很清楚的一件事是,默认情况下,跟踪被采样(参见源文件here),因此每个调用都被正确记录, 但只存储了 1e-4 条迹线。它有助于降低成本,但它是调试过程中的主要痛点。

如果要记录所有跟踪,可以使用 AlwaysOnSampler 并将其传递给跟踪器:

import os

from opencensus.common.transports.async_ import AsyncTransport
from opencensus.ext.stackdriver.trace_exporter import StackdriverExporter
from opencensus.trace.tracer import Tracer
from opencensus.trace.samplers import AlwaysOnSampler

def main():
    sde = StackdriverExporter(
        project_id=os.environ.get("GCP_PROJECT_ID"),
        transport=AsyncTransport)

    tracer = Tracer(exporter=sde, sampler=AlwaysOnSampler())
    with tracer.span(name="doingWork") as span:
        for i in range(10):
            pass

if __name__ == "__main__":
    main()

希望它能解决您的问题!