使用 OpenTelemetry 构建可观测性 04 - 收集器

在之前的博文中,我们讨论了如何使用 SDK 和链路追踪生产者来导出进程中的遥测数据。尽管有多种类型的导出器可供选择,但其中一个常见的目标是将数据导出到  OpenTelemetry Collector。本篇文章将深入探讨收集器以及如何使用它。

选 OTel Collector 还是其他

正如上一篇博客文章中提到的,我谈到了使用 OTLP 导出器将数据发送到 OTel Collector。此外我还提到,对导出器来说输出遥测数据的目的地是多样的。当导出器可以直接发送到 Jaeger、Prometheus 或控制台时,为什么还要选择 OTel Collector 呢?答案是由于灵活性:

  • 将遥测数据从收集器同时发送给多个不同的目标
  • 在发送之前对数据加工处理(添加/删除属性、批处理等)
  • 解耦生产者和消费者

以下是 OTel Collector 工作原理的概览:

20230814203245

收集器的主要组件包括:

  • 接收模块 - 从收集器外部收集遥测数据(例如 OTLP、Kafka、MySQL、syslog)
  • 处理模块 - 处理或转换数据(例如属性、批次、Kubernetes 属性)
  • 导出模块 - 将处理后的数据发送到另一个目标(例如 Jaeger、AWS Cloud Watch、Zipkin)
  • 扩展模块 - 收集器增强功能的插件(例如 HTTP 转发器)

在 Kubernetes 中运行 OpenTelemetry Collector 的两种方式

运行 OTel Collector 的方法有多种,比如您可以将其作为独立进程运行。不过也有很多场景都会涉及到 Kubernetes 集群的使用,在 Kubernetes 中,有两种主要的方式来运行 OpenTelemetry Collector 收集器的运行方式主要有两种。

第一种方式(也是示例应用程序中使用的)是守护进程( DaemonSet ),每个集群节点上都有一个收集器 pod:

20230814211046

在这种情况下,产生遥测数据的实例将导出到同节点中收集器的实例里面。通常,还会有一个网关收集器,从节点中收集器的实例中汇总数据。

在 Kubernetes 中运行收集器的另一种方式是作为附加辅助容器和主程序部署在同一个Pod中的边车模式( sidecars )。也就是说,应用程序 Pod 和收集器实例之间存在一对一的映射关系,它们共享相同的资源,无需额外的网络开销,紧密耦合并共享相同的生命周期。

20230814211205

在 OpenTelemetry Operator 中是使用注释 sidecar.opentelemetry.io/inject 来实现将 sidecar 容器注入到应用程序 Pod 中。

核心版与贡献版的区别

正如您在上面所看到的,OTel Collector 是一个设计高度可插拔拓展的系统。这样的设计非常灵活,因为随着当前和未来各种接收模块、处理模块、导出模块和扩展模块的增加,我们就可以利用插件机制进行集成。 OpenTelemetry 引入收集器分发的概念,其含义是根据需要选择不同组件,以创建满足特定需求的定制化收集器版本。

在撰写本文时,有两个分发版:Core 和 contrib。核心分发版的命名恰如其分,仅包含核心模块。但贡献版呢?全部。可以看到它包含了一长串的接收模块、处理模块和导出模块的列表。

定制化收集器分发版的构建

如果核心版和贡献版都无法完全满足你的需求,你可以使用 OpenTelemetry 提供的 ocb 工具自定义自己的收集器分发版本。该工具可以帮助你选择和组合需要的功能和组件,以创建符合你特定需求的自定义收集器分发版本。这样你既可以获得所需的功能,又能避免贡献版中的不必要组件。

为了使用 ocb 工具构建自定义的收集器分发版本,你需要提供一个 YAML 清单文件来指定构建的方式。一种简单的做法是使用 contrib manifest.yaml ,在该文件的基础上删除不需要的组件,以创建适合应用程序需求的小型清单。这样你就可以得到一个只包含必要组件的自定义收集器分发版本,以满足当前收集器场景,而且没有多余的组件。

dist:module: github.com/trstringer/otel-shopping-cart/collectorname: otel-shopping-cart-collectordescription: OTel Shopping Cart Collectorversion: 0.57.2output_path: ./collector/distotelcol_version: 0.57.2exporters:- import: go.opentelemetry.io/collector/exporter/loggingexportergomod: go.opentelemetry.io/collector v0.57.2- gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/jaegerexporter v0.57.2processors:- import: go.opentelemetry.io/collector/processor/batchprocessorgomod: go.opentelemetry.io/collector v0.57.2receivers:- import: go.opentelemetry.io/collector/receiver/otlpreceivergomod: go.opentelemetry.io/collector v0.57.2

