diff options
| author | shizhendong <[email protected]> | 2024-04-24 15:52:21 +0630 |
|---|---|---|
| committer | shizhendong <[email protected]> | 2024-04-24 15:52:21 +0630 |
| commit | 4e2b41eb074d918e85ad0a9a7b75d5e2433e22a6 (patch) | |
| tree | 26bdc00cc43af97e395b6a3068f998f57ea01e4a | |
| parent | 74968e70e90636668d4eb2400e069153b6583e8b (diff) | |
feat: remote_write nz_agent_status metrics to prometheusrel-24.01.13rel-24.01.12
1. 取消 nz-web 自监控
2. 定时任务推送 nz_agent_status 到 prometheus
5 files changed, 353 insertions, 224 deletions
diff --git a/nz-admin/src/main/java/com/nis/common/config/ShiroConfig.java b/nz-admin/src/main/java/com/nis/common/config/ShiroConfig.java index 2db364e0..88b957ae 100644 --- a/nz-admin/src/main/java/com/nis/common/config/ShiroConfig.java +++ b/nz-admin/src/main/java/com/nis/common/config/ShiroConfig.java @@ -6,7 +6,6 @@ import com.nis.common.utils.Constant; import com.nis.common.utils.R; import com.nis.common.utils.RCode; import com.nis.common.utils.Tool; -import com.nis.modules.metric.dto.NezhaMetrics; import com.nis.modules.sys.dao.SysApiKeyDao; import com.nis.modules.sys.dao.SysLoginSessionDao; import com.nis.modules.sys.service.LicenseService; @@ -15,7 +14,6 @@ import com.nis.modules.sys.shiro.MariadbSessionDao; import com.nis.modules.sys.shiro.MariadbSessionFactory; import com.nis.modules.sys.shiro.MariadbSessionManager; import com.nis.modules.sys.shiro.UserRealm; -import io.micrometer.core.instrument.MeterRegistry; import jakarta.servlet.Filter; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; @@ -64,11 +62,11 @@ public class ShiroConfig { private String compileType; @Value("${vendorCode}") private String vendorCode; - @Autowired - private NezhaMetrics nezhaMetrics; - @Autowired - private MeterRegistry meterRegistry; +// @Autowired +// private NezhaMetrics nezhaMetrics; +// @Autowired +// private MeterRegistry meterRegistry; @Autowired private LicenseService licenseService; @@ -119,17 +117,17 @@ public class ShiroConfig { /* * 自定义 过滤器 */ - filterMap.put("/actuator/prometheus", "metricsFilter"); // prometheus metrics +// filterMap.put("/actuator/prometheus", "metricsFilter"); // prometheus metrics filterMap.put("/actuator/**", "anon"); // 诊断接口 filterMap.put("/**", "tokenCheckFilter,licenseFilter"); Map<String, Filter> cumstomFilterMap = new LinkedHashMap<String, Filter>(); LicenseShiroFilter licenseShiroFilter = new LicenseShiroFilter(); - MetricsShiroFilter metricsShiroFilter = new MetricsShiroFilter(); +// MetricsShiroFilter metricsShiroFilter = new MetricsShiroFilter(); TokenCheckFilter tokenCheckFilter = new TokenCheckFilter(sysApiKeyDao,loginSessionDao); cumstomFilterMap.put("tokenCheckFilter", tokenCheckFilter); cumstomFilterMap.put("licenseFilter", licenseShiroFilter); - cumstomFilterMap.put("metricsFilter", metricsShiroFilter); +// cumstomFilterMap.put("metricsFilter", metricsShiroFilter); shiroFilter.setFilters(cumstomFilterMap); shiroFilter.setFilterChainDefinitionMap(filterMap); @@ -165,19 +163,19 @@ public class ShiroConfig { } - public class MetricsShiroFilter extends AccessControlFilter { - @Override - protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) - throws Exception { - nezhaMetrics.bindTo(meterRegistry); - return true; - } - - @Override - protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { - return false; - } - } +// public class MetricsShiroFilter extends AccessControlFilter { +// @Override +// protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) +// throws Exception { +// nezhaMetrics.bindTo(meterRegistry); +// return true; +// } +// +// @Override +// protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { +// return false; +// } +// } @Bean @ConditionalOnExpression("${nezha.shiroPermisSupport:true}") diff --git a/nz-admin/src/main/java/com/nis/common/job/JobConfig.java b/nz-admin/src/main/java/com/nis/common/job/JobConfig.java index b236680e..c3a1d984 100644 --- a/nz-admin/src/main/java/com/nis/common/job/JobConfig.java +++ b/nz-admin/src/main/java/com/nis/common/job/JobConfig.java @@ -3,10 +3,7 @@ package com.nis.common.job; import cn.hutool.core.util.StrUtil; import cn.hutool.log.Log; import com.nis.common.utils.Tool; -import com.nis.modules.agent.job.AgentHealthCheckJob; -import com.nis.modules.agent.job.AutoConfigAgentJob; -import com.nis.modules.agent.job.CortexHistoryDataDelJob; -import com.nis.modules.agent.job.LokiHistoryDataDelJob; +import com.nis.modules.agent.job.*; import com.nis.modules.alert.backend.AlertMessageExpiredJob; import com.nis.modules.alert.backend.AlertRuleManagerJob; import com.nis.modules.alert.backend.AlertSilenceStatusJob; @@ -112,6 +109,9 @@ public class JobConfig { @Value("${nezha.localCacheSyncJobCron:0/10 * * * * ?}") private String localCacheSyncJobCron; + @Value("${nezha.agentStatusMetricsUpdaterJobCron:0 0/1 * * * ? *}") + private String agentStatusMetricsUpdaterJobCron; + @Autowired private Scheduler scheduler; @Autowired @@ -142,6 +142,7 @@ public class JobConfig { private String sysLoginSessionCleanJob = "SYS_LOGIN_SESSION_CLEAN_JOB"; private String softwareLicenseStatusJobName = "SOFTWARE_LICENSE_STATUS_JOB"; private String localCacheSyncJobName = "LOCAL_CACHE_SYNC_JOB"; + private String agentStatusMetricsUpdaterJobName = "AGENT_STATUS_METRICS_UPDATER_JOB"; @Bean public JobDetail agentCronJobDetail() { @@ -258,6 +259,11 @@ public class JobConfig { return JobBuilder.newJob(LocalCacheSyncJob.class).withIdentity(JOB_NAME + localCacheSyncJobName).storeDurably().build(); } + @Bean + public JobDetail agentStatusMetricsUpdaterJobDetail() { + return JobBuilder.newJob(AgentStatusMetricsUpdaterJob.class).withIdentity(JOB_NAME + agentStatusMetricsUpdaterJobName).storeDurably().build(); + } + @PostConstruct public void init() throws SchedulerException { // agent 健康检查定时任务 @@ -328,6 +334,9 @@ public class JobConfig { // LocalCacheSyncJob createCronScheduleJob(localCacheSyncJobName, localCacheSyncJobDetail(), Tool.StrUtil.emptyToDefault(localCacheSyncJobCron, "0/10 * * * * ?")); + + // nz_agent_status metrics 定时更新任务 + createCronScheduleJob(agentStatusMetricsUpdaterJobName, agentStatusMetricsUpdaterJobDetail(), Tool.StrUtil.emptyToDefault(agentStatusMetricsUpdaterJobCron, "0 0/1 * * * ? *")); } /** diff --git a/nz-admin/src/main/java/com/nis/modules/agent/job/AgentConfigUtil.java b/nz-admin/src/main/java/com/nis/modules/agent/job/AgentConfigUtil.java index 794c9d4a..e63371e5 100644 --- a/nz-admin/src/main/java/com/nis/modules/agent/job/AgentConfigUtil.java +++ b/nz-admin/src/main/java/com/nis/modules/agent/job/AgentConfigUtil.java @@ -552,7 +552,7 @@ public class AgentConfigUtil { // prometheus_metric Map prometheusMetricJob = this.getPrometheusMetricJob(currentAgent, true); // nezha_metrics - Map nezhaMetricsJob = this.getNezhaMetricsJob(currentAgent, true); + // Map nezhaMetricsJob = this.getNezhaMetricsJob(currentAgent, true); // agent metrics Map agentMetricsJob = this.getAgentMetricsJob(currentAgent, true); // snmp exporter metrics @@ -591,7 +591,7 @@ public class AgentConfigUtil { // 本地存储 , metrics 数据保存于 Prometheus , 弃用 cortex , global 接收 per-datacenter // 推过来得数据,每一个 global 支持 nzweb 系统指标 if (isLocalStorage) { - jobList.add(nezhaMetricsJob); + // jobList.add(nezhaMetricsJob); // jobList.add(promMetricsMap); // metrics 本地存储,弃用 cortex ,直接采用 prometheus , 根据 sys_config prometheus_fed_mode // 确定 pull/push @@ -607,13 +607,19 @@ public class AgentConfigUtil { } else if (StrUtil.equals("2", prometheusFedMode)) { // global使用 remote_write 集中收集各个 per-datacenter数据 , 通过 联邦 job 收集其他 global 数据(global 负责任务采集,如 ping prometheus 等) // 只采集 其他 global 即可 - List<Integer> globalAgentIdList = globalAgents.stream().map(Agent::getId).collect(Collectors.toList()); - for (Map map : federateMapList) { - String jobName = (String) map.get("job_name"); - Integer serverId = Integer.valueOf(jobName.replaceAll("federate_", "")); - if (globalAgentIdList.contains(serverId) && !serverId.equals(currentAgent.getId())) { - jobList.add(map); + for (Agent agent : globalAgents) { + if (Tool.ObjectUtil.equal(agent.getId(), currentAgent.getId())) { + continue; } + Map<String, Object> remoteWriteMap = Tool.MapUtil.newHashMap(true); + String remoteWriteUrl = String.format("http://%s:%s/api/v1/write", agent.getHost(), prometheusDefaultPort); + if (isProxyPush) { + remoteWriteUrl = String.format("%s://%s:%s%s/prometheus/proxy/api/v1/write", agent.getProtocol(), + agent.getHost(), agent.getPort(), sysConfService.getValue(Constant.CONFAGENT_PATH)); + } + remoteWriteMap.put("url", remoteWriteUrl); + remoteWriteMap.put("token", agent.getToken()); + remoteWriteUrlInfoMapList.add(remoteWriteMap); } } } else { @@ -629,9 +635,9 @@ public class AgentConfigUtil { map.put("token", currentAgent.getToken()); remoteWriteUrlInfoMapList.add(map); - if (isSupportSysteMetrics) { - jobList.add(nezhaMetricsJob); - } +// if (isSupportSysteMetrics) { +// jobList.add(nezhaMetricsJob); +// } } } else { // 联邦关闭 @@ -685,9 +691,9 @@ public class AgentConfigUtil { remoteWriteUrlInfoMapList.add(map); } // 不论 本地还是对象存储 ,有一个支持 nzweb 系统指标即可 - if (isSupportSysteMetrics) { - jobList.add(nezhaMetricsJob); - } +// if (isSupportSysteMetrics) { +// jobList.add(nezhaMetricsJob); +// } } jobList.add(prometheusMetricJob); jobList.add(agentMetricsJob); @@ -1182,34 +1188,34 @@ public class AgentConfigUtil { * @param saveInstanceLabel * @return */ - private Map getNezhaMetricsJob(Agent agent, Boolean saveInstanceLabel) { - // nezha_metrics - String alertApi = sysConfService.getValue(Constant.SYSCONFIG_KEY_ALERT_API); - String scheme = Tool.StrUtil.isBlank(alertApi) ? "http" : alertApi.split("://")[0]; - String target = Tool.StrUtil.isBlank(alertApi) ? "" : alertApi.replace(scheme + "://", ""); - Map nezhaMetricsMap = new LinkedHashMap(); - String[] split = alertApi.split("://"); - nezhaMetricsMap.put("job_name", "nezha_metrics"); - nezhaMetricsMap.put("metrics_path", sysConfService.getValue(Constant.SYSCONFIG_KEY_ALERT_PATH_PREFIX) + "/actuator/prometheus"); - nezhaMetricsMap.put("isFederate", false); - nezhaMetricsMap.put("scheme", scheme); // 协议 - nezhaMetricsMap.put("instanceRelabel", saveInstanceLabel); - List nezhaMetricsStaticConfigList = new ArrayList(); - Map nezhaMetricsStaticConfig = new LinkedHashMap(2); - List nezhaMetricsTargets = new ArrayList(); - nezhaMetricsTargets.add(target); // ip:port - nezhaMetricsStaticConfig.put("targets", nezhaMetricsTargets); - Map nezhaLabels = new LinkedHashMap(4); - Dc dc = dcService.getById(agent.getDcId()); - // nezhaLabels.put("datacenter", ToolUtil.string2Json(dc.getName())); - nezhaLabels.put("application", "nz-web"); - nezhaLabels.put("agent_name", agent.getName()); - nezhaLabels.put("nz_agent_id", agent.getId()); - nezhaMetricsStaticConfig.put("labels", nezhaLabels); - nezhaMetricsStaticConfigList.add(nezhaMetricsStaticConfig); - nezhaMetricsMap.put("staticConfigList", nezhaMetricsStaticConfigList); - return nezhaMetricsMap; - } +// private Map getNezhaMetricsJob(Agent agent, Boolean saveInstanceLabel) { +// // nezha_metrics +// String alertApi = sysConfService.getValue(Constant.SYSCONFIG_KEY_ALERT_API); +// String scheme = Tool.StrUtil.isBlank(alertApi) ? "http" : alertApi.split("://")[0]; +// String target = Tool.StrUtil.isBlank(alertApi) ? "" : alertApi.replace(scheme + "://", ""); +// Map nezhaMetricsMap = new LinkedHashMap(); +// String[] split = alertApi.split("://"); +// nezhaMetricsMap.put("job_name", "nezha_metrics"); +// nezhaMetricsMap.put("metrics_path", sysConfService.getValue(Constant.SYSCONFIG_KEY_ALERT_PATH_PREFIX) + "/actuator/prometheus"); +// nezhaMetricsMap.put("isFederate", false); +// nezhaMetricsMap.put("scheme", scheme); // 协议 +// nezhaMetricsMap.put("instanceRelabel", saveInstanceLabel); +// List nezhaMetricsStaticConfigList = new ArrayList(); +// Map nezhaMetricsStaticConfig = new LinkedHashMap(2); +// List nezhaMetricsTargets = new ArrayList(); +// nezhaMetricsTargets.add(target); // ip:port +// nezhaMetricsStaticConfig.put("targets", nezhaMetricsTargets); +// Map nezhaLabels = new LinkedHashMap(4); +// Dc dc = dcService.getById(agent.getDcId()); +// // nezhaLabels.put("datacenter", ToolUtil.string2Json(dc.getName())); +// nezhaLabels.put("application", "nz-web"); +// nezhaLabels.put("agent_name", agent.getName()); +// nezhaLabels.put("nz_agent_id", agent.getId()); +// nezhaMetricsStaticConfig.put("labels", nezhaLabels); +// nezhaMetricsStaticConfigList.add(nezhaMetricsStaticConfig); +// nezhaMetricsMap.put("staticConfigList", nezhaMetricsStaticConfigList); +// return nezhaMetricsMap; +// } /** * prometheus agent metrics job @@ -1395,7 +1401,7 @@ public class AgentConfigUtil { // prometheus_metric Map prometheusMetricJob = this.getPrometheusMetricJob(agent, true); // nezha_metrics - Map nezhaMetricsJob = this.getNezhaMetricsJob(agent, true); + // Map nezhaMetricsJob = this.getNezhaMetricsJob(agent, true); // agent metrics Map agentMetricsJob = this.getAgentMetricsJob(agent, true); // snmp exporter metrics @@ -1413,7 +1419,7 @@ public class AgentConfigUtil { jobList.add(snmpExporterMetricsJob); jobList.add(blackboxExporterMetrics); - jobList.add(nezhaMetricsJob); + // jobList.add(nezhaMetricsJob); jobList.add(lokiMetricsJob); jobList.add(cortexMetricsJob); diff --git a/nz-admin/src/main/java/com/nis/modules/agent/job/AgentStatusMetricsUpdaterJob.java b/nz-admin/src/main/java/com/nis/modules/agent/job/AgentStatusMetricsUpdaterJob.java new file mode 100644 index 00000000..6534c593 --- /dev/null +++ b/nz-admin/src/main/java/com/nis/modules/agent/job/AgentStatusMetricsUpdaterJob.java @@ -0,0 +1,116 @@ +package com.nis.modules.agent.job; + +import cn.hutool.log.Log; +import com.nis.common.protobuf.Types; +import com.nis.common.utils.Constant; +import com.nis.common.utils.Tool; +import com.nis.modules.agent.entity.Agent; +import com.nis.modules.agent.service.AgentService; +import com.nis.modules.alert.service.RecordRuleService; +import com.nis.modules.asset.entity.Dc; +import com.nis.modules.asset.service.DcService; +import com.nis.modules.election.dao.LeaderElectionDao; +import org.apache.commons.lang3.time.StopWatch; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.quartz.QuartzJobBean; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * nz_agent_status metrics 定时更新任务 + */ +@DisallowConcurrentExecution +public class AgentStatusMetricsUpdaterJob extends QuartzJobBean { + + private static final Log log = Log.get(); + + @Autowired + private DcService dcService; + + @Autowired + private AgentService agentService; + + @Autowired + private RecordRuleService recordRuleService; + + @Override + protected void executeInternal(JobExecutionContext context) throws JobExecutionException { + Thread.currentThread().setName("AgentStatusMetricsUpdaterJob"); + + LeaderElectionDao leaderElectionDao = LeaderElectionDao.getInstance(); + boolean isLeader = leaderElectionDao.isLeader(Constant.SYS_HA_LOCK, Constant.SERVER_ID); + log.info("[AgentStatusMetricsUpdaterJob] [Get HA_LOCK] [isLeader: {}]", isLeader); + if (Tool.BooleanUtil.negate(isLeader)) return; + + log.info("[AgentStatusMetricsUpdaterJob] [begin]"); + StopWatch sw = new StopWatch(); + sw.start(); + try { + this.agentStatusMetricsUpdater(); + } catch (Exception e) { + log.error(e, "[AgentStatusMetricsUpdaterJob] [error]"); + } finally { + sw.stop(); + } + + log.info("[AgentStatusMetricsUpdaterJob] [finshed] [Run Time: {}]", sw.toString()); + } + + + /** + * agentStatusMetricsUpdater + */ + private void agentStatusMetricsUpdater() { + /** + * nz_agent_status + */ + List<Agent> agentList = agentService.list(); + List<Dc> dcList = dcService.list(); + Map<Integer, String> dcIdAndNameMap = dcList.stream().collect(Collectors.toMap(Dc::getId, Dc::getName)); + + List<Types.TimeSeries> result = Tool.ListUtil.list(false); + for (int i = 0; i < agentList.size(); i++) { + Agent agent = agentList.get(i); + String dcName = Tool.MapUtil.getStr(dcIdAndNameMap, agent.getDcId(), "null"); + Types.TimeSeries timeSeries = this.buildTimeSeries(agent, dcName); + result.add(timeSeries); + } + + log.info("[agentStatusMetricsUpdater] [nz_agent_status TimeSeries] [size: {}]", Tool.CollUtil.size(result)); + recordRuleService.rightPushRecordToCache(result); + } + + /** + * build TimeSeries + * + * @param agent + * @param dcName + * @return + */ + private Types.TimeSeries buildTimeSeries(Agent agent, String dcName) { + List<Types.Label> labelList = Tool.ListUtil.list(true); + + labelList.add(Types.Label.newBuilder().setName("datacenter").setValue(dcName).build()); + labelList.add(Types.Label.newBuilder().setName("type").setValue(Constant.AgentType.getAgentType(agent.getType()).getName()).build()); + labelList.add(Types.Label.newBuilder().setName("host").setValue(agent.getHost()).build()); + labelList.add(Types.Label.newBuilder().setName("port").setValue(agent.getPort() + "").build()); + labelList.add(Types.Label.newBuilder().setName("agent_name").setValue(agent.getName()).build()); + labelList.add(Types.Label.newBuilder().setName("application").setValue("nz-web").build()); + + // __name__ nz_agent_status + labelList.add(Types.Label.newBuilder().setName("__name__").setValue("nz_agent_status").build()); + + Types.Sample sample = Types.Sample.newBuilder() + .setTimestamp(System.currentTimeMillis()) + .setValue(agent.getStatus()) + .build(); + + Types.TimeSeries timeSeries = Types.TimeSeries.newBuilder().addAllLabels(labelList).addSamples(sample).build(); + return timeSeries; + } +} diff --git a/nz-admin/src/main/java/com/nis/modules/metric/dto/NezhaMetrics.java b/nz-admin/src/main/java/com/nis/modules/metric/dto/NezhaMetrics.java index 8e3168c4..385f1551 100644 --- a/nz-admin/src/main/java/com/nis/modules/metric/dto/NezhaMetrics.java +++ b/nz-admin/src/main/java/com/nis/modules/metric/dto/NezhaMetrics.java @@ -1,154 +1,154 @@ -package com.nis.modules.metric.dto; - -import com.alibaba.fastjson.JSONObject; -import com.nis.common.utils.Constant; -import com.nis.common.utils.Tool; -import com.nis.common.utils.ToolUtil; -import com.nis.modules.agent.entity.Agent; -import com.nis.modules.agent.service.AgentService; -import com.nis.modules.alert.dao.AlertHandlerDao; -import com.nis.modules.alert.dao.AlertRuleDao; -import com.nis.modules.asset.dao.AssetModelDao; -import com.nis.modules.asset.dao.DcDao; -import com.nis.modules.asset.entity.Dc; -import com.nis.modules.module.dao.MonitorModuleDao; -import com.nis.modules.sys.service.SysConfService; -import io.micrometer.core.instrument.*; -import io.micrometer.core.instrument.binder.MeterBinder; -import io.micrometer.core.instrument.search.Search; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@Component -public class NezhaMetrics implements MeterBinder { - - @Autowired - private DcDao dcDao; - - @Autowired - private AlertRuleDao alertRuleDao; - - @Autowired - private MonitorModuleDao monitorModuleDao; - - @Autowired - private AgentService agentService; - - @Autowired - private AssetModelDao modelDao; - - @Autowired - private SysConfService sysConfService; - - @Autowired - private AlertHandlerDao alertHandlerDao; - - @Override - public void bindTo(MeterRegistry meterRegistry) { - // 清空指标数据 - this.cleanMeterInRegistryByName(meterRegistry, "nz_alert_nums", "nz_asset_nums", "nz_endpoint_nums", "nz_agent_status", "nz_alerts"); - - /** - * alert_nums指标 / 根据告警规则 id 统计激活状态的告警消息数量 - */ - List<MetricsDto> nzAlertMumsMetrics = alertRuleDao.nzAlertMumsMetric(); - for (int i = 0; i < nzAlertMumsMetrics.size(); i++) { - MetricsDto dto = nzAlertMumsMetrics.get(i); - Gauge.builder("nz_alert_nums", dto, value -> dto.getTotal()) - .tags("id", dto.getId() + "", "name", dto.getName(), "severity", Tool.StrUtil.nullToEmpty(dto.getSeverity())) - .description("Alert statistics info") - .register(meterRegistry); - } - - /** - * nz_asset_nums - */ - List<MetricsDto> nzAssetNumsMetric = modelDao.nzAssetNumsMetric(); - for (int i = 0; i < nzAssetNumsMetric.size(); i++) { - MetricsDto dto = nzAssetNumsMetric.get(i); - // 这里将统计值扔进 map 操作是避免弱引用 统计结果出现NaN - Gauge.builder("nz_asset_nums", dto, value -> dto.getTotal()) - .tags("model", dto.getModel(), "type", dto.getType(), "brand", dto.getBrand(), "state", dto.getState()) - .description("Asset statistics info") - .register(meterRegistry); - } - - /** - * nz_endpoint_nums - */ - List<MetricsDto> nzEndpointNumsMetric = monitorModuleDao.nzEndpointNumsMetric(); - for (int i = 0; i < nzEndpointNumsMetric.size(); i++) { - MetricsDto dto = nzEndpointNumsMetric.get(i); - Gauge.builder("nz_endpoint_nums", dto, value -> dto.getTotal()) - .tags("module", dto.getName()) - .description("Endpoint statistics info") - .register(meterRegistry); - } - - /** - * nz_agent_status - */ - List<Agent> agentList = agentService.list(); - List<Dc> dcList = dcDao.selectList(null); - Map<Integer, String> idcIdAndNameMap = dcList.stream().collect(Collectors.toMap(Dc::getId, Dc::getName)); - - for (int i = 0; i < agentList.size(); i++) { - Agent agent = agentList.get(i); - Gauge.builder("nz_agent_status", agent,value -> agent.getStatus()) - .tags("datacenter", idcIdAndNameMap.get(agent.getDcId()) == null ? "null" : idcIdAndNameMap.get(agent.getDcId()), "type", Constant.AgentType.getAgentType(agent.getType()).getName(), "host", agent.getHost(), "port", agent.getPort() + "") - .description("Prometheus statistics info") - .register(meterRegistry); - } - - /** - * nz_alerts - */ - String nzAlertsMetricsEnabled = sysConfService.getValue("nz_alerts_metrics_enabled"); - nzAlertsMetricsEnabled = Tool.StrUtil.emptyToDefault(nzAlertsMetricsEnabled, "on"); - if (Tool.StrUtil.equals("on", nzAlertsMetricsEnabled)) { - List<String> activeMessageLabelsList = alertHandlerDao.selectAlertMessageLabelsList(); - activeMessageLabelsList = activeMessageLabelsList.stream().filter(s -> Tool.StrUtil.isNotEmpty(s)).distinct().collect(Collectors.toList()); - - for (String labelsJSONStr : activeMessageLabelsList) { - // labels - List<Tag> tags = new ArrayList<>(); - Map<String, Object> labelsMap = JSONObject.parseObject(labelsJSONStr, Map.class); - for (Map.Entry<String, Object> entry : labelsMap.entrySet()) { - String key = entry.getKey(); - if (Tool.StrUtil.equals("__name__", key)) continue; - tags.add(new ImmutableTag(key, entry.getValue().toString())); - } - - Gauge.builder("nz_alerts", labelsMap, value -> 0d) - .tags(tags) - .description("Alert active message statistics info") - .register(meterRegistry); - } - } - } - - /** - * 按照指标名称清除之前数据 - * - * @param registry - * @param meterNames - */ - private void cleanMeterInRegistryByName(MeterRegistry registry, String... meterNames) { - for (String meterName : meterNames) { - while (true) { - Search find = registry.find(meterName); - Meter meter = find.meter(); - if (ToolUtil.isNotEmpty(meter)) { - registry.remove(meter); - } else { - break; - } - } - } - } -} +//package com.nis.modules.metric.dto; +// +//import com.alibaba.fastjson.JSONObject; +//import com.nis.common.utils.Constant; +//import com.nis.common.utils.Tool; +//import com.nis.common.utils.ToolUtil; +//import com.nis.modules.agent.entity.Agent; +//import com.nis.modules.agent.service.AgentService; +//import com.nis.modules.alert.dao.AlertHandlerDao; +//import com.nis.modules.alert.dao.AlertRuleDao; +//import com.nis.modules.asset.dao.AssetModelDao; +//import com.nis.modules.asset.dao.DcDao; +//import com.nis.modules.asset.entity.Dc; +//import com.nis.modules.module.dao.MonitorModuleDao; +//import com.nis.modules.sys.service.SysConfService; +//import io.micrometer.core.instrument.*; +//import io.micrometer.core.instrument.binder.MeterBinder; +//import io.micrometer.core.instrument.search.Search; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.stereotype.Component; +// +//import java.util.ArrayList; +//import java.util.List; +//import java.util.Map; +//import java.util.stream.Collectors; +// +//@Component +//public class NezhaMetrics implements MeterBinder { +// +// @Autowired +// private DcDao dcDao; +// +// @Autowired +// private AlertRuleDao alertRuleDao; +// +// @Autowired +// private MonitorModuleDao monitorModuleDao; +// +// @Autowired +// private AgentService agentService; +// +// @Autowired +// private AssetModelDao modelDao; +// +// @Autowired +// private SysConfService sysConfService; +// +// @Autowired +// private AlertHandlerDao alertHandlerDao; +// +// @Override +// public void bindTo(MeterRegistry meterRegistry) { +// // 清空指标数据 +// this.cleanMeterInRegistryByName(meterRegistry, "nz_alert_nums", "nz_asset_nums", "nz_endpoint_nums", "nz_agent_status", "nz_alerts"); +// +// /** +// * alert_nums指标 / 根据告警规则 id 统计激活状态的告警消息数量 +// */ +// List<MetricsDto> nzAlertMumsMetrics = alertRuleDao.nzAlertMumsMetric(); +// for (int i = 0; i < nzAlertMumsMetrics.size(); i++) { +// MetricsDto dto = nzAlertMumsMetrics.get(i); +// Gauge.builder("nz_alert_nums", dto, value -> dto.getTotal()) +// .tags("id", dto.getId() + "", "name", dto.getName(), "severity", Tool.StrUtil.nullToEmpty(dto.getSeverity())) +// .description("Alert statistics info") +// .register(meterRegistry); +// } +// +// /** +// * nz_asset_nums +// */ +// List<MetricsDto> nzAssetNumsMetric = modelDao.nzAssetNumsMetric(); +// for (int i = 0; i < nzAssetNumsMetric.size(); i++) { +// MetricsDto dto = nzAssetNumsMetric.get(i); +// // 这里将统计值扔进 map 操作是避免弱引用 统计结果出现NaN +// Gauge.builder("nz_asset_nums", dto, value -> dto.getTotal()) +// .tags("model", dto.getModel(), "type", dto.getType(), "brand", dto.getBrand(), "state", dto.getState()) +// .description("Asset statistics info") +// .register(meterRegistry); +// } +// +// /** +// * nz_endpoint_nums +// */ +// List<MetricsDto> nzEndpointNumsMetric = monitorModuleDao.nzEndpointNumsMetric(); +// for (int i = 0; i < nzEndpointNumsMetric.size(); i++) { +// MetricsDto dto = nzEndpointNumsMetric.get(i); +// Gauge.builder("nz_endpoint_nums", dto, value -> dto.getTotal()) +// .tags("module", dto.getName()) +// .description("Endpoint statistics info") +// .register(meterRegistry); +// } +// +// /** +// * nz_agent_status +// */ +// List<Agent> agentList = agentService.list(); +// List<Dc> dcList = dcDao.selectList(null); +// Map<Integer, String> idcIdAndNameMap = dcList.stream().collect(Collectors.toMap(Dc::getId, Dc::getName)); +// +// for (int i = 0; i < agentList.size(); i++) { +// Agent agent = agentList.get(i); +// Gauge.builder("nz_agent_status", agent,value -> agent.getStatus()) +// .tags("datacenter", idcIdAndNameMap.get(agent.getDcId()) == null ? "null" : idcIdAndNameMap.get(agent.getDcId()), "type", Constant.AgentType.getAgentType(agent.getType()).getName(), "host", agent.getHost(), "port", agent.getPort() + "") +// .description("Prometheus statistics info") +// .register(meterRegistry); +// } +// +// /** +// * nz_alerts +// */ +// String nzAlertsMetricsEnabled = sysConfService.getValue("nz_alerts_metrics_enabled"); +// nzAlertsMetricsEnabled = Tool.StrUtil.emptyToDefault(nzAlertsMetricsEnabled, "on"); +// if (Tool.StrUtil.equals("on", nzAlertsMetricsEnabled)) { +// List<String> activeMessageLabelsList = alertHandlerDao.selectAlertMessageLabelsList(); +// activeMessageLabelsList = activeMessageLabelsList.stream().filter(s -> Tool.StrUtil.isNotEmpty(s)).distinct().collect(Collectors.toList()); +// +// for (String labelsJSONStr : activeMessageLabelsList) { +// // labels +// List<Tag> tags = new ArrayList<>(); +// Map<String, Object> labelsMap = JSONObject.parseObject(labelsJSONStr, Map.class); +// for (Map.Entry<String, Object> entry : labelsMap.entrySet()) { +// String key = entry.getKey(); +// if (Tool.StrUtil.equals("__name__", key)) continue; +// tags.add(new ImmutableTag(key, entry.getValue().toString())); +// } +// +// Gauge.builder("nz_alerts", labelsMap, value -> 0d) +// .tags(tags) +// .description("Alert active message statistics info") +// .register(meterRegistry); +// } +// } +// } +// +// /** +// * 按照指标名称清除之前数据 +// * +// * @param registry +// * @param meterNames +// */ +// private void cleanMeterInRegistryByName(MeterRegistry registry, String... meterNames) { +// for (String meterName : meterNames) { +// while (true) { +// Search find = registry.find(meterName); +// Meter meter = find.meter(); +// if (ToolUtil.isNotEmpty(meter)) { +// registry.remove(meter); +// } else { +// break; +// } +// } +// } +// } +//} |
