18、OpenTelemetry Collector 入门与实践

OpenTelemetry Collector 入门与实践

1. OpenTelemetry Collector 基础组件

OpenTelemetry Collector 的导出器支持多种格式,以下是可用的导出器及其支持的信号:
| 导出器 | 支持的信号 |
| — | — |
| … | … |

除了将不同信号的数据导出到可通过网络访问的目标外,还可以通过日志导出器将遥测数据本地导出到控制台,或通过文件导出器以 JSON 格式导出到文件。收集器的管道包含接收器、处理器和导出器这些组件,此外还有扩展功能。目前可用的扩展如下:
- ballast :允许用户为收集器配置内存压舱物,以提高收集器的整体稳定性和性能。
- health_check :提供一个端点用于检查收集器的健康状况,对服务发现或收集器编排很有用。
- pprof :启用 Go 性能分析器,用于识别收集器内的性能问题。
- zpages :在收集器中启用一个端点,提供有关收集器组件的调试信息。

2. 额外组件与 OTLP 协议

核心收集器发行版包含的组件是我们后续示例中二进制文件的一部分,但还有很多其他可用组件。为降低收集器核心功能的复杂性,主收集器仓库包含符合 OpenTelemetry 规范定义的组件。同时,许多个人和组织在 opentelemetry-collector-contrib 仓库(https://github.com/open-telemetry/opentelemetry-collector-contrib)贡献了额外的接收器、处理器和导出器。

在学习如何使用收集器并配置应用程序向其发送数据之前,需要了解用于接收和导出数据的首选协议 OTLP。OpenTelemetry 定义 OTLP 是为了确保遥测数据能尽可能高效可靠地传输,该协议通过协议缓冲区(https://developers.google.com/protocol-buffers)定义文件来定义。任何想发送或接收 OTLP 的客户端或服务器只需实现这些定义即可支持该协议。OTLP 是 OpenTelemetry 推荐的传输遥测数据的协议,也是收集器的核心组件。

OTLP 的定义(https://github.com/open-telemetry/opentelemetry-proto)分为多个部分以涵盖不同信号,每个组件通过其成熟度级别保证向后兼容性。例如,alpha 级别不保证无重大变更,而稳定级别保证每 12 个月最多引入一次向后不兼容的变更。各组件的成熟度级别可在项目的 README.md 文件中查看。

3. OTLP 的编码与协议

OTLP 规范定义了支持的编码和协议,最初支持以下三种组合:
- protobufs over gRPC
- protobufs over HTTP
- JSON over HTTP

选择编码或协议时,需考虑应用程序或部署代码的基础设施的要求。例如,某些环境可能不支持 gRPC,像一些云提供商的无服务器 Python 环境长期不支持 gRPC,浏览器也不支持 gRPC,这使得 JavaScript 的 OpenTelemetry 用户在为浏览器应用程序进行检测时无法使用 gRPC。此外,使用 JSON 序列化和反序列化数据可能会对某些语言的性能产生严重影响,与使用 protobufs 相比存在性能差异。这些不同的编码和协议组合为用户提供了更多灵活性,以适应不同的环境要求。

任何 OpenTelemetry 语言实现的要求之一是在将信号标记为通用可用之前支持至少一种这些格式,以确保用户可以使用 OTLP 在整个系统中从应用程序检测到后端导出数据。OTLP 协议还考虑了背压问题,定义了客户端在接收系统过载时应如何处理服务器响应以管理背压,并且该协议设计为对负载均衡器友好,以便可以水平扩展处理遥测数据的各个组件。

4. 使用 OpenTelemetry Collector

在熟悉了 OpenTelemetry Collector 和 OTLP 的核心组件后,我们可以开始在杂货店场景中使用收集器。首先,通过 opentelemetry-exporter-otlp 包为 Python 安装 OTLP 导出器,该包会安装每个协议和编码可用的包:
- opentelemetry-exporter-otlp-proto-grpc
- opentelemetry-exporter-otlp-proto-http
- opentelemetry-exporter-otlp-json-http

4.1 配置导出器

以下示例使用 otlp-proto-grpc 包,其中包含用于导出遥测数据的导出器类: OTLPSpanExporter OTLPMetricExporter OTLPLogExporter 。通过更新 common.py 模块来使用这些 OTLP 导出器,示例代码如下:

# common.py
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.exporter.otlp.proto.grpc._metric_exporter import OTLPMetricExporter
from opentelemetry.exporter.otlp.proto.grpc._log_exporter import OTLPLogExporter

def configure_tracer(name, version):
    ...
    exporter = OTLPSpanExporter()
    ...

def configure_meter(name, version):
    ...
    exporter = OTLPMetricExporter()
    ...

def configure_logger(name, version):
    ...
    exporter = OTLPLogExporter()
    ...

默认情况下,根据规范,导出器将配置为将数据发送到运行在 localhost:4317 的收集器。

4.2 配置收集器

以下收集器配置设置了 otlp 接收器以接收应用程序的遥测数据,并配置了日志导出器将有用信息输出到控制台:

# config/collector/config.yml
receivers:
  otlp:
    protocols:
      grpc:
exporters:
  logging:
service:
  pipelines:
    traces:
      receivers: [otlp]
      exporters: [logging]
    metrics:
      receivers: [otlp]
      exporters: [logging]
    logs:
      receivers: [otlp]
      exporters: [logging]

每次更新 config.yml 后,需要重启收集器以使更改生效。使用以下命令从终端启动收集器:

./otelcol --config ./config/collector/config.yml

如果一切正常,收集器进程将启动并列出已加载的组件,输出中应包含类似以下的消息:

2021-05-30T16:19:03.088-0700 info service/application.go:197 Everything is ready. Begin running and processing data.

在另一个终端中运行应用程序代码,依次启动 legacy_inventory.py grocery_store.py shopper.py

python legacy_inventory.py
python grocery_store.py
python shopper.py

关注运行收集器的终端输出,应能看到描述收集器处理的跟踪、指标和日志的信息,示例输出如下:

2022-02-13T14:35:47.101-0800    INFO    loggingexporter/logging_exporter.go:69  LogsExporter      {"#logs": 1}
2022-02-13T14:35:47.110-0800    INFO    loggingexporter/logging_exporter.go:40  TracesExporter    {"#spans": 4}
2022-02-13T14:35:49.858-0800    INFO    loggingexporter/logging_exporter.go:40  TracesExporter    {"#spans": 1}
2022-02-13T14:35:50.533-0800    INFO    loggingexporter/logging_exporter.go:40  TracesExporter    {"#spans": 3}
2022-02-13T14:35:50.535-0800    INFO    loggingexporter/logging_exporter.go:69  LogsExporter      {"#logs": 2}
5. 添加处理器优化收集器

观察上述输出,会发现 TracesExporter 多次被调用。可以使用批处理器来提高效率,它会等待一段时间,然后一次性发送包含所有遥测数据的单个批次。以下代码配置了一个超时时间为 10 秒的批处理器,并将其添加到每个管道中:

# config/collector/config.yml
processors:
  batch:
    timeout: 10s
...
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [logging]
    metrics:
      receivers: [otlp]
      processors: [batch]
      exporters: [logging]
    logs:
      receivers: [otlp]
      processors: [batch]
      exporters: [logging]

再次运行 shopper.py ,收集器的输出应显示包含之前所有跨度总和的单行信息:

2022-02-13T14:40:07.360-0800    INFO    loggingexporter/logging_exporter.go:69  LogsExporter    {"#logs": 2}
2022-02-13T14:40:07.360-0800    INFO    loggingexporter/logging_exporter.go:40  TracesExporter  {"#spans": 8}

多次运行 shopper.py 会发现收集器输出遥测数据信息有 10 秒的延迟,这就是批处理器在起作用。为了使日志输出更有用,可以更新日志导出器配置:

# config/collector/config.yml
exporters:
  logging:
    loglevel: debug

重启收集器并再次运行 shopper.py ,将输出接收到的完整遥测数据,可关注名为 add item to cart 的跨度,后续会对其进行修改。示例输出如下:

Span #0
    Trace ID       : 1592a37b7513b73eaefabde700f4ae9b
    Parent ID      : 2411c263df768eb5
    ID             : 8e6f5cdb56d6448d
    Name           : HTTP GET
    Kind           : SPAN_KIND_SERVER
    Start time     : 2022-02-13 22:41:42.673298 +0000 UTC
    End time       : 2022-02-13 22:41:42.677336 +0000 UTC
    Status code    : STATUS_CODE_UNSET
    Status message :
Attributes:
     -> http.method: STRING(GET)
     -> http.server_name: STRING(127.0.0.1)
     -> http.scheme: STRING(http)
     -> net.host.port: INT(5000)
     -> http.host: STRING(localhost:5000)
     -> http.target: STRING(/products)
     -> net.peer.ip: STRING(127.0.0.1)
6. 修改跨度与过滤指标

收集器的一个强大功能是能够从中央位置处理遥测数据。以下示例使用两个不同的处理器来增强之前提到的跨度。首先, attributes 处理器会添加一个 location 属性,然后 span 处理器会使用跨度的属性重命名跨度,使其包含 location item quantity 属性。新处理器必须添加到跟踪管道的处理器数组中:

# config/collector/config.yml
processors:
  attributes/add-location:
    actions:
      - key: location
        action: insert
        value: europe
  span/rename:
    name:
      from_attributes: [location, item, quantity]
      separator: ":"
...
  pipelines:
    traces:
      processors: [batch, attributes/add-location, span/rename]

注意处理器的顺序很重要,在这个例子中,顺序颠倒将无法正常工作,因为 location 属性将不会被填充。运行 shopper.py 并查看收集器的输出,新导出的跨度将包含配置的 europe 值的 location 属性,其名称也会更新为 location:item:quantity

Span #1
    Trace ID       : 47dac26efa8de0ca1e202b6d64fd319c
    Parent ID      : ee10984575037d4a
    ID             : a4f42124645c4d3b
    Name           : europe:orange:5
    Kind           : SPAN_KIND_INTERNAL
    Start time     : 2022-02-13 22:44:57.072143 +0000 UTC
    End time       : 2022-02-13 22:44:57.07751 +0000 UTC
    Status code    : STATUS_CODE_UNSET
    Status message :
Attributes:
     -> item: STRING(orange)
     -> quantity: INT(5)
     -> location: STRING(europe)

接下来,我们看看如何处理指标。 hostmetrics 接收器可以捕获本地主机的指标。以下示例配置 hostmetrics 接收器每 10 秒收集一次内存和网络信息:

# config/collector/config.yml
receivers:
  hostmetrics:
    collection_intervals: 10s
    scrapers:
      memory:
      network:
...
service:
  pipelines:
    metrics:
      receivers: [otlp, hostmetrics]

配置此接收器后,重启收集器,无需运行 shopper.py 即可在收集器输出中看到指标,输出将包括内存和网络指标,示例如下:

InstrumentationLibraryMetrics #0
InstrumentationLibrary
Metric #0
Descriptor:
     -> Name: system.memory.usage
     -> Description: Bytes of memory in use.
     -> Unit: By
     -> DataType: IntSum
     -> IsMonotonic: false
     -> AggregationTemporality: AGGREGATION_TEMPORALITY_CUMULATIVE
IntDataPoints #0
Data point labels:
     -> state: used
StartTimestamp: 1970-01-01 00:00:00 +0000 UTC
Timestamp: 2022-02-13 22:48:16.999087 +0000 UTC
Value: 10880851968
Metric #1
Descriptor:
     -> Name: system.network.packets
     -> Description: The number of packets transferred.
     -> Unit: {packets}
     -> DataType: IntSum
     -> IsMonotonic: true
     -> AggregationTemporality: AGGREGATION_TEMPORALITY_CUMULATIVE
IntDataPoints #0
Data point labels:
     -> device: lo0
     -> direction: transmit
StartTimestamp: 1970-01-01 00:00:00 +0000 UTC
Timestamp: 2022-02-13 22:48:16.999087 +0000 UTC
Value: 120456

根据运行收集器的系统类型,可能有多个网络接口会生成大量指标。为减少噪声,可以更新配置以仅收集单个接口的指标,例如使用 lo0 接口:

# config/collector/config.yml
receivers:
  hostmetrics:
    collection_intervals: 10s
    scrapers:
      memory:
      network:
        include:
          match_type: strict
          interfaces: [lo0]

注意网络接口名称因操作系统而异,常见的接口名称有 lo0 eth0 en0 wlan0 。如果不确定,可以查看之前输出中的 device 标签以了解系统上可用的接口。

尽管输出会显著减少,但仍有许多网络指标需要筛选。 system.network.connections 指标会为每个 TCP 状态收集数据点,比较嘈杂。可以使用 filter 处理器排除该指标:

# config/collector/config.yml
processors:
  filter/network-connections:
    metrics:
      exclude:
        match_type: strict
        metric_names:
          - system.network.connections
...
  pipelines:
    metrics:
      receivers: [hostmetrics]
      processors: [batch, filter/network-connections]

最后一次重启收集器,输出将更易于阅读。通过这些操作,我们对 OpenTelemetry Collector 有了更深入的了解,可以通过尝试不同的配置和处理器来进一步熟悉它。

综上所述,我们学习了 OpenTelemetry Collector 的基础知识和组件,了解了接收器、处理器、导出器和扩展的作用,掌握了 OTLP 协议的定义、优点和设计决策。通过配置收集器并使用各种处理器处理收集到的数据,我们能够更好地利用收集器的强大功能。后续可以进一步探索如何在各种场景中部署收集器,使其成为基础设施的核心组件。

OpenTelemetry Collector 入门与实践

7. 总结与展望

通过前面的学习和实践,我们已经对 OpenTelemetry Collector 有了较为全面的认识。下面对所学内容进行总结:
- 组件功能 :了解了接收器、处理器、导出器和扩展在收集器中的作用。接收器负责接收遥测数据,处理器对数据进行处理和转换,导出器将处理后的数据发送到目标位置,扩展则提供了额外的功能,如内存压舱物配置、健康检查、性能分析和调试信息提供等。
- OTLP 协议 :掌握了 OTLP 协议的定义、编码和协议组合,以及其在数据传输中的优势和设计考虑。OTLP 协议通过不同的编码和协议组合为用户提供了灵活性,同时考虑了背压管理和负载均衡器友好性。
- 配置与操作 :学会了如何配置导出器和收集器,以及如何使用处理器优化数据处理和输出。通过具体的配置示例,我们展示了如何添加批处理器、修改跨度和过滤指标,从而更好地管理和利用遥测数据。

为了更清晰地展示整个流程,下面是一个 mermaid 格式的流程图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([开始]):::startend --> B(安装 OTLP 导出器):::process
    B --> C(配置导出器):::process
    C --> D(配置收集器):::process
    D --> E(启动收集器):::process
    E --> F(运行应用程序):::process
    F --> G{数据处理与优化}:::decision
    G -->|添加批处理器| H(配置批处理器):::process
    G -->|修改跨度| I(配置跨度处理器):::process
    G -->|过滤指标| J(配置过滤处理器):::process
    H --> K(查看优化后输出):::process
    I --> K
    J --> K
    K --> L([结束]):::startend

未来,我们可以进一步探索如何将 OpenTelemetry Collector 从开发环境中的组件转变为基础设施的核心组件。以下是一些可以深入研究的方向:
- 多环境部署 :探索如何在不同的环境中部署收集器,如容器化环境(如 Docker 和 Kubernetes)、云环境等,以充分发挥收集器的优势。
- 与其他工具集成 :研究如何将 OpenTelemetry Collector 与其他监控和分析工具集成,如 Prometheus、Grafana 等,以实现更全面的监控和分析功能。
- 自定义处理器开发 :尝试开发自定义的处理器,以满足特定的业务需求,如数据加密、数据脱敏等。

8. 常见问题解答

在使用 OpenTelemetry Collector 的过程中,可能会遇到一些常见问题,下面为大家解答:
- 问题 1:更新配置文件后,收集器没有生效怎么办?
- 解答 :每次更新 config.yml 文件后,必须重启收集器,使用命令 ./otelcol --config ./config/collector/config.yml 重新启动收集器,使更改生效。
- 问题 2:如何确定系统上可用的网络接口名称?
- 解答 :可以查看收集器输出中的 device 标签,它会显示系统上可用的一些接口。常见的接口名称有 lo0 eth0 en0 wlan0 ,但具体名称因操作系统而异。
- 问题 3:处理器的顺序对结果有影响吗?
- 解答 :处理器的顺序非常重要。例如,在修改跨度的示例中,如果 attributes/add-location span/rename 处理器的顺序颠倒, span/rename 处理器将无法获取到 location 属性,导致无法正确重命名跨度。

9. 最佳实践建议

为了更好地使用 OpenTelemetry Collector,以下是一些最佳实践建议:
- 合理选择编码和协议 :根据应用程序和部署环境的要求,选择合适的编码和协议组合。如果环境支持 gRPC,优先考虑 protobufs over gRPC ,因为它通常具有更好的性能;如果环境不支持 gRPC,可以选择 protobufs over HTTP JSON over HTTP
- 使用批处理器 :在处理大量遥测数据时,使用批处理器可以提高效率,减少网络开销。合理设置批处理器的超时时间,以平衡数据处理的实时性和效率。
- 定期检查和优化配置 :随着业务的发展和环境的变化,定期检查和优化收集器的配置,确保其能够高效地处理和传输遥测数据。例如,根据实际情况调整接收器、处理器和导出器的配置,以满足不同的需求。

10. 总结

OpenTelemetry Collector 是一个强大的工具,它为我们提供了一种有效的方式来收集、处理和传输遥测数据。通过本文的学习,我们了解了收集器的核心组件、OTLP 协议的特点和优势,以及如何配置和使用收集器来处理遥测数据。同时,我们还通过具体的示例展示了如何使用处理器优化数据处理和输出,以及如何解决常见问题和遵循最佳实践。

希望大家能够通过不断的实践和探索,更好地掌握 OpenTelemetry Collector 的使用,将其应用到实际项目中,为系统的监控和分析提供有力支持。未来,随着技术的不断发展,OpenTelemetry Collector 也将不断完善和扩展,为我们带来更多的便利和价值。

【从高压输电线的架空地线中汲取电能】一个25千瓦受控电源从735千伏线路的架空地线中汲取电能的SimPowerSystems模型(Simulink仿真实现)内容概要:本文介绍了一个基于SimPowerSystems的Simulink仿真模型,用于模拟从735千伏高压输电线的架空地线中汲取25千瓦电能的受控电源系统。该模型聚焦于高压输电线路中架空地线的能量回收技术,通过仿真手段实现对电能采集过程的建模控制策略验证,体现了电力系统中新型能源获取方式的技术可行性工程应用潜力。文中还提及该资源属于一系列电力系统仿真研究的一部分,涵盖微电网、储能优化、碳流追踪、鲁棒调度等多个前沿方向,配套提供Matlab/Simulink代码及网盘资料链接,便于科研人员复现拓展研究。; 适合人群:具备电力系统基础知识、熟悉Matlab/Simulink仿真环境,从事电力工程、能源回收或智能电网相关研究的科研人员及研究生;有一定编程建模仿真经验的高年级本科生或工程技术人员。; 使用场景及目标:①研究高压输电线路中架空地线的能量回收机制建模方法;②掌握基于Simulink的电力系统仿真技术,特别是受控电源电网交互的动态特性分析;③为开展能源 harvesting、分布式供能、电力电子变换器控制等相关课题提供参考模型技术支撑; 阅读建议:建议结合提供的仿真模型文件进行实操演练,重点理解系统结构设计、参数设置控制逻辑实现;同时可延伸学习文档中提到的其他电力系统优化仿真案例,以拓宽研究视野和技术积累。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值