public static void IncomingRemoteCall() { IIncomingRemoteCallTracer incomingRemoteCallTracer = SampleApplication.OneAgentSdk .TraceIncomingRemoteCall("RemoteMethod", "RemoteServiceName", "mrcp://endpoint/service"); string incomingDynatraceStringTag = string.Empty; // retrieve from incoming call metadata incomingRemoteCallTracer.SetDynatraceStringTag(incomingDynatraceStringTag); // link both sides of the remote call together incomingRemoteCallTracer.SetProtocolName("MyRemoteCallProtocol"); incomingRemoteCallTracer.Start(); try { ProcessRemoteCall(); } catch (Exception e) { incomingRemoteCallTracer.Error(e); // handle or rethrow } finally { incomingRemoteCallTracer.End(); } }
public static void RemoteCallWithDatabase() { IOutgoingRemoteCallTracer outgoingRemoteCallTracer = SampleApplication.OneAgentSdk .TraceOutgoingRemoteCall("RemoteMethod", "RemoteServiceName", "mrcp://endpoint/service", ChannelType.TCP_IP, "myRemoteHost:1234"); outgoingRemoteCallTracer.SetProtocolName("MyRemoteCallProtocol"); outgoingRemoteCallTracer.Start(); try { string outgoingDynatraceStringTag = outgoingRemoteCallTracer.GetDynatraceStringTag(); // make the call and transport the tag across to the server to link both sides of the remote call // represents server side processing Thread server = new Thread(() => { IIncomingRemoteCallTracer incomingRemoteCallTracer = SampleApplication.OneAgentSdk .TraceIncomingRemoteCall("RemoteMethod", "RemoteServiceName", "mrcp://endpoint/service"); string incomingDynatraceStringTag = outgoingDynatraceStringTag; // retrieve from incoming call metadata incomingRemoteCallTracer.SetDynatraceStringTag(incomingDynatraceStringTag); incomingRemoteCallTracer.SetProtocolName("MyRemoteCallProtocol"); incomingRemoteCallTracer.Start(); try { // execute database request on server DatabaseRequestTracerSamples.Sync_StartEnd(); } catch (Exception e) { incomingRemoteCallTracer.Error(e); // handle or rethrow } finally { incomingRemoteCallTracer.End(); } }); server.Start(); server.Join(); // sync call, wait for db result } catch (Exception e) { outgoingRemoteCallTracer.Error(e); // handle or rethrow } finally { outgoingRemoteCallTracer.End(); } }
/// <summary> /// Demonstrates an outgoing remote call originating from a client and being processed by a server. /// The Dynatrace tag is used to link both sides of the call together. /// </summary> public static void LinkedAsyncRemoteCall() { IOutgoingRemoteCallTracer outgoingRemoteCallTracer = SampleApplication.OneAgentSdk .TraceOutgoingRemoteCall("RemoteMethod", "RemoteServiceName", "mrcp://endpoint/service", ChannelType.TCP_IP, "myRemoteHost:1234"); outgoingRemoteCallTracer.SetProtocolName("MyRemoteCallProtocol"); outgoingRemoteCallTracer.Start(); try { string outgoingDynatraceStringTag = outgoingRemoteCallTracer.GetDynatraceStringTag(); // make the call and transport the tag across to the server to link both sides of the remote call together // represents server side processing Thread server = new Thread(() => { IIncomingRemoteCallTracer incomingRemoteCallTracer = SampleApplication.OneAgentSdk .TraceIncomingRemoteCall("RemoteMethod", "RemoteServiceName", "mrcp://endpoint/service"); string incomingDynatraceStringTag = outgoingDynatraceStringTag; // retrieve from incoming call metadata incomingRemoteCallTracer.SetDynatraceStringTag(incomingDynatraceStringTag); // link both sides of the remote call together incomingRemoteCallTracer.SetProtocolName("MyRemoteCallProtocol"); incomingRemoteCallTracer.Start(); try { ProcessRemoteCall(); } catch (Exception e) { incomingRemoteCallTracer.Error(e); // handle or rethrow } finally { incomingRemoteCallTracer.End(); } }); server.Start(); // async processing on server } catch (Exception e) { outgoingRemoteCallTracer.Error(e); // handle or rethrow } finally { outgoingRemoteCallTracer.End(); } }
public static void InProcessLinkTracerSample() { // start a custom background worker CustomBackgroundWorker customBackgroundWorker = new CustomBackgroundWorker(); // we're using the incoming remote call tracer as an example for an active service call IIncomingRemoteCallTracer incomingRemoteCallTracer = SampleApplication.OneAgentSdk .TraceIncomingRemoteCall("RemoteMethod", "RemoteServiceName", "mrcp://endpoint/service"); incomingRemoteCallTracer.Start(); try { // create an in-process link on the originating thread IInProcessLink inProcessLink = SampleApplication.OneAgentSdk.CreateInProcessLink(); // delegate work to another thread, in this case we use a custom background worker implementation customBackgroundWorker.EnqueueWorkItem(() => { // use the in-process link to link the PurePath on the target thread to its origin IInProcessLinkTracer inProcessLinkTracer = SampleApplication.OneAgentSdk.TraceInProcessLink(inProcessLink); inProcessLinkTracer.Start(); DatabaseRequestTracerSamples.Sync_StartEnd(); // performs a database request traced using the IDatabaseRequestTracer inProcessLinkTracer.End(); }); // the same link can be re-used multiple times customBackgroundWorker.EnqueueWorkItem(() => { IInProcessLinkTracer inProcessLinkTracer = SampleApplication.OneAgentSdk.TraceInProcessLink(inProcessLink); inProcessLinkTracer.Trace(() => { DatabaseRequestTracerSamples.Sync_StartEnd(); }); }); customBackgroundWorker.EnqueueWorkItem(() => { IInProcessLinkTracer inProcessLinkTracer = SampleApplication.OneAgentSdk.TraceInProcessLink(inProcessLink); inProcessLinkTracer.Trace(DatabaseRequestTracerSamples.Sync_StartEnd); }); } catch (Exception e) { incomingRemoteCallTracer.Error(e); throw e; } finally { incomingRemoteCallTracer.End(); customBackgroundWorker.Shutdown(); } }
public override Task <Hipstershop.Cart> GetCart(GetCartRequest request, ServerCallContext context) { IIncomingRemoteCallTracer incomingRemoteCallTracer = getTracer(context, "GetCart"); try { incomingRemoteCallTracer.Start(); return(cartStore.GetCartAsync(request.UserId)); } catch (Exception e) { Console.WriteLine(e.ToString()); incomingRemoteCallTracer.Error(e); } finally { incomingRemoteCallTracer.End(); } return(null); }
public async override Task <Empty> EmptyCart(EmptyCartRequest request, ServerCallContext context) { IIncomingRemoteCallTracer incomingRemoteCallTracer = getTracer(context, "EmptyCart"); try { await incomingRemoteCallTracer.TraceAsync(() => cartStore.EmptyCartAsync(request.UserId)); } catch (Exception e) { Console.WriteLine(e.ToString()); incomingRemoteCallTracer.Error(e); } finally { incomingRemoteCallTracer.End(); } return(Empty); }
public async override Task <Empty> AddItem(AddItemRequest request, Grpc.Core.ServerCallContext context) { IIncomingRemoteCallTracer incomingRemoteCallTracer = getTracer(context, "AddItem"); try { await incomingRemoteCallTracer.TraceAsync(() => cartStore.AddItemAsync(request.UserId, request.Item.ProductId, request.Item.Quantity)); } catch (Exception e) { Console.WriteLine(e.ToString()); incomingRemoteCallTracer.Error(e); } finally { incomingRemoteCallTracer.End(); } return(Empty); }
public static void CustomRequestAttributeSample() { // we're using the incoming remote call tracer as an example for an active service call IIncomingRemoteCallTracer incomingRemoteCallTracer = SampleApplication.OneAgentSdk .TraceIncomingRemoteCall("RemoteMethod", "RemoteServiceName", "mrcp://endpoint/service"); incomingRemoteCallTracer.Trace(() => { // do processing ... // set custom request attributes SampleApplication.OneAgentSdk.AddCustomRequestAttribute("region", "EMEA"); // string value SampleApplication.OneAgentSdk.AddCustomRequestAttribute("salesAmount", 2500); // long value SampleApplication.OneAgentSdk.AddCustomRequestAttribute("service-quality", 0.707106); // double value // set multiple values for same key SampleApplication.OneAgentSdk.AddCustomRequestAttribute("account-group", 1); SampleApplication.OneAgentSdk.AddCustomRequestAttribute("account-group", 2); SampleApplication.OneAgentSdk.AddCustomRequestAttribute("account-group", 3); }); }
private IIncomingRemoteCallTracer getTracer(Grpc.Core.ServerCallContext context, string methodname) { try { Metadata.Entry metadataEntry = context.RequestHeaders.FirstOrDefault(m => String.Equals(m.Key, "x-dynatrace")); if (metadataEntry.Equals(default(Metadata.Entry)) || metadataEntry.Value == null) { Console.WriteLine("No x-dynatrace header found in the request."); return(null); } string incomingDynatraceStringTag = metadataEntry.Value; IIncomingRemoteCallTracer incomingRemoteCallTracer = oneAgentSdk.TraceIncomingRemoteCall(methodname, "CartService", "grpc://cartservice/" + methodname); incomingRemoteCallTracer.SetDynatraceStringTag(incomingDynatraceStringTag); incomingRemoteCallTracer.SetProtocolName("gRPC"); return(incomingRemoteCallTracer); } catch (Exception e) { Console.WriteLine(e.ToString()); return(null); } }