opentelemetry+jaeger python版本跨服务调用示例

25 篇文章 14 订阅

opentelemetry python版本跨服务调用示例

opentelemetry跨服务调用的时候,需要引用opentelemetry-instrumentation-requests,然后在用request跨服务请求。(注意,如果是异步要用aiohttp-client)
服务端我是用的jaeger,直接通过all-in-one的docker部署的,代码如下:

docker run -d --name jaeger \
  -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
  -p 5775:5775/udp \
  -p 6831:6831/udp \
  -p 6832:6832/udp \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 14250:14250 \
  -p 14268:14268 \
  -p 14269:14269 \
  -p 9411:9411 \
  jaegertracing/all-in-one:1.32

启动好jaeger之后,访问页面为:http://localhost:16686

python需要启动两个服务来展示跨服务调用。我用的框架是fastapi,所以需要安装opentelemetry-instrumentation-fastapi
由服务2调用服务1
服务1:

import fastapi
from opentelemetry import trace
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
from fastapi import Body
from pybase.lib.tracer.jaeger_ import register_to_jaeger
from pydantic import BaseModel

app = fastapi.FastAPI()


class UserInfo(BaseModel):
    name: str


tracer = trace.get_tracer(__name__)


@app.post("/server")
async def server(userinfo: str = Body(...), name: str = Body(..., )):
    return {"message": f"hello {userinfo},{name}"}



FastAPIInstrumentor.instrument_app(app)
if __name__ == '__main__':
    register_to_jaeger("fastapi-jaeger-server", "localhost")
    import uvicorn

    uvicorn.run(app,port=8001)

服务2

import fastapi
import requests
from opentelemetry import trace
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
from fastapi import Body
from opentelemetry.instrumentation.requests import RequestsInstrumentor
RequestsInstrumentor().instrument()
from pybase.lib.tracer.jaeger_ import register_to_jaeger
from pydantic import BaseModel

app = fastapi.FastAPI()


class UserInfo(BaseModel):
    name: str


tracer = trace.get_tracer(__name__)


@app.post("/foobar")
async def foobar(userinfo: str = Body(...), name: str = Body(..., )):
    with tracer.start_as_current_span("foo"):
        with tracer.start_as_current_span("bar"):
            with tracer.start_as_current_span("baz"):
                print("Hello world from OpenTelemetry Python!")
    return {"message": f"hello {userinfo},{name}"}
@app.post("/foobar2")
async def foobar2(userinfo: str = Body(...), name: str = Body(..., )):
    return {"message": f"hello {userinfo},{name}"}

@app.post("/client")
def client(userinfo: str = Body(...), name: str = Body(..., )):

    res=requests.post("http://127.0.0.1:8001/server",json={
        "userinfo":userinfo,"name":name
    })
    return res.json()


FastAPIInstrumentor.instrument_app(app)
if __name__ == '__main__':
    register_to_jaeger("fastapi-jaeger", "localhost")
    import uvicorn

    uvicorn.run(app)

依赖到的一个函数register_to_jaeger:

from opentelemetry import trace
from opentelemetry.exporter.jaeger.thrift import JaegerExporter
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor


def register_to_jaeger(service_name: str, jaeger_host: str, jaeger_port: int = 6831):
    """
    注册服务到jaeger,这样就可以发送tracer相关信息到jaeger服务器
    Args:
        service_name:  注册的服务明
        jaeger_host:   jaeger地址
        jaeger_port:

    Returns: TracerProvider

    """
    provider = TracerProvider(
        resource=Resource.create({SERVICE_NAME: service_name})
    )
    trace.set_tracer_provider(
        provider
    )

    # create a JaegerExporter
    jaeger_exporter = JaegerExporter(
        agent_host_name=jaeger_host,
        agent_port=jaeger_port,
    )

    # Create a BatchSpanProcessor and add the exporter to it
    span_processor = BatchSpanProcessor(jaeger_exporter)

    # add to the tracer
    trace.get_tracer_provider().add_span_processor(span_processor)

然后执行:

curl -X 'POST' \
  'http://127.0.0.1:8000/client' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "userinfo": "string",
  "name": "string"
}'

就可以得到如下效果:
请添加图片描述如有问题,欢迎指正。

好的,我可以为您提供一个Python应用程序中集成OpenTelemetry示例。 首先,您需要在您的Python应用程序中添加OpenTelemetry的依赖,例如: ```python pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-jaeger ``` 然后,您需要创建一个OpenTelemetry的实例,并配置它,例如: ```python from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import SimpleExportSpanProcessor from opentelemetry.exporter.jaeger import JaegerSpanExporter jaeger_exporter = JaegerSpanExporter( service_name="my-python-app", agent_host_name="localhost", agent_port=6831, ) trace.set_tracer_provider(TracerProvider()) trace.get_tracer_provider().add_span_processor( SimpleExportSpanProcessor(jaeger_exporter) ) tracer = trace.get_tracer(__name__) ``` 在上面的代码中,我们创建了一个OpenTelemetry的实例,并添加了一个JaegerSpanExporter,用于将跟踪数据发送到本地的Jaeger后端。您需要根据您的环境进行配置。 接下来,您可以使用OpenTelemetry的Tracer来创建Span,并在代码中添加注解,例如: ```python with tracer.start_as_current_span("MyOperation"): tracer.current_span().add_event("Starting the operation") # Your operation code here tracer.current_span().add_event("Finishing the operation") ``` 在上面的代码中,我们使用OpenTelemetry的Tracer来创建一个名为"MyOperation"的Span,并使用with语句创建一个上下文,以确保Span在操作完成后被正确地结束和释放。我们还添加了一些事件,用于更好地理解Span的上下文和时间线。 最后,您需要确保您的应用程序配置和代码逻辑与您选择的后端和部署环境相匹配。您可以使用Jaeger等工具来验证和可视化您的跟踪数据。 希望这个示例能够帮助您更好地理解和使用OpenTelemetry
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值