騰訊云手把手教你使用Prometheus監(jiān)控JVM

來源: 騰訊云原生
作者:roc 陳鵬
時(shí)間:2020-10-16
17645
當(dāng)你的Java業(yè)務(wù)容器化上K8S后,如果對(duì)其進(jìn)行監(jiān)控呢?Prometheus社區(qū)開發(fā)了JMX Exporter來導(dǎo)出JVM的監(jiān)控指標(biāo),以便使用Prometheus來采集監(jiān)控?cái)?shù)據(jù)。本文將介紹如何利用Prometheus與JMX Exporter來監(jiān)控你Java應(yīng)用的JVM。

概述

當(dāng)你的Java業(yè)務(wù)容器化上K8S后,如果對(duì)其進(jìn)行監(jiān)控呢?Prometheus社區(qū)開發(fā)了JMX Exporter來導(dǎo)出JVM的監(jiān)控指標(biāo),以便使用Prometheus來采集監(jiān)控?cái)?shù)據(jù)。本文將介紹如何利用Prometheus與JMX Exporter來監(jiān)控你Java應(yīng)用的JVM。

什么是JMX Exporter?

JMX Exporter利用Java的JMX機(jī)制來讀取JVM運(yùn)行時(shí)的一些監(jiān)控?cái)?shù)據(jù),然后將其轉(zhuǎn)換為Prometheus所認(rèn)知的metrics格式,以便讓Prometheus對(duì)其進(jìn)行監(jiān)控采集。

那么,JMX又是什么呢?它的全稱是:Java Management Extensions。顧名思義,是管理Java的一種擴(kuò)展框架,JMX Exporter正是基于此框架來讀取JVM的運(yùn)行時(shí)狀態(tài)的。

如何使用JMX Exporter 暴露JVM監(jiān)控指標(biāo)?

下面介紹如何通過JMX Exporter來暴露Java應(yīng)用的JVM監(jiān)控指標(biāo)。

JMX Exporter的兩種用法

JMX-Exporter提供了兩種用法:

1.啟動(dòng)獨(dú)立進(jìn)程。JVM啟動(dòng)時(shí)指定參數(shù),暴露JMX的RMI接口,JMX-Exporter調(diào)用RMI獲取JVM運(yùn)行時(shí)狀態(tài)數(shù)據(jù),轉(zhuǎn)換為Prometheus metrics格式,并暴露端口讓Prometheus采集。

2.JVM進(jìn)程內(nèi)啟動(dòng)(in-process)。JVM啟動(dòng)時(shí)指定參數(shù),通過javaagent的形式運(yùn)行JMX-Exporter的jar包,進(jìn)程內(nèi)讀取JVM運(yùn)行時(shí)狀態(tài)數(shù)據(jù),轉(zhuǎn)換為Prometheus metrics格式,并暴露端口讓Prometheus采集。

官方不推薦使用第一種方式,一方面配置復(fù)雜,另一方面因?yàn)樗枰粋€(gè)單獨(dú)的進(jìn)程,而這個(gè)進(jìn)程本身的監(jiān)控又成了新的問題,所以本文重點(diǎn)圍繞第二種用法講如何在K8S環(huán)境下使用JMX Exporter暴露JVM監(jiān)控指標(biāo)。

打包鏡像

使用第二種用法,啟動(dòng)JVM時(shí)需要指定JMX Exporter的jar包文件和配置文件。jar包是二進(jìn)制文件,不好通過configmap掛載,配置文件我們幾乎不需要修改,所以建議是直接將JMX Exporter的jar包和配置文件都打包到業(yè)務(wù)容器鏡像中。

首先準(zhǔn)備一個(gè)制作鏡像的目錄,放入JMX Exporter配置文件prometheus-jmx-config.yaml:

---

ssl:false

lowercaseOutputName:false

lowercaseOutputLabelNames:false

注:更多配置項(xiàng)請(qǐng)參考官方文檔。

然后準(zhǔn)備jar包文件,可以在jmx_exporter的Github頁面找到最新的jar包下載地址,下載到當(dāng)前目錄:

wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.13.0/jmx_prometheus_javaagent-0.13.0.jar

再準(zhǔn)備Dockerfile,這里以tomcat為例:

FROM tomcat:jdk8-openjdk-slim

ADD prometheus-jmx-config.yaml/prometheus-jmx-config.yaml

ADD jmx_prometheus_javaagent-0.13.0.jar/jmx_prometheus_javaagent-0.13.0.jar

最后編譯鏡像:

docker build.-t ccr.ccs.tencentyun.com/imroc/tomcat:jdk8

搞定!如果想要更簡(jiǎn)單,可以利用docker多階段構(gòu)建,省掉手動(dòng)下載jar包的步驟,Dockerfile示例:

FROM ubuntu:16.04 as jar

WORKDIR/

RUN apt-get update-y

RUN DEBIAN_FRONTEND=noninteractive apt-get install-y wget

RUN wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.13.0/jmx_prometheus_javaagent-0.13.0.jar

FROM tomcat:jdk8-openjdk-slim

ADD prometheus-jmx-config.yaml/prometheus-jmx-config.yaml

COPY--from=jar/jmx_prometheus_javaagent-0.13.0.jar/jmx_prometheus_javaagent-0.13.0.jar

部署Java應(yīng)用

有了打包好的鏡像,下一步我們看下如何部署應(yīng)用到K8S,關(guān)鍵點(diǎn)在于如何修改JVM啟動(dòng)參數(shù)以便啟動(dòng)時(shí)加載JMX Exporter。JVM啟動(dòng)時(shí)會(huì)讀取JAVA_OPTS環(huán)境變量,作為額外的啟動(dòng)參數(shù),所以我們部署時(shí)可以為應(yīng)用增加一下這個(gè)環(huán)境變量,示例:

apiVersion: apps/v1

kind: Deployment

metadata:

  name: tomcat

spec:

  replicas: 1

  selector:

    matchLabels:

      app: tomcat

  template:

    metadata:

      labels:

        app: tomcat

    spec:

      containers:

      - name: tomcat

        image: ccr.ccs.tencentyun.com/imroc/tomcat:jdk8

        env:

        - name: JAVA_OPTS

          value: "-javaagent:/jmx_prometheus_javaagent-0.13.0.jar=8088:/prometheus-jmx-config.yaml"

---

apiVersion: v1

kind: Service

metadata:

  name: tomcat

  labels:

    app: tomcat

spec:

  type: ClusterIP

  ports:

  - port: 8080

    protocol: TCP

    name: http

  - port: 8088

    protocol: TCP

    name: jmx-metrics

  selector:

    app: tomcat

·啟動(dòng)參數(shù)格式:-javaagent:<jar>=<port>:<config>。

·這里使用了8088端口暴露JVM的監(jiān)控指標(biāo),可自行更改。

添加Prometheus監(jiān)控配置

暴露了JVM的監(jiān)控指標(biāo),現(xiàn)在來配置下Prometheus,讓監(jiān)控?cái)?shù)據(jù)被采集到,配置示例:

    - job_name: tomcat

      scrape_interval: 5s

      kubernetes_sd_configs:

      - role: endpoints

        namespaces:

          names:

          - default

      relabel_configs:

      - action: keep

        source_labels:

        - __meta_kubernetes_service_label_app

        regex: tomcat

      - action: keep

        source_labels:

        - __meta_kubernetes_endpoint_port_name

        regex: jmx-metrics

如果是安裝了prometheus-operator,也可以通過創(chuàng)建ServiceMonitor的CRD對(duì)象來配置Prometheus:

apiVersion: monitoring.coreos.com/v1

kind: ServiceMonitor

metadata:

  name: tomcat

  namespace: default

  labels:

    app: tomcat

spec:

  endpoints:

  - port: jmx-metrics

    interval: 5s

  namespaceSelector:

    matchNames:

    - default

  selector:

    matchLabels:

      app: tomcat

添加Grafana監(jiān)控面板

采集到了數(shù)據(jù),下面看下如何展示數(shù)據(jù),如果熟悉Prometheus和Grafana,可自行根據(jù)指標(biāo)設(shè)計(jì)需要的面板,社區(qū)也有提供現(xiàn)成的,不過都有些老了,部分視圖可能展示不出來,用的比較多的是https://grafana.com/grafana/dashboards/8563,可以直接導(dǎo)入,面板效果圖:

640 (4).png

參考資料

·JMX Exporter項(xiàng)目地址:https://github.com/prometheus/jmx_exporter

·JVM監(jiān)控面板:https://grafana.com/grafana/dashboards/8563

立即登錄,閱讀全文
版權(quán)說明:
本文內(nèi)容來自于騰訊云原生,本站不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。文章內(nèi)容系作者個(gè)人觀點(diǎn),不代表快出海對(duì)觀點(diǎn)贊同或支持。如有侵權(quán),請(qǐng)聯(lián)系管理員(zzx@kchuhai.com)刪除!
掃碼登錄
打開掃一掃, 關(guān)注公眾號(hào)后即可登錄/注冊(cè)
加載中
二維碼已失效 請(qǐng)重試
刷新
賬號(hào)登錄/注冊(cè)
個(gè)人VIP
小程序
快出海小程序
公眾號(hào)
快出海公眾號(hào)
商務(wù)合作
商務(wù)合作
投稿采訪
投稿采訪
出海管家
出海管家