02.3、数据流 从应用到可视化
数据流:从应用到可视化
本节将学习:应用程序插桩、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 中可视化。
在下一节,我们将深入了解自动插桩和手动插桩的区别,看看何时使用哪种方式。