我修改了一些 dist 属性并删除了许多 exporters 、 processors 和 receivers 。现在可以根据需求构建定制化的收集器分发版了!

$ ocb --config ./collector/manifest.yaml
2022-08-09T20:38:24.325-0400    INFO    internal/command.go:108 OpenTelemetry Collector Builder {"version": "0.57.2", "date": "2022-08-03T21:53:33Z"}
2022-08-09T20:38:24.326-0400    INFO    internal/command.go:130 Using config file       {"path": "./collector/manifest.yaml"}
2022-08-09T20:38:24.326-0400    INFO    builder/config.go:99    Using go        {"go-executable": "/usr/local/go/bin/go"}
2022-08-09T20:38:24.326-0400    INFO    builder/main.go:76      Sources created {"path": "./collector/dist"}
2022-08-09T20:38:24.488-0400    INFO    builder/main.go:108     Getting go modules
2022-08-09T20:38:24.521-0400    INFO    builder/main.go:87      Compiling
2022-08-09T20:38:25.345-0400    INFO    builder/main.go:94      Compiled        {"binary": "./collector/dist/otel-shopping-cart-collector"}

最终输出一个二进制文件,在我的环境中,位于 ./collector/dist/otel-shopping-cart-collector 。不过还没结束,由于要在 Kubernetes 中运行这个收集器,所以需要创建一个容器映像。使用 contrib Dockerfile 作为基础模版,最终得到以下内容:

Dockerfile Dockerfile

FROM alpine:3.13 as certs
RUN apk --update add ca-certificatesFROM alpine:3.13 AS collector-build
COPY ./collector/dist/otel-shopping-cart-collector /otel-shopping-cart-collector
RUN chmod 755 /otel-shopping-cart-collectorFROM ubuntu:latestARG USER_UID=10001
USER ${USER_UID}COPY --from=certs /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
COPY --from=collector-build /otel-shopping-cart-collector /
COPY collector/config.yaml /etc/collector/config.yaml
ENTRYPOINT ["/otel-shopping-cart-collector"]
CMD ["--config", "/etc/collector/config.yaml"]
EXPOSE 4317 55678 55679

在本例中,我将 config.yaml 直接嵌入到镜像中,但您可以通过使用 ConfigMap 来使其更加动态:

config.yaml

receivers:otlp:protocols:grpc:http:processors:batch:exporters:logging:logLevel: debugjaeger:endpoint: jaeger-collector:14250tls:insecure: trueservice:pipelines:traces:receivers: [otlp]processors: [batch]exporters: [logging, jaeger]

最后创建此镜像后,我需要创建 DaemonSet 清单:

apiVersion: apps/v1
kind: DaemonSet
metadata:name: otel-collector-agent
spec:selector:matchLabels:app: otel-collectortemplate:metadata:labels:app: otel-collectorspec:containers:- name: opentelemetry-collectorimage: "{{ .Values.collector.image.repository }}:{{ .Values.collector.image.tag }}"imagePullPolicy: "{{ .Values.collector.image.pullPolicy }}"env:- name: MY_POD_IPvalueFrom:fieldRef:apiVersion: v1fieldPath: status.podIPports:- containerPort: 14250hostPort: 14250name: jaeger-grpcprotocol: TCP- containerPort: 4317hostPort: 4317name: otlpprotocol: TCP- containerPort: 4318hostPort: 4318name: otlp-httpprotocol: TCPdnsPolicy: ClusterFirstrestartPolicy: AlwaysterminationGracePeriodSeconds: 30

我使用的是Helm Chart 来部署,并设置了一些动态设置的配置值。安装时可以通过查看收集器的日志,来验证这些值是否正确地被应用:

