乐趣区

关于运维:使用-OpenTelemetry-构建可观测性-04-收集器

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

选 OTel Collector 还是其余

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

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

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

收集器的次要组件包含:

  • 接管模块 – 从收集器内部收集遥测数据(例如 OTLP、Kafka、MySQL、syslog)
  • 解决模块 – 解决或转换数据(例如属性、批次、Kubernetes 属性)
  • 导出模块 – 将解决后的数据发送到另一个指标(例如 Jaeger、AWS Cloud Watch、Zipkin)
  • 扩大模块 – 收集器加强性能的插件(例如 HTTP 转发器)

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

运行 OTel Collector 的办法有多种,比方您能够将其作为独立过程运行。不过也有很多场景都会波及到 Kubernetes 集群的应用,在 Kubernetes 中,有两种次要的形式来运行 OpenTelemetry Collector 收集器的运行形式次要有两种。

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

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

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

在 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/collector
  name: otel-shopping-cart-collector
  description: OTel Shopping Cart Collector
  version: 0.57.2
  output_path: ./collector/dist
  otelcol_version: 0.57.2

exporters:
  - import: go.opentelemetry.io/collector/exporter/loggingexporter
    gomod: go.opentelemetry.io/collector v0.57.2
  - gomod: github.com/open-telemetry/opentelemetry-collector-contrib/exporter/jaegerexporter v0.57.2

processors:
  - import: go.opentelemetry.io/collector/processor/batchprocessor
    gomod: go.opentelemetry.io/collector v0.57.2

receivers:
  - import: go.opentelemetry.io/collector/receiver/otlpreceiver
    gomod: 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-certificates

FROM alpine:3.13 AS collector-build
COPY ./collector/dist/otel-shopping-cart-collector /otel-shopping-cart-collector
RUN chmod 755 /otel-shopping-cart-collector

FROM ubuntu:latest

ARG 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: debug
  jaeger:
    endpoint: jaeger-collector:14250
    tls:
      insecure: true

service:
  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-collector
  template:
    metadata:
      labels:
        app: otel-collector
    spec:
      containers:
      - name: opentelemetry-collector
        image: "{{.Values.collector.image.repository}}:{{.Values.collector.image.tag}}"
        imagePullPolicy: "{{.Values.collector.image.pullPolicy}}"
        env:
        - name: MY_POD_IP
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: status.podIP
        ports:
        - containerPort: 14250
          hostPort: 14250
          name: jaeger-grpc
          protocol: TCP
        - containerPort: 4317
          hostPort: 4317
          name: otlp
          protocol: TCP
        - containerPort: 4318
          hostPort: 4318
          name: otlp-http
          protocol: TCP
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      terminationGracePeriodSeconds: 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 生态系统中具备重要作用。

本文翻译自:https://trstringer.com/otel-part4-collector/

扩大浏览:

  • 方法论:面向故障解决的可观测性体系建设
  • 白皮书:事件 OnCall 核心建设办法
  • 好工具:FlashDuty – 一站式告警解决平台:告警降噪、排班 OnCall
退出移动版