前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >实现跨应用链路追踪

实现跨应用链路追踪

作者头像
杜逸先
发布于 2023-04-13 08:33:32
发布于 2023-04-13 08:33:32
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

在上篇文章使用 opentelemetry 与 jaeger 实现 flask 应用的链路追踪 | 那时难决 (duyixian.cn)中,我们介绍了如何使用 opentelemetry 与 jaeger 对 flask 应用进行链路跟踪。

在真实的业务场景下多个服务间互相调用是十分常见的,在进行一些问题排查的时候有必要跟踪一个请求链路在各个服务中细节。

使用 opentelemetry 与 jaeger 同样可以实现跨应用的链路追踪。

原理

进行链路跟踪的核心概念是 trace,trace 是一个具有开始时间和结束时间的操作,它可以包含若干个 span,形成一个树状结构。 每一个 trace 都有一个唯一的 traceId,用于标识一个请求链路。在跨服务的场景下,我们可以通过 traceId 将一个请求链路中的所有 span 关联起来。

回到上一篇文章的场景,编辑main.py,定义/headers路由,使用 requests 库请求 https://httpbin.org/headers ,返回 requests 发起请求时的 header 信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.get("/headers")
def headers():
    return requests.get("https://httpbin.org/headers").json()

可以看到 headers 中有一个Traceparent,携带了 TraceId 信息。调用其他服务时,我们也需要将这个Traceparent传递给下游服务。


实现跨服务链路追踪

首先我们实现一个上游服务,用于演示跨应用链路追踪。这次我们使用 asyncio + FastAPI 来实现。asyncio 生态下的 httpx 和 fastapi 都有 opentelemetry 的支持。

先安装依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install fastapi opentelemetry-instrumentation-fastapi
pip install httpx opentelemetry-instrumentation-httpx

编辑upstream.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import fastapi
import httpx
from opentelemetry import trace
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor


def configure_trace(app: fastapi.FastAPI):
    trace.set_tracer_provider(
        TracerProvider(resource=Resource.create({SERVICE_NAME: app.title}))
    )

    trace.get_tracer_provider().add_span_processor(
        BatchSpanProcessor(
            JaegerExporter(
                agent_host_name="localhost",
                agent_port=6831,
            )
        )
    )

    FastAPIInstrumentor.instrument_app(app)
    HTTPXClientInstrumentor().instrument()


app = fastapi.FastAPI(title=__name__)
configure_trace(app)

def get_client():
    return httpx.AsyncClient()

@app.get("/api/check-baidu")
async def check_baidu(client: httpx.AsyncClient = fastapi.Depends(get_client)):
    resp = await client.head("https://www.baidu.com")
    return {"connected": resp.status_code == 200}

upstream.py中,我们定义了一个 FastAPI 应用,它有一个/api/check-baidu路由,用于检查是否能够访问百度。 并且进行了 opentelemetry 和 jaeger 的初始化配置

接下来使用 uvicorn 启动upstream服务:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
uvicorn upstream:app --port 5001 --reload

编辑main.py,在/check路由中,使用 requests 库请求http://localhost:5001/api/check-baidu,返回请求结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.get("/check-baidu")
def check_baidu():
    return requests.get("http://localhost:5001/api/check-baidu").json()

访问 http://localhost:5000/check-baidu ,可以看到请求成功:

访问 Jaeger UI ,查看链路追踪信息:

查看 trace 详情:

可以看到,我们的请求链路中包含了两个 span,分别是/check-baidu/api/check-baidu,分别来自于两个服务。

Jaeger UI也可以直接查看服务间的调用关系:

并且可以查看具体是哪些请求链路构成的服务间的调用关系(在 Layout 配置中开启 operations):


更复杂的场景

我们定义了五个服务,分别是mainupstreamservice1service2log

  • main:主服务,提供/check-sites路由,请求 upstream 服务的/api/check-sites接口。
  • upstream:上游服务,提供/api/check-sites路由,请求 service1 和 service2 服务的/api/check接口。
  • services1 与 service2:提供/api/check路由,分别检查百度和腾讯网的可连接性,在请求中请求 log 服务的/api/log接口。
  • log:提供/api/log路由,持久化 services1 与 service2 的请求日志。

访问 main 服务的/check-sites路由,可以看到请求成功:

刷新 Jaeger UI ,查看链路追踪信息:

