package com.ctrip.framework.apollo.tracer; import com.ctrip.framework.apollo.tracer.internals.NullMessageProducerManager; import com.ctrip.framework.apollo.tracer.spi.MessageProducer; import com.ctrip.framework.apollo.tracer.spi.MessageProducerManager; import com.ctrip.framework.apollo.tracer.spi.Transaction; import com.ctrip.framework.foundation.internals.ServiceBootstrap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author Jason Song(song_s@ctrip.com) */ public abstract class Tracer { private static final Logger logger = LoggerFactory.getLogger(Tracer.class); private static final MessageProducerManager NULL_MESSAGE_PRODUCER_MANAGER = new NullMessageProducerManager(); private static volatile MessageProducerManager producerManager; private static Object lock = new Object(); static { getProducer(); } private static MessageProducer getProducer() { try { if (producerManager == null) { synchronized (lock) { if (producerManager == null) { producerManager = ServiceBootstrap.loadFirst(MessageProducerManager.class); } } } } catch (Throwable ex) { logger.error( "Failed to initialize message producer manager, use null message producer manager.", ex); producerManager = NULL_MESSAGE_PRODUCER_MANAGER; } return producerManager.getProducer(); } public static void logError(String message, Throwable cause) { try { getProducer().logError(message, cause); } catch (Throwable ex) { logger.warn("Failed to log error for message: {}, cause: {}", message, cause, ex); } } public static void logError(Throwable cause) { try { getProducer().logError(cause); } catch (Throwable ex) { logger.warn("Failed to log error for cause: {}", cause, ex); } } public static void logEvent(String type, String name) { try { getProducer().logEvent(type, name); } catch (Throwable ex) { logger.warn("Failed to log event for type: {}, name: {}", type, name, ex); } } public static void logEvent(String type, String name, String status, String nameValuePairs) { try { getProducer().logEvent(type, name, status, nameValuePairs); } catch (Throwable ex) { logger.warn("Failed to log event for type: {}, name: {}, status: {}, nameValuePairs: {}", type, name, status, nameValuePairs, ex); } } public static Transaction newTransaction(String type, String name) { try { return getProducer().newTransaction(type, name); } catch (Throwable ex) { logger.warn("Failed to create transaction for type: {}, name: {}", type, name, ex); return NULL_MESSAGE_PRODUCER_MANAGER.getProducer().newTransaction(type, name); } } }