通过Jaeger上报C++应用数据

通过Jaeger为应用埋点并上报链路数据至可观测链路 OpenTelemetry 版后,可观测链路 OpenTelemetry 版即可开始监控应用,您可以查看应用拓扑、调用链路、异常事务、慢事务和SQL分析等一系列监控数据。本文介绍如何使用Jaeger埋点并上报C++应用数据。

重要

为获得更丰富的功能、更先进的链路追踪能力,以及最佳使用体验,建议您使用OpenTelemetry协议将应用接入可观测链路 OpenTelemetry 版

我们为您提供了详细的OpenTelemetry接入指南和最佳实践,帮助您快速上手可观测链路 OpenTelemetry 版。更多信息,请参见接入应用

前提条件

获取接入点信息

  1. 登录ARMS控制台,在左侧导航栏单击接入中心

  2. 服务端应用区域单击Jaeger卡片。

  3. 在弹出的Jaeger面板中选择数据需要上报的地域。

    说明

    初次接入的地域将会自动进行资源初始化。

  4. 选择连接方式上报方式,然后复制接入点信息。

    • 连接方式:若您的服务部署在阿里云上,且所属地域与选择的接入地域一致,推荐使用阿里云内网方式,否则选择公网方式。

    • 上报方式:根据客户端支持的协议类型选择HTTPgRPC协议上报数据。

    image.png

背景信息

数据是如何上报的?

  • 不通过Jaeger Agent而直接上报数据的原理如下图所示。

    image
  • 通过Jaeger Agent上报数据的原理如下图所示。

    image

快速开始

  1. 运行以下命令,从官方网站获取jaeger-client-cpp

    wget https://github.com/jaegertracing/jaeger-client-cpp/archive/master.zip && unzip master.zip
  2. 解压并进入jaeger-client-cpp安装包,然后运行以下命令编译jaeger-client-cpp。

    说明

    编译依赖CMake,gcc版本不低于4.9.2。

    mkdir build
        cd build
        cmake ..
        make
  3. 下载原生Jaeger Agent,并用以下参数启动Agent,以将数据上报至可观测链路 OpenTelemetry 版

    说明

    请将<endpoint>替换成前提条件获取的接入点信息。

    // reporter.grpc.host-port用于设置网关,网关因地域而异。 例如:
    nohup ./jaeger-agent --reporter.grpc.host-port=tracing-analysis-dc-sz.aliyuncs.com:1883 --jaeger.tags=<endpoint>
  4. 进入jaeger-client-cppexample目录,运行测试用例。

    ./app ../examples/config.yml

    登录ARMS控制台后,在应用监控 > 应用列表页面选择目标应用,查看链路数据。

    说明

    语言列显示image图标的应用为接入应用监控的应用,显示-图标的应用为接入可观测链路 OpenTelemetry 版的应用。

通过Agent上报数据

  1. 安装Jaeger Client(官方下载地址)。

  2. 创建Trace。

    例如,我们可以根据YAML配置生成Trace对象。

    void setUpTracer(const char* configFilePath)
    {
        auto configYAML = YAML::LoadFile(configFilePath);
        // 从YAML文件中导入配置。
        auto config = jaegertracing::Config::parse(configYAML);
        // 设置TraceserviceName和日志。
        auto tracer = jaegertracing::Tracer::make(
            "example-service", config, jaegertracing::logging::consoleLogger());
        //将Tracer设置为全局变量。
        opentracing::Tracer::InitGlobal(
            std::static_pointer_cast<opentracing::Tracer>(tracer));
    }

    YAML配置参考:

    disabled: false
    reporter:
      logSpans: true
    sampler:
      type: const
      param: 1
  3. 创建Span。

    // 有parentSpan的情况下创建Span。
    void tracedSubroutine(const std::unique_ptr<opentracing::Span>& parentSpan)
    {
        auto span = opentracing::Tracer::Global()->StartSpan(
            "tracedSubroutine", { opentracing::ChildOf(&parentSpan->context()) });
    }
    
    // 无parentSpan的情况下创建Span。
    void tracedFunction()
    {
        auto span = opentracing::Tracer::Global()->StartSpan("tracedFunction");
        tracedSubroutine(span);
    }
  4. 下载原生Jaeger Agent,并用以下参数启动Agent,以将数据上报至可观测链路 OpenTelemetry 版

    说明

    请将<endpoint>替换成前提条件获取的接入点信息。

    // reporter.grpc.host-port用于设置网关,网关因地域而异。 例如:
    nohup ./jaeger-agent --reporter.grpc.host-port=tracing-analysis-dc-sz.aliyuncs.com:1883 --jaeger.tags=<endpoint>