当前位置: 首页 > news >正文

【HBase】HBaseJMX 接口监控信息实现钉钉告警

目录

一、JMX 简介

二、JMX监控信息钉钉告警实现


一、JMX 简介


官网:Apache HBase ™ Reference Guide

JMX (Java管理扩展)提供了内置的工具,使您能够监视和管理Java VM。要启用远程系统的监视和管理,需要在启动Java VM时设置系统属性com.sun.management.jmxremote.port(希望通过该端口号启用JMX RMI连接)。

访问:

curl http://hdp-node2:16030/jmx?qry=Hadoop:service=HBase,name=RegionServer,sub=Server

输出的 指标如下:

{"beans" : [ {"name" : "Hadoop:service=HBase,name=RegionServer,sub=Server","modelerType" : "RegionServer,sub=Server","tag.zookeeperQuorum" : "hdp-node2:2181,hdp-node3:2181,hdp-node1:2181","tag.serverName" : "hdp-node2,16020,1738720067137","tag.clusterId" : "85aa06c7-b28c-41fd-aa17-a49376641751","tag.Context" : "regionserver","tag.Hostname" : "hdp-node2","regionCount" : 34,"storeCount" : 51,"hlogFileCount" : 1,"hlogFileSize" : 0,"storeFileCount" : 31,"memStoreSize" : 0,"storeFileSize" : 212110208,"maxStoreFileAge" : 23910274739,"minStoreFileAge" : 595075791,"avgStoreFileAge" : 12083745007,"numReferenceFiles" : 0,"regionServerStartTime" : 1738720067137,"averageRegionSize" : 6238535,"storeFileIndexSize" : 529736,"staticIndexSize" : 1348988,"staticBloomSize" : 2438222,"mutationsWithoutWALCount" : 0,"mutationsWithoutWALSize" : 0,"percentFilesLocal" : 100.0,"percentFilesLocalSecondaryRegions" : 0.0,"splitQueueLength" : 0,"compactionQueueLength" : 0,"smallCompactionQueueLength" : 0,"largeCompactionQueueLength" : 0,"flushQueueLength" : 0,"blockCacheFreeSize" : 1716727624,"blockCacheCount" : 0,"blockCacheSize" : 1259320,"blockCacheCountHitPercent" : 0.0,"blockCacheExpressHitPercent" : 0.0,"l1CacheHitCount" : 0,"l1CacheMissCount" : 0,"l1CacheHitRatio" : 0.0,"l1CacheMissRatio" : 0.0,"l2CacheHitCount" : 0,"l2CacheMissCount" : 0,"l2CacheHitRatio" : 0.0,"l2CacheMissRatio" : 0.0,"mobFileCacheCount" : 0,"mobFileCacheHitPercent" : 0.0,"totalRequestCount" : 2,"totalRowActionRequestCount" : 0,"readRequestCount" : 0,"filteredReadRequestCount" : 0,"writeRequestCount" : 0,"rpcGetRequestCount" : 0,"rpcScanRequestCount" : 0,"rpcMultiRequestCount" : 0,"rpcMutateRequestCount" : 0,"checkMutateFailedCount" : 0,"checkMutatePassedCount" : 0,"blockCacheHitCount" : 0,"blockCacheHitCountPrimary" : 0,"blockCacheMissCount" : 0,"blockCacheMissCountPrimary" : 0,"blockCacheEvictionCount" : 0,"blockCacheEvictionCountPrimary" : 0,"blockCacheFailedInsertionCount" : 0,"blockCacheDataMissCount" : 0,"blockCacheLeafIndexMissCount" : 0,"blockCacheBloomChunkMissCount" : 0,"blockCacheMetaMissCount" : 0,"blockCacheRootIndexMissCount" : 0,"blockCacheIntermediateIndexMissCount" : 0,"blockCacheFileInfoMissCount" : 0,"blockCacheGeneralBloomMetaMissCount" : 0,"blockCacheDeleteFamilyBloomMissCount" : 0,"blockCacheTrailerMissCount" : 0,"blockCacheDataHitCount" : 0,"blockCacheLeafIndexHitCount" : 0,"blockCacheBloomChunkHitCount" : 0,"blockCacheMetaHitCount" : 0,"blockCacheRootIndexHitCount" : 0,"blockCacheIntermediateIndexHitCount" : 0,"blockCacheFileInfoHitCount" : 0,"blockCacheGeneralBloomMetaHitCount" : 0,"blockCacheDeleteFamilyBloomHitCount" : 0,"blockCacheTrailerHitCount" : 0,"updatesBlockedTime" : 0,"flushedCellsCount" : 0,"compactedCellsCount" : 0,"majorCompactedCellsCount" : 0,"flushedCellsSize" : 0,"compactedCellsSize" : 0,"majorCompactedCellsSize" : 0,"cellsCountCompactedFromMob" : 0,"cellsCountCompactedToMob" : 0,"cellsSizeCompactedFromMob" : 0,"cellsSizeCompactedToMob" : 0,"mobFlushCount" : 0,"mobFlushedCellsCount" : 0,"mobFlushedCellsSize" : 0,"mobScanCellsCount" : 0,"mobScanCellsSize" : 0,"mobFileCacheAccessCount" : 0,"mobFileCacheMissCount" : 0,"mobFileCacheEvictedCount" : 0,"hedgedReads" : 0,"hedgedReadWins" : 0,"blockedRequestCount" : 0,"MajorCompactionTime_num_ops" : 2,"MajorCompactionTime_min" : 0,"MajorCompactionTime_max" : 0,"MajorCompactionTime_mean" : 0,"MajorCompactionTime_25th_percentile" : 0,"MajorCompactionTime_median" : 0,"MajorCompactionTime_75th_percentile" : 0,"MajorCompactionTime_90th_percentile" : 0,"MajorCompactionTime_95th_percentile" : 0,"MajorCompactionTime_98th_percentile" : 0,"MajorCompactionTime_99th_percentile" : 0,"MajorCompactionTime_99.9th_percentile" : 0,"MajorCompactionTime_TimeRangeCount_600000-inf" : 2,"PauseTimeWithGc_num_ops" : 0,"PauseTimeWithGc_min" : 0,"PauseTimeWithGc_max" : 0,"PauseTimeWithGc_mean" : 0,"PauseTimeWithGc_25th_percentile" : 0,"PauseTimeWithGc_median" : 0,"PauseTimeWithGc_75th_percentile" : 0,"PauseTimeWithGc_90th_percentile" : 0,"PauseTimeWithGc_95th_percentile" : 0,"PauseTimeWithGc_98th_percentile" : 0,"PauseTimeWithGc_99th_percentile" : 0,"PauseTimeWithGc_99.9th_percentile" : 0,"compactedOutputBytes" : 8924,"pauseWarnThresholdExceeded" : 0,"ScanTime_num_ops" : 0,"ScanTime_min" : 0,"ScanTime_max" : 0,"ScanTime_mean" : 0,"ScanTime_25th_percentile" : 0,"ScanTime_median" : 0,"ScanTime_75th_percentile" : 0,"ScanTime_90th_percentile" : 0,"ScanTime_95th_percentile" : 0,"ScanTime_98th_percentile" : 0,"ScanTime_99th_percentile" : 0,"ScanTime_99.9th_percentile" : 0,"Increment_num_ops" : 0,"Increment_min" : 0,"Increment_max" : 0,"Increment_mean" : 0,"Increment_25th_percentile" : 0,"Increment_median" : 0,"Increment_75th_percentile" : 0,"Increment_90th_percentile" : 0,"Increment_95th_percentile" : 0,"Increment_98th_percentile" : 0,"Increment_99th_percentile" : 0,"Increment_99.9th_percentile" : 0,"Delete_num_ops" : 0,"Delete_min" : 0,"Delete_max" : 0,"Delete_mean" : 0,"Delete_25th_percentile" : 0,"Delete_median" : 0,"Delete_75th_percentile" : 0,"Delete_90th_percentile" : 0,"Delete_95th_percentile" : 0,"Delete_98th_percentile" : 0,"Delete_99th_percentile" : 0,"Delete_99.9th_percentile" : 0,"Put_num_ops" : 0,"Put_min" : 0,"Put_max" : 0,"Put_mean" : 0,"Put_25th_percentile" : 0,"Put_median" : 0,"Put_75th_percentile" : 0,"Put_90th_percentile" : 0,"Put_95th_percentile" : 0,"Put_98th_percentile" : 0,"Put_99th_percentile" : 0,"Put_99.9th_percentile" : 0,"DeleteBatch_num_ops" : 0,"DeleteBatch_min" : 0,"DeleteBatch_max" : 0,"DeleteBatch_mean" : 0,"DeleteBatch_25th_percentile" : 0,"DeleteBatch_median" : 0,"DeleteBatch_75th_percentile" : 0,"DeleteBatch_90th_percentile" : 0,"DeleteBatch_95th_percentile" : 0,"DeleteBatch_98th_percentile" : 0,"DeleteBatch_99th_percentile" : 0,"DeleteBatch_99.9th_percentile" : 0,"splitRequestCount" : 0,"FlushMemstoreSize_num_ops" : 0,"FlushMemstoreSize_min" : 0,"FlushMemstoreSize_max" : 0,"FlushMemstoreSize_mean" : 0,"FlushMemstoreSize_25th_percentile" : 0,"FlushMemstoreSize_median" : 0,"FlushMemstoreSize_75th_percentile" : 0,"FlushMemstoreSize_90th_percentile" : 0,"FlushMemstoreSize_95th_percentile" : 0,"FlushMemstoreSize_98th_percentile" : 0,"FlushMemstoreSize_99th_percentile" : 0,"FlushMemstoreSize_99.9th_percentile" : 0,"CompactionInputFileCount_num_ops" : 2,"CompactionInputFileCount_min" : 0,"CompactionInputFileCount_max" : 0,"CompactionInputFileCount_mean" : 0,"CompactionInputFileCount_25th_percentile" : 0,"CompactionInputFileCount_median" : 0,"CompactionInputFileCount_75th_percentile" : 0,"CompactionInputFileCount_90th_percentile" : 0,"CompactionInputFileCount_95th_percentile" : 0,"CompactionInputFileCount_98th_percentile" : 0,"CompactionInputFileCount_99th_percentile" : 0,"CompactionInputFileCount_99.9th_percentile" : 0,"PutBatch_num_ops" : 0,"PutBatch_min" : 0,"PutBatch_max" : 0,"PutBatch_mean" : 0,"PutBatch_25th_percentile" : 0,"PutBatch_median" : 0,"PutBatch_75th_percentile" : 0,"PutBatch_90th_percentile" : 0,"PutBatch_95th_percentile" : 0,"PutBatch_98th_percentile" : 0,"PutBatch_99th_percentile" : 0,"PutBatch_99.9th_percentile" : 0,"CompactionTime_num_ops" : 2,"CompactionTime_min" : 0,"CompactionTime_max" : 0,"CompactionTime_mean" : 0,"CompactionTime_25th_percentile" : 0,"CompactionTime_median" : 0,"CompactionTime_75th_percentile" : 0,"CompactionTime_90th_percentile" : 0,"CompactionTime_95th_percentile" : 0,"CompactionTime_98th_percentile" : 0,"CompactionTime_99th_percentile" : 0,"CompactionTime_99.9th_percentile" : 0,"CompactionTime_TimeRangeCount_600000-inf" : 2,"Get_num_ops" : 0,"Get_min" : 0,"Get_max" : 0,"Get_mean" : 0,"Get_25th_percentile" : 0,"Get_median" : 0,"Get_75th_percentile" : 0,"Get_90th_percentile" : 0,"Get_95th_percentile" : 0,"Get_98th_percentile" : 0,"Get_99th_percentile" : 0,"Get_99.9th_percentile" : 0,"MajorCompactionInputFileCount_num_ops" : 2,"MajorCompactionInputFileCount_min" : 0,"MajorCompactionInputFileCount_max" : 0,"MajorCompactionInputFileCount_mean" : 0,"MajorCompactionInputFileCount_25th_percentile" : 0,"MajorCompactionInputFileCount_median" : 0,"MajorCompactionInputFileCount_75th_percentile" : 0,"MajorCompactionInputFileCount_90th_percentile" : 0,"MajorCompactionInputFileCount_95th_percentile" : 0,"MajorCompactionInputFileCount_98th_percentile" : 0,"MajorCompactionInputFileCount_99th_percentile" : 0,"MajorCompactionInputFileCount_99.9th_percentile" : 0,"CheckAndPut_num_ops" : 0,"CheckAndPut_min" : 0,"CheckAndPut_max" : 0,"CheckAndPut_mean" : 0,"CheckAndPut_25th_percentile" : 0,"CheckAndPut_median" : 0,"CheckAndPut_75th_percentile" : 0,"CheckAndPut_90th_percentile" : 0,"CheckAndPut_95th_percentile" : 0,"CheckAndPut_98th_percentile" : 0,"CheckAndPut_99th_percentile" : 0,"CheckAndPut_99.9th_percentile" : 0,"SplitTime_num_ops" : 0,"SplitTime_min" : 0,"SplitTime_max" : 0,"SplitTime_mean" : 0,"SplitTime_25th_percentile" : 0,"SplitTime_median" : 0,"SplitTime_75th_percentile" : 0,"SplitTime_90th_percentile" : 0,"SplitTime_95th_percentile" : 0,"SplitTime_98th_percentile" : 0,"SplitTime_99th_percentile" : 0,"SplitTime_99.9th_percentile" : 0,"MajorCompactionOutputSize_num_ops" : 2,"MajorCompactionOutputSize_min" : 0,"MajorCompactionOutputSize_max" : 0,"MajorCompactionOutputSize_mean" : 0,"MajorCompactionOutputSize_25th_percentile" : 0,"MajorCompactionOutputSize_median" : 0,"MajorCompactionOutputSize_75th_percentile" : 0,"MajorCompactionOutputSize_90th_percentile" : 0,"MajorCompactionOutputSize_95th_percentile" : 0,"MajorCompactionOutputSize_98th_percentile" : 0,"MajorCompactionOutputSize_99th_percentile" : 0,"MajorCompactionOutputSize_99.9th_percentile" : 0,"MajorCompactionOutputSize_SizeRangeCount_100000000-inf" : 2,"majorCompactedInputBytes" : 8924,"slowAppendCount" : 0,"flushedOutputBytes" : 0,"CompactionOutputFileCount_num_ops" : 2,"CompactionOutputFileCount_min" : 0,"CompactionOutputFileCount_max" : 0,"CompactionOutputFileCount_mean" : 0,"CompactionOutputFileCount_25th_percentile" : 0,"CompactionOutputFileCount_median" : 0,"CompactionOutputFileCount_75th_percentile" : 0,"CompactionOutputFileCount_90th_percentile" : 0,"CompactionOutputFileCount_95th_percentile" : 0,"CompactionOutputFileCount_98th_percentile" : 0,"CompactionOutputFileCount_99th_percentile" : 0,"CompactionOutputFileCount_99.9th_percentile" : 0,"slowDeleteCount" : 0,"Replay_num_ops" : 0,"Replay_min" : 0,"Replay_max" : 0,"Replay_mean" : 0,"Replay_25th_percentile" : 0,"Replay_median" : 0,"Replay_75th_percentile" : 0,"Replay_90th_percentile" : 0,"Replay_95th_percentile" : 0,"Replay_98th_percentile" : 0,"Replay_99th_percentile" : 0,"Replay_99.9th_percentile" : 0,"FlushTime_num_ops" : 0,"FlushTime_min" : 0,"FlushTime_max" : 0,"FlushTime_mean" : 0,"FlushTime_25th_percentile" : 0,"FlushTime_median" : 0,"FlushTime_75th_percentile" : 0,"FlushTime_90th_percentile" : 0,"FlushTime_95th_percentile" : 0,"FlushTime_98th_percentile" : 0,"FlushTime_99th_percentile" : 0,"FlushTime_99.9th_percentile" : 0,"MajorCompactionInputSize_num_ops" : 2,"MajorCompactionInputSize_min" : 0,"MajorCompactionInputSize_max" : 0,"MajorCompactionInputSize_mean" : 0,"MajorCompactionInputSize_25th_percentile" : 0,"MajorCompactionInputSize_median" : 0,"MajorCompactionInputSize_75th_percentile" : 0,"MajorCompactionInputSize_90th_percentile" : 0,"MajorCompactionInputSize_95th_percentile" : 0,"MajorCompactionInputSize_98th_percentile" : 0,"MajorCompactionInputSize_99th_percentile" : 0,"MajorCompactionInputSize_99.9th_percentile" : 0,"MajorCompactionInputSize_SizeRangeCount_100000000-inf" : 2,"pauseInfoThresholdExceeded" : 0,"splitSuccessCount" : 0,"CheckAndDelete_num_ops" : 0,"CheckAndDelete_min" : 0,"CheckAndDelete_max" : 0,"CheckAndDelete_mean" : 0,"CheckAndDelete_25th_percentile" : 0,"CheckAndDelete_median" : 0,"CheckAndDelete_75th_percentile" : 0,"CheckAndDelete_90th_percentile" : 0,"CheckAndDelete_95th_percentile" : 0,"CheckAndDelete_98th_percentile" : 0,"CheckAndDelete_99th_percentile" : 0,"CheckAndDelete_99.9th_percentile" : 0,"CompactionInputSize_num_ops" : 2,"CompactionInputSize_min" : 0,"CompactionInputSize_max" : 0,"CompactionInputSize_mean" : 0,"CompactionInputSize_25th_percentile" : 0,"CompactionInputSize_median" : 0,"CompactionInputSize_75th_percentile" : 0,"CompactionInputSize_90th_percentile" : 0,"CompactionInputSize_95th_percentile" : 0,"CompactionInputSize_98th_percentile" : 0,"CompactionInputSize_99th_percentile" : 0,"CompactionInputSize_99.9th_percentile" : 0,"CompactionInputSize_SizeRangeCount_100000000-inf" : 2,"MajorCompactionOutputFileCount_num_ops" : 2,"MajorCompactionOutputFileCount_min" : 0,"MajorCompactionOutputFileCount_max" : 0,"MajorCompactionOutputFileCount_mean" : 0,"MajorCompactionOutputFileCount_25th_percentile" : 0,"MajorCompactionOutputFileCount_median" : 0,"MajorCompactionOutputFileCount_75th_percentile" : 0,"MajorCompactionOutputFileCount_90th_percentile" : 0,"MajorCompactionOutputFileCount_95th_percentile" : 0,"MajorCompactionOutputFileCount_98th_percentile" : 0,"MajorCompactionOutputFileCount_99th_percentile" : 0,"MajorCompactionOutputFileCount_99.9th_percentile" : 0,"ScanSize_num_ops" : 0,"ScanSize_min" : 0,"ScanSize_max" : 0,"ScanSize_mean" : 0,"ScanSize_25th_percentile" : 0,"ScanSize_median" : 0,"ScanSize_75th_percentile" : 0,"ScanSize_90th_percentile" : 0,"ScanSize_95th_percentile" : 0,"ScanSize_98th_percentile" : 0,"ScanSize_99th_percentile" : 0,"ScanSize_99.9th_percentile" : 0,"slowGetCount" : 0,"flushedMemstoreBytes" : 0,"CompactionOutputSize_num_ops" : 2,"CompactionOutputSize_min" : 0,"CompactionOutputSize_max" : 0,"CompactionOutputSize_mean" : 0,"CompactionOutputSize_25th_percentile" : 0,"CompactionOutputSize_median" : 0,"CompactionOutputSize_75th_percentile" : 0,"CompactionOutputSize_90th_percentile" : 0,"CompactionOutputSize_95th_percentile" : 0,"CompactionOutputSize_98th_percentile" : 0,"CompactionOutputSize_99th_percentile" : 0,"CompactionOutputSize_99.9th_percentile" : 0,"CompactionOutputSize_SizeRangeCount_100000000-inf" : 2,"majorCompactedOutputBytes" : 8924,"PauseTimeWithoutGc_num_ops" : 0,"PauseTimeWithoutGc_min" : 0,"PauseTimeWithoutGc_max" : 0,"PauseTimeWithoutGc_mean" : 0,"PauseTimeWithoutGc_25th_percentile" : 0,"PauseTimeWithoutGc_median" : 0,"PauseTimeWithoutGc_75th_percentile" : 0,"PauseTimeWithoutGc_90th_percentile" : 0,"PauseTimeWithoutGc_95th_percentile" : 0,"PauseTimeWithoutGc_98th_percentile" : 0,"PauseTimeWithoutGc_99th_percentile" : 0,"PauseTimeWithoutGc_99.9th_percentile" : 0,"slowPutCount" : 0,"slowIncrementCount" : 0,"compactedInputBytes" : 8924,"Append_num_ops" : 0,"Append_min" : 0,"Append_max" : 0,"Append_mean" : 0,"Append_25th_percentile" : 0,"Append_median" : 0,"Append_75th_percentile" : 0,"Append_90th_percentile" : 0,"Append_95th_percentile" : 0,"Append_98th_percentile" : 0,"Append_99th_percentile" : 0,"Append_99.9th_percentile" : 0,"FlushOutputSize_num_ops" : 0,"FlushOutputSize_min" : 0,"FlushOutputSize_max" : 0,"FlushOutputSize_mean" : 0,"FlushOutputSize_25th_percentile" : 0,"FlushOutputSize_median" : 0,"FlushOutputSize_75th_percentile" : 0,"FlushOutputSize_90th_percentile" : 0,"FlushOutputSize_95th_percentile" : 0,"FlushOutputSize_98th_percentile" : 0,"FlushOutputSize_99th_percentile" : 0,"FlushOutputSize_99.9th_percentile" : 0,"Bulkload_count" : 0,"Bulkload_mean_rate" : 0.0,"Bulkload_1min_rate" : 0.0,"Bulkload_5min_rate" : 0.0,"Bulkload_15min_rate" : 0.0,"Bulkload_num_ops" : 0,"Bulkload_min" : 0,"Bulkload_max" : 0,"Bulkload_mean" : 0,"Bulkload_25th_percentile" : 0,"Bulkload_median" : 0,"Bulkload_75th_percentile" : 0,"Bulkload_90th_percentile" : 0,"Bulkload_95th_percentile" : 0,"Bulkload_98th_percentile" : 0,"Bulkload_99th_percentile" : 0,"Bulkload_99.9th_percentile" : 0} ]
}

