标签的作用:
- 可以基于已有的标签,生成一个标签
- 也可以创建新的标签
- 还可以过滤标签,不想采集哪些
- 哪些标签不要了也可以将其删除
保留或丢弃对象、哪些对象需要抓取
Relabeling 另一个常见的用例就是过滤有标签的对象,keep
或 drop
这两个动作可以来完成,使用这两个操作,可以帮助我们完成如下的一些操作:
- 来自服务发现的哪些目标应该被抓取
- 从目标中抓取哪些指定的序列样本,或将其发送到远程存储
- 哪些报警要发送到 Alertmanager
一个 keep
动作的配置规则如下所示:
action: keep
source_labels: [<source label name list>]
separator: <source labels separator> # 默认为 ';'
regex: <regular expression> # 默认为 '(.*)' (匹配任何值)
keep
操作同样按顺序执行如下步骤:
- 使用 separator 分隔符将 source_labels 中列出的标签值连接起来,多个label用分隔符分开
- 测试 regex 中的正则表达式是否与上一步的连接字符串匹配
- 如果不匹配,该对象将从最终输出列表中删除,如果匹配,则保留该对象
drop
动作和 keep
类似,只是它是删除一个对象而不是保留。同样接下来看一看 keep
和 drop
的示例。
只抓取具有注解的目标
在服务发现的时候,我们可能只想抓取那些具有特定元数据标签的目标,例如,下面的配置让我们只抓取 Kubernetes 中具有 example.io/should_be_scraped=true
这个 annotation 的目标。
- action: keep
source_labels:
[_meta_kubernetes_service_annotation_example_io_should_be_scraped]
regex: true
kind: Service
apiVersion: v1
metadata:
name: redis
namespace: monitor
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9121"
--------------------------------------------------------------------------------
- job_name: 'kubernetes-service-endpoints'
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
action: keep
regex: true
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: default;kubernetes;https
下面是完整的操作:
[root@k8s-uat-m01 manifests]# curl -k https://10.202.17.17:10259/metrics
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "forbidden: User \"system:anonymous\" cannot get path \"/metrics\"",
"reason": "Forbidden",
"details": {},
"code": 403
}
[apps@prometheus-uat prometheus]$ curl -k --location 'https://10.202.17.17:10259/metrics' --header 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Ijh0dERyYXVnRHJ4ZS1YYzBwNlpRbGg5NFVnZ3Z1QWwzWWRWZndka29laWsifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzQ3MjE0MTIyLCJpYXQiOjE3MTU2NzgxMjIsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlc3BoZXJlLW1vbml0b3Jpbmctc3lzdGVtIiwicG9kIjp7Im5hbWUiOiJwcm9tZXRoZXVzLWs4cy0wIiwidWlkIjoiZTY1MTFkNTItODViMy00MGVhLWI1MGYtMGY5Nzk1ZTMzNWFiIn0sInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJwcm9tZXRoZXVzLWs4cyIsInVpZCI6ImYwZjdiOTkxLTAwYzItNDhjNC05OGFiLWE1Mzk4NGRmMThlMiJ9LCJ3YXJuYWZ0ZXIiOjE3MTU2ODE3Mjl9LCJuYmYiOjE3MTU2NzgxMjIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlc3BoZXJlLW1vbml0b3Jpbmctc3lzdGVtOnByb21ldGhldXMtazhzIn0.TuvVbdbQ3s7kXlGwTGpzxIA7M46EW66r-yQIoV7-DdjLe10CjNyI4Wn28sHdaK0QTaagpcgzQXkb6j1ITZPawvo3hGtPq_ZlKrs1lCYdolMjEdzQJ0ayxwUFaSrJAQP5NI_HPv0k8iqQDUYhmrnmy6zF7gyQUXiFMaXBTetT5BfNreir550Z2j5Vb2qZFWrfM4PVdXV9KADfk0m5kwU5ER2uXbXPo-gABU6CCWVaGOVYZI8wMK25L3H-3V4KQYf0NNXf53AhyojH-B0S7acQ-xXvHHC5tDcBBd1PIsLyWfxdShxfDQBqHImenSAyvHauJWbXY0HSH6jyh-Wyxv2oKA'
scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0001"} 63
scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue",profile="default-scheduler",status="Success",le="0.0002"} 63
scheduler_framework_extension_point_duration_seconds_bucket{extension_point="PreEnqueue"
[root@k8s-uat-m01 manifests]# kubectl get svc -n kube-system | grep kube-scheduler
kube-scheduler-svc ClusterIP None <none> 10259/TCP 79d
[root@k8s-uat-m01 manifests]# kubectl describe svc kube-scheduler-svc -n kube-system
apiVersion: v1
kind: Service
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app.kubernetes.io/name":"kube-scheduler"},"name":"kube-scheduler-svc","namespace":"kube-system"},"spec":{"clusterIP":"None","ports":[{"name":"https-metrics","port":10259,"targetPort":10259}],"selector":{"component":"kube-scheduler"}}}
prometheus.io/port: "10259" ######添加#######
prometheus.io/scrape: "true" ######添加#######
labels:
app.kubernetes.io/name: kube-scheduler
name: kube-scheduler-svc
- job_name: "k8s-kube-scheduler"
honor_timestamps: true
metrics_path: /metrics
scheme: https
kubernetes_sd_configs:
- api_server: https://k8s-uat-api.ztoky.cn:6443
role: endpoints
bearer_token_file: /apps/svr/prometheus/k8s_cert/token
tls_config:
insecure_skip_verify: true
bearer_token_file: /apps/svr/prometheus/k8s_cert/token
tls_config:
insecure_skip_verify: true
relabel_configs:
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape,__meta_kubernetes_namespace,__meta_kubernetes_endpoints_name,__meta_kubernetes_endpoint_port_name]
action: keep
regex: true;kube-system;kube-scheduler-svc;https-metrics
keep下面这些标签是否正确,以及标签值是否正确,每个人的环境是不一样的,得确认!!!!
[__meta_kubernetes_service_annotation_prometheus_io_scrape,__meta_kubernetes_namespace,__meta_kubernetes_endpoints_name,__meta_kubernetes_endpoint_port_name]
action: keep
regex: true;kube-system;kube-scheduler-svc;https-metrics
Kubernetes 服务发现机制下面会将 labels 标签与 annotation 作为元信息输出到 Prometheus,这些元信息都包含 __meta_
前缀,这里我们的配置就是保留具有 example.io/should_be_scraped
这个 annotation 标签,且值为 true
的目标。
只存储特定的指标
当使用 metric_relabel_configs(抓取数据之后的,也就是说要存储了,只会去存储这样的指标,relabel_configs是抓取之前)
来控制目标的抓取方式时,我们可以使用下面的规则来只存储指标名称以 api_
或 http_
开头的指标。
action: keep
source_labels: [__name__]
regex: "(api_|http_).*"
只抓取特定目标的Service
Keep只有匹配的才会去采集数据,不匹配的就不采集。下面意思就是pod当中有些注解中声明了prometheus_io_scrape这个字段,那么就会把你纳入监控,如果没有声明就不会纳入监控。也就是k8s当中部署了这么多pod,谁要监控,谁不要被监控,在部署service可以指定是否需要采集,如果需要采集需要在注解当中声明prometheus_io_scrape: true
在service 和pod里面声明配置注解,那么就会采集注解里面含有这个值的
annotations:
prometheus.io/scrape: 'true'# Service没配置注解prometheus.io/scrape的不采集
- action: keep
regex: true
source_labels:
- __meta_kubernetes_service_annotation_prometheus_io_scrape