前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx如何支持OpenTracing - Jaeger

Nginx如何支持OpenTracing - Jaeger

作者头像
云原生小白
发布2021-05-13 09:57:09
1.2K0
发布2021-05-13 09:57:09
举报
文章被收录于专栏:Loki

小白前段时间做Loki分布式追踪时,遇到需要在Nginx这一层生成TraceID和打印traceid相关日志的需求,在网上找了一大圈恁是没找到合适的Docker镜像。

原本应该用opentracing-contrib编译的nginx-opentracing的docker镜像,但是当pull镜像时居然发现它有1.5G的容量,看了Dockerfile才知道这个镜像把Nginx源码和所有编译所需的C库都放在里面,真是佩服。

最后还是得我们自己根据OpenTracing的方法给Nginx安装插件。按照阿里云的文档,小白做了一个Nginx1.14版本镜像提供给大家使用。

quay.io/cloudxiaobai/nginx-jaeger:1.14.0

安装过程参考:https://help.aliyun.com/document_detail/126251.html zipkin也可以用如上方法炮制

如何使用镜像

1. 首先要启用trace的话,我们需要定义个jaeger的描述配置:

jaeger.config

代码语言:javascript
复制
{
  "service_name": "nginx",
  "sampler": {
    "type": "const",
    "param": 1
  },
  "reporter": {
    "localAgentHostPort": "jaeger:6831"
  },
  "headers": {
    #一些默认的jaeger Baggage头设置
    "jaegerDebugHeader": "jaeger-debug-id",
    "jaegerBaggageHeader": "jaeger-baggage",
    "traceBaggageHeaderPrefix": "uberctx-"
  },
  "baggage_restrictions": {
    "denyBaggageOnInitializationFailure": false,
    "hostPort": ""
  }
}

2. nginx还需引入jaeger相关的动态库配置,如下:

nginx.conf

代码语言:javascript
复制
# 加载OpenTracing的动态库
load_module modules/ngx_http_opentracing_module.so;

http {
  # 加载Jaeger库
  opentracing_load_tracer /usr/local/lib/libjaegertracing_plugin.so /etc/jaeger-nginx-config.json;

  # 启用Jaeger
  opentracing on;

  # 选择性的注入Tag
  opentracing_tag http_user_agent $http_user_agent;

  upstream backend {
    server app-service:9001;
  }

  location ~ {
    opentracing_operation_name $uri;
    opentracing_propagate_context;
    proxy_pass http://backend;
  }
}

3. 如果我们需要将Trace的日志打印出来,可以设置自定义的日志格式:

代码语言:javascript
复制
log_format opentracing '{"timestamp":"$time_iso8601",'
                       '"source":"$server_addr",'
                       '"hostname":"$hostname",'
                       '"ip":"$http_x_forwarded_for",'
                       '"traceID":"$opentracing_context_uber_trace_id",'
                       '"client":"$remote_addr",'
                       '"request_method":"$request_method",'
                       '"scheme":"$scheme",'
                       '"domain":"$server_name",'
                       '"referer":"$http_referer",'
                       '"request":"$request_uri",'
                       '"args":"$args",'
                       '"size":$body_bytes_sent,'
                       '"status": $status,'
                       '"responsetime":$request_time,'
                       '"upstreamtime":"$upstream_response_time",'
                       '"upstreamaddr":"$upstream_addr",'
                       '"http_user_agent":"$http_user_agent",'
                       '"https":"$https"'
                       '}';
                         
 access_log   /dev/stdout opentracing;

这样我们的日志打印出来的就是json格式

代码语言:javascript
复制
{
    "source": "172.16.0.1",
    "timestamp": "2020-11-02T15:58:15+00:00",
    "args": "-",
    "client": "172.16.0.20",
    "domain": "",
    "hostname": "e7b3c1369b96",
    "http_user_agent": "Ruby",
    "https": "",
    "ip": "-",
    "referer": "-",
    "request": "/loki/api/v1/push",
    "request_method": "POST",
    "responsetime": 0.005,
    "scheme": "http",
    "size": 0,
    "status": 204,
    "traceID": "c39f7c73e43ddd29:c39f7c73e43ddd29:0:1",
    "upstreamaddr": "172.20.0.3:3100",
    "upstreamtime": "0.008"
}

扩展:Ingress-nginx怎么启用OpenTracing

如果你在kubernetes中用了ingress-nginx作为服务的网关,那么可以直接在ingress中启用opentracing而不用重建镜像。

在启用前,我们需要在ingress-nginx-controller的configmap里面添加如下配置:

代码语言:javascript
复制
apiVersion: v1
kind: ConfigMap
data:
  enable-opentracing: "true"
  
  #jaeger的常用篇日志
  jaeger-collector-host: jaeger-agent.default.svc.cluster.local
  jaeger-sampler-param: 1
  jaeger-sampler-type: const

  #zipkin的常用配置
  zipkin-collector-host: zipkin.default.svc.cluster.local
  zipkin-sample-rate: 1.0

  #datadog的常用配置
  datadog-collector-host: datadog-agent.default.svc.cluster.local
  datadog-sample-rate: 1.0
  
metadata:
  name: ingress-nginx-controller
  namespace: kube-system

启用成功后,我们就可以在jaeger里面看到详情了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云原生小白 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何使用镜像
  • 扩展:Ingress-nginx怎么启用OpenTracing
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档