-
Notifications
You must be signed in to change notification settings - Fork 885
[AOT] Added publishAOT test app to ensure OpenTelemetry SDK is AOT safe. #4392
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
ae1849f
324a7b2
46ddb20
4e04bc1
3c6ee77
60ef365
e9842d6
cd6e26e
ff307ab
58b7bd1
460205a
ce51034
e510df3
8f3e6be
e08c04d
4be2de8
ed371fe
a37eaf6
09bcb4c
446943a
a7eb400
010eed1
18c7afa
6409cdb
ea81b23
61ce597
4be236e
1e9b10b
618b742
28b81fc
29ba642
794d92c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,34 @@ | ||
| <Project Sdk="Microsoft.NET.Sdk"> | ||
|
|
||
| <PropertyGroup> | ||
| <OutputType>Exe</OutputType> | ||
| <TargetFramework>net7.0</TargetFramework> | ||
| <PublishAot>true</PublishAot> | ||
| <TrimmerSingleWarn>false</TrimmerSingleWarn> | ||
| </PropertyGroup> | ||
|
|
||
| <ItemGroup> | ||
| <TrimmerRootAssembly Include="OpenTelemetry.Api.ProviderBuilderExtensions" /> | ||
| <TrimmerRootAssembly Include="OpenTelemetry.Api" /> | ||
| <TrimmerRootAssembly Include="OpenTelemetry.Exporter.Console" /> | ||
| <TrimmerRootAssembly Include="OpenTelemetry.Exporter.InMemory" /> | ||
| <TrimmerRootAssembly Include="OpenTelemetry.Exporter.Jaeger" /> | ||
| <TrimmerRootAssembly Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" /> | ||
| <TrimmerRootAssembly Include="OpenTelemetry.Exporter.Prometheus.HttpListener" /> | ||
| <TrimmerRootAssembly Include="OpenTelemetry.Exporter.Zipkin" /> | ||
| <TrimmerRootAssembly Include="OpenTelemetry.Exporter.ZPages" /> | ||
| <TrimmerRootAssembly Include="OpenTelemetry.Extensions.Hosting" /> | ||
| <TrimmerRootAssembly Include="OpenTelemetry.Extensions.Propagators" /> | ||
| <TrimmerRootAssembly Include="OpenTelemetry.Instrumentation.AspNetCore" /> | ||
| <TrimmerRootAssembly Include="OpenTelemetry.Instrumentation.GrpcNetClient" /> | ||
| <TrimmerRootAssembly Include="OpenTelemetry.Instrumentation.Http" /> | ||
| <TrimmerRootAssembly Include="OpenTelemetry.Instrumentation.SqlClient" /> | ||
| <TrimmerRootAssembly Include="OpenTelemetry.SemanticConventions" /> | ||
| <TrimmerRootAssembly Include="OpenTelemetry.Shims.OpenTracing" /> | ||
| <TrimmerRootAssembly Include="OpenTelemetry" /> | ||
|
|
||
| <TrimmerRootAssembly Update="@(TrimmerRootAssembly)" Path="$(RepoRoot)\src\%(Identity)\%(Identity).csproj" /> | ||
| <ProjectReference Include="@(TrimmerRootAssembly->'%(Path)')" /> | ||
| </ItemGroup> | ||
|
|
||
| </Project> | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
| // <copyright file="Program.cs" company="OpenTelemetry Authors"> | ||
| // Copyright The OpenTelemetry Authors | ||
| // | ||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||
| // you may not use this file except in compliance with the License. | ||
| // You may obtain a copy of the License at | ||
| // | ||
| // http://www.apache.org/licenses/LICENSE-2.0 | ||
| // | ||
| // Unless required by applicable law or agreed to in writing, software | ||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| // See the License for the specific language governing permissions and | ||
| // limitations under the License. | ||
| // </copyright> | ||
|
|
||
| Console.WriteLine("Hello, World!"); |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,91 @@ | ||
| // <copyright file="AotCompatibilityTests.cs" company="OpenTelemetry Authors"> | ||
| // Copyright The OpenTelemetry Authors | ||
| // | ||
| // Licensed under the Apache License, Version 2.0 (the "License"); | ||
| // you may not use this file except in compliance with the License. | ||
| // You may obtain a copy of the License at | ||
| // | ||
| // http://www.apache.org/licenses/LICENSE-2.0 | ||
| // | ||
| // Unless required by applicable law or agreed to in writing, software | ||
| // distributed under the License is distributed on an "AS IS" BASIS, | ||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| // See the License for the specific language governing permissions and | ||
| // limitations under the License. | ||
| // </copyright> | ||
|
|
||
| using System.Diagnostics; | ||
| using Xunit; | ||
| using Xunit.Abstractions; | ||
|
|
||
| namespace OpenTelemetry.AotCompatibility.Tests | ||
| { | ||
| public class AotCompatibilityTests | ||
| { | ||
| private readonly ITestOutputHelper testOutputHelper; | ||
|
|
||
| public AotCompatibilityTests(ITestOutputHelper testOutputHelper) | ||
| { | ||
| this.testOutputHelper = testOutputHelper; | ||
| } | ||
|
|
||
| /// <summary> | ||
| /// This test ensures that the intended APIs of the OpenTelemetry.AotCompatibility.TestApp libraries are | ||
| /// trimming and NativeAOT compatible. | ||
| /// | ||
| /// This test follows the instructions in https://learn.microsoft.com/dotnet/core/deploying/trimming/prepare-libraries-for-trimming#show-all-warnings-with-sample-application | ||
| /// | ||
| /// If this test fails, it is due to adding trimming and/or AOT incompatible changes | ||
| /// to code that is supposed to be compatible. | ||
| /// | ||
| /// To diagnose the problem, inspect the test output which will contain the trimming and AOT errors. For example: | ||
| /// | ||
| /// error IL2091: 'T' generic argument does not satisfy 'DynamicallyAccessedMemberTypes.PublicConstructors'. | ||
| /// </summary> | ||
| [Fact] | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Curious - would it make sense to have the AOT test build as a separate CI job instead of using unit test here? (easier to turn on/off, can run in parallel with existing unit test pipelines, etc.)
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm thinking while we are still developing, i.e. the warnings are > 0, we keep this as a unit test so that it's easier to capture the expected number of warnings and run the test locally.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
You should be able to run the CI check locally as well.
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sounds good to me 👍 |
||
| public void EnsureAotCompatibility() | ||
| { | ||
| string[] paths = { @"..", "..", "..", "..", "OpenTelemetry.AotCompatibility.TestApp" }; | ||
| string testAppPath = Path.Combine(paths); | ||
| string testAppProject = "OpenTelemetry.AotCompatibility.TestApp.csproj"; | ||
|
|
||
| // ensure we run a clean publish every time | ||
| DirectoryInfo testObjDir = new DirectoryInfo(Path.Combine(testAppPath, "obj")); | ||
| if (testObjDir.Exists) | ||
| { | ||
| testObjDir.Delete(recursive: true); | ||
| } | ||
|
|
||
| var process = new Process | ||
| { | ||
| // set '-nodereuse:false /p:UseSharedCompilation=false' so the MSBuild and Roslyn server processes don't hang around, which may hang the test in CI | ||
| StartInfo = new ProcessStartInfo("dotnet", $"publish {testAppProject} --self-contained -nodereuse:false /p:UseSharedCompilation=false") | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. these can be achieved in the CI tasks itself
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thank you for the info, Cijo : ) |
||
| { | ||
| RedirectStandardOutput = true, | ||
| UseShellExecute = false, | ||
| CreateNoWindow = true, | ||
| WorkingDirectory = testAppPath, | ||
| }, | ||
| }; | ||
|
|
||
| var expectedOutput = new System.Text.StringBuilder(); | ||
| process.OutputDataReceived += (sender, e) => | ||
| { | ||
| if (!string.IsNullOrEmpty(e.Data)) | ||
| { | ||
| this.testOutputHelper.WriteLine(e.Data); | ||
| expectedOutput.AppendLine(e.Data); | ||
| } | ||
| }; | ||
|
|
||
| process.Start(); | ||
| process.BeginOutputReadLine(); | ||
|
|
||
| Assert.True(process.WaitForExit(milliseconds: 180_000), "dotnet publish command timed out after 180 seconds."); | ||
| Assert.True(process.ExitCode == 0, "Publishing the AotCompatibility app failed. See test output for more details."); | ||
|
Yun-Ting marked this conversation as resolved.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You may want to consider a way to baseline the existing warnings to start, and ensure new warnings aren't introduced as new features are added. I'm not sure the best way to do this, but maybe @vitek-karas @agocke or @sbomer knows of a good way? In dotnet/sdk, we use the following method to verify the warnings (see the callers above this method):
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Other than baselining the output of the build I can't think of another way for NativeAOT right now. ILLink supports suppressing warnings via XML files, which would be the best solution here, unfortunately that functionality isn't implemented in NativeAOT (it's on the list, but I don't know when it's going to happen). |
||
|
|
||
| var warnings = expectedOutput.ToString().Split('\n', '\r').Where(line => line.Contains("warning IL")); | ||
| Assert.Equal(77, warnings.Count()); | ||
| } | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,20 @@ | ||
| <Project Sdk="Microsoft.NET.Sdk"> | ||
|
|
||
| <PropertyGroup> | ||
| <Description>Test to ensure AOT compatilibity.</Description> | ||
| <TargetFramework>net7.0</TargetFramework> | ||
| <ImplicitUsings>enable</ImplicitUsings> | ||
| <Nullable>enable</Nullable> | ||
| </PropertyGroup> | ||
|
|
||
| <ItemGroup> | ||
| <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPkgVer)" /> | ||
| <PackageReference Include="xunit" Version="$(XUnitPkgVer)" /> | ||
| <PackageReference Include="xunit.runner.visualstudio" Version="$(XUnitRunnerVisualStudioPkgVer)"> | ||
| <PrivateAssets>all</PrivateAssets> | ||
| <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets> | ||
| </PackageReference> | ||
| <DotNetCliToolReference Include="dotnet-xunit" Version="$(DotNetXUnitCliVer)" /> | ||
| </ItemGroup> | ||
|
|
||
| </Project> |
Uh oh!
There was an error while loading. Please reload this page.