如上监控主要是HBase 内某个RegionServer 详细信息。具体有gc, scan,flush ,block,compaction 等细粒度的监控。


二、JMX监控信息钉钉告警实现


下面我们实现了一个RegionServer运行时长的钉钉通知消息

# -*- coding: utf-8 -*-import time
import requests
import jsonimport schedule as schedule"""
~~~~~~~~~~~~
author: kangll
date: 2025/02/11 11:50
desc: reid cluster  HBase JMX  获取指标信息
-- curl 请求: curl http://hdp-node2:16030/jmx?qry=Hadoop:service=HBase,name=RegionServer,sub=Server2小时发出一次正常的RS运行状态信息,RS运行时间小于10分钟且当前小时立即发出一次告警
"""__author__ = 'kanglilong  <kangll@winnerinf.com>'headers = {'Content-Type': 'application/json;charset=utf-8'}
hostArr = {"hdp-node1", "hdp-node2", "hdp-node3"}
dingding_url = "https://oapi.dingtalk.com/robot/send?access_token=ba7693ae5a1a5a4cda1358f35b19785a6d8a7659da92ba3685d6532994a6d82c"# 记录上一次发送运行时间小于 10 分钟告警的小时
last_less_than_10mins_alert_hour = Nonedef jmxGetHBaseStatus(regionserver_host):"""从 HBase JMX 接口获取 RegionServer 运行时长信息:return: 告警信息"""jmx_port = 16030# 构建JMX查询URL,用于获取运行时间指标jmx_url = f'http://{regionserver_host}:{jmx_port}/jmx?qry=Hadoop:service=HBase,name=RegionServer,sub=Server'try:# 发送HTTP请求获取JMX数据response = requests.get(jmx_url)# 检查响应状态码response.raise_for_status()# 解析JSON响应jmx_data = response.json()# 从JMX数据中提取运行时间(单位:毫秒)region_server_start_time = jmx_data['beans'][0]['regionServerStartTime']# 获取当前时间戳(毫秒)current_time = int(time.time() * 1000)# 计算RegionServer运行时长(毫秒)uptime = current_time - region_server_start_time# 将运行时长转换为时分秒格式uptime_hms = convert_milliseconds_to_hms(uptime)text = f"hostname: {regionserver_host}, RegionServer uptime: {uptime_hms}"return textexcept requests.exceptions.RequestException as e:print(f'请求出错: {e}')except (KeyError, IndexError, json.JSONDecodeError) as e:print(f'解析 JMX 数据出错: {e}')def jmxGetHBaseAlarmStatus(regionserver_host):"""从 HBase JMX 接口获取 RegionServer 重启的运行时长,也就是运行时间小于10min:return: 告警信息"""jmx_port = 16030# 构建JMX查询URL,用于获取运行时间指标jmx_url = f'http://{regionserver_host}:{jmx_port}/jmx?qry=Hadoop:service=HBase,name=RegionServer,sub=Server'try:text = ""now_time = time.localtime(time.time())formatted_time = time.strftime('%Y-%m-%d %H:%M:%S', now_time)# 发送HTTP请求获取JMX数据response = requests.get(jmx_url)if response.status_code == 200:# 检查响应状态码# response.raise_for_status()# 解析JSON响应jmx_data = response.json()if len(jmx_data['beans'][0]) > 400:# print("---", less_than_10mins_alert_sent)# if jmx_data is not None and len(jmx_data) > 0:# 从JMX数据中提取运行时间(单位:毫秒)region_server_start_time = jmx_data['beans'][0]['regionServerStartTime']# 获取当前时间戳(毫秒)current_time = int(time.time() * 1000)# 计算 RegionServer 运行时长(毫秒)uptime = current_time - region_server_start_time# 将运行时长转换为时分秒格式uptime_hms = convert_milliseconds_to_hms(uptime)#current_hour = time.localtime().tm_hourglobal last_less_than_10mins_alert_hourif uptime is not None:if uptime < 10 * 60 * 1000:  # 运行时间小于 10 分钟if last_less_than_10mins_alert_hour is None or last_less_than_10mins_alert_hour != current_hour:print("++++", last_less_than_10mins_alert_hour)text = "告警类型: reid 集群HBase 重启告警通知 \n" + "告警信息: \n" + f"hostname: {regionserver_host} ,RegionServer uptime: {uptime_hms} " + "\n告警时间:" + formatted_time# 发出告警msg(text, dingding_url)last_less_than_10mins_alert_hour = current_hour# print(f"hostname: {regionserver_host}, RegionServer uptime: {uptime_hms}")return textexcept requests.exceptions.RequestException as e:print(f'请求出错: {e}')except (KeyError, IndexError, json.JSONDecodeError) as e:print(f'解析 JMX 数据出错: {e}')return Nonedef convert_milliseconds_to_hms(milliseconds):"""将毫秒转换为时分秒的格式:param milliseconds: 毫秒数:return: 时分秒格式的字符串"""seconds = milliseconds // 1000hours = seconds // 3600seconds %= 3600minutes = seconds // 60seconds %= 60return f"{hours}小时 {minutes}分钟 {seconds}秒."def getAllHostsHBase(alert_message=""):"""从 HBase JMX 接口获取 RegionServer 运行时长信息:return: 正常通知信息或 None"""count = 0now_time = time.localtime(time.time())formatted_time = time.strftime('%Y-%m-%d %H:%M:%S', now_time)# 将集合转换为列表,并进行排序sorted_hosts = sorted(list(hostArr))alert_message += "告警类型: reid 集群HBase告警通知 \n" + "告警信息: \n"for host in sorted_hosts:line_alarm = str(jmxGetHBaseStatus(host))count += 1alert_message += "\t" + str(count) + "." + line_alarm + "\n"alert_message += "\n告警时间:" + formatted_timeprint(alert_message)notify_msg(alert_message, dingding_url)def check_and_alert():"""检查运行时长,若小于 10 分钟且满足条件则立即发送"""now_time = time.localtime(time.time())formatted_time = time.strftime('%Y-%m-%d %H:%M:%S', now_time)# 将集合转换为列表,并进行排序sorted_hosts = sorted(list(hostArr))for host in sorted_hosts:alarm_str = jmxGetHBaseAlarmStatus(host)print(alarm_str)if alarm_str is not None and alarm_str != "":print("时间: ", formatted_time, "主机:", host, 'RegionServer 重启告警发出!')else:print("时间: ", formatted_time, "主机:", host, 'RegionServer 状 态 正 常!')def msg(text, api_url):"""钉钉告警发出 通知具体负责人:param text: 告警文本:param api_url: 钉钉URL:return: 无返回值"""json_text = {"msgtype": "text","text": {"content": text}, "at": {"atMobiles": [""]}}requests.post(api_url, json.dumps(json_text), headers=headers).contentdef notify_msg(text, api_url):"""钉钉告警发出:param text: 告警文本:param api_url: 钉钉URL:return: 无返回值"""json_text = {"msgtype": "text","text": {"content": text}, "at": {"atMobiles": [""]}}requests.post(api_url, json.dumps(json_text), headers=headers).contentdef correct_msg(text, api_url):"""钉钉告警发出, 组件正常的告警信息,不艾特告警人:param text: 告警文本:param api_url: 钉钉URL:return: 无返回值"""json_text = {"msgtype": "text","text": {"content": text}, "at": {"atMobiles": [""]}}requests.post(api_url, json.dumps(json_text), headers=headers).contentif __name__ == '__main__':# 设定整点执行常规告警任务schedule.every().hour.at(":00").do(getAllHostsHBase)while True:check_and_alert()schedule.run_pending()time.sleep(10)

