成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

收藏備用小知識:使用 JMX 監控 Kafka 和 Zookeeper

安全 應用安全
jmx 監控數據采集的關鍵點,其實是這個 rules 的最佳實踐,也就是說,對于某個 Java 應用,你具體要采集哪些指標,這是真經驗,真正有價值的東西。

JVM 默認會通過 JMX 的方式暴露基礎指標,很多中間件也會通過 JMX 的方式暴露業務指標,比如 Kafka、Zookeeper、ActiveMQ、Cassandra、Spark、Tomcat、Flink 等等。掌握了 JMX 監控方式,就掌握了一批程序的監控方式。本節介紹 JMX-Exporter 的使用,利用 JMX-Exporter 把 JMX 監控數據暴露為 Prometheus 可識別的格式。

JMX

JMX(Java Management Extensions)是 Java 管理擴展的簡稱,是一種為 Java 應用程序植入管理功能的框架。Java 類程序經常使用 JMX 暴露監控指標數據,也可以通過 JMX 來控制 Java 類程序,典型的比如通過 JMX 觸發程序 GC。

Java 程序里,某個類如果實現了 MBean 接口,那么這個類就可以通過 JMX 來讀取和修改這個類的屬性,也可以調用這個類的方法。JMX 通過 MBeanServer 來管理 MBean,MBeanServer 是一個管理器,它可以管理多個 MBean,每個 MBean 都有一個 ObjectName,用來唯一標識這個 MBean。

更新信息可以參考 JMX Specification。非本文重點。

JMX-Exporter 簡介

JMX-Exporter 是 Prometheus 社區提供的一個工具,用來把 JMX 暴露的監控指標數據轉換為 Prometheus 可識別的格式。JMX-Exporter 通過 HTTP 服務的方式暴露監控指標數據,Prometheus 通過 HTTP 協議來拉取監控指標數據。

JMX-Exporter 就是個 jar 包,以 javaagent(何為 javaagent,需要讀者自行 Google) 的方式運行,和業務 Java(或 Scala) 程序運行在一個 JVM 虛擬機里。有了 JMX-Exporter,業務程序無需暴露 JMX 端口了,JMX-Exporter 會把 JMX 暴露的監控指標數據轉換為 Prometheus 可識別的格式,然后通過 HTTP 只讀方式暴露出去,也更為安全。

JMX-Exporter 安裝

因為 JMX-Exporter 是個 jar 包,所以安裝非常簡單,只需要把 jar 包下載到服務器上就可以了。JMX-Exporter 的下載地址是 https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/,下載最新版本的 jar 包即可。

比如我們把下載的 jar 包放在 /opt/jmx-exporter 目錄,另外,建立 /etc/jmx-exporter 目錄放置 JMX-Exporter 所需配置文件。像 Kafka,暴露的 JMX 指標非常非常多,我們不需要全部采集,只需要采集我們關心的指標即可。所以,我們需要配置文件來告訴 JMX-Exporter,我們需要采集哪些指標。

JMX-Exporter 提供了很多樣例配置,地址在這里:https://github.com/prometheus/jmx_exporter/tree/main/example_configs。

使用 JMX 監控 Zookeeper

實際上,新版 Zookeeper 已經直接暴露了 Prometheus 協議的監控數據,無需通過 JMX 方式采集了。另外,Zookeeper 還提供了四字命令的監控數據采集方式,比如 Categraf 的 input.zookeeper 插件就是采用的這種方式。

不過,本文主要是演示 JMX 的方式,所以還是使用 JMX 的方式來采集 Zookeeper 的監控數據。

首先,從 https://github.com/prometheus/jmx_exporter/tree/main/example_configs 這里找到 Zookeeper 的配置樣例文件,下載到 /etc/jmx-exporter/zookeeper.yml。然后把 jmx-exporter 的 jar 包作為 javaagent 啟動參數加入 Zookeeper 的啟動命令即可。

# zookeeper-env.sh
SERVER_JVMFLAGS="-javaagent:/opt/jmx-exporter/jmx-exporter.jar=7070:/etc/jmx-exporter/zookeeper.yml"

Zookeeper 有個 zookeeper-env.sh 控制 Zookeeper 的啟動參數,我們在這里加入 javaagent 啟動參數,然后重啟 Zookeeper 即可。上例是把 JMX-Exporter 的 HTTP 服務端口設置為 7070,可以根據實際情況修改,配置文件指定為 /etc/jmx-exporter/zookeeper.yml。

