diff --git a/build/cmake/FindLibdatadog.cmake b/build/cmake/FindLibdatadog.cmake index 8fa55756bd06..145861f4962f 100644 --- a/build/cmake/FindLibdatadog.cmake +++ b/build/cmake/FindLibdatadog.cmake @@ -4,12 +4,12 @@ endif() include(FetchContent) -set(LIBDATADOG_VERSION "v20.0.0" CACHE STRING "libdatadog version") +set(LIBDATADOG_VERSION "v22.1.0" CACHE STRING "libdatadog version") if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") # For Darwin, we'll download both architectures and combine them - set(SHA256_LIBDATADOG_ARM64 "916a207ea1343744062ff44f421f198bc9d79ae2be7624f4ba355542ff03b7ec" CACHE STRING "libdatadog arm64 sha256") - set(SHA256_LIBDATADOG_X86_64 "879d213a5cbf982500833323828c862a5efc824afdb03628daa8f363e70cbfe9" CACHE STRING "libdatadog x86_64 sha256") + set(SHA256_LIBDATADOG_ARM64 "2ace4fe2299638fdc32845359c10da02a58db458dd86c8c542deaf99a90e4c78" CACHE STRING "libdatadog arm64 sha256") + set(SHA256_LIBDATADOG_X86_64 "682fafc37dd17c8e3970efc798657f18dc5d8f07d277a577ef71e6a712c91a96" CACHE STRING "libdatadog x86_64 sha256") set(FILE_TO_DOWNLOAD_ARM64 libdatadog-aarch64-apple-darwin.tar.gz) set(FILE_TO_DOWNLOAD_X86_64 libdatadog-x86_64-apple-darwin.tar.gz) @@ -62,18 +62,18 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") else() if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") if(DEFINED ENV{IsAlpine} AND "$ENV{IsAlpine}" MATCHES "true") - set(SHA256_LIBDATADOG "12791239d3d0bfeab8fc659d10dd64e8ccf9ad87aa3f293c3f509a57bf2b3ade" CACHE STRING "libdatadog sha256") + set(SHA256_LIBDATADOG "74be28884a318a3d8c3b37d4e2e2821f803917680464c18bae3f9a57f9827d1b" CACHE STRING "libdatadog sha256") set(FILE_TO_DOWNLOAD libdatadog-aarch64-alpine-linux-musl.tar.gz) else() - set(SHA256_LIBDATADOG "368903a0a73b700ba2a6a8aee91b2be49af9ef6077b684b9f1aace408f8917b1" CACHE STRING "libdatadog sha256") + set(SHA256_LIBDATADOG "cec1c38503d96ae0991a7e914aaf40e16ce23444bd3fda99532954ab8bb562ff" CACHE STRING "libdatadog sha256") set(FILE_TO_DOWNLOAD libdatadog-aarch64-unknown-linux-gnu.tar.gz) endif() else() if(DEFINED ENV{IsAlpine} AND "$ENV{IsAlpine}" MATCHES "true") - set(SHA256_LIBDATADOG "bcf85135fea719aa192d176b08bb62056beff5d96ddbd114dfc28e50fcfea08c" CACHE STRING "libdatadog sha256") + set(SHA256_LIBDATADOG "3f1815af29b6223357ca1961d18f3efada5be264e9034255c439de27e130e4b9" CACHE STRING "libdatadog sha256") set(FILE_TO_DOWNLOAD libdatadog-${CMAKE_SYSTEM_PROCESSOR}-alpine-linux-musl.tar.gz) else() - set(SHA256_LIBDATADOG "84b779bdaa3da7668795e264a5ac4b015185044d147a142727349026eb49d428" CACHE STRING "libdatadog sha256") + set(SHA256_LIBDATADOG "e1d878e894ed6a60d12e60c71281dac0567cde56147cc6d76ac4b98b6849bdae" CACHE STRING "libdatadog sha256") set(FILE_TO_DOWNLOAD libdatadog-${CMAKE_SYSTEM_PROCESSOR}-unknown-linux-gnu.tar.gz) endif() endif() diff --git a/build/vcpkg_local_ports/libdatadog/portfile.cmake b/build/vcpkg_local_ports/libdatadog/portfile.cmake index 446069304fa5..99f787e35860 100644 --- a/build/vcpkg_local_ports/libdatadog/portfile.cmake +++ b/build/vcpkg_local_ports/libdatadog/portfile.cmake @@ -3,11 +3,11 @@ set(LIBDATADOG_VERSION ${VERSION}) if(TARGET_TRIPLET STREQUAL "x64-windows" OR TARGET_TRIPLET STREQUAL "x64-windows-static") set(PLATFORM "x64") - set(LIBDATADOG_HASH "f43b4e0a41a4f1d20995e13bc43b7d3502120c2809aefa177f3eea73db1f430e9de350f6f54bdadae09820ad7a492b7f054ec0180d94c33e44fb9a462ab3153a") + set(LIBDATADOG_HASH "dcf282c7fba93e25eb41bde9671e6893b1faf2d57599ac75a37d32195a606bbeaf6b4af8c269cb622508ebd98770facba25b1c05efcc1a01d023c82d3800e9df") elseif(TARGET_TRIPLET STREQUAL "x86-windows" OR TARGET_TRIPLET STREQUAL "x86-windows-static") set(PLATFORM "x86") - set(LIBDATADOG_HASH "9cdc780f52edcccf272098f46ee2200e2fa3d56b29be21b5bfc1bcf7943f9a0efd7b7d9e84ca6340e618ec92c4b19d7625d6907592027d4ca67241b08b9063a6") + set(LIBDATADOG_HASH "afacd4320ed4f1c736a7301cee5e1f4064624283087870a7dd94768ba6d23854800fd0968bf8f845d400a2969dd5dcef91c4c7fe79e8295ec0ed7bac7d5b9d10") else() message(FATAL_ERROR "Unsupported triplet: ${TARGET_TRIPLET}") endif() diff --git a/build/vcpkg_local_ports/libdatadog/vcpkg.json b/build/vcpkg_local_ports/libdatadog/vcpkg.json index 83e4b026f16d..b521c9941451 100644 --- a/build/vcpkg_local_ports/libdatadog/vcpkg.json +++ b/build/vcpkg_local_ports/libdatadog/vcpkg.json @@ -1,6 +1,6 @@ { "name": "libdatadog", - "version-string": "20.0.0", + "version-string": "22.1.0", "description": "Package providing libdatadog prebuilt binaries for Windows only.", "dependencies": [] } diff --git a/profiler/src/ProfilerEngine/Datadog.Profiler.Native/CorProfilerCallback.cpp b/profiler/src/ProfilerEngine/Datadog.Profiler.Native/CorProfilerCallback.cpp index ea0ffc193ab4..355701a4f92b 100644 --- a/profiler/src/ProfilerEngine/Datadog.Profiler.Native/CorProfilerCallback.cpp +++ b/profiler/src/ProfilerEngine/Datadog.Profiler.Native/CorProfilerCallback.cpp @@ -3,6 +3,8 @@ // from dotnet coreclr includes +// TO REMOVE: only to trigger profiler tests +// #include "cor.h" #include "corprof.h" // end diff --git a/tracer/src/Datadog.Trace/LibDatadog/CString.cs b/tracer/src/Datadog.Trace/LibDatadog/CString.cs index db10f7ae0428..5acddd6f17a4 100644 --- a/tracer/src/Datadog.Trace/LibDatadog/CString.cs +++ b/tracer/src/Datadog.Trace/LibDatadog/CString.cs @@ -28,19 +28,30 @@ internal CString(string? str) { var encoding = StringEncoding.UTF8; var maxBytesCount = encoding.GetMaxByteCount(str.Length); - Ptr = Marshal.AllocHGlobal(maxBytesCount); + Ptr = Marshal.AllocHGlobal(maxBytesCount + 1); // +1 for null terminator unsafe { fixed (char* strPtr = str) { try { - Length = (nuint)encoding.GetBytes(strPtr, str.Length, (byte*)Ptr, maxBytesCount); + int bytesWritten = (nuint)encoding.GetBytes(strPtr, str.Length, (byte*)Ptr, maxBytesCount); + if (bytesWritten < 0 || bytesWritten > maxBytesCount) + { + Marshal.FreeHGlobal(Ptr); + Ptr = IntPtr.Zero; + Length = 0; + return; + } + + Length = (nuint)bytesWritten + *((byte*)Ptr + Length) = 0; // Add null terminator } catch { Marshal.FreeHGlobal(Ptr); Ptr = IntPtr.Zero; + Length = 0; } } } diff --git a/tracer/src/Datadog.Trace/LibDatadog/HandsOffConfiguration/ConfiguratorHelper.cs b/tracer/src/Datadog.Trace/LibDatadog/HandsOffConfiguration/ConfiguratorHelper.cs index 753ca34487fe..e09a68706f4d 100644 --- a/tracer/src/Datadog.Trace/LibDatadog/HandsOffConfiguration/ConfiguratorHelper.cs +++ b/tracer/src/Datadog.Trace/LibDatadog/HandsOffConfiguration/ConfiguratorHelper.cs @@ -33,8 +33,7 @@ internal static ConfigurationResult GetConfiguration(string? handsOffLocalConfig CString? localPath = null; CString? fleetPath = null; var configHandle = IntPtr.Zero; - Error? resultError = null; - LibraryConfigs? libraryConfigs = null; + LibraryConfigResult? configurationResult = null; try { languageCs = new CharSlice(TracerConstants.Language); @@ -55,18 +54,18 @@ internal static ConfigurationResult GetConfiguration(string? handsOffLocalConfig NativeInterop.LibraryConfig.ConfiguratorWithFleetPath(configHandle, fleetPath.Value); } - var configurationResult = NativeInterop.LibraryConfig.ConfiguratorGet(configHandle); - var result = configurationResult.Result; + configurationResult = NativeInterop.LibraryConfig.ConfiguratorGet(configHandle); + var result = configurationResult.Value.Result; - if (configurationResult.Tag == ResultTag.Err) + if (configurationResult.Value.Tag == ResultTag.Err) { - resultError = result.Error; - var error = resultError.Value.Message.ToUtf8String(); + var resultError = result.Error; + var error = resultError.Message.ToUtf8String(); return new ConfigurationResult(null, error, Result.LibDatadogCallError); } - libraryConfigs = result.Ok; - var configsLength = (int)libraryConfigs.Value.Length; + var libraryConfigs = result.Ok; + var configsLength = (int)libraryConfigs.Length; var configEntriesLocal = new Dictionary(); var configEntriesRemote = new Dictionary(); var structSize = Marshal.SizeOf(); @@ -74,7 +73,7 @@ internal static ConfigurationResult GetConfiguration(string? handsOffLocalConfig { unsafe { - var ptr = new IntPtr(libraryConfigs.Value.Ptr + (structSize * i)); + var ptr = new IntPtr(libraryConfigs.Ptr + (structSize * i)); var libraryConfig = (LibraryConfig*)ptr; var name = libraryConfig->Name.ToUtf8String(); var value = libraryConfig->Value.ToUtf8String(); @@ -100,15 +99,10 @@ internal static ConfigurationResult GetConfiguration(string? handsOffLocalConfig languageCs?.Dispose(); localPath?.Dispose(); fleetPath?.Dispose(); - if (resultError.HasValue) - { - var resultErrorValue = resultError.Value; - NativeInterop.Common.DropError(ref resultErrorValue); - } - if (libraryConfigs.HasValue) + if (configurationResult.HasValue) { - NativeInterop.LibraryConfig.LibraryConfigDrop(libraryConfigs.Value); + NativeInterop.LibraryConfig.LibraryConfigDrop(configurationResult.Value); } if (configHandle != IntPtr.Zero) diff --git a/tracer/src/Datadog.Trace/LibDatadog/HandsOffConfiguration/InteropStructs/LibraryConfigs.cs b/tracer/src/Datadog.Trace/LibDatadog/HandsOffConfiguration/InteropStructs/LibraryConfigs.cs index 4cbe3497e190..74882b42b1e8 100644 --- a/tracer/src/Datadog.Trace/LibDatadog/HandsOffConfiguration/InteropStructs/LibraryConfigs.cs +++ b/tracer/src/Datadog.Trace/LibDatadog/HandsOffConfiguration/InteropStructs/LibraryConfigs.cs @@ -14,4 +14,5 @@ internal struct LibraryConfigs public nint Ptr; // const LibraryConfig* public nuint Length; public nuint Capacity; + public CString Logs; // ffi::CString } diff --git a/tracer/src/Datadog.Trace/LibDatadog/NativeInterop.cs b/tracer/src/Datadog.Trace/LibDatadog/NativeInterop.cs index c5b5b032d478..833214b006fb 100644 --- a/tracer/src/Datadog.Trace/LibDatadog/NativeInterop.cs +++ b/tracer/src/Datadog.Trace/LibDatadog/NativeInterop.cs @@ -116,16 +116,17 @@ internal static class Common internal static class LibraryConfig { - [DllImport(DllName, EntryPoint = "ddog_store_tracer_metadata")] - internal static extern TracerMemfdHandleResult StoreTracerMetadata( - byte schemaVersion, - CharSlice runtimeId, - CharSlice tracerLanguage, - CharSlice tracerVersion, - CharSlice hostname, - CharSlice serviceName, - CharSlice serviceEnv, - CharSlice serviceVersion); + [DllImport(DllName, EntryPoint = "ddog_tracer_metadata_new")] + internal static extern IntPtr TracerMetadataNew(); + + [DllImport(DllName, EntryPoint = "ddog_tracer_metadata_free")] + internal static extern void TracerMetadataFree(IntPtr metadata); + + [DllImport(DllName, EntryPoint = "ddog_tracer_metadata_set")] + internal static extern void TracerMetadataSet(IntPtr metadata, MetadataKind kind, CString value); + + [DllImport(DllName, EntryPoint = "ddog_tracer_metadata_store")] + internal static extern TracerMemfdHandleResult StoreTracerMetadata(IntPtr metadata); [DllImport(DllName, EntryPoint = "ddog_library_configurator_new")] internal static extern IntPtr ConfiguratorNew(byte debugLogs, CharSlice language); @@ -143,6 +144,6 @@ internal static extern TracerMemfdHandleResult StoreTracerMetadata( internal static extern void ConfiguratorDrop(IntPtr configurator); [DllImport(DllName, EntryPoint = "ddog_library_config_drop")] - internal static extern void LibraryConfigDrop(LibraryConfigs configs); + internal static extern void LibraryConfigDrop(LibraryConfigResult configs); } } diff --git a/tracer/src/Datadog.Trace/LibDatadog/ServiceDiscovery/MetadataKind.cs b/tracer/src/Datadog.Trace/LibDatadog/ServiceDiscovery/MetadataKind.cs new file mode 100644 index 000000000000..2595cdc26bb3 --- /dev/null +++ b/tracer/src/Datadog.Trace/LibDatadog/ServiceDiscovery/MetadataKind.cs @@ -0,0 +1,22 @@ +// +// Unless explicitly stated otherwise all files in this repository are licensed under the Apache 2 License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). Copyright 2017 Datadog, Inc. +// + +#nullable enable +using System; + +namespace Datadog.Trace.LibDatadog.ServiceDiscovery; + +internal enum MetadataKind : int +{ + RuntimeId = 0, + TracerLanguage = 1, + TracerVersion = 2, + Hostname = 3, + ServiceName = 4, + ServiceEnvironment = 5, + ServiceVersion = 6, + ProcessTags = 7, + ContainerId = 8, +} diff --git a/tracer/src/Datadog.Trace/LibDatadog/ServiceDiscovery/ServiceDiscoveryHelper.cs b/tracer/src/Datadog.Trace/LibDatadog/ServiceDiscovery/ServiceDiscoveryHelper.cs index 5544f7d8bc3d..cc0a67bc4960 100644 --- a/tracer/src/Datadog.Trace/LibDatadog/ServiceDiscovery/ServiceDiscoveryHelper.cs +++ b/tracer/src/Datadog.Trace/LibDatadog/ServiceDiscovery/ServiceDiscoveryHelper.cs @@ -31,7 +31,6 @@ internal static StoreMetadataResult StoreTracerMetadata(TracerSettings tracerSet try { var result = StoreTracerMetadata( - 1, Tracer.RuntimeId, TracerConstants.Language, TracerConstants.ThreePartVersion, @@ -66,7 +65,6 @@ internal static StoreMetadataResult StoreTracerMetadata(TracerSettings tracerSet } private static TracerMemfdHandleResult StoreTracerMetadata( - byte schemaVersion, string runtimeId, string tracerLanguage, string tracerVersion, @@ -75,14 +73,32 @@ private static TracerMemfdHandleResult StoreTracerMetadata( string? serviceEnv, string? serviceVersion) { - using var runtimeIdCharSlice = new CharSlice(runtimeId); - using var tracerLanguageCharSlice = new CharSlice(tracerLanguage); - using var tracerVersionCharSlice = new CharSlice(tracerVersion); - using var hostnameCharSlice = new CharSlice(hostname); - using var serviceNameCharSlice = new CharSlice(serviceName); - using var serviceEnvCharSlice = new CharSlice(serviceEnv); - using var serviceVersionCharSlice = new CharSlice(serviceVersion); + IntPtr ptr = IntPtr.Zero; + try + { + ptr = NativeInterop.LibraryConfig.TracerMetadataNew(); + SetMetadata(ptr, MetadataKind.RuntimeId, runtimeId); + SetMetadata(ptr, MetadataKind.TracerLanguage, tracerLanguage); + SetMetadata(ptr, MetadataKind.TracerVersion, tracerVersion); + SetMetadata(ptr, MetadataKind.Hostname, hostname); + SetMetadata(ptr, MetadataKind.ServiceName, serviceName); + SetMetadata(ptr, MetadataKind.ServiceEnvironment, serviceEnv); + SetMetadata(ptr, MetadataKind.ServiceVersion, serviceVersion); - return NativeInterop.LibraryConfig.StoreTracerMetadata(schemaVersion, runtimeIdCharSlice, tracerLanguageCharSlice, tracerVersionCharSlice, hostnameCharSlice, serviceNameCharSlice, serviceEnvCharSlice, serviceVersionCharSlice); + return NativeInterop.LibraryConfig.StoreTracerMetadata(ptr); + } + finally + { + if (ptr != IntPtr.Zero) + { + NativeInterop.LibraryConfig.TracerMetadataFree(ptr); + } + } + + void SetMetadata(IntPtr ptr, MetadataKind kind, string? value) + { + using var valueCharSlice = new CString(value); + NativeInterop.LibraryConfig.TracerMetadataSet(ptr, kind, valueCharSlice); + } } } diff --git a/tracer/test/Datadog.Trace.IntegrationTests/LibDatadog/TraceExporterTests.cs b/tracer/test/Datadog.Trace.IntegrationTests/LibDatadog/TraceExporterTests.cs index 62eb76c3bb7f..79eb77cabb40 100644 --- a/tracer/test/Datadog.Trace.IntegrationTests/LibDatadog/TraceExporterTests.cs +++ b/tracer/test/Datadog.Trace.IntegrationTests/LibDatadog/TraceExporterTests.cs @@ -135,6 +135,10 @@ public async Task SendsTracesUsingDataPipeline(TestTransports transport) .And.AllSatisfy(rates => rates.Should().BeEquivalentTo(expectedRates)); sampleRateResponses.Should().ContainSingle(); + // Assert telemetry payloads were sent + await agent.WaitForLatestTelemetryAsync(t => t != null); + agent.Telemetry.Should().NotBeNull(); + Dictionary GetSettings() { var settingsMap = new Dictionary @@ -175,11 +179,11 @@ Dictionary GetSettings() MockTracerAgent GetAgent() => transport switch { - TestTransports.Tcp => MockTracerAgent.Create(null), - TestTransports.WindowsNamedPipe => MockTracerAgent.Create(null, new WindowsPipesConfig(pipeName, null)), + TestTransports.Tcp => MockTracerAgent.Create(null, useTelemetry: true), + TestTransports.WindowsNamedPipe => MockTracerAgent.Create(null, new WindowsPipesConfig(pipeName, null) { UseTelemetry = true }), #if NETCOREAPP3_1_OR_GREATER TestTransports.Uds - => MockTracerAgent.Create(null, new UnixDomainSocketConfig(udsPath, null)), + => MockTracerAgent.Create(null, new UnixDomainSocketConfig(udsPath, null) { UseTelemetry = true }), #endif _ => throw new InvalidOperationException("Unsupported transport type " + transport), };