Skip to content

Commit 005c87f

Browse files
WIP tracing support (#553)
* WIP tracing support * Added unit tests, * Moved integration tests to allow for modifying xunit behavior
1 parent 12277eb commit 005c87f

File tree

69 files changed

+870
-164
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

69 files changed

+870
-164
lines changed

LSP.sln

+15
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dap.Protocol.Proposals", "s
7777
EndProject
7878
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Protocol.Proposals", "src\Protocol.Proposals\Protocol.Proposals.csproj", "{201B1CA7-AB12-41AD-9246-BC30F2EBE2DF}"
7979
EndProject
80+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lsp.Integration.Tests", "test\Lsp.Integration.Tests\Lsp.Integration.Tests.csproj", "{72A74595-A278-46F0-9C8B-3151C9681B91}"
81+
EndProject
8082
Global
8183
GlobalSection(SolutionConfigurationPlatforms) = preSolution
8284
Debug|Any CPU = Debug|Any CPU
@@ -357,6 +359,18 @@ Global
357359
{201B1CA7-AB12-41AD-9246-BC30F2EBE2DF}.Release|x64.Build.0 = Release|Any CPU
358360
{201B1CA7-AB12-41AD-9246-BC30F2EBE2DF}.Release|x86.ActiveCfg = Release|Any CPU
359361
{201B1CA7-AB12-41AD-9246-BC30F2EBE2DF}.Release|x86.Build.0 = Release|Any CPU
362+
{72A74595-A278-46F0-9C8B-3151C9681B91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
363+
{72A74595-A278-46F0-9C8B-3151C9681B91}.Debug|Any CPU.Build.0 = Debug|Any CPU
364+
{72A74595-A278-46F0-9C8B-3151C9681B91}.Debug|x64.ActiveCfg = Debug|Any CPU
365+
{72A74595-A278-46F0-9C8B-3151C9681B91}.Debug|x64.Build.0 = Debug|Any CPU
366+
{72A74595-A278-46F0-9C8B-3151C9681B91}.Debug|x86.ActiveCfg = Debug|Any CPU
367+
{72A74595-A278-46F0-9C8B-3151C9681B91}.Debug|x86.Build.0 = Debug|Any CPU
368+
{72A74595-A278-46F0-9C8B-3151C9681B91}.Release|Any CPU.ActiveCfg = Release|Any CPU
369+
{72A74595-A278-46F0-9C8B-3151C9681B91}.Release|Any CPU.Build.0 = Release|Any CPU
370+
{72A74595-A278-46F0-9C8B-3151C9681B91}.Release|x64.ActiveCfg = Release|Any CPU
371+
{72A74595-A278-46F0-9C8B-3151C9681B91}.Release|x64.Build.0 = Release|Any CPU
372+
{72A74595-A278-46F0-9C8B-3151C9681B91}.Release|x86.ActiveCfg = Release|Any CPU
373+
{72A74595-A278-46F0-9C8B-3151C9681B91}.Release|x86.Build.0 = Release|Any CPU
360374
EndGlobalSection
361375
GlobalSection(SolutionProperties) = preSolution
362376
HideSolutionNode = FALSE
@@ -385,6 +399,7 @@ Global
385399
{58E83291-1ED9-4921-A12F-F2450AB17F47} = {2F323ED5-EBF8-45E1-B9D3-C014561B3DDA}
386400
{D43637CC-94E6-4ED4-BAA3-E5D1AD3285F5} = {D764E024-3D3F-4112-B932-2DB722A1BACC}
387401
{201B1CA7-AB12-41AD-9246-BC30F2EBE2DF} = {D764E024-3D3F-4112-B932-2DB722A1BACC}
402+
{72A74595-A278-46F0-9C8B-3151C9681B91} = {2F323ED5-EBF8-45E1-B9D3-C014561B3DDA}
388403
EndGlobalSection
389404
GlobalSection(ExtensibilityGlobals) = postSolution
390405
SolutionGuid = {D38DD0EC-D095-4BCD-B8AF-2D788AF3B9AE}

build.sh

100644100755
File mode changed.

src/Dap.Protocol/DapReceiver.cs

+24-6
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ protected virtual IEnumerable<Renor> GetRenor(JToken @object)
5252
var sequence = id.Value<long>();
5353
var messageType = type.Value<string>();
5454

55+
var properties = request.Properties().ToLookup(z => z.Name, StringComparer.OrdinalIgnoreCase);
56+
5557
if (messageType == "event")
5658
{
5759
if (!request.TryGetValue("event", out var @event))
@@ -60,7 +62,10 @@ protected virtual IEnumerable<Renor> GetRenor(JToken @object)
6062
yield break;
6163
}
6264

63-
yield return new Notification(@event.Value<string>(), request.TryGetValue("body", out var body) ? body : null);
65+
yield return new Notification(@event.Value<string>(), request.TryGetValue("body", out var body) ? body : null) {
66+
TraceState = properties["tracestate"].FirstOrDefault()?.Value<string>(),
67+
TraceParent = properties["traceparent"].FirstOrDefault()?.Value<string>()
68+
};
6469
yield break;
6570
}
6671

@@ -81,16 +86,29 @@ protected virtual IEnumerable<Renor> GetRenor(JToken @object)
8186
// This makes it so that the cancel handler implementer must still return a positive response even if the request didn't make it through.
8287
if (ro.TryGetValue("requestId", out var requestId))
8388
{
84-
yield return new Notification(JsonRpcNames.CancelRequest, JObject.FromObject(new { id = requestId }));
89+
yield return new Notification(JsonRpcNames.CancelRequest, JObject.FromObject(new { id = requestId })) {
90+
TraceState = properties["tracestate"].FirstOrDefault()?.Value<string>(),
91+
TraceParent = properties["traceparent"].FirstOrDefault()?.Value<string>()
92+
};
8593
ro.Remove("requestId");
8694
}
95+
else
96+
{
97+
yield return new Request(sequence, RequestNames.Cancel, ro) {
98+
TraceState = properties["tracestate"].FirstOrDefault()?.Value<string>(),
99+
TraceParent = properties["traceparent"].FirstOrDefault()?.Value<string>()
100+
};
101+
yield break;
102+
}
103+
}
87104

