首页 > 其他分享 > 使用jaeger-native在Envoy中进行链路追踪

使用jaeger-native在Envoy中进行链路追踪

时间:2022-09-21 18:35:47浏览次数:69  
标签:name service jaeger Envoy envoy address type native

系统环境

网络:172.31.81.0/24
服务:
  • Front-Proxy:前端代理,监听端口8000/tcp
  • 2个后端服务
    • service1:接收Front-Envoy的请求,并会请求service2
    • service2:接收service1的请求
  • 追踪服务zipkin,监听端口9411

环境配置

server-demo

service.py

from flask import Flask
from flask import request
import os
import requests
import socket
import sys

app = Flask(__name__)

TRACE_HEADERS_TO_PROPAGATE = [
    'X-Ot-Span-Context',
    'X-Request-Id',

    # Zipkin headers
    'X-B3-TraceId',
    'X-B3-SpanId',
    'X-B3-ParentSpanId',
    'X-B3-Sampled',
    'X-B3-Flags',

    # Jaeger header (for native client)
    "uber-trace-id",

    # SkyWalking headers.
    "sw8"
]


@app.route('/service/<service_number>')
def hello(service_number):
    return (
        'Hello from behind Envoy (service {})! hostname: {} resolved'
        'hostname: {}\n'.format(
            os.environ['SERVICE_NAME'], socket.gethostname(),
            socket.gethostbyname(socket.gethostname())))


@app.route('/trace/<service_number>')
def trace(service_number):
    headers = {}
    # call service 2 from service 1
    if int(os.environ['SERVICE_NAME']) == 1:
        for header in TRACE_HEADERS_TO_PROPAGATE:
            if header in request.headers:
                headers[header] = request.headers[header]
        requests.get("http://localhost:9000/trace/2", headers=headers)
    return (
        'Hello from behind Envoy (service {})! hostname: {} resolved'
        'hostname: {}\n'.format(
            os.environ['SERVICE_NAME'], socket.gethostname(),
            socket.gethostbyname(socket.gethostname())))


if __name__ == "__main__":
    app.run(host='127.0.0.1', port=8080, debug=True)

Dockerfile-service

FROM envoyproxy/envoy-alpine:v1.21-latest

ADD repositories /etc/apk/repositories
RUN apk update && apk --no-cache -U add py3-pip bash curl
RUN python3 -m venv /code && source /code/bin/activate &&  pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip && \
  pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -q click==8.0.4 flask==2.1.3 itsdangerous==2.1.1 jinja2==3.0.3 markupsafe==2.1.1 pyyaml==6.0 werkzeug==2.0.3 requests==2.21.0
ADD ./service.py /code
ADD ./start_service.sh /usr/local/bin/start_service.sh
RUN chmod u+x /usr/local/bin/start_service.sh
ENTRYPOINT ["/bin/sh", "/usr/local/bin/start_service.sh"]

start_service.sh

#!/bin/sh
source /code/bin/activate &&  python3 /code/service.py &
envoy -c /etc/service-envoy.yaml --service-cluster "service${SERVICE_NAME}"

install-jaeger-plugin

# curl -Ls https://github.com/envoyproxy/misc/releases/download/jaegertracing-plugin/jaegertracing-plugin-centos.tar.gz   
# tar zxf jaegertracing-plugin-centos.tar.gz

front-envoy.yaml

node:
  id: front-envoy
  cluster: front-envoy

admin:
  address:
    socket_address:
      address: 0.0.0.0
      port_value: 8001

static_resources:
  listeners:
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 8000
    traffic_direction: OUTBOUND
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          generate_request_id: true
          tracing:
            provider:
              name: envoy.tracers.dynamic_ot
              typed_config:
                "@type": type.googleapis.com/envoy.config.trace.v3.DynamicOtConfig
                library: /usr/local/lib/libjaegertracing_plugin.so
                config:
                  service_name: front-proxy
                  sampler:
                    type: const
                    param: 1
                  reporter:
                    localAgentHostPort: jaeger:6831
                  headers:
                    jaegerDebugHeader: jaeger-debug-id
                    jaegerBaggageHeader: jaeger-baggage
                    traceBaggageHeaderPrefix: uberctx-
                  baggage_restrictions:
                    denyBaggageOnInitializationFailure: false
                    hostPort: ""
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: service1
                decorator:
                  operation: checkAvailability
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
          use_remote_address: true

  clusters:
  - name: service1
    type: strict_dns
    lb_policy: round_robin
    load_assignment:
      cluster_name: service1
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: service1
                port_value: 8000 

service1-envoy-sidecar.yaml