OK,現在可以測試了,先看 7070 端口是否在監聽,如果在監聽,就可以請求這個端口的 /metrics 接口采集 Prometheus 協議的監控數據了。

$ netstat -tlnp | grep 7070
tcp        0      0 0.0.0.0:7070            0.0.0.0:*               LISTEN      892/java

$ curl -s localhost:7070/metrics | head
# HELP jvm_threads_current Current thread count of a JVM
# TYPE jvm_threads_current gauge
jvm_threads_current 16.0
# HELP jvm_threads_daemon Daemon thread count of a JVM
# TYPE jvm_threads_daemon gauge
jvm_threads_daemon 12.0
# HELP jvm_threads_peak Peak thread count of a JVM
# TYPE jvm_threads_peak gauge
jvm_threads_peak 16.0
# HELP jvm_threads_started_total Started thread count of a JVM

可以看到,Zookeeper 的監控數據已經暴露出來了,接下來就可以采集這些數據了,抓取 Prometheus 協議的監控數據有很多方式,可以直接使用 Prometheus 自身來抓取,也可以通過 Categraf 的 input.prometheus 插件來抓取,也可以通過 vmagent 來抓取,大家自行決策即可。

使用 JMX 監控 Kafka

從 JMX-Exporter 提供的樣例配置目錄,下載 kafka.yml,然后導出 KAFKA_OPTS 環境變量即可。

$ export KAFKA_OPTS='-javaagent:/opt/jmx-exporter/jmx-exporter.jar=7071:/etc/jmx-exporter/kafka.yml'
$ /opt/kafka_2.11-0.10.1.0/bin/kafka-server-start.sh /opt/kafka_2.11-0.10.1.0/conf/server.properties

上例中,我們把端口換成了7071,配置文件指定為 /etc/jmx-exporter/kafka.yml。測試一下端口是否成功監聽:

$ netstap -tlnp | grep 7071
tcp6       0      0 :::7071                 :::*                    LISTEN      19288/java

$ curl -s localhost:7071 | grep -i kafka | head
# HELP kafka_server_replicafetchermanager_minfetchrate Attribute exposed for management (kafka.server<type=ReplicaFetcherManager, name=MinFetchRate, clientId=Replica><>Value)
# TYPE kafka_server_replicafetchermanager_minfetchrate untyped
kafka_server_replicafetchermanager_minfetchrate{clientId="Replica",} 0.0
# HELP kafka_network_requestmetrics_totaltimems Attribute exposed for management (kafka.network<type=RequestMetrics, name=TotalTimeMs, request=OffsetFetch><>Count)
# TYPE kafka_network_requestmetrics_totaltimems untyped
kafka_network_requestmetrics_totaltimems{request="OffsetFetch",} 0.0
kafka_network_requestmetrics_totaltimems{request="JoinGroup",} 0.0
kafka_network_requestmetrics_totaltimems{request="DescribeGroups",} 0.0
kafka_network_requestmetrics_totaltimems{request="LeaveGroup",} 0.0
kafka_network_requestmetrics_totaltimems{request="GroupCoordinator",} 0.0

一切正常哈,如果你的 Kafka 是通過 systemd 運行的,可以類似下面的方式來配置 kafka.service 文件:

...
[Service]
Restart=on-failure
Environment=KAFKA_OPTS=-javaagent:/opt/jmx-exporter/jmx-exporter.jar=7071:/etc/jmx-exporter/kafka.yml
ExecStart=/opt/kafka/bin/kafka-server-start.sh /etc/kafka/server.properties
ExecStop=/opt/kafka/bin/kafka-server-stop.sh
TimeoutStopSec=600
User=kafka
...

加餐

使用 jmx-exporter jar 包的時候,會引用一個配置文件,不同的 Java 應用可能會通過 jmx 的方式暴露特別多的監控指標,顯然,我們不需要采集所有,具體要采集哪些指標,就是靠 jmx-exporter jar 包引用的那個配置文件決定的。我們來看一下 /etc/jmx-exporter/zookeeper.yml 的內容:

