02.3数据流 从应用到可视化

分类: OpenTelemetry架构概览

数据流:从应用到可视化

本节将学习:应用程序插桩、OTLP 协议传输、Collector 处理、后端存储、Grafana 可视化。了解数据是如何流动的。

完整数据流程概览

数据流程是这样的

第一步:应用程序插桩。 应用程序使用 SDK 在应用中插桩。它在应用运行时采集 Traces、Metrics、Logs。

第二步:OTLP 协议传输。 SDK 使用 OTLP 协议传输数据到 Collector。OTLP 是 OpenTelemetry 定义的标准协议。

第三步:Collector 处理。 Collector 处理、转换、路由数据。它可以使用 Receivers、Processors、Exporters 来处理数据。

第四步:后端存储。 数据存储在后端,比如 Prometheus、Loki、Tempo。

第五步:Grafana 可视化。 在 Grafana 中查询和可视化数据。可以在 Dashboard 中看到 Traces、Metrics、Logs。

这就是完整的数据流程。从应用到可视化,数据经过了多个环节。现在让我们深入了解每个环节。

步骤一:应用程序插桩

应用程序插桩是什么? 就是在应用中添加代码,采集 Traces、Metrics、Logs。

插桩有两种方式

第一种是自动插桩。 无需修改代码,通过 Agent 自动插桩,适用于常见的框架和库。例如,Spring Boot 的自动插桩,Express 的自动插桩,它们会自动采集 HTTP 请求、数据库查询等信息。

第二种是手动插桩。 需要修改代码,手动创建 Traces、Metrics、Logs,适用于自定义逻辑。例如,要追踪某个特定的业务逻辑,就需要手动插桩。

插桩的过程是这样的:应用代码通过自动插桩或手动插桩,SDK 采集数据,然后导出数据。

代码示例:在 Spring Boot 中,可以使用自动插桩:

@RestController
public class OrderController {
    @GetMapping("/orders")
    public List<Order> getOrders() {
        // automatically created Span,No manual code required
        return orderService.getOrders();
    }
}

这个代码会自动创建 Span,无需手动代码。

如果要手动插桩:

Span span = tracer.spanBuilder("createOrder")
    .setAttribute("order.id", orderId)
    .startSpan();

这个代码手动创建 Span。我们将在下一节详细讲解自动插桩和手动插桩的区别。

步骤二:OTLP 协议传输

OTLP 是什么? OpenTelemetry Protocol,OpenTelemetry 定义的标准协议,用于传输 Traces、Metrics、Logs。

OTLP 协议有什么特点?

第一个特点:标准化。 OTLP 使用统一的协议格式。无论使用什么语言、什么 SDK,都使用相同的协议。这样数据格式就统一了。

第二个特点:高效。 OTLP 使用优化的数据传输格式,传输效率高。它可以高效地传输大量的 Traces、Metrics、Logs。

第三个特点:灵活。 OTLP 支持多种传输方式,比如 HTTP 和 gRPC。可以根据需求选择传输方式。

第四个特点:可扩展。 OTLP 支持自定义扩展。可以根据需要扩展协议。

传输方式:SDK 可以通过 OTLP/gRPC 或 OTLP/HTTP 传输数据到 Collector。也可以直接传输到后端存储,但通常建议使用 Collector。

协议优势:标准化、高效、灵活。这就是为什么 OpenTelemetry 使用 OTLP 协议,而不是每个 SDK 使用自己的协议。

步骤三:Collector 处理数据

Collector 处理数据的流程是这样的

第一步:Receivers 接收数据。 Receivers 接收来自 SDK 的数据,使用 OTLP 协议。例如,OTLP Receiver 接收 OTLP 数据。

第二步:Processors 处理数据。 Processors 处理、转换、聚合数据。例如,它可以:

  • 采样 Traces:只保留一部分 Traces,降低存储成本
  • 聚合 Metrics:聚合 Metrics 数据,减少数据量
  • 处理 Logs:处理 Logs 数据,添加属性、过滤等

第三步:Exporters 导出数据。 Exporters 导出数据到后端存储。例如,Prometheus Exporter 导出到 Prometheus,Loki Exporter 导出到 Loki,Tempo Exporter 导出到 Tempo。

处理示例:Collector 的配置可能是这样的:

Receivers:
- otlp (接收 OTLP 数据)

Processors:
- batch (批量处理)
- sampling (采样)
- attributes (添加属性)

Exporters:
- prometheus (导出到 Prometheus)
- loki (导出到 Loki)
- tempo (导出到 Tempo)

这个配置定义了数据接收、处理、导出的流程。我们将在后续章节详细讲解 Collector 的配置。

步骤四和五:后端存储和 Grafana 可视化

后端存储:Collector 将数据路由到不同的后端存储。

  • Tempo:存储 Traces(链路追踪数据)。它专门用于存储分布式追踪数据。
  • Prometheus:存储 Metrics(指标数据)。它专门用于存储时间序列数据。
  • Loki:存储 Logs(日志数据)。它专门用于存储日志数据。

Grafana 可视化:在 Grafana 中,可以:

  • 创建 Dashboard:可视化数据。可以创建各种图表,展示 Traces、Metrics、Logs。
  • 查询数据:查询 Traces、Metrics、Logs。可以使用 PromQL、LogQL、TraceQL 等查询语言。
  • 关联数据:通过 Trace ID 关联三种信号。可以从 Metrics 跳转到 Traces,从 Traces 跳转到 Logs。
  • 配置告警:配置告警规则。当指标超过阈值时,可以自动告警。

这就是完整的数据流程。从应用到可视化,数据经过了多个环节,最终在 Grafana 中可视化。

本节小结

在本节中,我们学习了完整的数据流程:

第一步:应用程序插桩。 使用自动插桩或手动插桩,在应用中采集 Traces、Metrics、Logs。

第二步:OTLP 协议传输。 使用 OTLP 协议传输数据到 Collector。OTLP 是标准化的数据传输协议。

第三步:Collector 处理。 Collector 使用 Receivers、Processors、Exporters 处理数据。

第四步:后端存储。 数据存储在后端,比如 Tempo、Prometheus、Loki。

第五步:Grafana 可视化。 在 Grafana 中查询和可视化数据。

完整流程:应用插桩 → OTLP 传输 → Collector 处理 → 后端存储 → Grafana 可视化。

这就是完整的数据流程。从应用到可视化,数据经过了多个环节,最终在 Dashboard 中可视化。

在下一节,我们将深入了解自动插桩和手动插桩的区别,看看何时使用哪种方式。