来自自定义导出器的 Prometheus 指标显示在 /metrics 中,但不在 /graph (k8s) 中
Posted
技术标签:
【中文标题】来自自定义导出器的 Prometheus 指标显示在 /metrics 中,但不在 /graph (k8s) 中【英文标题】:Prometheus metrics from custom exporter display in /metrics, but not in /graph (k8s) 【发布时间】:2020-12-01 16:03:06 【问题描述】:我在 golang 中编写了一个名为“my-node-exporter”的节点导出器,其中包含一些收集器来显示指标。在我的集群中,我可以通过以下方式查看我的指标:
kubectl port-forward my-node-exporter-999b5fd99-bvc2c 9090:8080 -n kube-system
localhost:9090/metrics
但是,当我尝试在 prometheus 仪表板中查看我的指标时
kubectl port-forward prometheus-prometheus-operator-158978-prometheus-0 9090
localhost:9090/graph
找不到我的指标,我只能看到默认指标。我是否错过了将指标显示在图表上的步骤?
这是我的默认命名空间中的 pod,其中包含我的 prometheus 内容。
pod/alertmanager-prometheus-operator-158978-alertmanager-0 2/2 Running 0 85d
pod/grafana-1589787858-fd7b847f9-sxxpr 1/1 Running 0 85d
pod/prometheus-operator-158978-operator-75f4d57f5b-btwk9 2/2 Running 0 85d
pod/prometheus-operator-1589787700-grafana-5fb7fd9d8d-2kptx 2/2 Running 0 85d
pod/prometheus-operator-1589787700-kube-state-metrics-765d4b7bvtdhj 1/1 Running 0 85d
pod/prometheus-operator-1589787700-prometheus-node-exporter-bwljh 1/1 Running 0 85d
pod/prometheus-operator-1589787700-prometheus-node-exporter-nb4fv 1/1 Running 0 85d
pod/prometheus-operator-1589787700-prometheus-node-exporter-rmw2f 1/1 Running 0 85d
pod/prometheus-prometheus-operator-158978-prometheus-0 3/3 Running 1 85d
我使用helm安装prometheus operator。
编辑:添加我的 yaml 文件
# Configuration to deploy
#
# example usage: kubectl create -f <this_file>
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-node-exporter-sa
namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: my-node-exporter-binding
subjects:
- kind: ServiceAccount
name: my-node-exporter-sa
namespace: kube-system
roleRef:
kind: ClusterRole
name: my-node-exporter-role
apiGroup: rbac.authorization.k8s.io
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: my-node-exporter-role
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
---
#####################################################
############ Service ############
#####################################################
kind: Service
apiVersion: v1
metadata:
name: my-node-exporter-svc
namespace: kube-system
labels:
app: my-node-exporter
spec:
ports:
- name: my-node-exporter
port: 8080
targetPort: metrics
protocol: TCP
selector:
app: my-node-exporter
---
#########################################################
############ Deployment ############
#########################################################
kind: Deployment
apiVersion: apps/v1
metadata:
name: my-node-exporter
namespace: kube-system
spec:
selector:
matchLabels:
app: my-node-exporter
replicas: 1
template:
metadata:
labels:
app: my-node-exporter
spec:
serviceAccount: my-node-exporter-sa
containers:
- name: my-node-exporter
image: locationofmyimagehere
args:
- "--telemetry.addr=8080"
- "--telemetry.path=/metrics"
imagePullPolicy: Always
ports:
- containerPort: 8080
volumeMounts:
- name: log-dir
mountPath: /var/log
volumes:
- name: log-dir
hostPath:
path: /var/log
服务监控yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: my-node-exporter-service-monitor
labels:
app: my-node-exporter-service-monitor
spec:
selector:
matchLabels:
app: my-node-exporter
matchExpressions:
- key: app, operator: Exists
endpoints:
- port: my-node-exporter
namespaceSelector:
matchNames:
- default
- kube-system
普罗米修斯 yaml
# Prometheus will use selected ServiceMonitor
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: my-node-exporter
labels:
team: frontend
spec:
serviceMonitorSelector:
matchLabels:
app: my-node-exporter
matchExpressions:
- key: app
operator: Exists
【问题讨论】:
【参考方案1】:您需要明确告诉 Prometheus 要收集哪些指标 - 以及从何处收集 - 首先创建一个指向您的 my-node-exporter
pod 的 Service
,然后创建一个 ServiceMonitor
,如在Prometheus Operator docs 中描述 - 搜索短语“此服务对象由 ServiceMonitor 发现”。
【讨论】:
我已经创建了一个服务。我按照他们的描述创建了 servicemonitor yaml 文件,并将“app”设置为 my-node-exporter,没有任何改变。我还尝试将“app”设置为服务 my-node-exporter-svc,因为不清楚我应该使用哪一个。我在默认命名空间中创建了 servicemonitor 以及我的 prometheus 部署。 您可以查看 Prometheus Operator 安装附带的默认ServiceMonitor
s,看看它们是如何定义的。如果你仍然不能让它工作,你能告诉你Deployment
、Service
和ServiceMonitor
的确切定义吗?
我已经添加了完整的 yaml。是否有必要将我的导出器添加到抓取配置中,如此处所述? prometheus.io/docs/prometheus/latest/getting_started/…。我已经做到了,它也没有帮助。
看起来在您的ServiceMonitor
中,您正在处理一个未在您的Service
中定义的端口名称:port: my-node-exporter
。 This diagram 在创建事物应如何连接在一起的心智模型方面看起来很有用。
我已经对 yaml 文件进行了更改,并在上面更新了它们,试图将它们在该图表中所做的事情与我的能力相匹配。仍然没有在目标或图表上看到我的出口商。将我的 prometheus yaml 也添加到了编辑中。【参考方案2】:
让 Deployment/Service/ServiceMonitor/PrometheusRule 在 PrometheusOperator
中工作需要非常小心。
所以我创建了一个 helm chart repo kehao95/helm-prometheus-exporter 来安装任何 prometheus-exporters,包括您的客户 exporter,您可以尝试一下。
它不仅会为您创建导出器Deployment
,还会为您创建Service
/ServiceMonitor
/PrometheusRule
。
helm repo add kehao95 https://kehao95.github.io/helm-prometheus-exporter/
为kehao95/prometheus-exporter
创建一个值文件my-exporter.yaml
exporter:
image: your-exporter
tag: latest
port: 8080
args:
- "--telemetry.addr=8080"
- "--telemetry.path=/metrics"
用 helm 安装它
helm install --namespace yourns my-exporter kehao95/prometheus-exporter -f my-exporter.yaml
然后你应该在 prometheus 中看到你的指标。
【讨论】:
以上是关于来自自定义导出器的 Prometheus 指标显示在 /metrics 中,但不在 /graph (k8s) 中的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JSON 格式获取 Prometheus 节点导出器指标