钉钉告警通知:

相关文章:

【HBase】HBaseJMX 接口监控信息实现钉钉告警

目录 一、JMX 简介 二、JMX监控信息钉钉告警实现 一、JMX 简介 官网&#xff1a;Apache HBase ™ Reference Guide JMX &#xff08;Java管理扩展&#xff09;提供了内置的工具&#xff0c;使您能够监视和管理Java VM。要启用远程系统的监视和管理&#xff0c;需要在启动Java…...

OpenLayers总结3

一、 静态测距 1.原理 静态测距主要是针对地图上已有的矢量要素&#xff08;如线要素&#xff09;&#xff0c;利用 OpenLayers 提供的几何计算函数来获取其长度。在实际操作中&#xff0c;先加载包含几何要素的 GeoJSON 数据到矢量图层&#xff0c;当鼠标指针移动到要素上时…...

【OpenCV】在Liunx中配置OpenCV环境变量

将 /usr/local/include/opencv4 加入到环境变量中&#xff0c;可以帮助编译器找到 OpenCV 的头文件。这可以通过设置 CPLUS_INCLUDE_PATH 和 C_INCLUDE_PATH 环境变量来实现。以下是具体步骤&#xff1a; 方法一&#xff1a;临时设置环境变量 如果您希望临时设置这些环境变量…...