static_resources:
  listeners:
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 8000
    traffic_direction: INBOUND
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: service1_route
            virtual_hosts:
            - name: service1
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: local_service
                decorator:
                  operation: checkAvailability
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 9000
    traffic_direction: OUTBOUND
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          tracing:
            provider:
              name: envoy.tracers.dynamic_ot
              typed_config:
                "@type": type.googleapis.com/envoy.config.trace.v3.DynamicOtConfig
                library: /usr/local/lib/libjaegertracing_plugin.so
                config:
                  service_name: service1
                  sampler:
                    type: const
                    param: 1
                  reporter:
                    localAgentHostPort: jaeger:6831
                  headers:
                    jaegerDebugHeader: jaeger-debug-id
                    jaegerBaggageHeader: jaeger-baggage
                    traceBaggageHeaderPrefix: uberctx-
                  baggage_restrictions:
                    denyBaggageOnInitializationFailure: false
                    hostPort: ""
          codec_type: auto
          stat_prefix: egress_http
          route_config:
            name: service2_route
            virtual_hosts:
            - name: service2
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/trace/2"
                route:
                  cluster: service2
                decorator:
                  operation: checkStock
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
  clusters:
  - name: local_service
    type: strict_dns
    lb_policy: round_robin
    load_assignment:
      cluster_name: local_service
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 127.0.0.1
                port_value: 8080
  - name: service2
    type: strict_dns
    lb_policy: round_robin
    load_assignment:
      cluster_name: service2
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: service2
                port_value: 8000 

service2-envoy-sidecar.yaml

static_resources:
  listeners:
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 8000
    traffic_direction: INBOUND
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          tracing:
            provider:
              name: envoy.tracers.dynamic_ot
              typed_config:
                "@type": type.googleapis.com/envoy.config.trace.v3.DynamicOtConfig
                library: /usr/local/lib/libjaegertracing_plugin.so
                config:
                  service_name: service2
                  sampler:
                    type: const
                    param: 1
                  reporter:
                    localAgentHostPort: jaeger:6831
                  headers:
                    jaegerDebugHeader: jaeger-debug-id
                    jaegerBaggageHeader: jaeger-baggage
                    traceBaggageHeaderPrefix: uberctx-
                  baggage_restrictions:
                    denyBaggageOnInitializationFailure: false
                    hostPort: ""
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: service2
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: local_service
                decorator:
                  operation: checkStock
          http_filters:
          - name: envoy.filters.http.router
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
  clusters:
  - name: local_service
    type: strict_dns
    lb_policy: round_robin
    load_assignment:
      cluster_name: local_service
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 127.0.0.1
                port_value: 8080 

docker-compose.yaml

version: "3"

services:
  front-envoy:
    image: envoyproxy/envoy:v1.23-latest
    volumes:
      - ./front-envoy/front-envoy.yaml:/etc/envoy/envoy.yaml
      - ./libjaegertracing.so.0.4.2:/usr/local/lib/libjaegertracing_plugin.so
    networks:
      envoymesh:
        ipv4_address: 172.31.81.10
        aliases:
        - front-envoy
        - front
    ports:
    - "8000:8000"
    - "9901:9901"

  service1:
    build:
      context: ./service/
      dockerfile: Dockerfile-service
    volumes:
    - ./service/service1-envoy-sidecar.yaml:/etc/service-envoy.yaml
    - ./libjaegertracing.so.0.4.2:/usr/local/lib/libjaegertracing_plugin.so
    networks:
      envoymesh:
        aliases:
        - service1
    environment:
    - SERVICE_NAME=1

  service2:
    build:
      context: ./service/
      dockerfile: Dockerfile-service
    volumes:
    - ./service/service2-envoy-sidecar.yaml:/etc/service-envoy.yaml
    - ./libjaegertracing.so.0.4.2:/usr/local/lib/libjaegertracing_plugin.so
    networks:
      envoymesh:
        aliases:
        - service2
    environment:
    - SERVICE_NAME=2

  jaeger:
    image: jaegertracing/all-in-one:1.27
    environment:
    - COLLECTOR_ZIPKIN_HOST_PORT=9411
    networks:
      envoymesh:
        ipv4_address: 172.31.81.15
        aliases:
        - zipkin     
        - jaeger
    ports:
    - "9411:9411"
    - "16686:16686" 


networks:
  envoymesh:
    driver: bridge
    ipam:
      config:
        - subnet: 172.31.81.0/24

运行服务

