use of com.newrelic.api.agent.DistributedTracePayload in project newrelic-java-agent by newrelic.
the class SpanProxyTest method testTraceIdFromInboundPayload.
@Test
public void testTraceIdFromInboundPayload() throws Exception {
SpanProxy spanProxy = new SpanProxy();
String traceId = "flimflam";
DistributedTracePayload payload = new DistributedTracePayloadImpl(0, null, null, null, null, null, traceId, null, null, null);
spanProxy.acceptDistributedTracePayload(payload);
String result = spanProxy.getOrCreateTraceId();
assertEquals(traceId, result);
}
use of com.newrelic.api.agent.DistributedTracePayload in project newrelic-java-agent by newrelic.
the class DistributedTraceServiceImplTest method testSpanEventsDisabled.
@Test
public void testSpanEventsDisabled() {
DistributedTracePayload payloadInterface = configureAndCreatePayload(false, false);
assertTrue(payloadInterface instanceof DistributedTracePayloadImpl);
DistributedTracePayloadImpl payload = (DistributedTracePayloadImpl) payloadInterface;
final String payloadStr = payload.httpSafe();
final DistributedTracePayloadImpl parsedPayload = new DistributedTracePayloadParser(NewRelic.getAgent().getMetricAggregator(), distributedTraceService, Agent.LOG).parse(null, payloadStr);
assertNotNull(parsedPayload);
// Payload should not have a guid since span events are disabled
assertNull(parsedPayload.guid);
// Check other required fields
assertEquals("App", parsedPayload.parentType);
assertEquals("accountId", parsedPayload.accountId);
assertEquals("primaryApplicationId", parsedPayload.applicationId);
assertEquals(txn.getSpanProxy().getTraceId(), parsedPayload.traceId);
assertEquals(txn.getGuid(), parsedPayload.txnId);
}
use of com.newrelic.api.agent.DistributedTracePayload in project newrelic-java-agent by newrelic.
the class DistributedTraceCrossAgentTest method runTest.
@Test
public void runTest() throws ParseException, IOException {
String accountKey = (String) jsonTest.get("trusted_account_key");
String accountId = (String) jsonTest.get("account_id");
String transportType = (String) jsonTest.get("transport_type");
Boolean webTransaction = (Boolean) jsonTest.get("web_transaction");
Boolean raisesException = (Boolean) jsonTest.get("raises_exception");
Boolean forceSampledTrue = (Boolean) jsonTest.get("force_sampled_true");
Long majorVersion = (Long) jsonTest.get("major_version");
Long minorVersion = (Long) jsonTest.get("minor_version");
Boolean spanEventsEnabled = (Boolean) jsonTest.get("span_events_enabled");
replaceConfig(spanEventsEnabled);
Assert.assertEquals(majorVersion.intValue(), ServiceFactory.getDistributedTraceService().getMajorSupportedCatVersion());
Assert.assertEquals(minorVersion.intValue(), ServiceFactory.getDistributedTraceService().getMinorSupportedCatVersion());
JSONArray outbound_payloads = (JSONArray) jsonTest.get("outbound_payloads");
JSONArray inbound_payloads = (JSONArray) jsonTest.get("inbound_payloads");
ArrayList expectedMetrics = (ArrayList) jsonTest.get("expected_metrics");
Map<String, Object> intrinsics = (Map<String, Object>) jsonTest.get("intrinsics");
Map<String, Object> commonAssertions = (Map<String, Object>) intrinsics.get("common");
ArrayList targetEvents = (ArrayList) intrinsics.get("target_events");
Map<String, Object> transactionAssertions = (Map<String, Object>) intrinsics.get("Transaction");
Map<String, Object> spanAssertions = (Map<String, Object>) intrinsics.get("Span");
Map<String, Object> connectInfo = new HashMap<>();
connectInfo.put(DistributedTracingConfig.ACCOUNT_ID, accountId);
connectInfo.put(DistributedTracingConfig.TRUSTED_ACCOUNT_KEY, accountKey);
AgentConfig agentConfig = AgentHelper.createAgentConfig(true, Collections.<String, Object>emptyMap(), connectInfo);
distributedTraceService.connected(null, agentConfig);
Transaction.clearTransaction();
TransactionActivity.clear();
spanEventsService.clearReservoir();
Transaction tx = Transaction.getTransaction();
TransactionData transactionData = new TransactionData(tx, 0);
TransactionStats transactionStats = transactionData.getTransaction().getTransactionActivity().getTransactionStats();
SamplingPriorityQueue<SpanEvent> eventPool = spanEventsService.getOrCreateDistributedSamplingReservoir(APP_NAME);
Tracer rootTracer;
if (webTransaction) {
rootTracer = TransactionAsyncUtility.createDispatcherTracer(this, "WebTransaction");
} else {
rootTracer = TransactionAsyncUtility.createOtherTracer("OtherTransaction");
}
tx.getTransactionActivity().tracerStarted(rootTracer);
if (raisesException) {
tx.setThrowable(new Throwable(), TransactionErrorPriority.API, false);
}
setTransportType(tx, transportType);
if (inbound_payloads != null) {
for (Object payload : inbound_payloads) {
tx.acceptDistributedTracePayload(payload.toString());
}
} else {
tx.acceptDistributedTracePayload((String) null);
}
if (forceSampledTrue) {
tx.setPriorityIfNotNull(new Random().nextFloat() + 1.0f);
}
if (outbound_payloads != null) {
for (Object assertion : outbound_payloads) {
JSONObject payloadAssertions = (JSONObject) assertion;
DistributedTracePayload payload = new BoundTransactionApiImpl(tx).createDistributedTracePayload();
assertOutboundPayload(payloadAssertions, payload);
}
}
rootTracer.finish(Opcodes.RETURN, 0);
distributedTraceService.dispatcherTransactionFinished(transactionData, transactionStats);
((SpanEventsServiceImpl) spanEventsService).dispatcherTransactionFinished(transactionData, transactionStats);
List<SpanEvent> spans = eventPool.asList();
TransactionEvent transactionEvent = ServiceFactory.getTransactionEventsService().createEvent(transactionData, transactionStats, "wat");
JSONObject txnEvents = serializeAndParseEvents(transactionEvent);
assertExpectedMetrics(expectedMetrics, transactionStats);
for (Object event : targetEvents) {
if (event.toString().startsWith("Transaction") && transactionAssertions != null) {
assertTransactionEvents(transactionAssertions, txnEvents);
assertTransactionEvents(commonAssertions, txnEvents);
} else if (event.toString().startsWith("Span") && spanAssertions != null) {
assertNotEquals("Expected some spans!", 0, spans.size());
assertSpanEvents(spanAssertions, spans);
assertSpanEvents(commonAssertions, spans);
}
}
}
use of com.newrelic.api.agent.DistributedTracePayload in project newrelic-java-agent by newrelic.
the class DistributedTraceServiceImpl method createDistributedTracePayload.
@Override
public DistributedTracePayload createDistributedTracePayload(Tracer tracer) {
if (tracer == null) {
return NoOpDistributedTracePayload.INSTANCE;
}
Transaction tx = tracer.getTransactionActivity().getTransaction();
String spanId = null;
// Override guid if this trace is sampled and spans are enabled
// guid will be the guid of the span that is creating this payload
boolean spansEnabled = ServiceFactory.getConfigService().getDefaultAgentConfig().getSpanEventsConfig().isEnabled();
boolean sampled = DistributedTraceUtil.isSampledPriority(tx.getPriority());
if (sampled && spansEnabled) {
// Need to do this in case the span that created this is a @Trace(excludeFromTransactionTrace=true)
Tracer tracerWithSpan = AbstractTracer.getParentTracerWithSpan(tracer);
spanId = tracerWithSpan != null ? tracerWithSpan.getGuid() : null;
}
DistributedTracePayload distributedTracePayload = tx.createDistributedTracePayload(spanId);
if (distributedTracePayload == null) {
return NoOpDistributedTracePayload.INSTANCE;
}
return distributedTracePayload;
}
use of com.newrelic.api.agent.DistributedTracePayload in project newrelic-java-agent by newrelic.
the class DefaultTracerTest method testTransactionABParenting.
/**
* Transaction A has spans 1, 2, and 3. Span 2 is active when a distributed tracing payload is created.
* Transaction B has spans 5 and 6. The payload from span 2 is accepted when span 5 is active.
*
* Verify that all the parenting attributes are correct.
*/
@Test
public void testTransactionABParenting() {
DistributedTraceServiceImpl dts = (DistributedTraceServiceImpl) ServiceFactory.getServiceManager().getDistributedTraceService();
Map<String, Object> configMap = ImmutableMap.<String, Object>builder().put("distributed_tracing", ImmutableMap.builder().put("account_id", "12345").put("trusted_account_key", "67890").put("primary_application_id", "789").build()).build();
dts.connected(null, AgentConfigFactory.createAgentConfig(configMap, null, null));
TransactionActivity.clear();
Transaction.clearTransaction();
Transaction tx = Transaction.getTransaction();
DefaultTracer span1Tracer = new OtherRootTracer(tx, new ClassMethodSignature("class", "span1", "()V"), null, DefaultTracer.NULL_METRIC_NAME_FORMATTER);
tx.getTransactionActivity().tracerStarted(span1Tracer);
tx.setTransactionName(com.newrelic.api.agent.TransactionNamePriority.CUSTOM_HIGH, true, "Transaction A");
DefaultTracer span2Tracer = new OtherRootTracer(tx, new ClassMethodSignature("class", "span2", "()V"), null, DefaultTracer.NULL_METRIC_NAME_FORMATTER);
tx.getTransactionActivity().tracerStarted(span2Tracer);
DistributedTracePayload payload = new BoundTransactionApiImpl(span2Tracer.getTransaction()).createDistributedTracePayload();
DefaultTracer span3Tracer = new OtherRootTracer(tx, new ClassMethodSignature("class", "span3", "()V"), null, DefaultTracer.NULL_METRIC_NAME_FORMATTER);
tx.getTransactionActivity().tracerStarted(span3Tracer);
span3Tracer.finish(Opcodes.ARETURN, null);
span2Tracer.finish(Opcodes.ARETURN, null);
span1Tracer.finish(Opcodes.ARETURN, null);
TransactionActivity.clear();
Transaction.clearTransaction();
Transaction txB = Transaction.getTransaction();
DefaultTracer span5Tracer = new OtherRootTracer(txB, new ClassMethodSignature("class", "span5", "()V"), null, DefaultTracer.NULL_METRIC_NAME_FORMATTER);
txB.getTransactionActivity().tracerStarted(span5Tracer);
span5Tracer.getTransaction().acceptDistributedTracePayload(payload);
txB.setTransactionName(com.newrelic.api.agent.TransactionNamePriority.CUSTOM_HIGH, true, "Transaction B");
txB.setThrowable(new Throwable(), TransactionErrorPriority.API, false);
DefaultTracer span6Tracer = new OtherRootTracer(txB, new ClassMethodSignature("class", "span6", "()V"), null, DefaultTracer.NULL_METRIC_NAME_FORMATTER);
txB.getTransactionActivity().tracerStarted(span6Tracer);
span6Tracer.finish(Opcodes.ARETURN, null);
span5Tracer.finish(Opcodes.ARETURN, null);
// assert traceId
SpanEventsService spanEventService = ServiceFactory.getSpanEventService();
final TransactionData tdA = new TransactionData(tx, 1024);
((SpanEventsServiceImpl) spanEventService).dispatcherTransactionFinished(tdA, new TransactionStats());
final TransactionData tdB = new TransactionData(txB, 1024);
((SpanEventsServiceImpl) spanEventService).dispatcherTransactionFinished(tdB, new TransactionStats());
SamplingPriorityQueue<SpanEvent> eventPool = spanEventService.getOrCreateDistributedSamplingReservoir(APP_NAME);
List<SpanEvent> spanEvents = eventPool.asList();
assertEquals(5, spanEvents.size());
TransactionEvent txAEvent = ServiceFactory.getTransactionEventsService().createEvent(tdA, new TransactionStats(), tdA.getBlameMetricName());
TransactionEvent txBEvent = ServiceFactory.getTransactionEventsService().createEvent(tdB, new TransactionStats(), tdB.getBlameMetricName());
SpanEvent span1 = getSpanByName(eventPool, "Java/class/span1");
SpanEvent span2 = getSpanByName(eventPool, "Java/class/span2");
SpanEvent span3 = getSpanByName(eventPool, "Java/class/span3");
SpanEvent span5 = getSpanByName(eventPool, "Java/class/span5");
SpanEvent span6 = getSpanByName(eventPool, "Java/class/span6");
DistributedTracePayloadImpl parsedPayload = new DistributedTracePayloadParser(NewRelic.getAgent().getMetricAggregator(), ServiceFactory.getDistributedTraceService(), Agent.LOG).parse(null, payload.text());
assertEquals(tx.getGuid(), parsedPayload.txnId);
assertEquals(tx.sampled(), parsedPayload.sampled.booleanValue());
assertEquals(tx.getPriority(), parsedPayload.priority, 0.0f);
assertEquals(span2Tracer.getGuid(), parsedPayload.guid);
assertEquals(span2.getGuid(), parsedPayload.guid);
assertEquals(txAEvent.getTripId(), parsedPayload.traceId);
assertEquals(txBEvent.getTripId(), parsedPayload.traceId);
assertEquals(span1.getTraceId(), span2.getTraceId());
assertEquals(span2.getTraceId(), span3.getTraceId());
assertEquals(span3.getTraceId(), span5.getTraceId());
assertEquals(span5.getTraceId(), span6.getTraceId());
assertEquals(txAEvent.getGuid(), span1.getTransactionId());
assertEquals(span1.getGuid(), span2.getParentId());
assertEquals(txAEvent.getGuid(), span2.getTransactionId());
assertEquals(span2.getGuid(), span3.getParentId());
assertEquals(txAEvent.getGuid(), span3.getTransactionId());
assertEquals(txAEvent.getGuid(), txBEvent.getParentId());
assertEquals(span2.getGuid(), txBEvent.getParenSpanId());
assertEquals(span2.getGuid(), span5.getParentId());
assertEquals(txBEvent.getGuid(), span5.getTransactionId());
assertEquals(span5.getGuid(), span6.getParentId());
assertEquals(txBEvent.getGuid(), span6.getTransactionId());
ServiceFactory.getTransactionService().transactionFinished(tdB, new TransactionStats());
ErrorServiceImpl errorService = (ErrorServiceImpl) txB.getRPMService().getErrorService();
DistributedSamplingPriorityQueue<ErrorEvent> reservoir = errorService.getReservoir(ServiceFactory.getConfigService().getDefaultAgentConfig().getApplicationName());
List<ErrorEvent> errorEvents = reservoir.asList();
assertEquals(1, errorEvents.size());
ErrorEvent errorEvent = errorEvents.get(0);
Map<String, Object> errorDtAtts = errorEvent.getDistributedTraceIntrinsics();
assertEquals(txBEvent.getTripId(), errorDtAtts.get("traceId"));
assertEquals(txBEvent.getGuid(), errorEvent.getTransactionGuid());
}
Aggregations