当您在集群中开启观测并安装 prometheus-agent 组件后,允许通过 PodMonitor 来满足自定义采集规则的需求。本文为您介绍如何通过 PodMonitor 来配置服务发现。
您可以使用以下 Demo,体验基于 golang 的应用接入和 PodMonitor 服务发现过程。下面的示例中,使用 golang 语言创建了一个应用,并在应用中暴露了一个名为rpc_durations_seconds
的指标,用于对服务的 RPC 延迟进行统计。
package main import ( "math" "math/rand" "net/http" "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/collectors" "github.com/prometheus/client_golang/prometheus/promhttp" ) var rpcDurations = prometheus.NewSummaryVec( prometheus.SummaryOpts{ Name: "rpc_durations_seconds", Help: "RPC latency distributions.", Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}, }, []string{"service"}, ) func main() { // Create a new registry. reg := prometheus.NewRegistry() // Add Go module build info. reg.MustRegister(collectors.NewBuildInfoCollector()) // Add go runtime metrics and process collectors. reg.MustRegister( collectors.NewGoCollector(), collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}), ) reg.MustRegister(rpcDurations) start := time.Now() oscillationFactor := func() float64 { return 2 + math.Sin(math.Sin(2*math.Pi*float64(time.Since(start))/float64(10*time.Minute))) } // Periodically record some sample latencies for the three services. go func() { for { v := rand.Float64() * 0.0002 rpcDurations.WithLabelValues("uniform").Observe(v) time.Sleep(time.Duration(100*oscillationFactor()) * time.Millisecond) } }() go func() { for { v := (rand.NormFloat64() * 0.0002) + 0.00001 rpcDurations.WithLabelValues("normal").Observe(v) time.Sleep(time.Duration(75*oscillationFactor()) * time.Millisecond) } }() go func() { for { v := rand.ExpFloat64() / 1e6 rpcDurations.WithLabelValues("exponential").Observe(v) time.Sleep(time.Duration(50*oscillationFactor()) * time.Millisecond) } }() http.Handle("/metrics", promhttp.HandlerFor( reg, promhttp.HandlerOpts{}, )) http.ListenAndServe(":2023", nil) }
您可以使用镜像仓库中的镜像,在容器服务 VKE 集群中部署应用。步骤如下:
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 spec: containers: - name: golang-demo # 配置容器名称 image: doc-cn-beijing.cr.volces.com/vmp/golang-demo:1.0 # 配置应用镜像的地址和版本 ports: - name: metric-port # 配置容器端口名称 containerPort: 2023 # 配置容器端口
说明
本例中的镜像地址为举例,您需要将其修改为实际环境中镜像的正确地址。
apiVersion: monitoring.coreos.com/v1 kind: PodMonitor metadata: name: golang-demo-discover # 配置 PodMonitor 的名称 namespace: volcano-metrics # 配置 PodMonitor 的命名空间 labels: volcengine.vmp: "true" # 配置 PodMonitor 的标签,允许被 Prometheus-agent 发现 spec: podMetricsEndpoints: - interval: 30s port: metric-port # 填写容器端口名称 path: /metrics # 填写容器指标的 Path 路径,不填默认为 /metrics relabelings: # 配置指标的 relabel。如没有需求,可省略 - targetLabel: environment action: replace # 这个例子中我们添加一个固定 label:environment="Production" replacement: Production namespaceSelector: matchNames: - volcano-metrics # 配置容器所在的命名空间 selector: matchLabels: app: golang-demo # 配置容器的 Label 值,以定位和选择目标 Pod
up{job="volcano-metrics/golang-demo-discover"}
,查看对应的 Pod 是否被正确发现。默认情况下,通过 PodMonitor 发现的 job 名称为 PodMonitor 的 <namespace>/<name>
,例如在本文中,job 的默认名称为volcano-metrics/golang-demo-discover
。您可以根据需要,自定义 job 的名称。
您可以在 PodMonitor 中使用jobLabel
字段,将 job 名称修改为指定的 Pod 标签值。例如在本例中,可以将 job 名称修改为标签app: golang-demo
的值,即 job 名称为golang-demo
。
apiVersion: monitoring.coreos.com/v1 kind: PodMonitor metadata: name: golang-demo-discover namespace: volcano-metrics labels: volcengine.vmp: "true" spec: jobLabel: app # 配置为 Pod 指定的标签名 podMetricsEndpoints: - interval: 30s port: metric-port path: /metrics namespaceSelector: matchNames: - volcano-metrics selector: matchLabels: app: golang-demo
预期结果如下所示,可以使用 job 名称golang-demo
查询到指标。
说明
该方法的优先级高于方法一。
您可以在 PodMonitor 中使用spec.podMetricsEndpoints.N.relabelings
字段,配置 Relabel 能力,自定义 job 的名称。
apiVersion: monitoring.coreos.com/v1 kind: PodMonitor metadata: name: golang-demo-discover namespace: volcano-metrics labels: volcengine.vmp: "true" spec: podMetricsEndpoints: - interval: 30s port: metric-port path: /metrics relabelings: # 配置指标的 relabel - targetLabel: job action: replace replacement: jobname-demo # 自定义 job 名称 namespaceSelector: matchNames: - volcano-metrics selector: matchLabels: app: golang-demo
预期结果如下所示,可以使用 job 名称jobname-demo
查询到指标。
默认情况下,Pod 的 Label 不会加到指标中。您可以在 PodMonitor 中使用spec.podTargetLabels
字段,将 Pod 的 Label 加入到指标中。
apiVersion: monitoring.coreos.com/v1 kind: PodMonitor metadata: name: golang-demo-discover namespace: volcano-metrics labels: volcengine.vmp: "true" spec: jobLabel: app podMetricsEndpoints: - interval: 30s port: metric-port path: /metrics namespaceSelector: matchNames: - volcano-metrics podTargetLabels: # 将所需要增加到指标中的 PodLabel 加入到下述列表中 - app - app.kubernetes.io/component selector: matchLabels: app: golang-demo
预期结果如下所示:
注意
由于 Prometheus 的 metricsLabel 只能由大小写英文字符、数字、下划线组成,因此 Pod 的 LabelName 中其他字符都会自动替换成下划线。例如 app.kubernetes.io/component
变为app_kubernetes_io_component
您可以通过指标 Relabel,在抓取指标或推送指标到托管 Prometheus 工作区之前,添加、修改或删除指标标签。支持 2 种配置方式,包括:
relabelings
:
metricRelabelings
:
说明
更多 PodMonitor 的 Relabel 详情,请参见 官方文档。您也可以通过 Relabel 工具来查看 Relabel 实现的过程,Debug 您的 Relabel 需求。
如果您希望在采集到的指标都增加指定的 Label,可以通过配置spec.podMetricsEndpoints.N.relabelings
参数实现。例如通过以下配置,可以在采集到的所有指标上增加label: value
标签对。
apiVersion: monitoring.coreos.com/v1 kind: PodMonitor metadata: name: golang-demo-discover namespace: volcano-metrics labels: volcengine.vmp: "true" spec: podMetricsEndpoints: - interval: 30s port: metric-port path: /metrics relabelings: # 配置指标的 relabel,增加全局 Label - targetLabel: label action: replace replacement: value namespaceSelector: matchNames: - volcano-metrics selector: matchLabels: app: golang-demo
如果您希望仅写入某些指定的指标,可以通过配置action: keep
来实现。例如通过以下配置,仅保留指标名满足正则表达式vmagent_remotewrite.*
的指标。
apiVersion: monitoring.coreos.com/v1 kind: PodMonitor metadata: name: golang-demo-discover namespace: volcano-metrics labels: volcengine.vmp: "true" spec: podMetricsEndpoints: - interval: 30s port: metric-port path: /metrics metricRelabelings: # 保留满足指定正则表达式的指标 - action: keep regex: vmagent_remotewrite.* sourceLabels: - __name__ namespaceSelector: matchNames: - volcano-metrics selector: matchLabels: app: golang-demo
如果您希望不写入某些指标,可以通过配置action: drop
来将某些指标丢弃掉。例如通过以下配置,可以将vmagent_daily_series_limit_rows_dropped_total
指标丢弃。
apiVersion: monitoring.coreos.com/v1 kind: PodMonitor metadata: name: golang-demo-discover namespace: volcano-metrics labels: volcengine.vmp: "true" spec: podMetricsEndpoints: - interval: 30s port: metric-port path: /metrics metricRelabelings: # 删除指定的指标 - action: drop regex: vmagent_daily_series_limit_rows_dropped_total # 需要删除的指标,支持正则表达式 sourceLabels: - __name__ namespaceSelector: matchNames: - volcano-metrics selector: matchLabels: app: golang-demo
如果您希望修改某个 Label 的值,可以通过配置action: replace
来实现。例如通过以下配置,可以将以/api/v1
开头的 path label 值去掉/api/v1
前缀,即由path: /api/v1/targets
修改为path: /targets
。
apiVersion: monitoring.coreos.com/v1 kind: PodMonitor metadata: name: golang-demo-discover namespace: volcano-metrics labels: volcengine.vmp: "true" spec: podMetricsEndpoints: - interval: 30s port: metric-port path: /metrics relabelings: # 使用正则表达式,修改 Label 的值 - action: replace regex: /api/v1:(.*) replacement: $1 sourceLabels: - path targetLabel: path namespaceSelector: matchNames: - volcano-metrics selector: matchLabels: app: golang-demo