草庐IT

在 K8s 上构建端到端的无侵入开源可观测解决方案

阳明 2023-03-28 原文

Odigos(https://github.com/keyval-dev/odigos) 是一个开源的可观测性控制平面,允许企业创建和维护他们的可观测性管道,Odigos 允许应用程序在几分钟内提供追踪、指标和日志,重要的是无需修改任何代码,完全无任何侵入性。

当你的应用程序在世界各地的数十个节点上的数百个 pod 上运行时,很难全面了解整个应用程序,对于需要跟踪、管理和优化这些环境的性能和可用性的团队来说,可观测性就成为了关键的工作任务。

如果整合得当,可观测性工具可以通过集中你的数据并提供对性能、使用情况和用户行为等关键指标提供更智能的洞察力来监控和排查问题,可观测性工具应支持你使用的语言和框架,与你的容器平台和你使用的其他工具轻松集成,包括任何通信或报警。问题是实施、维护和扩展是持续的任务,如果没有适当的执行和持续的配置,可观测性工具是有限的,很多时候还是无效的。

对于研发团队来说,在云上应用可观测性能力需要特定的技能组合,特别是考虑到向 OpenTelemetry & eBPF 的转变。企业必须确保他们能够在有限的、竞争激烈的人才库中获得特定的技能组合。学习 SDK、添加自动仪表(针对每种语言)、编写代码、部署和维护采集器--这些都需要大量的时间和知识,而大多数组织并不具备这些条件。

为了解决这些集成问题,一些大型的可观测性工具供应商提供自己的代理,提供他们自己的定制解决方案。这样做的问题是,通过使用专有格式摄取和存储数据的专有代理,但是会和这些供应商绑定在一起了。随着企业越来越多地寻求与开源标准的兼容性,以及跨部门共享和访问数据的能力,将数据锁定在一个独立的供应商中会阻碍这些努力并增加成本。

Odigos 可观测性控制平面提供了一个全面的、完全自动化的解决方案,使各组织能够在几分钟内建立他们的可观测性管道。Odigos 专注与第三方集成、开源、开放标准,以及整体上更加综合的方法,减少了结合多个可观测性软件平台和开源软件解决方案的复杂性。

Odigos 自动检测你集群中每个应用程序的编程语言,并相应地进行自动检测。对于已编译的语言(如 Go),使用 eBPF 来检测应用程序,对于虚拟机语言(如 Java)则使用 OpenTelemetry。此外,Odigos 创建的管道遵循最佳实践,例如:将 API 密钥持久化为 Kubernetes 的 Secret,使用最小的采集器镜像,等等。安装、配置和维护一个开源的、不可知的 Observabiity 控制平面的能力将使各种规模的组织有能力在任何时候采用适合他们的工具,并根据需要添加更多工具。

Odigos 使可观测性变得简单,人人都能使用。

使用

准备

接下来我们将安装一个 bank-of-athnos(https://github.com/keyval-dev/bank-of-athnos) 应用,这是一个由 Google 创建的银行应用程序示例,我们使用没有任何检测代码的修改版本来演示 Odigos 如何自动从应用程序收集可观察性数据。

当然前提是需要一个 Kubernetes 集群,如果是在本地开发环境强烈推荐使用 kind 来创建一个测试集群,只需要使用名 ​​kind create cluster​​ 即可创建一个集群。有了集群后使用下面的命令部署测试应用即可:

kubectl apply -f https://raw.githubusercontent.com/keyval-dev/bank-of-athnos/main/release/kubernetes-manifests.yaml
在进入下一步之前,确保所有的 pod 都处于运行状态(可能需要一些时间)。

安装 Odigos

接下来我们需要先安装 Odigos,最简单的方式是使用 Helm Chart 进行安装:

helm repo add odigos https://keyval-dev.github.io/odigos-charts/
helm install my-odigos odigos/odigos --namespace odigos-system --create-namespace
在 odigos-system 命名空间中的所有 pod 运行后,通过运行以下命令可以打开 Odigos UI:

kubectl port-forward svc/odigos-ui 3000:3000 -n odigos-system
然后我们就可以在浏览器中通过 http://localhost:3000 访问 Odigos UI 了,正常可以看到如下所示的页面:

有两种方法可以选择 Odigos 应该使用哪些应用程序进行观测:

  • Opt out(推荐):检测所有程序,包括每一个将要部署的新应用,用户仍然可以手动标记不被检测的应用程序。
  • Opt in:只对用户手动选择的应用程序进行检测。
这里我们就选择使用 Opt out 模式。

配置

接下来是告诉 Odigos 如何访问我们自己的可观测后端,Odigos 支持很多的后端服务:

比如我们这里选择自己托管的 Prometheus、Tempo、Loki 三个服务,当然也需要提前部署该 3 个服务:

添加以下三个目的地:

Tempo:

  • Name: tempo
  • URL: http://observability-tempo.observability
Prometheus:要添加其他目的地,请从侧栏中选择目的地,然后单击添加新目的地

  • Name: prometheus
  • URL: http://observability-prometheus-server.observability
Loki

  • Name: loki
  • URL: http://observability-loki.observability
选择后等待几秒钟,让 Odigos 完成部署所需的采集器并对目标应用程序进行检测。你可以通过运行以下程序来监控进度

kubectl get pods -w
等待所有的 pods 都处于运行状态(特别是注意 transactionservice 应用程序,它的启动时间很慢)。最后我们就可以在 Grafana 中探索我们的可观测数据,我们现在可以看到并将指标与追踪和日志数据关联了起来。

同样可以通过运行端口转发到你的 Grafana 实例。

kubectl port-forward svc/observability-grafana -n observability 3100:80
并导航到 http://localhost:3100,输入 admin 作为用户名,对于密码,输入以下命令的输出:

kubectl get secret -n observability observability-grafana -o jsnotallow=”{.data.admin-password}” | base64 --decode

Service Graph

现在我们就可以查看微服务的 Service Graph 了。

  1. 点击侧边栏的 Explorer
  2. 选择 Tempo 作为数据源
  3. 选择 Service Graph 标签
  4. 点击 Run query 按钮开始查询

指标

接着我们可以查看一些指标,从 service graph 中点击 contacts 节点并选择 Request rate:

就会出现如下所示的一个非常熟悉的图表:

还有很多 Odigos 收集的指标可以从 Prometheus 数据源轻松查询,请查看此文档(​​https://odigos.io/docs/telemetry-types/​​)以了解完整的清单 。

追踪

再次点击 Service Graph 中的 contacts 应用,但这次选择请求直方图,为了将指标和追踪联系起来,我们将使用一个叫做 exemplars 的功能,要显示 exemplars,按照如下步骤:

  1. 打开 options 菜单。
  2. 打开 exemplars。
  3. 注意现在直方图上增加了绿色的菱形。

将鼠标悬停在其中一个添加的点上,点击 Query With Tempo,应该会出现类似于下面的追踪数据。

在此 trace 中,可以准确地看到整个请求的每个部分花费了多少时间,深入其中一个部分将显示其他信息,例如数据库查询。

日志

要进一步调查具体操作,可以简单地按下小文件图标查询相关日志。按平衡器旁边的文件图标,显示相关日志。

总结

我们已经展示了仅使用开源解决方案提取和传输日志、追踪和指标是多么容易。此外,我们还能够在几分钟内从一个应用程序中生成追踪、指标和日志数据,现在也有能力在不同的信号之间进行关联。可以将指标与追踪和追踪与日志相关联,现在拥有所有需要的数据来快速检测和修复目标应用中的生产问题。

有关在 K8s 上构建端到端的无侵入开源可观测解决方案的更多相关文章

  1. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  2. ruby - 在 Ruby 中构建长字符串的简洁方法 - 2

    在编写Ruby(客户端脚本)时,我看到了三种构建更长字符串的方法,包括行尾,所有这些对我来说“闻起来”有点难看。有没有更干净、更好的方法?变量递增。ifrender_quote?quote="NowthatthereistheTec-9,acrappyspraygunfromSouthMiami."quote+="ThisgunisadvertisedasthemostpopularguninAmericancrime.Doyoubelievethatshit?"quote+="Itactuallysaysthatinthelittlebookthatcomeswithit:themo

  3. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

  4. Ruby 守护进程和 JRuby - 备选方案 - 2

    我有一个应用程序正在从Ruby迁移到JRuby(由于需要通过Java提供更好的Web服务安全支持)。我使用的gem之一是daemons创建后台作业。问题在于它使用fork+exec来创建后台进程,但这对JRuby来说是禁忌。那么-是否有用于创建后台作业的替代gem/wrapper?我目前的想法是只从shell脚本调用rake并让rake任务永远运行......提前致谢,克里斯。更新我们目前正在使用几个与Java线程相关的包装器,即https://github.com/jmettraux/rufus-scheduler和https://github.com/philostler/acts

  5. ruby-on-rails - 如何构建复杂的 Rails 系统 - 2

    关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭8年前。Improvethisquestion我们有以下(以及更多)系统,我们将数据从一个应用推送/拉取到另一个:托管CRM(InsideSales.com)Asterisk电话系统(内部)横幅广告系统(openx,我们托管)潜在客户生成系统(自行开发)电子商务商店(spree,我们托管)工作板(本土)一些工作网站抓取+入站工作提要电子邮件传送系统(如Mailchimp,自主开发)事件管理系统(如eventbrite,自主开发)仪表板系统(大量图表和

  6. ruby-on-rails -/usr/local/lib/libz.1.dylib,文件是为 i386 构建的,它不是被链接的体系结构 (x86_64) - 2

    在我的mac上安装几个东西时遇到这个问题,我认为这个问题来自将我的豹子升级到雪豹。我认为这个问题也与macports有关。/usr/local/lib/libz.1.dylib,filewasbuiltfori386whichisnotthearchitecturebeinglinked(x86_64)有什么想法吗?更新更具体地说,这发生在安装nokogirigem时日志看起来像:xslt_stylesheet.c:127:warning:passingargument1of‘Nokogiri_wrap_xml_document’withdifferentwidthduetoproto

  7. ruby - Ruby 语言可以用来构建操作系统吗? - 2

    Ruby语言是否可以用于创建全新的移动操作系统或桌面操作系统,即是否可以用于系统编程? 最佳答案 嗯,现在有一些操作系统使用比C更高级的语言。基本上,ruby解释器本身需要用一些低级的东西来编写,并且需要一些引导加载代码将功能齐全的ruby​​解释器作为独立内核加载到内存中。一旦ruby​​解释器被引导并以内核模式(或innerrings之一)运行,就没有什么可以阻止您在其上构建整个操作系统。不幸的是,它可能会很慢。每个操作系统功能的垃圾收集可能会相当引人注目。ruby解释器将负责任务调度和网络堆栈等基本事情,使用垃圾收集框架会大大

  8. ruby-on-rails - 无法构建 gem native 扩展 (mkmf (LoadError)) - Ubuntu 12.04 - 2

    这个问题在这里已经有了答案:Unabletoinstallgem-Failedtobuildgemnativeextension-cannotloadsuchfile--mkmf(LoadError)(17个答案)关闭9年前。嘿,我正在尝试在一台新的ubuntu机器上安装rails。我安装了ruby​​和rvm,但出现“无法构建gemnative扩展”错误。这是什么意思?$sudogeminstallrails-v3.2.9(没有sudo表示我没有权限)然后它会输出很多“获取”命令,最终会出现这个错误:Buildingnativeextensions.Thiscouldtakeawhi

  9. ruby-on-rails - 如何使用 ruby​​ on rails 构建 openid 提供程序 - 2

    我尝试了一些关于ruby​​onrails中openid利用率的搜索。然而,尽管出现了一组选项,例如omniauth、authlogic等,但这些gem通常用于构建接受openid身份验证的站点。换句话说,它们用于openid消费者设置。我也想构建自己的openid服务器。AssuggestedhereinOpenIdsite我发现了像Masquerade和local-openid这样的东西,不幸的是,它们不是非常活跃的项目,下载量很少。自建openidprovider服务器有没有其他设施可以推荐?非常感谢!!干杯,叶 最佳答案 虽

  10. ruby-on-rails - 能够处理 rar/tar/zip/7z 的 Ruby/rubyzip 替代方案? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion我想知道是否有人知道Ruby的ruby​​zip替代品,它可以处理各种格式,特别是zip/rar/7z?我知道libarchive,但它对我的目的来说并不完整(它是一个很好的gem)。(澄清一下,libarchive-对我不起作用-因为

随机推荐