88-
yield return new Request(sequence, RequestNames.Cancel, ro);
105+
{
106+
yield return new Request(sequence, requestName, requestObject) {
107+
TraceState = properties["tracestate"].FirstOrDefault()?.Value<string>(),
108+
TraceParent = properties["traceparent"].FirstOrDefault()?.Value<string>()
109+
};
89110
yield break;
90111
}
91-
92-
yield return new Request(sequence, requestName, requestObject);
93-
yield break;
94112
}
95113

96114
if (messageType == "response")

src/Dap.Protocol/DebugAdapterConverters/DapClientNotificationConverter.cs

+10
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,16 @@ public override void WriteJson(JsonWriter writer, OutgoingNotification value, Js
3333
writer.WritePropertyName("body");
3434
serializer.Serialize(writer, value.Params);
3535
}
36+
if (value.TraceParent != null)
37+
{
38+
writer.WritePropertyName("traceparent");
39+
writer.WriteValue(value.TraceParent);
40+
if (!string.IsNullOrWhiteSpace(value.TraceState))
41+
{
42+
writer.WritePropertyName("tracestate");
43+
writer.WriteValue(value.TraceState);
44+
}
45+
}
3646

3747
writer.WriteEndObject();
3848
}

src/Dap.Protocol/DebugAdapterConverters/DapClientRequestConverter.cs

+10
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,16 @@ public override void WriteJson(JsonWriter writer, OutgoingRequest value, JsonSer
2828
writer.WritePropertyName("arguments");
2929
serializer.Serialize(writer, value.Params);
3030
}
31+
if (value.TraceParent != null)
32+
{
33+
writer.WritePropertyName("traceparent");
34+
writer.WriteValue(value.TraceParent);
35+
if (!string.IsNullOrWhiteSpace(value.TraceState))
36+
{
37+
writer.WritePropertyName("tracestate");
38+
writer.WriteValue(value.TraceState);
39+
}
40+
}
3141