docker-compose build
docker-compose up
~# docker ps
CONTAINER ID   IMAGE                           COMMAND                  CREATED          STATUS          PORTS                                                                                                                                               NAMES
c8761ca7ca42   jaegertracing/all-in-one:1.27   "/go/bin/all-in-one-…"   26 minutes ago   Up 26 minutes   5775/udp, 5778/tcp, 14250/tcp, 0.0.0.0:9411->9411/tcp, :::9411->9411/tcp, 6831-6832/udp, 14268/tcp, 0.0.0.0:16686->16686/tcp, :::16686->16686/tcp   jaeger-native-jaeger-1
db2cb5d36c31   envoyproxy/envoy:v1.23-latest   "/docker-entrypoint.…"   26 minutes ago   Up 26 minutes   0.0.0.0:8000->8000/tcp, :::8000->8000/tcp, 0.0.0.0:9901->9901/tcp, :::9901->9901/tcp, 10000/tcp                                                     jaeger-native-front-envoy-1
8f40ac27e9dd   jaeger-native_service2          "/bin/sh /usr/local/…"   26 minutes ago   Up 26 minutes   10000/tcp                                                                                                                                           jaeger-native-service2-1
9e63f1ecd893   jaeger-native_service1          "/bin/sh /usr/local/…"   26 minutes ago   Up 26 minutes   10000/tcp                                                                                                                                           jaeger-native-service1-1

请求测试

~# curl -v 172.31.81.10:8000/trace/1
*   Trying 172.31.81.10:8000...
* TCP_NODELAY set
* Connected to 172.31.81.10 (172.31.81.10) port 8000 (#0)
> GET /trace/1 HTTP/1.1
> Host: 172.31.81.10:8000
> User-Agent: curl/7.68.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< content-type: text/html; charset=utf-8
< content-length: 90
< server: envoy
< date: Wed, 21 Sep 2022 10:19:46 GMT
< x-envoy-upstream-service-time: 11
< 
Hello from behind Envoy (service 1)! hostname: 9e63f1ecd893 resolvedhostname: 172.31.81.2
* Connection #0 to host 172.31.81.10 left intact
jaeger-native-service2-1     | 127.0.0.1 - - [21/Sep/2022 10:19:46] "GET /trace/2 HTTP/1.1" 200 -
jaeger-native-service1-1     | 127.0.0.1 - - [21/Sep/2022 10:19:46] "GET /trace/1 HTTP/1.1" 200 -

访问jaeger

参考文档

https://www.envoyproxy.io/docs/envoy/latest/api-v3/config/trace/v3/dynamic_ot.proto#extension-envoy-tracers-dynamic-ot

https://github.com/envoyproxy/envoy/tree/main/examples/jaeger-native-tracing

https://github.com/jaegertracing/jaeger-client-cpp

标签:name,service,jaeger,Envoy,envoy,address,type,native
From: https://www.cnblogs.com/wangguishe/p/16712081.html

相关文章

  • 学习 React Native——可按下的触控动画
    学习ReactNative——可按下的触控动画Pressable是ReactNative应用程序中处理触摸的最新最好的工具,句柄新闻和长按唯一令人讨厌的是,如果用户触摸了按钮,它不会向......
  • React Native — REST API 调用
    ReactNative—RESTAPI调用ReactNative/JSShorts的一部分:切中要害|简单的1.0获取fetchAPI是一个现成的JS函数。我们可以使用它在我们的ReactNative......
  • react-native 函数组件调用函数组件的方法
    xxxRef.current.你的方法()  ......
  • React Native 组件介绍(一)
    Text一个用于显示文本的React组件,支持嵌套、样式、以及触摸处理style属性color:基本同css写法fontSize:number类型fontStyle:enum('normal','italic')fo......
  • 使用 React Native 在 5 天内构建您的移动应用程序
    使用ReactNative在5天内构建您的移动应用程序5天内使用ReactNative开发功能齐全的移动应用在数字化时代,开发移动应用程序已成为当务之急。在最短的时间内推出......
  • Envoy 局部故障处理机制
    局部故障处理机制retry:分布式环境中对远程资源和服务的调用可能会由于瞬态故障(短时间内可自行恢复的故障)而失败,一般情况下,重试机制可解决此类问题常见的瞬态故障有网......
  • 2022年值得推荐的五大React Native UI库
    2022年值得推荐的五大ReactNativeUI库51CTO2022-04-2411:02北京北京无忧创想信息技术有限公司关注 译者:布加迪  科技巨头之一Facebook在2015......
  • 2023年值得推荐的五大React Native UI库
    2022年值得推荐的五大ReactNativeUI库译者|布加迪科技巨头之一Facebook在2015年创建并管理ReactNative这套应用程序开发框架,以帮助开发人员构建具有原生外观感觉......
  • Envoy 流量镜像
    流量镜像流量镜像,也称为流量复制或影子镜像流量镜像功能通常用于在生产环境进行测试,通过将生产流量镜像拷贝到测试集群或者新版本集群,实现新版本接近真实环境的测试,旨......
  • Knative部署应用以及应用的更新、应用的分流(二)
    1.应用的更新1.1更新hello-example应用1.更新应用的环境变量可通过命令行的方式亦可以通过读取配置文件的方式,这里主要来看命令行的方式[root@kn-server-master01-13......