rules:
  # replicated Zookeeper
  - pattern: "org.apache.ZooKeeperService<name0=ReplicatedServer_id(\\d+)><>(\\w+)"
    name: "zookeeper_$2"
    type: GAUGE
  - pattern: "org.apache.ZooKeeperService<name0=ReplicatedServer_id(\\d+), name1=replica.(\\d+)><>(\\w+)"
    name: "zookeeper_$3"
    type: GAUGE
    labels:
      replicaId: "$2"
  - pattern: "org.apache.ZooKeeperService<name0=ReplicatedServer_id(\\d+), name1=replica.(\\d+), name2=(\\w+)><>(Packets\\w+)"
    name: "zookeeper_$4"
    type: COUNTER
    labels:
      replicaId: "$2"
      memberType: "$3"
  - pattern: "org.apache.ZooKeeperService<name0=ReplicatedServer_id(\\d+), name1=replica.(\\d+), name2=(\\w+)><>(\\w+)"
    name: "zookeeper_$4"
    type: GAUGE
    labels:
      replicaId: "$2"
      memberType: "$3"
  - pattern: "org.apache.ZooKeeperService<name0=ReplicatedServer_id(\\d+), name1=replica.(\\d+), name2=(\\w+), name3=(\\w+)><>(\\w+)"
    name: "zookeeper_$4_$5"
    type: GAUGE
    labels:
      replicaId: "$2"
      memberType: "$3"
  # standalone Zookeeper
  - pattern: "org.apache.ZooKeeperService<name0=StandaloneServer_port(\\d+)><>(\\w+)"
    type: GAUGE
    name: "zookeeper_$2"
  - pattern: "org.apache.ZooKeeperService<name0=StandaloneServer_port(\\d+), name1=InMemoryDataTree><>(\\w+)"
    type: GAUGE
    name: "zookeeper_$2"

這個配置文件里定義了一堆 rules,每個 rule 由四部分組成:pattern、name、type、labels,其中 pattern 是一個正則表達式,用來匹配 MBean 的 object name(什么是 MBean,什么是 object name 可以自行 Google,這里暫不展開),如果匹配到了就采集對應的 MBean 的數據,否則就不采集。type 是指定了數據類型,labels 是指定了標簽,標簽值是來自 pattern 中提取到的正則數據。

所以,jmx 監控數據采集的關鍵點,其實是這個 rules 的最佳實踐,也就是說,對于某個 Java 應用,你具體要采集哪些指標,這是真經驗,真正有價值的東西。

文章主要翻譯了 https://alex.dzyoba.com/blog/jmx-exporter/ 并加入了一些個人理解。enjoy…make a better world :)

責任編輯:武曉燕 來源: SRETalk
相關推薦

2024-09-03 10:35:31

JMXJava框架

2019-10-09 16:08:21

PythonPython教程Python 開發

2023-03-16 17:19:50

開源OCR識別項目

2022-11-10 07:41:00

sshLinux

2024-07-01 13:58:07

2019-09-12 08:03:56

MySQL索引數據庫

2024-10-17 16:41:57

KafkaZooKeeper

2025-03-25 07:54:15

2021-04-28 18:28:44

KafkaZookeeper

2024-01-30 08:43:26

IF 語句JavaScripJS

2024-03-26 15:21:43

2023-09-04 00:05:27

JMX管理組件

2022-05-10 15:24:34

KafkaZooKeeperKafka Raft

2020-05-14 10:26:27

KafkaSpark數據

2013-07-29 04:46:48

iOS開發iOS開發學習iOS小知識

2018-08-22 10:14:01

2009-01-15 09:02:27

JMXJBossJMX監控

2022-07-20 00:15:48

SQL數據庫編程語言

2018-08-19 09:15:25

MongoDBGo 微服務

2022-07-20 09:05:06

Python編程語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩欧美亚洲一区 | 一区二区三区精品视频 | 精品中文字幕久久 | 国产日韩免费观看 | 久久亚洲一区 | 久久新 | 色婷婷综合网 | 亚洲aⅴ一区二区 | 亚洲精品一区av在线播放 | 97中文视频 | 国产午夜在线观看 | 婷婷久久网 | 91新视频 | 国产精品视频网站 | 久久综合一区二区三区 | 黄色网址av | 美女网站视频免费黄 | 亚洲一区毛片 | 男女羞羞视频在线 | 久久天堂 | 视频一区二区在线观看 | 欧美日韩在线免费观看 | 日韩欧美一区二区三区四区 | 国产精品免费在线 | 精品久久久久久亚洲精品 | 国产日韩欧美在线 | 亚洲国产中文字幕 | 欧美日韩午夜精品 | 中文字幕乱码一区二区三区 | 欧美区在线| 国产香蕉视频在线播放 | 伊人精品一区二区三区 | 中文字幕在线三区 | 日韩欧美在线不卡 | 久久免费国产 | 日韩第一夜 | 殴美黄色录像 | 国产精品成人一区二区三区 | 色综合视频在线 | 久久久精彩视频 | 午夜免费观看体验区 |