Fremount 2024-04-13 14:13 采纳率: 11.1%
浏览 34
已结题

获取链路追踪的http数据

现在我想实现这么一个功能:在k8s环境中部署了一个具有多个微服务的系统,现在我想对其进行链路追踪,追踪后的数据格式如下所示:

{
    "req_id": "trace1234normal",
    "spans": [
        {
            "service_name": "订单服务 (A)",
            "operation_name": "处理订单(正常)",
            "request": {
                "method": "POST",
                "url": "/order/submit",
                "headers": {
                    "Content-Type": "application/json"
                },
                "body": {
                    "user_id": 102,
                    "items": [{"item_id": 56, "quantity": 2}],
                    "address": "用户地址信息"
                }
            },
            "response": {
                "status_code": 200,
                "body": {
                    "order_id": 3001,
                    "message": "订单处理成功"
                }
            },
            "dependencies": [
                {
                    "dependent_service": "库存服务 (B)",
                    "status": "success"
                },
                {
                    "dependent_service": "支付服务 (C)",
                    "status": "success"
                }
            ]
        },
        {
            "service_name": "库存服务 (B)",
            "operation_name": "检查库存",
            "request": {
                "method": "GET",
                "url": "/inventory/check",
                "headers": {},
                "body": {
                    "item_id": 56
                }
            },
            "response": {
                "status_code": 200,
                "body": {
                    "item_id": 56,
                    "available_quantity": 10
                }
            }
        },
        {
            "service_name": "支付服务 (C)",
            "operation_name": "处理支付",
            "request": {
                "method": "POST",
                "url": "/payment/process",
                "headers": {
                    "Content-Type": "application/json"
                },
                "body": {
                    "order_id": 3001,
                    "amount": 100
                }
            },
            "response": {
                "status_code": 200,
                "body": {
                    "payment_id": 4001,
                    "status": "支付成功"
                }
            }
        }
    ]
}

也就是获取到一个请求所涉及到各个微服务的请求和响应的详细内容。

要求用非侵入式的方案进行实现,不修改原有项目的代码。

  • 写回答

25条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-13 14:13
    关注
    获得3.00元问题酬金

    引自免费微信小程序:皆我百晓生

    要实现在Kubernetes环境中对具有多个微服务的系统的链路追踪,并获取类似您所描述的跟踪数据,可以采用以下非侵入式方案。我们将利用OpenTelemetry(一种云原生计算基金会CNCF项目,用于收集、处理和导出分布式系统中的遥测数据)和Jaeger(一种流行的分布式追踪系统,用于实时监控和故障排查)作为链路追踪工具。以下是详细步骤和配置示例:

    1. 安装Jaeger Operator: 使用Helm chart或其他方法在Kubernetes集群中安装Jaeger Operator,以便管理Jaeger实例的生命周期。例如,使用Helm:

      helm repo add jaegertracing https://jaegertracing.github.io/helm-charts
      helm install jaeger-operator jaegertracing/jaeger-operator
      
    2. 创建Jaeger实例: 创建一个Jaeger Custom Resource (CR) 来定义所需的Jaeger实例。例如,创建一个名为my-jaeger的Jaeger CR:

      apiVersion: jaegertracing.io/v1
      kind: Jaeger
      metadata:
        name: my-jaeger
      spec:
        strategy: allInOne
        allInOne:
          image: jaegertracing/all-in-one
          options:
            log-level: debug
        ingress:
          enabled: true
          hosts:
            - jaeger.example.com
      

      将上述内容保存为jaeger.yaml,然后应用到集群:

      kubectl apply -f jaeger.yaml
      
    3. 配置OpenTelemetry Collector: 下载适用于Kubernetes环境的OpenTelemetry Collector配置文件,例如otel-collector-config.yaml

      apiVersion: opentelemetry.io/v1alpha1
      kind: OpenTelemetryCollector
      metadata:
        name: otel-collector
      spec:
        config: |
          receivers:
            otlp:
              protocols:
                http:
                grpc:
          processors:
            batch:
            memory_limiter:
              limit_mib: 900
              check_interval: 1s
              spike_limit_percentage: 75
          exporters:
            jaeger:
              endpoint: "http://my-jaeger-query.jaeger-operator.svc.cluster.local:14268/api/traces"
              insecure: true
      
          service:
            pipelines:
              traces:
                receivers: [otlp]
                processors: [batch, memory_limiter]
                exporters: [jaeger]
      

      应用此配置到集群:

      kubectl apply -f otel-collector-config.yaml
      
    4. 在微服务中注入OpenTelemetry代理: 使用Kubernetes的自动注入机制,在每个微服务的Pod模板中添加注解sidecar.opentelemetry.io/inject: "true"。例如:

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: order-service
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: order-service
        template:
          metadata:
            labels:
              app: order-service
            annotations:
              sidecar.opentelemetry.io/inject: "true"
          spec:
            containers:
            - name: order-service
              image: your-order-service-image
              ports:
              - containerPort: 8080
      

      这将确保每个微服务Pod内部自动包含一个OpenTelemetry代理容器,负责捕获并转发服务间的HTTP请求和响应数据到OpenTelemetry Collector。

    5. 验证和访问链路追踪数据: 部署完成后,通过浏览器访问http://jaeger.example.com(或您在Jaeger CR中配置的主机名),查看和分析链路追踪数据。您应该能看到类似您提供的示例结构的跟踪信息,包括各个微服务的请求和响应详细内容。

    按照以上步骤,您可以在Kubernetes环境中实现对微服务系统的链路追踪,无需修改原有项目的代码。所有跟踪数据将以非侵入方式被捕获并通过Jaeger界面展示。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月21日
  • 创建了问题 4月13日

悬赏问题

  • ¥20 vx转账功能对方不能领取
  • ¥15 vue2+codemirror 运行后页面光标太大了
  • ¥15 pdfjs库如何在前端实现打印、旋转等功能
  • ¥15 combobox数据绑定问题
  • ¥15 maven打包时,为什么有的依赖打不进去包
  • ¥15 求复现机器学习文章一篇
  • ¥15 爬虫抓取数据|解析视频文本内容(相关搜索:自动化)
  • ¥15 combobox绑定值改变的问题
  • ¥15 from seleniumwire import webdriver 在抓取http://链接的时候会自动转https://这个怎么解决
  • ¥15 hive直连数据库模式插入mysql表数据失败(相关搜索:数据库)