接收器
接收器简介
otlp 接收器是在 OTLP 格式中收集跟踪、指标和日志的最佳解决方案。如果在以其他格式发出应用程序遥测数据,那么收集器很有可能也有一个相应的接收器
这里定义了 http
和 grpc
两种协议,分别监听 4317
和 4318
端口。配置如下所示:
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 抓取器的配置中,指定了要排除某些文件系统类型和挂载点的指标收集。具体来说,它排除了文件系统类型 autofs
、binfmt_misc
、bpf
、cgroup2
......,它还排除了挂载点 /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_file
、key_file
和cert_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
来指定要收集的数据来源,可以指定的值包括 container
、pod
、node
和 volume
。比如希望仅从接收器收集节点和 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 配置文件中写入一样,例如:
注意:由于收集器配置支持 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 本身的指标数据了。