游戏引擎学习第109天

回顾目前进展 在这一期中&#xff0c;讨论了游戏开发中的一个重要问题——如何处理Z轴值的表示&#xff0c;尤其是在一个3D游戏中&#xff0c;如何更好地表示和存储这些值。上次的进展中&#xff0c;已经解决了透视投影的问题&#xff0c;意味着渲染部分的Z轴代码基本上已经完…...

npm、yarn、pnpm 的异同及为何推荐 pnpm

文章目录 一、引言二、npm 介绍&#xff08;一&#xff09;工作原理和特点&#xff08;二&#xff09;优势与不足 三、yarn 介绍&#xff08;一&#xff09;诞生背景和特性&#xff08;二&#xff09;与 npm 的主要区别 四、pnpm 介绍&#xff08;一&#xff09;核心优势和创新…...

基于遗传算法排课系统

一、遗传算法介绍&#xff1a; 遗传算法核心的任务是要通过编码体系&#xff0c;给出解决方案的染色体表现规则&#xff0c;首先需要随机初始化一定数量的种群&#xff08;population&#xff09;&#xff0c;而种群则由一定数目的个体(individual)构成。每个个体实际上是染色体…...

Windows 图形显示驱动开发-GpuMmu 示例方案

本文介绍常见使用方案以及实现这些方案所需的操作顺序。 更新进程的页表条目 下面是更新页表条目以将属于进程 (P) 的分配映射到物理内存的操作序列。 假定页表分配已驻留在图形处理单元中GPU)内存段。 视频内存管理器在分页进程上下文中为进程 P 的根页表分配分配虚拟地址范…...

