除了采集组件默认的采集规则,您可能还需要配置面向自定义目标的采集规则。本文介绍如何配置自定义的采集规则。
Prometheus 主要通过 Pull 的方式来抓取目标服务暴露的监控接口。因此,您需要在集群中配置对应的服务发现规则,指定采集对象,才能完成数据采集,并写入到托管 Prometheus 服务的工作区中。
托管 Prometheus 服务支持的服务发现类型,如下表所示。
服务发现类型 | 说明 |
---|---|
ServiceMonitor | 在 Kubernetes 集群中,使用 NameSpace 和 Label 指定需要进行监控的 Service。 |
PodMonitor | 在 Kubernetes 集群中,使用 NameSpace 和 Label 指定需要进行监控的 Pod。 |
Service/Pod annotation | 在 Kubernetes 集群中,通过给 Service 或 Pod 配置指定的 annotation,实现服务发现。 |
您可以通过 ServiceMonitor 配置自定义目标的服务发现,实现对自定义目标的指标采集。
操作步骤如下:
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: service-discover # 配置服务发现的名称 namespace: volcano-metrics # 配置服务发现的命名空间 labels: volcengine.vmp: "true" # 配置服务发现的标签,允许被 Agent 发现 spec: endpoints: - interval: 15s # 配置采集的时间间隔,默认为 30 秒 scrapeTimeout: 30s # 配置采集超时时间,默认为 30 秒 port: metrics # 填写服务端口名称,该端口名称必须在容器的配置中显示声明 path: /metrics # 填写指标暴露的 URI 路径,默认为 /metrics scheme: http # 配置采集协议,支持 HTTP 和 HTTPS ,默认为 HTTP relabelings: # 配置指标的 relabel。如没有需求,可省略 - targetLabel: environment action: replacelabel:environment="Production" replacement: Production namespaceSelector: # 配置为采集对象所在的命名空间,不填写表示选择当前命名空间 matchNames: - volcano-metrics selector: # 配置 Service 的 Label 值,以定位和选择目标 Service matchLabels: app.kubernetes.io/name: ek8s-gpu-exporter
说明
更多配置项说明,请参见 官方文档。
在容器服务中创建 CRD 后,可以遵循以下步骤,查看、编辑或删除配置。
...
,选择 编辑 Yaml 或 删除,即可编辑或删除该配置。您可以通过 PodMonitor 配置服务发现,实现对自定义目标的指标采集。
操作步骤如下:
apiVersion: monitoring.coreos.com/v1 kind: PodMonitor metadata: name: pod-discover # 配置服务发现的名称 namespace: volcano-metrics # 配置服务发现的命名空间 labels: volcengine.vmp: "true" # 配置服务发现的标签,允许被 Agent 发现 spec: # 描述采集目标 Pod 的特征和采集任务的配置 podMetricsEndpoints: # 配置需要监控对象的 Prometheus HTTP 接口,可以配置多个 Endpoint - interval: 15s # 配置采集的时间间隔,默认为 30 秒 scrapeTimeout: 30s # 配置采集超时时间,默认为 30 秒 port: metric-port # 填写容器端口名称,该端口名称必须在容器的配置中显示声明 path: /metrics # 填写指标暴露的 URI 路径,默认为 /metrics scheme: http # 配置采集协议,支持 HTTP 和 HTTPS ,默认为 HTTP relabelings: # 配置指标的标签改写功能,允许配置多个改写规则,按照顺序执行 - action: replace # 标签匹配后的操作,包括:replace(替换)、keep、drop sourceLabels: # 从原始 labels 中取哪些 label 的值进行 relabel - instance regex: (.*) # 对 source labels 对应值进行正则匹配的表达式 targetLabel: instance # 当 action 为 replace 时,通过 target_label 来指定对应 label name replacement: 'kafka-xxxxxx' # 当 action 为 replace 时,通过 replacement 来定义当 regex 匹配之后需要替换的表达式 namespaceSelector: # 配置为采集对象所在的命名空间,不填写表示选择当前命名空间 matchNames: - volcano-metrics selector: # 配置采集对象的 Label 值,以定位和选择目标 Pod matchLabels: app-name: kafka-exporter
说明
更多配置项说明,请参见 官方文档。
在容器服务中创建 CRD 后,可以遵循以下步骤,查看、编辑或删除配置。
...
,选择 编辑 Yaml 或 删除,即可编辑或删除该配置。如上文所述,您可以使用 ServiceMonitor 或 PodMonitor 实现服务发现。但是,如果集群中有很多的 Service/Pod,那么就需要人工去创建多个 ServiceMonitor 或 PodMonitor 对象来进行监控,这会使得您的配置变得尤为复杂。
为了解决上述问题,托管 Prometheus 为您提供了另外一种服务发现方式,即通过配置 Service/Pod annotation 来实现服务发现。您可以在部署 Service 或 Pod 时,添加指定的 annotation 字段,实现业务的快速接入。
注意
当您在集群中配置 Service/Pod 时,可以通过添加如下的 annotation,实现对自定义目标的服务发现。
prometheus.io/scrape: "true" # 配置为 true 表示开启采集 prometheus.io/port: "9400" # 配置为采集指标暴露的端口号 prometheus.io/path: "/metrics" # 填写指标暴露的 URI 路径,一般是 /metrics
说明
使用prometheus.io/port: "9400"
指定目标的端口号时,该端口必须在容器的配置中显示声明,如下所示:
... spec: containers: ports: - containerPort: 9400 # 在容器配置中,对容器端口进行显示声明
当您在集群中配置服务时,可以添加 annotation 完成服务发现。方便服务快速接入监控,步骤如下:
apiVersion: v1 kind: Service metadata: name: golang-service-demo namespace: volcano-metrics # 配置服务所在的命名空间 labels: app: golang-service-demo # 配置服务的标签 annotations: prometheus.io/scrape: "true" # 配置为 true 表示开启服务发现 prometheus.io/port: "2023" # 配置为采集指标暴露的端口号,该端口号必须在容器的配置中显示声明 prometheus.io/path: "/metrics" # 填写指标暴露的 URI 路径,一般是 /metrics spec: selector: app: golang-demo ports: - protocol: TCP port: 2023 targetPort: 2023 name: metrics # 配置服务端口名称 type: ClusterIP
当您在集群中配置 Pod 时,可以添加 annotation 完成服务发现。方便 Pod 快速接入监控,步骤如下:
apiVersion: apps/v1 kind: Deployment metadata: name: golang-demo # 配置应用的名称 namespace: volcano-metrics # 配置应用所在的命名空间 labels: app: golang-demo # 配置应用的标签 spec: replicas: 2 # 配置应用副本数 selector: matchLabels: app: golang-demo template: metadata: labels: app: golang-demo annotations: prometheus.io/scrape: "true" # 配置为 true 表示开启服务发现 prometheus.io/port: "2023" # 配置为采集指标暴露的端口号,该端口号必须在容器的配置中显示声明 prometheus.io/path: "/metrics" # 填写指标暴露的 URI 路径,一般是 /metrics spec: containers: - name: golang-demo # 配置容器名称 image: doc-cn-beijing.cr.volces.com/vmp/golang-demo:1.0 # 配置应用镜像的地址和版本 ports: - containerPort: 2023 # 配置容器端口号
说明
配置服务发现后,您可以使用托管 Prometheus 的 Explore 功能,确认是否已经发现了期望的服务。操作步骤如下:
up{job="xxx"}
语句,查看对应的服务是否被正确发现。指标的值为 1 表示对应的服务已经被正确发现。说明
如果您仍然无法正确查询到预期的指标,请参见 无法正确查看到预期的指标?。