跳转至

接收器

接收器简介

otlp 接收器是在 OTLP 格式中收集跟踪、指标和日志的最佳解决方案。如果在以其他格式发出应用程序遥测数据,那么收集器很有可能也有一个相应的接收器

这里定义了 httpgrpc 两种协议,分别监听 43174318 端口。配置如下所示:

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: ${env:MY_POD_IP}:4317
      http:
        endpoint: ${env:MY_POD_IP}:4318

常用接收器

hostmetrics 接收器

hostmetrics 接收器用于收集主机级别的指标,例如 CPU 使用率、磁盘使用率、内存使用率和网络流量

receivers:
  hostmetrics:
    collection_interval: 10s
    root_path: /hostfs
    scrapers:
      cpu: null
      disk: null
      filesystem:
        exclude_fs_types:
          fs_types:
            - autofs
            - binfmt_misc
            - bpf
            - cgroup2
            - configfs
            - debugfs
            - devpts
            - devtmpfs
            - fusectl
            - hugetlbfs
            - iso9660
            - mqueue
            - nsfs
            - overlay
            - proc
            - procfs
            - pstore
            - rpc_pipefs
            - securityfs
            - selinuxfs
            - squashfs
            - sysfs
            - tracefs
          match_type: strict
        exclude_mount_points:
          match_type: regexp
          mount_points:
            - /dev/*
            - /proc/*
            - /sys/*
            - /run/k3s/containerd/*
            - /var/lib/docker/*
            - /var/lib/kubelet/*
            - /snap/*
      load: null
      memory: null
      network: null

配置通过 collection_interval 指定了每 10 秒收集一次指标,并使用根路径 /hostfs 来访问主机文件系统。

hostmetrics 接收器包括多个抓取器,用于收集不同类型的指标。例如,cpu 抓取器用于收集 CPU 使用率指标,disk 抓取器用于收集磁盘使用率指标,memory 抓取器用于收集内存使用率指标,load 抓取器用于收集 CPU 负载指标。在这个配置文件中,我们只启用了 filesystem 抓取器,用于收集文件系统使用率指标。

filesystem 抓取器的配置中,指定了要排除某些文件系统类型和挂载点的指标收集。具体来说,它排除了文件系统类型 autofsbinfmt_miscbpfcgroup2......,它还排除了挂载点 /dev/*/proc/*/sys/*/run/k3s/containerd/*/var/lib/docker/*/var/lib/kubelet/*/snap/*,这些排除操作确保只收集相关的文件系统使用率指标。

kubeletstats 接收器

Kubelet Stats Receiver 用于从 kubelet 上的 API 服务器中获取指标。通常用于收集与 Kubernetes 工作负载相关的指标,例如 CPU 使用率、内存使用率和网络流量。这些指标可用于监视 Kubernetes 集群和工作负载的健康状况和性能。

Kubelet Stats Receiver 默认支持在端口 10250 暴露的安全 Kubelet 端点和在端口 10255 暴露的只读 Kubelet 端点。如果 auth_type 设置为 none,则将使用只读端点。如果 auth_type 设置为以下任何值,则将使用安全端点:

  • tls 告诉接收方使用 TLS 进行身份验证,并要求设置 ca_filekey_filecert_file 字段。
  • serviceAccount 告诉该接收者使用默认的 ServiceAccount 令牌来向 kubelet API 进行身份验证。
  • kubeConfig 告诉该接收器使用 kubeconfig 文件(KUBECONFIG 环境变量或 ~/.kube/config)进行身份验证并使用 APIServer 代理来访问 kubelet API。
  • initial_delay(默认 = 1 秒),定义接收器在开始之前等待的时间。

此外还可以指定以下参数:

  • collection_interval(默认= 10s),收集数据的时间间隔。
  • insecure_skip_verify(默认= false),是否跳过证书验证。

默认情况下,所有生成的指标都基于 kubelet 的 /stats/summary 端点提供的资源标签。对于某些场景而言,这可能还不够。因此,可以利用其他端点来获取附加的元数据,并将它们设置为指标资源的额外标签。当前支持的元数据包括以下内容:

  • container.id - 使用从通过 /pods 暴露的容器状态获取的容器 ID 标签来增强指标。
  • k8s.volume.type - 从通过 /pods 暴露的 Pod 规范收集卷类型,并将其作为卷指标的标签。如果端点提供的信息不仅仅是卷类型,这些信息也会根据可用字段和卷类型进行同步。例如,aws.volume.id 将从 awsElasticBlockStore 同步,gcp.pd.name 将从 gcePersistentDisk 同步。

如果你希望将 container.id 标签添加到你的指标中,请使用 extra_metadata_labels 字段来启用它,例如:

receivers:
  kubeletstats:
    collection_interval: 10s
    auth_type: "serviceAccount"
    endpoint: "${env:K8S_NODE_NAME}:10250"
    insecure_skip_verify: true
    extra_metadata_labels:
      - container.id

如果没有设置 extra_metadata_labels,则不会进行额外的 API 调用来获取额外的元数据。

默认情况下,该收集器将收集来自容器、pod 和节点的指标。我们可以通过设置一个 metric_groups 来指定要收集的数据来源,可以指定的值包括 containerpodnodevolume。比如希望仅从接收器收集节点和 Pod 指标,则可以使用以下配置:

receivers:
  kubeletstats:
    collection_interval: 10s
    auth_type: "serviceAccount"
    endpoint: "${env:K8S_NODE_NAME}:10250"
    insecure_skip_verify: true
    metric_groups:
      - node
      - pod

K8S_NODE_NAME 环境变量在 Kubernetes 集群里面可以通过 Downward API 来注入。

prometheus 接收器

Prometheus 接收器以 Prometheus 格式接收指标数据。该接收器旨在最大限度地成为 Prometheus 的替代品,但是目前不支持下面这些 Prometheus 的高级功能:

  • alert_config.alertmanagers
  • alert_config.relabel_configs
  • remote_read
  • remote_write
  • rule_files

该接收器是让 Prometheus 抓取你的服务的直接替代品。它支持 scrape_config 中的全部 Prometheus 配置,包括服务发现。就像在启动 Prometheus 之前在 YAML 配置文件中写入一样,例如:

prometheus --config.file=prom.yaml

注意:由于收集器配置支持 env 变量替换,prometheus 配置中的 $ 字符将被解释为环境变量。如果要在 prometheus 配置中使用 $ 字符,则必须使用 $$ 对其进行转义。

比如我们可以通过下面的配置来让收集器接收 Prometheus 的指标数据,使用方法和 Prometheus 一样,只需要在 scrape_configs 中添加一个任务即可:

receivers:
  prometheus:
    config:
      scrape_configs:
        - job_name: opentelemetry-collector
          scrape_interval: 10s
          static_configs:
            - targets:
                - ${env:MY_POD_IP}:8888
        - job_name: k8s
          kubernetes_sd_configs:
            - role: pod
          relabel_configs:
            - source_labels:
                [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
              regex: "true"
              action: keep
          metric_relabel_configs:
            - source_labels: [__name__]
              regex: "(request_duration_seconds.*|response_duration_seconds.*)"
              action: keep

这里添加的 opentelemetry-collector 任务,是去抓取 8888 端口的数据,而 8888 端口就是 OpenTelemetry Collector 的端口,这个端口我们在 service.telemetry 中已经定义了,这样我们就可以通过该接收器来抓取 OpenTelemetry Collector 本身的指标数据了。