【Linux AnolisOS】关于Docker的一系列问题。尤其是拉取东西时的网络问题,镜像源问题。

AnolisOS 8中使用Docker部署&#xff08;全&#xff09;_anolis安装docker-CSDN博客 从在虚拟机安装龙蜥到安装docker上面这篇文章写的很清晰了&#xff0c;我重点讲述我解决文章里面问题一些的方法。 问题1&#xff1a; docker: Get https://registry-1.docker.io/v2/: net/h…...

策略+适配器模式详解

文章目录 1.策略模式1.目录结构2.Strategy.java 策略接口3.StrategyA.java 策略A4.StrategyB.java 策略B5.StrategyC.java 策略C6.Context.java 策略上下文7.Client.java 客户端8.小结 2.适配器模式1.目录结构2.CustomPaymentProcessor.java 自己的支付接口3.PayPalPaymentServ…...

Vue中事件名的命名规范

Vue中事件名的命名规范 起因&#xff1a; 本人之前不太写vue的项目&#xff0c;最近接触了vue的代码&#xff0c;在学习的过程中同时也会伴随着一点疑惑。比如一以下面的父子组件的事件传递为例&#xff1a; 父组件&#xff1a; 显然&#xff0c;父组件有个自定义事件refre…...

云计算架构学习之Ansible-playbook实战、Ansible-流程控制、Ansible-字典循环-roles角色