从 trace 信息中可以直观了解到请求链路的细节,比如 upstream 两次请求 service1 和 service2 服务的/api/check接口是串行的,改成并行的话可以有效减少请求时间。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.get("/api/check-sites")
async def check_sites(client: httpx.AsyncClient = fastapi.Depends(get_client)):
    baidu = (await client.get("http://localhost:5002/api/check")).json()['connected']
    qq = (await client.get("http://localhost:5003/api/check")).json()['connected']
    return {"baidu": baidu, "qq": qq}

@app.get("/api/check-sites-v2")
async def check_sites_v2(client: httpx.AsyncClient = fastapi.Depends(get_client)):
    baidu , qq = await asyncio.gather(check("baidu",client),check("qq",client))
    return {"baidu": baidu, "qq": qq}

async def check(site:str,client: httpx.AsyncClient):
    match site:
        case "baidu":
            return (await client.get("http://localhost:5002/api/check")).json()['connected']
        case "qq":
            return (await client.get("http://localhost:5003/api/check")).json()['connected']
        case _:
            return False

实现一个并行的/api/check-sites-v2接口,可以看到请求时间从 374ms 减少到 195ms,提升十分明显。

可以看看目前的服务间调用关系:

总结

本文介绍了如何使用 opentelemetry 和 jaeger 来实现跨服务链路追踪,以及如何使用 opentelemetry 的自动化追踪功能来实现对异步应用的链路追踪。 在真实的复杂场景中,跨服务链路追踪可以帮助我们快速定位问题,提高服务的可用性和稳定性。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-02-162,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用opentelemetry与jaeger实现flask应用的链路追踪
链路追踪是应用可观测性的重要组成部分,它可以帮助我们快速定位问题,提高应用的可用性和稳定性。 今天我们来看看如何使用 opentelemetry 与 jaeger 实现 flask 应用的链路追踪。
杜逸先
2023/04/13
1.9K0
使用opentelemetry与jaeger实现flask应用的链路追踪
FastAPI基础-协程
协程是一种轻量级的线程,它允许我们在同一个线程内并发地执行多个任务。在协程中,我们可以使用 async/await 语法来定义异步操作。例如,我们可以使用 async def 定义一个异步函数,并在函数中使用 await 关键字来等待异步操作的完成。
堕落飞鸟
2023/05/07
6530
FastAPI基础-异步
异步编程是一种编程范式,它允许我们同时处理多个任务,而不必等待每个任务完成。在传统的同步编程中,我们通常是按顺序执行代码,一次只处理一个任务,直到完成后才继续执行下一个任务。而在异步编程中,我们可以同时处理多个任务,并在任务完成时处理它们的结果。
堕落飞鸟
2023/05/07
9330
Python3 新一代Http请求库Httpx使用(详情版)
我们经常使用Python语言的朋友们都清楚,requests 是使用率非常高的 HTTP 库,甚至更早Python2中使用的是 urllib、urllib2 ,也给我们提供了许多方便的功能。
Python兴趣圈
2024/01/12
9.9K0
Python3 新一代Http请求库Httpx使用(详情版)
使用Python进行异步微服务架构的设计与实现
微服务架构已经成为现代软件开发中的主流趋势,它将一个大型应用程序拆分为一系列小型、独立的服务,每个服务都有自己的特定功能。而异步微服务架构则更进一步,通过异步通信方式提高了系统的性能和可扩展性。本文将介绍如何使用Python构建异步微服务架构,并提供代码实例进行演示。
一键难忘
2024/07/31
2K0
锅总浅析链路追踪技术
链路追踪是什么?常用的链路追踪工具有哪些?它们的异同、架构、工作流程及关键指标有哪些?希望读完本文能帮您解答这些疑惑!
锅总
2024/07/31
1460
锅总浅析链路追踪技术
跨服务链路追踪:一次完整的 OpenTelemetry 使用实践
在现代的微服务架构中,一个用户请求可能需要跨多个服务才能完全处理。这样的复杂性可能会给诊断问题和性能优化带来挑战。因此,跨服务链路追踪技术的应用越来越受到关注。
运维开发王义杰
2023/08/10
2.5K0
跨服务链路追踪:一次完整的 OpenTelemetry 使用实践
分布式链路追踪续集
在上一文中提到为了统一各种分布式追踪系统的实现,CNCF (云原生计算基金会)下的 OpenTracing 项目定义了一套分布式追踪的标准,可以使用 OpenTracing API 完成代码的监控埋点,最后用户自由选择遵循 OpenTracing 标准的链路追踪系统,比如 jaeger 。
gopher云原生
2021/10/18
8080
送书 | 两百四十多万字,六百章的小说秒爬完
相信很多人喜欢在空闲的时间里看小说,甚至有小部分人为了追小说而熬夜看,那么问题来了,喜欢看小说的小伙伴在评论区告诉我们为什么喜欢看小说,今天我们手把手教你使用异步协程20秒爬完两百四十多万字,六百章的小说,让你一次看个够。
我被狗咬了
2021/09/24
5590
python新一代网络库HTTPX
最近在写一个自动化脚本,从某电商网站批量获取手机设备信息参数,基于python + requests完成脚本开发,但是实际运行效率上并不是特别满意。无意中看到了HTTPX,在功能性和效率性上,给了我眼前一亮的感觉。
测试加
2022/06/21
1.2K0
python新一代网络库HTTPX
FastAPI(61)- 异步测试
前言 前面讲解了通过 pytest 进行单元测试,是针对同步函数的:https://www.cnblogs.com/poloyy/p/15354901.html 但它无法再 pytest 中测试或运行任何异步函数 能够在测试中使用异步函数可能很有用 例如,当异步查询数据库时,假设想要测试向 FastAPI 应用程序发送请求,然后验证后端是否成功在数据库中写入了正确的数据,同时使用异步数据库 FastAPI 代码 from fastapi import FastAPI app = FastAPI() @
小菠萝测试笔记
2021/10/09
8860
Python新一代爬虫请求库!!
在 Python3 网络爬虫领域最新的比较火的工具莫过于 httpx 了,号称新一代网络请求神库
Python编程与实战
2021/10/21
1.5K0
基于opentracing + jaeger 实现全链路追踪
当代互联网服务,通常都是用复杂,大规模分布式集群来实现,微服务化,这些软件模块分布在不同的机器,不同的数据中心,由不同团队,语言开发而成。因此,需要工具帮助理解,分析这些系统、定位问题,做到追踪每一个请求的完整调用链路,收集性能数据,反馈到服务治理中,链路追踪系统应运而生。
orientlu
2019/06/14
3K0
【愚公系列】2023年05月 Python工具集合-httpx网络请求工具的使用
HTTP请求是指客户端向服务器发送请求的消息格式。它包括:请求行(HTTP方法、请求URL、HTTP协议版本号)、请求头部、请求数据三个部分。客户端向服务器发送HTTP请求后,服务器会依据请求消息的内容进行相应的处理并回送HTTP响应消息给客户端。
愚公搬代码
2023/05/03
6950
【愚公系列】2023年05月 Python工具集合-httpx网络请求工具的使用
Tempo - 分布式Loki链路追踪利器
Tempo是Grafana Labs在ObservabilityCON 2020大会上新开源的一个用于做分布式式追踪的后端服务。它和Cortex、Loki一样,Tempo也是一个兼备高扩展和低成本效应的系统。
米开朗基杨
2020/12/14
3.9K0
Tempo - 分布式Loki链路追踪利器
分布式链路追踪
微服务架构 作为云原生核心技术之一,提倡将单一应用程序划分成一组小的服务(微服务),服务之间互相协调、互相配合,为用户提供最终价值。
gopher云原生
2021/10/18
1.3K1
【微服务架构】从链路追踪到日志关联:打造分布式系统问题定位利器
微服务架构为系统带来了灵活性与扩展性,但也让问题定位变得更加复杂。服务间缺乏日志关联性是微服务调试和运维中的核心痛点之一。本文章将深入探讨如何通过分布式追踪、链路ID等技术实现服务间日志关联,并通过示例代码与工具展示如何落地这些方法。
网罗开发
2025/01/14
1600
【微服务架构】从链路追踪到日志关联:打造分布式系统问题定位利器
OpenObserve 指标和链路追踪方面的支持
前面我们讲到了 OpenObserve 的基本使用,使用 Fluentd 将日志采集后输出到了 OpenObserve,此外 OpenObserve 还支持指标和链路追踪。
我是阳明
2023/08/21
1.3K0
OpenObserve 指标和链路追踪方面的支持
当 .NET 5 遇上OpenTelemetry,会碰撞出怎样的火花?
OpenTelemetry是谷歌和微软共同推进的云原生监控的新规范, 兼容OpenTracing和OpenCensus
全球技术精选
2021/02/19
5710
当 .NET 5 遇上OpenTelemetry,会碰撞出怎样的火花?
OpenTelemetry 实战:从零实现分布式链路追踪
之前写过一篇 从 Dapper 到 OpenTelemetry:分布式追踪的演进之旅的文章,主要是从概念上讲解了 Trace 在 OpenTelemetry 的中的场景和使用。
crossoverJie
2024/09/29
2840
推荐阅读
相关推荐
使用opentelemetry与jaeger实现flask应用的链路追踪
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验