ServerHealthCollector.java 2.9 KB
Newer Older
A
ascrutae 已提交
1
package com.a.eye.skywalking.reciever.selfexamination;
wu-sheng's avatar
wu-sheng 已提交
2

3
import java.util.Arrays;
wu-sheng's avatar
wu-sheng 已提交
4
import java.util.Map;
5
import java.util.concurrent.ConcurrentHashMap;
wu-sheng's avatar
wu-sheng 已提交
6

A
ascrutae 已提交
7 8
import com.a.eye.skywalking.reciever.conf.Config;
import com.a.eye.skywalking.reciever.util.MachineUtil;
9 10 11 12
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class ServerHealthCollector extends Thread {
A
ascrutae 已提交
13
    private Logger logger = LogManager.getLogger(ServerHealthCollector.class);
14

A
ascrutae 已提交
15
    private static Map<String, ServerHeathReading> heathReadings = new ConcurrentHashMap<String, ServerHeathReading>();
16

A
ascrutae 已提交
17 18 19 20
    private ServerHealthCollector() {
        super("ServerHealthCollector");
        this.setDaemon(true);
    }
21

A
ascrutae 已提交
22 23 24
    public static void init() {
        new ServerHealthCollector().start();
    }
25

A
ascrutae 已提交
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
    public static ServerHeathReading getCurrentHeathReading(String extraId) {
        String id = getId(extraId);
        if (!heathReadings.containsKey(id)) {
            synchronized (heathReadings) {
                if (!heathReadings.containsKey(id)) {
                    if (heathReadings.keySet().size() > 5000) {
                        throw new RuntimeException(
                                "use ServerHealthCollector illegal. There is an overflow trend of Server Health Collector Report Data.");
                    }
                    heathReadings.put(id, new ServerHeathReading(id));
                }
            }
        }
        return heathReadings.get(id);
    }

    private static String getId(String extraId) {
        return "SkyWalkingServer,M:" + MachineUtil.getHostDesc() + ",P:" + MachineUtil.getProcessNo() + ",T:" + Thread
                .currentThread().getName() + "(" + Thread.currentThread().getId() + ")" + (extraId == null ?
                "" :
                ",extra:" + extraId);
    }

    @Override
    public void run() {
        while (true) {
            try {
                Map<String, ServerHeathReading> heathReadingsSnapshot = heathReadings;
                heathReadings = new ConcurrentHashMap<String, ServerHeathReading>();
                String[] keyList = heathReadingsSnapshot.keySet().toArray(new String[0]);
                Arrays.sort(keyList);
                StringBuilder log = new StringBuilder();
                log.append("\n---------Server Health Collector Report---------\n");
                for (String key : keyList) {
                    log.append(heathReadingsSnapshot.get(key)).append("\n");
                }
                log.append("------------------------------------------------\n");

                logger.info(log);

                try {
                    Thread.sleep(Config.HealthCollector.REPORT_INTERVAL);
                } catch (InterruptedException e) {
                    logger.warn("sleep error.", e);
                }
            } catch (Throwable t) {
                logger.error("ServerHealthCollector report error.", t);
            }
        }
    }
wu-sheng's avatar
wu-sheng 已提交
76
}