一、Ansible-playbook实战 1.Ansible-playbook安装软件 bash #编写yml [rootansible ansible]# cat wget.yml - hosts: backup tasks: - name: Install wget yum: name: wget state: present #检查playbook的语法 [rootansible ansible]…...

背包dp与数位dp

背包dp 介绍 动态规划实际上就是将复杂问题分解成若干个子问题&#xff0c;并通过子问题的解逐步发展成整体问题的解的算法思想。&#xff08;我感觉这个解释就跟递归的思想一样&#xff09; 背包问题分为01背包(物体只能使用一次)&#xff0c;完全背包(物体可以使用无数次)&…...

【linux】更换ollama的deepseek模型默认安装路径

【linux】更换ollama的deepseek模型默认安装路径 文章目录 【linux】更换ollama的deepseek模型默认安装路径Ollama 默认安装路径及模型存储路径迁移ollama模型到新的路径1.创建新的模型存储目录2.停止ollama3.迁移现有模型4.修改 Ollama 服务配置5.重启ollama6.验证迁移是否成功…...

【紫光同创国产FPGA教程】——FPGA开发工具使用

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com) 一&#xff1a;实验简介 实验目的&#xff1a;了解PDS软件的使用&#xff0c;在线Debugger工具的使用请看第八章uart实…...

面试技术分享:MySQL死锁与事务等待超时的临时解决方案

&#x1f4dd; 面试技术分享&#xff1a;MySQL死锁与事务等待超时的临时解决方案 1. 问题背景 某电商系统在促销高峰期出现库存更新失败&#xff0c;日志报错&#xff1a; Lock wait timeout exceeded; try restarting transaction (errno 1213)现象&#xff1a;多个事务因争…...

6.3 k8s的事件event和kube-scheduler中的事件广播器

什么是k8s的events k8s的events是向您展示集群内部发生的事情的对象 例如调度程序做出了哪些决定或者为什么某些 Pod 从节点中被逐出 哪些组件可以产生events 所有核心组件和扩展&#xff08;操作符&#xff09;都可以通过 API Server 创建事件k8s 多个组件均会产生 event …...

OAI 平台 4G(LTE)基站 、终端、核心网 端到端部署实践(一)

本系列文章,基于OAI LTE代码搭建端到端运行环境,包含 eNB,EPC,UE三个网元。本小节先介绍系统总体架构,硬件平台及驱动安装方法。 1. Overview 系统总体架构如下图所示。 2 Machine setup 2.1 Machine specs Distributor ID: Ubuntu Description: Ubuntu 18.04.5 LTS…...

t113修改串口

1 sys_config.fex [uart_para] uart_debug_port 0 uart_debug_tx port:PE02<6><1><default><default> uart_debug_rx port:PE03<6><1><default><default> 2 uboot修改启动参数 3 修改env.cfg启动地址和传输 #ear…...

