package com.yammer.telemetry.agent;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.yammer.telemetry.agent.handlers.ApacheHttpClientClassHandler;
import com.yammer.telemetry.agent.handlers.EnvironmentExecutorClassHandler;
import com.yammer.telemetry.agent.handlers.HttpServletClassHandler;
import com.yammer.telemetry.agent.handlers.MetricsRegistryHandler;
import com.yammer.telemetry.agent.jdbc.JdbcDriverClassHandler;
import com.yammer.telemetry.instrumentation.TelemetryTransformer;
import com.yammer.telemetry.tracing.Annotations;
import com.yammer.telemetry.tracing.SpanHelper;
import com.yammer.telemetry.tracing.SpanSinkRegistry;
import com.yammer.telemetry.tracing.logging.LoggingSpanSink;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.instrument.Instrumentation;
public class TelemetryAgent {
public static void agentmain(String agentArgs, Instrumentation inst) {
premain(agentArgs, inst);
}
public static void premain(String agentArgs, Instrumentation inst) {
if (!agentArgs.isEmpty()) {
try {
TelemetryConfiguration config = loadConfiguration(agentArgs);
SpanHelper.setSampler(config.getSampler());
Annotations.setServiceAnnotations(config.getAnnotations());
if (config.isEnabled()) {
LogConfiguration log = config.getSinks().getLog();
if (log.isEnabled()) {
SpanSinkRegistry.register(new LoggingSpanSink(log.getFile()));
}
final TelemetryTransformer transformer = new TelemetryTransformer();
if (config.getInstruments().contains("inbound-http")) {
transformer.addHandler(new HttpServletClassHandler());
}
if (config.getInstruments().contains("outbound-http")) {
transformer.addHandler(new ApacheHttpClientClassHandler());
}
if (config.getInstruments().contains("database")) {
transformer.addHandler(new JdbcDriverClassHandler());
}
if (config.getInstruments().contains("metrics")) {
transformer.addHandler(new MetricsRegistryHandler());
}
if (config.getInstruments().contains("executors")) {
transformer.addHandler(new EnvironmentExecutorClassHandler());
}
inst.addTransformer(transformer);
}
} catch (IOException e) {
System.err.println("Failed to load telemetry agent configuration: " + e.toString());
System.err.println("Application will continue uninstrumented.");
e.printStackTrace(System.err);
}
} else {
System.err.println("No agent configuration path was specified. Application will not be traced by telemetry.");
System.err.println("To trace an application, specify the path to telemetry.yml as an argument to the agent.");
}
}
private static TelemetryConfiguration loadConfiguration(String filePath) throws IOException {
File configPath = new File(filePath);
if (!configPath.isFile()) {
throw new FileNotFoundException("Config file " + filePath + " does not exist");
}
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
return mapper.readValue(configPath, TelemetryConfiguration.class);
}
}