2022-08-10T00:47:00.703Z    info    service/telemetry.go:103    Setting up own telemetry...
2022-08-10T00:47:00.703Z    info    service/telemetry.go:138    Serving Prometheus metrics  {"address": ":8888", "level": "basic"}
2022-08-10T00:47:00.703Z    info    components/components.go:30 In development component. May change in the future. {"kind": "exporter", "data_type": "traces", "name":
2022-08-10T00:47:00.722Z    info    extensions/extensions.go:42 Starting extensions...
2022-08-10T00:47:00.722Z    info    pipelines/pipelines.go:74   Starting exporters...
2022-08-10T00:47:00.722Z    info    pipelines/pipelines.go:78   Exporter is starting... {"kind": "exporter", "data_type": "traces", "name": "logging"}
2022-08-10T00:47:00.722Z    info    pipelines/pipelines.go:82   Exporter started.   {"kind": "exporter", "data_type": "traces", "name": "logging"}
2022-08-10T00:47:00.722Z    info    pipelines/pipelines.go:78   Exporter is starting... {"kind": "exporter", "data_type": "traces", "name": "jaeger"}
2022-08-10T00:47:00.722Z    info    pipelines/pipelines.go:82   Exporter started.   {"kind": "exporter", "data_type": "traces", "name": "jaeger"}
2022-08-10T00:47:00.722Z    info    pipelines/pipelines.go:86   Starting processors...
2022-08-10T00:47:00.722Z    info    jaegerexporter@v0.57.2/exporter.go:186  State of the connection with the Jaeger Collector backend   {"kind": "exporter", "data_type
2022-08-10T00:47:00.722Z    info    pipelines/pipelines.go:90   Processor is starting...    {"kind": "processor", "name": "batch", "pipeline": "traces"}
2022-08-10T00:47:00.722Z    info    pipelines/pipelines.go:94   Processor started.  {"kind": "processor", "name": "batch", "pipeline": "traces"}
2022-08-10T00:47:00.722Z    info    pipelines/pipelines.go:98   Starting receivers...
2022-08-10T00:47:00.722Z    info    pipelines/pipelines.go:102  Receiver is starting... {"kind": "receiver", "name": "otlp", "pipeline": "traces"}
2022-08-10T00:47:00.722Z    info    otlpreceiver/otlp.go:70 Starting GRPC server on endpoint 0.0.0.0:4317   {"kind": "receiver", "name": "otlp", "pipeline": "traces"}
2022-08-10T00:47:00.722Z    info    otlpreceiver/otlp.go:88 Starting HTTP server on endpoint 0.0.0.0:4318   {"kind": "receiver", "name": "otlp", "pipeline": "traces"}
2022-08-10T00:47:00.722Z    info    pipelines/pipelines.go:106  Receiver started.   {"kind": "receiver", "name": "otlp", "pipeline": "traces"}
2022-08-10T00:47:00.722Z    info    service/collector.go:215    Starting otel-shopping-cart-collector...    {"Version": "0.57.2", "NumCPU": 4}

最后一行显示了自定义分发版的名称:“otel-shopping-cart-collector”。就像这样,使用 Helm Chart 和自定义分发版的收集器可以提供灵活性和精确控制的优势,即能够满足特定的需求,也不会添加不必要的额外部分。

总结

OpenTelemetry Collector 是一个功能强大的工具,它的一大优点是您可以创建自己的收集器分发版来满足您的需求。在我看来,这种灵活性使得 OpenTelemetry Collector 在 OpenTelemetry 生态系统中具备重要作用。

本文翻译自:Observability with OpenTelemetry Part 4 - Collector | Thomas Stringer

扩展阅读:

  • 方法论:面向故障处理的可观测性体系建设
  • 白皮书:事件 OnCall 中心建设方法
  • 好工具:FlashDuty - 一站式告警处理平台:告警降噪、排班OnCall

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/46718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Eduma主题 - 线上教育WordPress主题/网站

Eduma主题 – 线上教育WordPress主题是为教育网站、LMS、培训中心、课程中心、学院、大学、学校、幼儿园而制作的。基于我们使用以前的主题eLearning WP构建WordPress LMS的经验,Education WP是下一代,也是围绕WordPress最好的教育主题之一,它…

一个炫酷的头像悬停效果 2

基于上次翻译的 🔥🔥一个炫酷的头像悬停效果 收获了不少同学的喜欢,原作者近期进行了优化升级。本文将升级后的核心实现过程进行梳理讲解,如果没看过第一期的推荐先看看第一期的实现过程。升级后的效果如下图所示。 gif动画效果如…

Baklib是比语雀、Notion、石墨文档更好用的在线知识库管理工具

在当今信息爆炸的时代,如何高效地管理和利用知识成为了每个人都面临的问题。在线知识库管理工具应运而生,帮助用户整理、存储和共享知识。在这篇文章中,我将介绍一个更好用的在线知识库管理工具——Baklib,并探讨它相对于其他知识…

Spring系列篇--关于IOC【控制反转】的详解

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Spring的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.什么是Spring 二.Spring的特点 三.什…

【O2O领域】Axure外卖订餐骑手端APP原型图,外卖众包配送原型设计图

作品概况 页面数量:共 110 页 兼容软件:Axure RP 9/10,不支持低版本 应用领域:外卖配送、生鲜配送 作品申明:页面内容仅用于功能演示,无实际功能 作品特色 本品为外卖订餐骑手端APP原型设计图&#x…

Datawhale Django 后端开发入门 Task05 DefaultRouter、自定义函数

一、DefaultRouter是Django REST framework中提供的一个路由器类,用于自动生成URL路由。路由器是将URL与视图函数或视图集关联起来的一种机制。Django REST framework的路由器通过简单的配置可以自动生成标准的URL路由,从而减少了手动编写URL路由的工作量…

Redis Lua脚本执行原理和语法示例

Redis Lua脚本语法示例 文章目录 Redis Lua脚本语法示例0. 前言参考资料 1. Redis 执行Lua脚本原理1.1. 对Redis源码中嵌入Lua解释器的简要解析:1.2. Redis Lua 脚本缓存机制 2. Redis Lua脚本示例1.1. 场景示例1. 请求限流2. 原子性地从一个list移动元素到另一个li…

基于郊狼算法优化的BP神经网络(预测应用) - 附代码

基于郊狼算法优化的BP神经网络(预测应用) - 附代码 文章目录 基于郊狼算法优化的BP神经网络(预测应用) - 附代码1.数据介绍2.郊狼优化BP神经网络2.1 BP神经网络参数设置2.2 郊狼算法应用 4.测试结果:5.Matlab代码 摘要…

【深入解析:数据结构栈的魅力与应用】

本章重点 栈的概念及结构 栈的实现方式 数组实现栈接口 栈面试题目 概念选择题 一、栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数…

指针(一)【C语言进阶版】

大家好,我是深鱼~ 【前言】: 指针的主题,在初阶指针章节已经接触过了,我们知道了指针的概念: 1.指针就是个变量,用来存放地址,地址的唯一标识一块内存空间(指针变量)&a…

【云原生|Docker系列第3篇】Docker镜像的入门实践

欢迎来到Docker入门系列的第三篇博客!在前两篇博客中,我们已经了解了什么是Docker以及如何安装和配置它。本篇博客将重点介绍Docker镜像的概念,以及它们之间的关系。我们还将学习如何拉取、创建、管理和分享Docker镜像,这是使用Do…

jenkins同一jar包部署到多台服务器

文章目录 安装插件配置ssh服务构建完成后执行 没有部署过可以跟这个下面的步骤先部署一遍,我这篇主要讲jenkins同一jar包部署到多台服务器 【Jenkins】部署Springboot项目https://blog.csdn.net/qq_39017153/article/details/131901613 安装插件 Publish Over SSH 这…

stm32g070的PD0/PD2 PA8和PB15

目前在用STM32G070做项目,其中PD2TIMER3去模拟PWM,PD0用作按键检测,测试发现PD0低电平检测没有问题,高电平检测不到,电路图如下图所示: 用万用表测试电平,高电平1.0V左右,首先怀疑硬…

rust踩雷笔记(4)——刷点Vec相关的题(持续更新)

俗话说,孰能生巧,今天是第六天接触Rust,感觉基础语法和特性没什么问题了(当然如果你整天都学这个可能2天半就够了),但是想达到熟练使用,还需要刷点题。算法我相信能来看rust博客的人都是大牛&am…

【项目实践】基于LSTM的一维数据扩展与预测

基于LSTM的一维数据拟合扩展 一、引(fei)言(hua) 我在做Sri Lanka生态系统服务价值计算时,中间遇到了一点小问题。从世界粮农组织(FAO)上获得Sri Lanka主要农作物产量和价格数据时,其中的主要作物Sorghum仅有2001-2006年的数据,而Millet只有…

算法通关村第4关【黄金】| 表达式问题

1. 计算器问题 思路:此题不考虑括号和负数情况,单纯使用栈即可解决。注意的是数字可能是多位数需要保留完整的num, 保留数字的前缀符号,当碰到加号,存进去;当碰到减号,存相反数进去;…

Apinto 网关进阶教程,插件开发入门指南

Apinto 是基于Go语言,由 Eolink 自主研发的一款高性能、可扩展、易维护的云原生 API 网关。Apinto 能够帮助用户简单、快速、低成本、低风险地实现:系统微服务化、系统集成、向合作伙伴、开发者开放功能和数据。 通过 Apinto,企业能够专注于…

【LeetCode-中等题】15. 三数之和

题目 题解一&#xff1a;双指针法 图解参考链接&#xff1a;画解算法&#xff1a;15. 三数之和 详解参考代码随想录讲的非常好 梦破碎的地方&#xff01;| LeetCode&#xff1a;15.三数之和 代码&#xff1a; class Solution {public List<List<Integer>> thre…

Codeforces Round 893 (Div. 2) A ~ C

比赛链接 A. Buttons 博弈、最优策略一定是先去按都能按的按钮&#xff0c;按完之后再按自己的。 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing namespace std;typedef pair<int, int> PII; typede…

jstack(Stack Trace for Java)Java堆栈跟踪工具

jstack&#xff08;Stack Trace for Java&#xff09;Java堆栈跟踪工具 jstack&#xff08;Stack Trace for Java&#xff09;命令用于生成虚拟机当前时刻的线程快照&#xff08;一般称为threaddump或者javacore文件&#xff09;。 线程快照就是当前虚拟机内每一条线程正在执…