使用Jaeger对Nginx进行链路追踪

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

前提条件

获取接入点信息

新版控制台

  1. 登录可观测链路 OpenTelemetry 版控制台,在左侧导航栏单击接入中心

  2. 开源框架区域单击Jaeger卡片。

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

    说明

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

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

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

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

    image

旧版控制台

  1. 登录可观测链路 OpenTelemetry 版控制台

  2. 在左侧导航栏单击集群配置,然后在右侧页面单击接入点信息页签。

  3. 在页面顶部选择需要接入的地域,然后在集群信息区域打开显示Token开关。

  4. 客户端采集工具区域单击Jaeger

    相关信息列中,获取接入点信息。jager中国.jpg

    说明

    如果应用部署于阿里云生产环境,则选择阿里云VPC网络接入点,否则选择公网接入点。

教程概述

Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器,对其进行跟踪可以帮助我们更好的了解应用服务的运行状况。

当Nginx代理的微服务出现假死现象时,因为采集不到任何数据,所以无法评估造成的影响。借助链路追踪,我们追踪微服务的上游Nginx,并快速统计出假死现象影响的访问量。

在Docker上部署和跟踪Nginx

  1. 下载Dockerfile并编译部署。

    wget https://arms-apm.oss-cn-hangzhou.aliyuncs.com/demo/nginx-jaeger-docker.tgz
    tar -xzvf nginx-jaeger-docker.tgz
    cd nginx-jaeger
    # 编译docker
    docker build --rm --tag nginx-jaeger:0.1 .
  2. 运行Docker。

    docker run --rm  -p 80:80 -e "GRPC_HOST=${GRPC_HOST}" -e "GRPC_AUTH=${GRPC_AUTH}" -d jaeger-nginx:0.1

    ${GRPC_HOST}${GRPC_AUTH}是前提条件中保存的Agent接入点信息。

    例如:

    docker run --rm  -p 80:80 -e "GRPC_HOST=tracing-analysis-dc-hz.aliyuncs.com:1883" -e "GRPC_AUTH=123abc@123abc_789abc@456abc}" -d jaeger-nginx:0.1

在ECS上部署和跟踪Nginx

  1. 安装Nginx。

    1. 下载并解压Nginx源码。

      wget http://nginx.org/download/nginx-1.14.2.tar.gz
      tar -xzvf nginx-1.14.2.tar.gz
    2. 编译Nginx源码。

      cd nginx-1.14.2
      ./configure --with-compat
      make
      sudo make install
  2. 安装OpenTracing插件。

    1. 下载OpenTracing插件并解压。

      wget https://github.com/opentracing-contrib/nginx-opentracing/releases/download/v0.7.0/linux-amd64-nginx-1.14.0-ngx_http_module.so.tgz
      tar -xzvf linux-amd64-nginx-1.14.0-ngx_http_module.so.tgz
    2. 拷贝.so文件至Nginx的modules目录。如果不存在该目录则需要先创建。

      sudo mkdir /usr/local/nginx/modules
      sudo cp ngx_http_opentracing_module.so /usr/local/nginx/modules/ngx_http_opentracing_module.so
  3. 使用Jaeger进行链路追踪。

    1. 下载Jaeger插件并将其拷贝至任意工作目录。

      wget https://github.com/jaegertracing/jaeger-client-cpp/releases/download/v0.4.2/libjaegertracing_plugin.linux_amd64.so
      sudo cp /usr/local/lib/libjaegertracing_plugin.so /usr/local/lib/libjaegertracing.so
    2. 配置/usr/local/nginx/conf/nginx.conf文件。

      load_module modules/ngx_http_opentracing_module.so;
      events {}
      http {
        opentracing on;
        opentracing_load_tracer /usr/local/lib/libjaegertracing_plugin.so /etc/jaeger-config.json;
        server {
          error_log /var/log/nginx/debug.log debug;
          listen 80;
          location  ~ {
            opentracing_operation_name $uri;
            opentracing_trace_locations off;
            # 跳转到代理的服务,用户根据需要替换。
            proxy_pass http://127.0.0.1:8081;
            opentracing_propagate_context;
          }
        }
      }
      说明

      详细配置说明,请参见opentracing-contrib配置

    3. /etc/jaeger-config.json文件中配置Jaeger参数。

      {
        "service_name": "nginx",
        // 配置采样
        "sampler": {
          "type": "const",
          "param": 1
        },
        "reporter": {
          "localAgentHostPort": "localhost:6831"
        }
      }
    4. 采用以下方法之一配置Jaeger Agent。

      • 若使用自建的Jaeger服务,则下载原生Jaeger Agent,并配置collector.host-port。

        nohup ./jaeger-agent  --collector.host-port=10.100.**.**:142**   1>1.log 2>2.log &
      • 若使用阿里云的Jaeger托管服务,则下载tracing-analysis-agent,并用以下参数启动Agent,以将数据上报至可观测链路 OpenTelemetry 版

        请将<endpoint>替换成前提条件中保存的Agent接入点信息。请删除页面上显示的接入点信息末尾的“/api/traces”,例如http://tracing-analysis-dc-sh.aliyuncs.com/adapt_abc123@abc123_efg123@efg123

        # collector.host-port 用于设置网关,网关因地域而异。例如:
        nohup ./tracing-analysis-agent-linux-amd64 --collector.host-port=<endpoint>
    5. 运行Nginx并访问Nginx服务。

      sudo /usr/local/nginx/sbin/nginx
      curl "http://localhost"

在其他环境上部署和跟踪Nginx

  1. 从Registry中拉取镜像。

    docker pull registry.cn-hangzhou.aliyuncs.com/public-community/jaeger-nginx:0.1
  2. 运行Nginx Docker。

    docker run --rm  -p 80:80 -e "GRPC_HOST=${GRPC_HOST}" -e "GRPC_AUTH=${GRPC_AUTH}" -d registry.cn-hangzhou.aliyuncs.com/public-community/jaeger-nginx:0.1

    ${GRPC_HOST}${GRPC_AUTH}是前提条件中保存的Agent接入点信息。

    例如:

    docker run --rm  -p 80:80 -e "GRPC_HOST=tracing-analysis-dc-hz.aliyuncs.com:1883" -e "GRPC_AUTH=123abc@123abc_789abc@456abc}" -d jaeger-nginx:0.1
  3. 访问Nginx页面。

    在浏览器访问localhost/nginx.conf或者curl "localhost/nginx.conf"。

查看结果

可观测链路 OpenTelemetry 版控制台应用列表页面选择目标应用,查看链路数据。