package com.fr.start; import com.fr.concurrent.FineExecutors; import com.fr.concurrent.NamedThreadFactory; import com.fr.design.mainframe.SiteCenterToken; import com.fr.design.metric.AbstractDesignerMetric; import com.fr.general.CloudCenter; import com.fr.general.http.HttpToolbox; import com.fr.json.JSONObject; import com.fr.json.revise.EmbedJson; import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; import com.fr.start.common.DesignerStartupContext; import com.fr.startup.metric.DesignerMetrics; import com.fr.startup.metric.DesignerStartupModel; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; /** * fbp设计器启动埋点提交 * * @author Bruce.Deng * @since 11.0 * Created on 2024/9/5 */ public class DesignerStartupMetric extends AbstractDesignerMetric { private static final String LANDING_TIME = "landingTime"; private static final String STARTING_TIME = "startingTime"; private static final String MODE = "mode"; private static final String INFO = "info"; private static volatile DesignerStartupMetric instance = new DesignerStartupMetric(); private static final String DESIGNER_START_TABLE_SUFFIX = "record_of_fbp_designerStartTime/single"; private DesignerStartupMetric() { } /** * 获取单例 */ public static DesignerStartupMetric getInstance() { return instance; } /** * 延迟5分钟提交埋点数据 * */ public void asyncSubmit() { ScheduledExecutorService scheduledExecutorService = FineExecutors.newSingleThreadScheduledExecutor(new NamedThreadFactory("DesignerStartupMetricSubmit")); scheduledExecutorService.schedule(new Runnable() { @Override public void run() { collectAndSubmit(); } }, 5, TimeUnit.MINUTES); scheduledExecutorService.shutdown(); } private void collectAndSubmit() { Map para = new HashMap<>(); para.put("token", SiteCenterToken.generateToken()); para.put("content", collect()); try { HttpToolbox.post(getUrl(), para); FineLoggerFactory.getLogger().debug("[DesignerStartup] submit designer startup metric to cloud."); } catch (Throwable t) { FineLoggerFactory.getLogger().debug(t,"[DesignerStartup] failed to submit designer startup metric to cloud."); } } private String getUrl() { String monitorEntry = CloudCenter.getInstance().acquireUrlByKind("cloud.monitor.api.entrypoint"); String url = (StringUtils.isNotEmpty(monitorEntry) ? monitorEntry : DEFAULT_MONITOR_URL) + DESIGNER_START_TABLE_SUFFIX; return url; } private JSONObject collect() { JSONObject info = new JSONObject(); DesignerMetrics designerMetrics = DesignerStartupContext.getInstance().getDesignerMetrics(); DesignerStartupModel model = designerMetrics.getModel(); info.put(LANDING_TIME, model.getLandingTime()); info.put(STARTING_TIME, model.getStartingTime()); info.put(MODE, model.getMode()); info.put(INFO, EmbedJson.encode(model.getInfo())); addDefaultMetric(info); return info; } }