「软件设计模式」桥接模式(Bridge Pattern)

深入解析桥接模式&#xff1a;解耦抽象与实现的艺术 一、模式思想&#xff1a;正交维度的优雅解耦 桥接模式&#xff08;Bridge Pattern&#xff09;通过分离抽象&#xff08;Abstraction&#xff09;与实现&#xff08;Implementation&#xff09;&#xff0c;使二者可以独立…...

“地质环境体检”辅助智慧地质,服务工程建设、城市用地规划

随着社会经济的高速发展&#xff0c;各类工程建设也在加快筹建中。在工程项目的快速推进中&#xff0c;如何保障工作安全和工程建设的质量&#xff0c;是国家和社会普遍关注的一个问题。地质环境条件是影响工程建设、城市用地规划的重要因素&#xff0c;加强地质风险系统性研究…...

TMS320F28335二次bootloader在线IAP升级

F28335总共ABCDEFGH个区域&#xff0c;每个32K*16bits&#xff0c;即64K字节。 bootloader代码占用A区&#xff0c;地址0x338000~0x33FF7F&#xff0c;cmd文件中SECTIONS部分&#xff0c;需要添加Flash28_API相关信息&#xff0c;具体下载Flash28335_API_V210的demo&#xff0…...

java:用Guava的TypeToken优雅处理通配符类型(WildcardType): ? extends Number

在日常开发中我们经常会遇到泛型和通配符类型&#xff08;WildcardType&#xff09;&#xff0c;比如当我们需要处理List<? extends Number>这样的类型时&#xff0c;如何优雅地创建这样的类型表示&#xff1f;本文将重点介绍如何通过Guava的TypeToken来实现通配符类型的…...

ROS-相机话题-获取图像-颜色目标识别与定位-目标跟随-人脸检测

文章目录 相机话题获取图像颜色目标识别与定位目标跟随人脸检测 相机话题 启动仿真 roslaunch wpr_simulation wpb_stage_robocup.launch rostopic hz /kinect2/qhd/image_color_rect/camera/image_raw&#xff1a;原始的、未经处理的图像数据。 /camera/image_rect&#xff…...

Zabbix——Rocky9安装zabbix相关步骤记录

安装Zabbix 安装MariaDB 这里用MariaDB演示 https://mariadb.org/download/?trepo-config&dRedHatEnterpriseLinux9&v10.11&r_mneusoft 通过这个网址获得连接 选择对应的repo 根据系统版本和要安装的版本选择对应的repo 安装 新建一个repo文件&#xff0c;例…...

三轴云台之姿态测量篇

一、姿态测量的基本原理 三轴云台通过内置的传感器实时感知其姿态变化。这些传感器主要包括陀螺仪、加速度计和磁力计&#xff08;在某些高级系统中&#xff09;。 陀螺仪&#xff1a;用于检测云台的角速度变化&#xff0c;即绕三个轴的旋转速度。陀螺仪提供的数据是姿态测量的…...

Kotlin 2.1.0 入门教程(二十三)泛型、泛型约束、协变、逆变、不变

out&#xff08;协变&#xff09; out 关键字用于实现泛型的协变。协变意味着如果 B 是 A 的子类型&#xff0c;那么 Producer<B> 可以被视为 Producer<A> 的子类型。这里的 Producer 是一个使用泛型类型参数的类或接口&#xff0c;并且该泛型类型参数被标记为 ou…...

VSCode 中使用 Snippets 设置常用代码块

背景 在开发中&#xff0c;有很多代码片段是重复的&#xff0c;例如&#xff1a;vue文件中的模版&#xff0c;react 中的模版&#xff0c;打印的 log 等等&#xff0c;很多很多。对于这些重复性的工作&#xff0c;vscode 官方提供了解决方案-Snippets in Visual Studio Code&a…...

在conda虚拟环境中安装jupyter lab-----deepseek问答记录

在 Conda 虚拟环境中安装 Jupyter Lab 的步骤如下&#xff1a; 1. 创建并激活 Conda 虚拟环境 如果你还没有创建虚拟环境&#xff0c;可以使用以下命令创建一个新的虚拟环境并激活它&#xff1a; conda create -n myenv python3.x # 将 myenv 替换为你的环境名称&#xff0…...

单元测试整理

在国外软件开发中&#xff0c;单元测试必不可少&#xff0c;但是国内并不太重视这一块&#xff0c;一个好的单元测试可以提前发现很多问题&#xff0c;也减去和测试battle的时间 Spring单元测试 JUnit4 RunWith 指明单元测试框架 e.g. RunWith(SpringJUnit4ClassRunner.cla…...

计算机毕业设计hadoop+spark旅游景点推荐 旅游推荐系统 旅游可视化 旅游爬虫 景区客流量预测 旅游大数据 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Java虚拟机面试题:内存管理(下)

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

【贝克街迷宫疑云:用侦探思维破解Java迷宫算法】

贝克街迷宫疑云&#xff1a;用侦探思维破解Java迷宫算法 "华生&#xff0c;把煤气灯调亮些。"福尔摩斯用放大镜仔细端详着桌上的羊皮纸&#xff0c;“这个案子比表面上看起来要复杂得多——它是个三维的思维迷宫。” 第一幕&#xff1a;离奇委托 1895年秋的伦敦笼…...

网络安全示意图 网络安全路线图

其实网络安全本身的知识点并不算难&#xff0c;但需要学的东西比较多&#xff0c;如果想要从事网络安全领域&#xff0c;肯定是需要系统、全面地掌握清楚需要用到的技能的。 自学的方式基本是通过看视频或者相关的书籍&#xff0c;不论是什么方法&#xff0c;都是很难的&#…...

ubuntu22.04离线安装K8S

1. 准备离线安装包 参考教程离线包准备教程 2. 准备环境 2.1. 准备主机 主机名ip系统k8s-master192.168.38.128ubuntu22.04k8s-node192.168.38.131ubuntu22.04 2.2. 设置host 修改 /etc/hosts 文件&#xff0c;添加master和node节点&#xff0c;需要和主机名保持一致 2…...

985本硕,网络安全方向,走算法还是走开发?

