package com.dianping.pigeon.monitor;
import com.dianping.pigeon.log.Logger;
import com.dianping.pigeon.log.LoggerLoader;
import java.util.ArrayList;
import java.util.List;
/**
* Created by zhanjun on 2017/4/12.
*/
public class CompositeMonitor implements Monitor {
private static final Logger logger = LoggerLoader.getLogger(CompositeMonitor.class);
private List<Monitor> monitorList;
private ThreadLocal<MonitorTransaction> tlCallTransition = new ThreadLocal<>();
private ThreadLocal<MonitorTransaction> tlServiceTransition = new ThreadLocal<>();
public CompositeMonitor(List<Monitor> monitorList) {
if (monitorList == null) {
monitorList = new ArrayList<>();
}
this.monitorList = monitorList;
}
@Override
public void init() {
for (Monitor monitor : monitorList) {
monitor.init();
}
}
@Override
public void logError(String msg, Throwable t) {
for (Monitor monitor : monitorList) {
monitor.logError(msg, t);
}
}
@Override
public void logError(Throwable t) {
for (Monitor monitor : monitorList) {
monitor.logError(t);
}
}
@Override
public void logEvent(String name, String event, String desc) {
for (Monitor monitor : monitorList) {
monitor.logEvent(name, event, desc);
}
}
@Override
public void logMonitorError(Throwable t) {
for (Monitor monitor : monitorList) {
monitor.logMonitorError(t);
}
}
@Override
public MonitorTransaction createTransaction(String name, String uri, Object invocationContext) {
List<MonitorTransaction> monitorTransactionList = new ArrayList<>(monitorList.size());
for (Monitor monitor : monitorList) {
MonitorTransaction transaction = monitor.createTransaction(name, uri, invocationContext);
if (transaction != null) {
monitorTransactionList.add(transaction);
}
}
return new CompositeTransaction(monitorTransactionList);
}
@Override
public MonitorTransaction getCurrentCallTransaction() {
return tlCallTransition.get();
}
@Override
public void setCurrentCallTransaction(MonitorTransaction transaction) {
tlCallTransition.set(transaction);
}
@Override
public void clearCallTransaction() {
tlCallTransition.remove();
}
@Override
public MonitorTransaction getCurrentServiceTransaction() {
return tlServiceTransition.get();
}
@Override
public void setCurrentServiceTransaction(MonitorTransaction transaction) {
tlServiceTransition.set(transaction);
}
@Override
public void clearServiceTransaction() {
tlServiceTransition.remove();
}
}