去年寫過一篇基於jmx監控的文章,此次在Openshift上實現,發現確實很多變化。主要重點問題在java
1. prometheus jmx exporter的改進,再也不須要運行一個獨立的進程,不須要把數據輸入到influxdb,node
而是直接提供了prometheus數據。連接在 git
https://github.com/prometheus/jmx_exportergithub
2. OpenShift上採用prometheus Operator架構,內置了集羣的監控指標,在此基礎上如何集成客戶化的監控數據。docker
接下來咱們就看看具體的實現過程。api
下載agent的jmx_prometheus_javaagent-0.12.0.jar
包,具體連接在tomcat
https://github.com/prometheus/jmx_exporter架構
以tomcat爲例,構建一個鏡像app
[root@master jmx]# ls catalina.sh config.yaml Dockerfile jmx_prometheus_javaagent-0.12.0.jar
Dockerfilejvm
[root@master jmx]# cat Dockerfile FROM registry.example.com/tomcat:8-slim COPY *.* /usr/local/tomcat/bin/ CMD ["catalina.sh", "run"]
catalina.sh 是從鏡像中拷貝出來的,修改了以下地方
CLASSPATH=/usr/local/tomcat/bin JAVA_OPTS="-javaagent:/usr/local/tomcat/bin/jmx_prometheus_javaagent-0.12.0.jar=8180:/usr/local/tomcat/bin/config.yaml $JAVA_OPTS $JSSE_OPTS"
由於缺省的8080和tomcat啓動端口衝突,因此修改成8180
config.yaml, 最簡單的配置,什麼信息都獲取
--- lowercaseOutputLabelNames: true lowercaseOutputName: true
而後構建部署
docker build -t registry.example.com/tomcatjmx:8-slim . docker push registry.example.com/tomcatjmx:8-slim oc import-image tomcatjmx:8-slim --from=registry.example.com/tomcatjmx:8-slim --confirm --insecure=true
完成後在myproject的image下看到有個tomcatjmx:8-slim
在service下開放8180端口,修改yaml文件,加入8180端口
- name: 8180-tcp port: 8180 protocol: TCP targetPort: 8180
而後應用鏡像工做基本完成。
OpenShift的 prometheus採用Operator進行部署,基於servicemonitor的模式對服務進行監控。
在OpenShift環境中內置了servicemonitor
[root@master jmx]# oc -n openshift-monitoring get servicemonitor NAME AGE alertmanager 175d cluster-monitoring-operator 175d etcd 6d kube-apiserver 175d kube-controllers 175d kube-state-metrics 175d kubelet 175d node-exporter 175d prometheus 175d prometheus-operator 175d
service monitor經過namespace肯定工做範圍,同時基於Label對服務(Service)進行監控
咱們若是須要對本身的服務進行監控,就須要創建一個客戶化的Service monitor
[root@master ~]# cat myservicemonitor.yaml apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: tomcatmonitor labels: k8s-app: tomcatmonitor namespace: openshift-monitoring spec: namespaceSelector: any: true selector: matchLabels: app: tomcatjmx endpoints: - interval: 30s path: /metrics port: 8180-tcp
比較核心的地方是selector, 決定對哪一個服務進行監控,另外就是endpoint,針對哪一個port獲取指標。
建立後能夠經過下面命令看到
[root@master ~]# oc -n openshift-monitoring get servicemonitor NAME AGE alertmanager 175d cluster-monitoring-operator 175d etcd 6d kube-apiserver 175d kube-controllers 175d kube-state-metrics 175d kubelet 175d node-exporter 175d prometheus 175d prometheus-operator 175d tomcatmonitor 1h
但這時候在prometheus的target上是看不到咱們tomcatmonitor的,由於缺乏了受權工做,添加RBAC的受權
oc adm policy add-cluster-role-to-user view system:serviceaccount:openshift-monitoring:prometheus-k8s
oc adm policy add-role-to-user view system:serviceaccount:openshift-monitoring:prometheus-k8s -n myproject
完成後,在prometheus target界面上看到tomcatjmx服務已經啓動
轉去指標界面看到一系列指標
這部分工做比較耗時,主要是要找到合適的圖標導入,
我在
https://grafana.com/grafana/dashboards?search=jmx
上找了好幾個,最後發現 https://grafana.com/grafana/dashboards/8878
比較合適。導入後展示結果,好處是能夠直接選擇project,service,而後選擇相應的pod
heap和non-heap的指標
GC time
改進:
可讓servicemonitor監聽全部打了jmx: jvm標籤的服務。這樣只要在服務上加上標籤,就能夠被監控。
至此工做完成. Enjoy!