3242
writer.WriteEndObject();
3343
}

src/Dap.Shared/DebugAdapterRequestRouter.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@ internal class DebugAdapterRequestRouter : RequestRouterBase<IHandlerDescriptor>
1212
private readonly DebugAdapterHandlerCollection _collection;
1313

1414
public DebugAdapterRequestRouter(
15-
DebugAdapterHandlerCollection collection, ISerializer serializer, IServiceScopeFactory serviceScopeFactory, ILogger<DebugAdapterRequestRouter> logger
15+
DebugAdapterHandlerCollection collection, ISerializer serializer, IServiceScopeFactory serviceScopeFactory, ILogger<DebugAdapterRequestRouter> logger,
16+
IActivityTracingStrategy? activityTracingStrategy = null
1617
)
17-
: base(serializer, serviceScopeFactory, logger) =>
18+
: base(serializer, serviceScopeFactory, logger, activityTracingStrategy) =>
1819
_collection = collection;
1920

2021
public IDisposable Add(IJsonRpcHandler handler) => _collection.Add(handler);

src/Directory.Build.props

+36-33
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,36 @@
1-
<Project>
2-
<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))"/>
3-
<PropertyGroup>
4-
<PackageVersion Condition="'$(GitVersion_NuGetVersion)' != ''">$(GitVersion_NuGetVersion)</PackageVersion>
5-
<AssemblyVersion>0.0.9.9</AssemblyVersion>
6-
<AssemblyVersion Condition="'$(GitVersion_AssemblySemVer)' != ''">$(GitVersion_Major).$(GitVersion_Minor).0.0</AssemblyVersion>
7-
<FileVersion Condition="'$(GitVersion_AssemblySemVer)' != ''">$(GitVersion_AssemblySemVer)</FileVersion>
8-
<InformationalVersion Condition="'$(GitVersion_InformationalVersion)' != ''">$(GitVersion_InformationalVersion)</InformationalVersion>
9-
<IsPackable>true</IsPackable>
10-
<Nullable>enable</Nullable>
11-
</PropertyGroup>
12-
13-
<ItemGroup>
14-
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
15-
<_Parameter1>Client.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100391db875e68eb4bfef49ce14313b9e13f2cd3cc89eb273bbe6c11a55044c7d4f566cf092e1c77ef9e7c75b1496ae7f95d925938f5a01793dd8d9f99ae0a7595779b71b971287d7d7b5960d052078d14f5ce1a85ea5c9fb2f59ac735ff7bc215cab469b7c3486006860bad6f4c3b5204ea2f28dd4e1d05e2cca462cfd593b9f9f</_Parameter1>
16-
</AssemblyAttribute>
17-
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
18-
<_Parameter1>JsonRpc.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100391db875e68eb4bfef49ce14313b9e13f2cd3cc89eb273bbe6c11a55044c7d4f566cf092e1c77ef9e7c75b1496ae7f95d925938f5a01793dd8d9f99ae0a7595779b71b971287d7d7b5960d052078d14f5ce1a85ea5c9fb2f59ac735ff7bc215cab469b7c3486006860bad6f4c3b5204ea2f28dd4e1d05e2cca462cfd593b9f9f</_Parameter1>
19-
</AssemblyAttribute>
20-
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
21-
<_Parameter1>Dap.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100391db875e68eb4bfef49ce14313b9e13f2cd3cc89eb273bbe6c11a55044c7d4f566cf092e1c77ef9e7c75b1496ae7f95d925938f5a01793dd8d9f99ae0a7595779b71b971287d7d7b5960d052078d14f5ce1a85ea5c9fb2f59ac735ff7bc215cab469b7c3486006860bad6f4c3b5204ea2f28dd4e1d05e2cca462cfd593b9f9f</_Parameter1>
22-
</AssemblyAttribute>
23-
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
24-
<_Parameter1>Lsp.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100391db875e68eb4bfef49ce14313b9e13f2cd3cc89eb273bbe6c11a55044c7d4f566cf092e1c77ef9e7c75b1496ae7f95d925938f5a01793dd8d9f99ae0a7595779b71b971287d7d7b5960d052078d14f5ce1a85ea5c9fb2f59ac735ff7bc215cab469b7c3486006860bad6f4c3b5204ea2f28dd4e1d05e2cca462cfd593b9f9f</_Parameter1>
25-
</AssemblyAttribute>
26-
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
27-
<_Parameter1>TestingUtils, PublicKey=0024000004800000940000000602000000240000525341310004000001000100391db875e68eb4bfef49ce14313b9e13f2cd3cc89eb273bbe6c11a55044c7d4f566cf092e1c77ef9e7c75b1496ae7f95d925938f5a01793dd8d9f99ae0a7595779b71b971287d7d7b5960d052078d14f5ce1a85ea5c9fb2f59ac735ff7bc215cab469b7c3486006860bad6f4c3b5204ea2f28dd4e1d05e2cca462cfd593b9f9f</_Parameter1>
28-
</AssemblyAttribute>
29-
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
30-
<_Parameter1>DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7</_Parameter1>
31-
</AssemblyAttribute>
32-
</ItemGroup>
33-
</Project>
1+
<Project>
2+
<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))"/>
3+
<PropertyGroup>
4+
<PackageVersion Condition="'$(GitVersion_NuGetVersion)' != ''">$(GitVersion_NuGetVersion)</PackageVersion>
5+
<AssemblyVersion>0.0.9.9</AssemblyVersion>
6+
<AssemblyVersion Condition="'$(GitVersion_AssemblySemVer)' != ''">$(GitVersion_Major).$(GitVersion_Minor).0.0</AssemblyVersion>
7+
<FileVersion Condition="'$(GitVersion_AssemblySemVer)' != ''">$(GitVersion_AssemblySemVer)</FileVersion>
8+
<InformationalVersion Condition="'$(GitVersion_InformationalVersion)' != ''">$(GitVersion_InformationalVersion)</InformationalVersion>
9+
<IsPackable>true</IsPackable>
10+
<Nullable>enable</Nullable>
11+
</PropertyGroup>
12+
13+
<ItemGroup>
14+
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
15+
<_Parameter1>Client.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100391db875e68eb4bfef49ce14313b9e13f2cd3cc89eb273bbe6c11a55044c7d4f566cf092e1c77ef9e7c75b1496ae7f95d925938f5a01793dd8d9f99ae0a7595779b71b971287d7d7b5960d052078d14f5ce1a85ea5c9fb2f59ac735ff7bc215cab469b7c3486006860bad6f4c3b5204ea2f28dd4e1d05e2cca462cfd593b9f9f</_Parameter1>
16+
</AssemblyAttribute>
17+
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
18+
<_Parameter1>JsonRpc.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100391db875e68eb4bfef49ce14313b9e13f2cd3cc89eb273bbe6c11a55044c7d4f566cf092e1c77ef9e7c75b1496ae7f95d925938f5a01793dd8d9f99ae0a7595779b71b971287d7d7b5960d052078d14f5ce1a85ea5c9fb2f59ac735ff7bc215cab469b7c3486006860bad6f4c3b5204ea2f28dd4e1d05e2cca462cfd593b9f9f</_Parameter1>
19+
</AssemblyAttribute>
20+
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
21+
<_Parameter1>Dap.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100391db875e68eb4bfef49ce14313b9e13f2cd3cc89eb273bbe6c11a55044c7d4f566cf092e1c77ef9e7c75b1496ae7f95d925938f5a01793dd8d9f99ae0a7595779b71b971287d7d7b5960d052078d14f5ce1a85ea5c9fb2f59ac735ff7bc215cab469b7c3486006860bad6f4c3b5204ea2f28dd4e1d05e2cca462cfd593b9f9f</_Parameter1>
22+
</AssemblyAttribute>
23+
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
24+
<_Parameter1>Lsp.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100391db875e68eb4bfef49ce14313b9e13f2cd3cc89eb273bbe6c11a55044c7d4f566cf092e1c77ef9e7c75b1496ae7f95d925938f5a01793dd8d9f99ae0a7595779b71b971287d7d7b5960d052078d14f5ce1a85ea5c9fb2f59ac735ff7bc215cab469b7c3486006860bad6f4c3b5204ea2f28dd4e1d05e2cca462cfd593b9f9f</_Parameter1>
25+
</AssemblyAttribute>
26+
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
27+
<_Parameter1>Lsp.Integration.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100391db875e68eb4bfef49ce14313b9e13f2cd3cc89eb273bbe6c11a55044c7d4f566cf092e1c77ef9e7c75b1496ae7f95d925938f5a01793dd8d9f99ae0a7595779b71b971287d7d7b5960d052078d14f5ce1a85ea5c9fb2f59ac735ff7bc215cab469b7c3486006860bad6f4c3b5204ea2f28dd4e1d05e2cca462cfd593b9f9f</_Parameter1>
28+
</AssemblyAttribute>
29+
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
30+
<_Parameter1>TestingUtils, PublicKey=0024000004800000940000000602000000240000525341310004000001000100391db875e68eb4bfef49ce14313b9e13f2cd3cc89eb273bbe6c11a55044c7d4f566cf092e1c77ef9e7c75b1496ae7f95d925938f5a01793dd8d9f99ae0a7595779b71b971287d7d7b5960d052078d14f5ce1a85ea5c9fb2f59ac735ff7bc215cab469b7c3486006860bad6f4c3b5204ea2f28dd4e1d05e2cca462cfd593b9f9f</_Parameter1>
31+
</AssemblyAttribute>
32+
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleToAttribute">
33+
<_Parameter1>DynamicProxyGenAssembly2, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7</_Parameter1>
34+
</AssemblyAttribute>
35+
</ItemGroup>
36+
</Project>
+15-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,23 @@
1+
using Newtonsoft.Json;
2+
13
namespace OmniSharp.Extensions.JsonRpc.Client
24
{
3-
public record OutgoingNotification
5+
public record OutgoingNotification : ITraceData
46
{
57
public string Method { get; set; } = null!;
68

79
public object? Params { get; set; }
10+
11+
/// <summary>
12+
/// Gets or sets the data for the <see href="https://www.w3.org/TR/trace-context/">W3C Trace Context</see> <c>traceparent</c> value.
13+
/// </summary>
14+
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
15+
public string? TraceParent { get; set; }
16+
17+
/// <summary>
18+
/// Gets or sets the data for the <see href="https://www.w3.org/TR/trace-context/">W3C Trace Context</see> <c>tracestate</c> value.
19+
/// </summary>
20+
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
21+
public string? TraceState { get; set; }
822
}
923
}

src/JsonRpc/Client/OutgoingRequest.cs

+13-1
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,25 @@
22

33
namespace OmniSharp.Extensions.JsonRpc.Client
44
{
5-
public record OutgoingRequest
5+
public record OutgoingRequest : ITraceData
66
{
77
public object? Id { get; set; }
88

99
public string? Method { get; set; }
1010

1111
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
1212
public object? Params { get; set; }
13+
14+
/// <summary>
15+
/// Gets or sets the data for the <see href="https://www.w3.org/TR/trace-context/">W3C Trace Context</see> <c>traceparent</c> value.
16+
/// </summary>
17+
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
18+
public string? TraceParent { get; set; }
19+
20+
/// <summary>
21+
/// Gets or sets the data for the <see href="https://www.w3.org/TR/trace-context/">W3C Trace Context</see> <c>tracestate</c> value.
22+
/// </summary>
23+
[JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
24+
public string? TraceState { get; set; }
1325
}
1426
}

0 commit comments

Comments
 (0)