使用OpenTelemetry进行基础设施指标收集

这是2022年OpenTelemetry在线日历的第13天的文章。

 

OpenTelemetry可用于基础设施监控,是这样说的。

提到OpenTelemetry时,人们会关注到分布式追踪,但它的用途不仅限于此,还可以轻松应用于应用程序所建立的基础设施和中间件。

对于那些正在考虑迁移到云端或容器化的主机,以前用Zabbix之类的工具进行监控,但现在开始听说了微服务等传闻,不知道是否应该继续这样下去,这可能会给基础架构工程师带来困扰。若这能为他们提供一些参考,将不胜荣幸。

立即安装Otel

Otel支持Docker、Kubernetes、Linux、Windows、MacOS等操作系统。

 

本次我们将使用功能扩展版的Otel Collector Contrib版。
对于Linux系统,每个软件包都有提供。
※在接下来的步骤中,我们将发送数据至Splunk Observability Cloud。您当然可以使用官方的Otel版本,但使用Splunk的Otel Distribution会更加便利。

 

我想先在Ubuntu上安装Otel。
※虽然这次我们将手动安装Otel,但当然也可以使用Ansible或Puppet等进行分发。

wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.67.0/otelcol-contrib_0.67.0_linux_amd64.deb
sudo apt install ./otelcol-contrib_0.67.0_linux_amd64.deb -y

就这样。

接下来是指标发送设置。
Contrib版将写在/etc/otelcol-contrib/config.yaml中。

第一次使用Otel的人可能会对设置方法感到困惑。
详细信息请参考其他文章,但是Otel由三个组件组成:Receiver(数据收集)、Processor(数据处理)和Exporter(数据传输)。
只需将这些定义写入config.yaml文件即可。

接收者

这里是接收者名单。

关于主机,可以使用Hostmetrics Receiver。可以收集与CPU、内存、硬盘、进程等相关的指标。可以进行过滤等操作,但暂时会进行全部数据的收集。

receivers:
  hostmetrics:
    collection_interval: 10s
    scrapers:
      cpu:
      disk:
      load:
      filesystem:
      memory:
      network:
      paging:
      processes:
      process:

处理器

这里是处理器一览。

接下来是处理器。
处理器即使没有也可以工作。但默认情况下它甚至不能获取主机名,所以我们会使用能良好获取资源信息的Resource Detection Processor。

processors:
  resourcedetection:
    detectors: [ec2]

由于我们在EC2上使用Ubuntu,所以我们指定了EC2。这样一来,它会自动收集以下信息,并将其作为维度添加到指标中。

* cloud.provider ("aws")
* cloud.platform ("aws_ec2")
* cloud.account.id
* cloud.region
* cloud.availability_zone
* host.id
* host.image.id
* host.name
* host.type 

出口商

出口商名单在这里。

最后,我们将数据发送到一个地方。这次我们将使用SignalFx Metrics Exporter,将数据发送到Splunk Observability Cloud。

exporters:
  signalfx:
    access_token: "*****"
    realm: "*****"

顺便提一句,Otel的特色是只要是适用于Otel的工具,无论是什么都可以。就像支持供应商列表中提到的,无论是Grafana还是Elastic都可以。只要调整一下Exporter的设置,就不需要修改Receiver和Processor。

管道

我們至此所做的只是各自定義而已。
要使用定義,需要搭建Pipeline。

service:
  pipelines:
    metrics:
      receivers: [otlp, opencensus, prometheus, hostmetrics]
      processors: [batch, resourcedetection]
      exporters: [signalfx]

如上所述,我们指定了之前定义过的Receiver、Processor和Exporter的定义名称。
我们保留了默认设置。
现在,config.yaml已经完成。

启用设置

请重新启动Otel并激活它。

sudo systemctl restart otelcol-contrib

日志可以在下面查看。

sudo journalctl | grep otelcol-contrib

看一下

当使用Splunk Observability Cloud的基础设施监控功能进行确认时…

image.png

太棒了!

顺便提一下中间件

如果Nginx正在运行,我也想收集Nginx的指标数据。
现在是Nginx接收器的时间了。

将用于Nginx的Receiver定义加入Pipeline的receivers。

receivers:
  nginx:
    endpoint: "http://localhost:80/status"
    collection_interval: 10s

service:
  pipelines:
    metrics:
      receivers: [otlp, opencensus, prometheus, hostmetrics, nginx]
      processors: [batch, resourcedetection]
      exporters: [signalfx]

当Otel重新启动时,…

sudo systemctl restart otelcol-contrib
image.png

太棒了!!!

最后,这是整个config.yaml文件的概览。
※包含了本次没有特别提及的默认设置。

extensions:
  health_check:
  pprof:
    endpoint: 0.0.0.0:1777
  zpages:
    endpoint: 0.0.0.0:55679

receivers:
  otlp:
    protocols:
      grpc:
      http:

  opencensus:

  # Collect own metrics
  prometheus:
    config:
      scrape_configs:
      - job_name: 'otel-collector'
        scrape_interval: 10s
        static_configs:
        - targets: ['0.0.0.0:8888']

  jaeger:
    protocols:
      grpc:
      thrift_binary:
      thrift_compact:
      thrift_http:

  zipkin:

  hostmetrics:
    collection_interval: 10s
    scrapers:
      cpu:
      disk:
      load:
      filesystem:
      memory:
      network:
      paging:
      processes:
      process:

  nginx:
    endpoint: "http://localhost:80/status"
    collection_interval: 10s

processors:
  batch:

  resourcedetection:
    detectors: [ec2]

exporters:
  logging:
    logLevel: debug

  signalfx:
    access_token: "*****"
    realm: "*****"

service:

  pipelines:

    traces:
      receivers: [otlp, opencensus, jaeger, zipkin]
      processors: [batch]
      exporters: [logging]

    metrics:
      receivers: [otlp, opencensus, prometheus, hostmetrics, nginx]
      processors: [batch, resourcedetection]
      exporters: [signalfx]

  extensions: [health_check, pprof, zpages]


那又怎样?

Otel的真正优势在于能够统一满足所谓可观察性三要素之一的指标(Metrics)、追踪(Trace)、日志(Log)。与应用程序一样,通过Otel也可以获取基础设施部分的指标,并将其发送到相同的后端,这样就能在故障排除时迅速判断是应用程序问题还是基础设施问题(当然,前提是后端具备这种相关分析功能)。

提到日志,Advent Calendar的第一天可以参考OpenTelemetry Collector来更新日志文件。

祝你度过美好的酒店生活!

广告
将在 10 秒后关闭
bannerAds