|
| 1 | +// See https://aka.ms/new-console-template for more information |
| 2 | +using System.Runtime.InteropServices; |
| 3 | + |
| 4 | +var url = new CharSlice("http://localhost:8126"); |
| 5 | +var tracerVersion = new CharSlice("1.0.0"); |
| 6 | +var language = new CharSlice(".NET"); |
| 7 | +var languageVersion = new CharSlice("5.0.0"); |
| 8 | +var languageInterpreter = new CharSlice(".NET"); |
| 9 | +var hostname = new CharSlice("localhost"); |
| 10 | +var env = new CharSlice("development"); |
| 11 | +var service = new CharSlice("dotnet-test"); |
| 12 | +var serviceVersion = new CharSlice("1.0.0"); |
| 13 | + |
| 14 | +var handle = IntPtr.Zero; |
| 15 | + |
| 16 | +Console.WriteLine("Creating exporter"); |
| 17 | +var error = Native.ddog_trace_exporter_new( |
| 18 | + outHandle: ref handle, |
| 19 | + url: url, |
| 20 | + tracerVersion: tracerVersion, |
| 21 | + language: language, |
| 22 | + languageVersion: languageVersion, |
| 23 | + languageInterpreter: languageInterpreter, |
| 24 | + hostname: hostname, |
| 25 | + env: env, |
| 26 | + version: serviceVersion, |
| 27 | + service: service, |
| 28 | + inputFormat: TraceExporterInputFormat.V04, |
| 29 | + outputFormat: TraceExporterOutputFormat.V04, |
| 30 | + computeStats: false, |
| 31 | + agentResponseCallback: (IntPtr chars) => |
| 32 | + { |
| 33 | + var response = Marshal.PtrToStringUni(chars); |
| 34 | + Console.WriteLine(response); |
| 35 | + } |
| 36 | +); |
| 37 | + |
| 38 | +if (error.Tag == ErrorTag.Some) |
| 39 | +{ |
| 40 | + Console.WriteLine("Error creating exporter"); |
| 41 | + Console.WriteLine(Marshal.PtrToStringUni(error.Message.Ptr)); |
| 42 | + Native.ddog_MaybeError_drop(error); |
| 43 | + return; |
| 44 | +} |
| 45 | + |
| 46 | +if (handle == IntPtr.Zero) |
| 47 | +{ |
| 48 | + Console.WriteLine("Error creating exporter"); |
| 49 | + return; |
| 50 | +} |
| 51 | + |
| 52 | +Console.WriteLine("Exporter created"); |
| 53 | + |
| 54 | +Console.WriteLine("Freeing exporter"); |
| 55 | +Native.ddog_trace_exporter_free(handle); |
| 56 | +Console.WriteLine("Exporter freed"); |
| 57 | +Console.WriteLine("Done"); |
| 58 | + |
| 59 | +internal enum TraceExporterInputFormat |
| 60 | +{ |
| 61 | + Proxy = 0, |
| 62 | + V04 = 1, |
| 63 | +} |
| 64 | + |
| 65 | +internal enum TraceExporterOutputFormat |
| 66 | +{ |
| 67 | + V04 = 0, |
| 68 | + V07 = 1, |
| 69 | +} |
| 70 | + |
| 71 | +internal delegate void AgentResponseCallback(IntPtr response); |
| 72 | + |
| 73 | +internal static class Native |
| 74 | +{ |
| 75 | + private const string DllName = "datadog_profiling_ffi"; |
| 76 | + |
| 77 | + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] |
| 78 | + internal static extern MaybeError ddog_trace_exporter_new( |
| 79 | + ref IntPtr outHandle, |
| 80 | + CharSlice url, |
| 81 | + CharSlice tracerVersion, |
| 82 | + CharSlice language, |
| 83 | + CharSlice languageVersion, |
| 84 | + CharSlice languageInterpreter, |
| 85 | + CharSlice hostname, |
| 86 | + CharSlice env, |
| 87 | + CharSlice version, |
| 88 | + CharSlice service, |
| 89 | + TraceExporterInputFormat inputFormat, |
| 90 | + TraceExporterOutputFormat outputFormat, |
| 91 | + bool computeStats, |
| 92 | + AgentResponseCallback agentResponseCallback); |
| 93 | + |
| 94 | + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] |
| 95 | + internal static extern void ddog_MaybeError_drop(MaybeError error); |
| 96 | + |
| 97 | + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] |
| 98 | + internal static extern void ddog_trace_exporter_free(IntPtr handle); |
| 99 | +} |
| 100 | + |
| 101 | +[StructLayout(LayoutKind.Sequential)] |
| 102 | +internal struct CharSlice |
| 103 | +{ |
| 104 | + internal IntPtr Ptr; |
| 105 | + internal UIntPtr Len; |
| 106 | + |
| 107 | + internal CharSlice(string str) |
| 108 | + { |
| 109 | + var bytes = System.Text.Encoding.UTF8.GetBytes(str); |
| 110 | + Ptr = Marshal.AllocHGlobal(bytes.Length); |
| 111 | + Marshal.Copy(bytes, 0, Ptr, bytes.Length); |
| 112 | + Len = (UIntPtr)bytes.Length; |
| 113 | + } |
| 114 | +} |
| 115 | + |
| 116 | +internal enum ErrorTag |
| 117 | +{ |
| 118 | + Some = 0, |
| 119 | + None = 1, |
| 120 | +} |
| 121 | + |
| 122 | +[StructLayout(LayoutKind.Sequential)] |
| 123 | +internal struct MaybeError |
| 124 | +{ |
| 125 | + internal ErrorTag Tag; |
| 126 | + internal CharSlice Message; |
| 127 | +} |
0 commit comments