zoukankan      html  css  js  c++  java
  • 手把手教你使用 Prometheus 监控 JVM

    概述

    当你的 Java 业务容器化上 K8S 后,如果对其进行监控呢?Prometheus 社区开发了 JMX Exporter 来导出 JVM 的监控指标,以便使用 Prometheus 来采集监控数据。本文将介绍如何利用 Prometheus 与 JMX Exporter 来监控你 Java 应用的 JVM。

    什么是 JMX Exporter ?

    JMX Exporter 利用 Java 的 JMX 机制来读取 JVM 运行时的一些监控数据,然后将其转换为 Prometheus 所认知的 metrics 格式,以便让 Prometheus 对其进行监控采集。

    那么,JMX 又是什么呢?它的全称是:Java Management Extensions。 顾名思义,是管理 Java 的一种扩展框架,JMX Exporter 正是基于此框架来读取 JVM 的运行时状态的。

    如何使用 JMX Exporter 暴露 JVM 监控指标 ?

    下面介绍如何通过 JMX Exporter 来暴露 Java 应用的 JVM 监控指标。

    JMX Exporter 的两种用法

    JMX-Exporter 提供了两种用法:

    1. 启动独立进程。JVM 启动时指定参数,暴露 JMX 的 RMI 接口,JMX-Exporter 调用 RMI 获取 JVM 运行时状态数据,转换为 Prometheus metrics 格式,并暴露端口让 Prometheus 采集。
    2. JVM 进程内启动(in-process)。JVM 启动时指定参数,通过 javaagent 的形式运行 JMX-Exporter 的 jar 包,进程内读取 JVM 运行时状态数据,转换为 Prometheus metrics 格式,并暴露端口让 Prometheus 采集。

    官方不推荐使用第一种方式,一方面配置复杂,另一方面因为它需要一个单独的进程,而这个进程本身的监控又成了新的问题,所以本文重点围绕第二种用法讲如何在 K8S 环境下使用 JMX Exporter 暴露 JVM 监控指标。

    打包镜像

    使用第二种用法,启动 JVM 时需要指定 JMX Exporter 的 jar 包文件和配置文件。jar 包是二进制文件,不好通过 configmap 挂载,配置文件我们几乎不需要修改,所以建议是直接将 JMX Exporter 的 jar 包和配置文件都打包到业务容器镜像中。

    首先准备一个制作镜像的目录,放入 JMX Exporter 配置文件 prometheus-jmx-config.yaml:

    ---
    ssl: false
    lowercaseOutputName: false
    lowercaseOutputLabelNames: false
    

    : 更多配置项请参考官方文档。

    然后准备 jar 包文件,可以在 jmx_exporter 的 Github 页面找到最新的 jar 包下载地址,下载到当前目录:

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

    再准备 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
    

    搞定!如果想要更简单,可以利用 docker 多阶段构建,省掉手动下载 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 应用

    有了打包好的镜像,下一步我们看下如何部署应用到 K8S,关键点在于如何修改 JVM 启动参数以便启动时加载 JMX Exporter。JVM 启动时会读取 JAVA_OPTS 环境变量,作为额外的启动参数,所以我们部署时可以为应用增加一下这个环境变量,示例:

    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
    
    • 启动参数格式: -javaagent:<jar>=<port>:<config>
    • 这里使用了 8088 端口暴露 JVM 的监控指标,可自行更改。

    添加 Prometheus 监控配置

    暴露了 JVM 的监控指标,现在来配置下 Prometheus,让监控数据被采集到,配置示例:

        - 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,也可以通过创建 ServiceMonitor 的 CRD 对象来配置 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 监控面板

    采集到了数据,下面看下如何展示数据,如果熟悉 Prometheus 和 Grafana,可自行根据指标设计需要的面板,社区也有提供现成的,不过都有些老了,部分视图可能展示不出来,用的比较多的是 https://grafana.com/grafana/dashboards/8563 ,可以直接导入,面板效果图:

    img

    参考资料

    【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!!

  • 相关阅读:
    Linux操作篇之配置Samba
    Chrome扩展实现网页图片右键上传(以E站图片搜索为例)
    Linux开机自动挂载NFS配置的一个误区
    ffmpeg指令解读海康威视摄像头
    linux服务器性能调优之tcp/ip性能调优
    多线程程序设计中的8条简单原则
    初识文件系统
    socket中的listen到底干了哪些事情?
    ip面向无连接?TCP面向连接?HTTP连接方式?
    网络层和数据链层的区别
  • 原文地址:https://www.cnblogs.com/tencent-cloud-native/p/13807113.html
Copyright © 2011-2022 走看看