今天给大家分享的是一位粉丝的提问&#xff0c;985本硕&#xff0c;网络安全方向&#xff0c;走算法还是走开发&#xff1f; 接下来把粉丝的具体提问和我的回复分享给大家&#xff0c;希望也能给一些类似情况的小伙伴一些启发和帮助。 同学提问&#xff1a; 985本硕&#xff…...

如何清理 Linux 缓存 ?

和其他操作系统一样&#xff0c;Linux 使用缓存来优化系统性能。随着时间的推移&#xff0c;这些缓存可能会累积起来&#xff0c;尽管 Linux 擅长管理内存&#xff0c;但在某些情况下&#xff0c;手动清除可能是有益的&#xff0c;例如用于系统诊断、应用程序性能测试或其他特定…...

cv2库的使用及图像预处理02

目录 八,图像缩放 1. 图像缩放操作 2. 插值方法 &#xff08;1&#xff09;最邻近插值&#xff08;cv2.INTER_NEAREST&#xff09; &#xff08;2&#xff09;双线性插值&#xff08;cv2.INTER_LINEAR&#xff09; 3. 显示缩放结果 4. 目标尺寸 5. 总结 九,线性灰度变…...

硬件学习笔记--45 电磁兼容试验-9 无线电干扰抑制试验介绍

目录 电磁兼容试验- 无线电干扰抑制试验 1.试验目的 2.试验方法 3.判定依据及意义 电磁兼容试验- 无线电干扰抑制试验 驻留时间是在规定频率下影响量施加的持续时间。被试设备&#xff08;EUT&#xff09;在经受扫频频带的电磁影响量或电磁干扰的情况下&a…...

P1464 Function(记忆化递归)

#include <bits/stdc.h> using namespace std;#define ll long longll dp[21][21][21]; // dp数组&#xff0c;用来记忆已经计算过的结果ll w(ll a, ll b, ll c) {if (a < 0 || b < 0 || c < 0) {return 1;}if (a > 20 || b > 20 || c > 20) {return …...

OpenCV机器学习(7)人工神经网络 定义模型训练过程中参数的搜索范围cv::ml::ParamGrid 类

OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::ml::ParamGrid 类是 OpenCV 机器学习模块中的一个辅助类&#xff0c;用于定义模型训练过程中参数的搜索范围。它通常被用作某些机器学习算法&#xff08;如支持向量机 SVM&…...

STL —— 洛谷字符串(string库)入门题(蓝桥杯题目训练)(一)

目录 一、B2109 统计数字字符个数 - 洛谷 算法代码&#xff1a; 1. 引入库和命名空间 2. 主函数 3. 读取输入 4. 变量初始化 5. 遍历字符串 6. 输出结果 7. 返回值 总结 评测记录&#xff1a; 二、B2110 找第一个只出现一次的字符 - 洛谷 方法一&#xff1a;算法代…...

游戏引擎学习第107天

仓库:https://gitee.com/mrxiao_com/2d_game_2 回顾我们之前停留的位置 在这段内容中&#xff0c;讨论了如何处理游戏中的三维效果&#xff0c;特别是如何处理额外的“Z层”。由于游戏中的艺术资源是位图而不是3D模型&#xff0c;因此实现三维效果变得非常具有挑战性。虽然可…...

网页制作01-html,css,javascript初认识のhtml的基本标记

一、 Html简介 英文全称是 hyper text markup language,超文本标记语言,是全球广域网上描述网页内容和外观的标准. Html作为一款标记语言,本身不能显示在浏览器中.标记语言经过浏览器的解释和编译,才能正确地反映html标记语言的内容. 1.html 的基本标记 1&#xff09;头部标…...

WebSocket在分布式环境中的局限性及解决方案

WebSocket 在分布式环境中存在一些局限性&#xff0c;特别是当系统需要扩展多个服务实例时&#xff0c;单个 WebSocket 连接的管理和消息推送就变得比较复杂。因此&#xff0c;必须采取一些额外的措施来确保 WebSocket 能在多个服务实例之间正确工作。 WebSocket 在分布式环境…...

Windows日志分析

查看服务日志文件 windows下我们可以通过时间查看器来查看windows系统下服务&#xff0c;应用&#xff0c;系统等产生的事件以及日志 1.打开方式是&#xff1a; winr 输入eventvwr.msc 2.控制面板--系统与安全--事件查看器 事件类型分为5种 错误&#xff1a;标识问题很严重…...

青少年编程与数学 02-009 Django 5 Web 编程 20课题、测试

青少年编程与数学 02-009 Django 5 Web 编程 20课题、测试 一、软件测试二、自动化测试三、单元测试四、Django 单元测试&#xff08;一&#xff09;、创建测试用例&#xff08;二&#xff09;、运行测试&#xff08;三&#xff09;、常用测试功能 课题摘要: 本文全面介绍了软件…...

WPF 中为 Grid 设置背景图片全解析

WPF 中为 Grid 设置背景图片全解析 在 WPF&#xff08;Windows Presentation Foundation&#xff09;开发中&#xff0c;界面的美观度是吸引用户的重要因素之一。而添加背景图片是提升界面视觉效果的常见手段。今天&#xff0c;我们就来深入探讨在 WPF 里如何为 Grid 设置背景…...

3.10 实战Hugging Face Transformers:从文本分类到模型部署全流程

实战Hugging Face Transformers:从文本分类到模型部署全流程 一、文本分类实战:IMDB电影评论情感分析 1.1 数据准备与预处理 from datasets import load_dataset from transformers import AutoTokenizer # 加载IMDB数据集 dataset = load_dataset("imdb") …...

Android中获取so文件来源于哪个库

Android app中可能有很多的.so文件&#xff0c;有时我们不确定这些.so文件都是来源于哪些库的&#xff0c;可以通过在build.gradle中添加代码来统计。具体方法如下&#xff1a; 1.在com.android.application模块的build.gradle文件最后添加如下代码&#xff1a; // 获取所有的…...

地面沉降监测,为地质安全保驾护航

地面沉降&#xff0c;不容忽视的城市隐患 随着城市化进程的加速&#xff0c;大规模的工程建设、地下水过度开采等因素&#xff0c;导致地面沉降现象日益严重。地面沉降不仅会使建筑物开裂、倾斜&#xff0c;影响其使用寿命和安全性&#xff0c;还会破坏地下管线&#xff0c;引…...