Is X-Ray on Lambda Compatible with .NET Ahead-of-Time compilation?

0

When attempting to set up XRay in a .NET/C# Lambda function published with AOT, I am getting the following error upon invoking the function:

Unhandled Exception: System.TypeInitializationException: A type initializer threw an exception. To determine which type, inspect the InnerException's StackTrace property.
---> System.MissingMethodException: No parameterless constructor defined for type 'Amazon.XRay.Recorder.Core.Sampling.Local.SamplingConfiguration'.
at System.ActivatorImplementation.CreateInstance(Type, Boolean) + 0x120
at ThirdParty.LitJson.JsonMapper.ReadValue(Type, JsonReader) + 0x483
at ThirdParty.LitJson.JsonMapper.ToObject[T](TextReader) + 0x4f
at Amazon.XRay.Recorder.Core.Sampling.Local.LocalizedSamplingStrategy.Init(Stream) + 0x60
at Amazon.XRay.Recorder.Core.Sampling.Local.LocalizedSamplingStrategy.InitWithDefaultSamplingRules() + 0x53
at Amazon.XRay.Recorder.Core.AWSXRayRecorder..ctor(ISegmentEmitter) + 0x5e
at Amazon.XRay.Recorder.Core.AWSXRayRecorder..cctor() + 0xcd
at System.Runtime.CompilerServices.ClassConstructorRunner.EnsureClassConstructorRun(StaticClassConstructionContext*) + 0xb9
--- End of inner exception stack trace ---
[...]

I've tried adding the following to rd.xml, to no avail:

<Directives xmlns="http://schemas.microsoft.com/netfx/2013/01/metadata">
  <Application>
    <Assembly Name="bootstrap" Dynamic="Required All"/>
    <Assembly Name="AWSSDK.Core" Dynamic="Required All"/>
    <Assembly Name="AWSSDK.SecretsManager" Dynamic="Required All"/>
    <Assembly Name="AWSSDK.XRay" Dynamic="Required All"/>
    <Assembly Name="AWSXRayRecorder.Core" Dynamic="Required All"/>
    <Assembly Name="AWSXRayRecorder.Handlers.AwsSdk" Dynamic="Required All"/>
    <Assembly Name="System.Configuration.ConfigurationManager">
      <Type Name="System.Configuration.ClientConfigurationHost" Dynamic="Required All" />
      <Type Name="System.Configuration.AppSettingsSection" Dynamic="Required All" />
    </Assembly>
  </Application>
</Directives>

My initialization code is as follows:

AWSSDKHandler.RegisterXRayForAllServices();
AWSXRayRecorder.InitializeInstance(); // pass IConfiguration object that reads appsettings.json file

Any ideas?

3 回答
2

Hi Jason, I've just tried this same code locally and it seems to work ok. I've taken the sample code on GitHub and added the AWSXRayRecorder.InitializeInstance(); line.

Would it be possible for you to paste a copy of your .csproj file?

profile pictureAWS
jamesuk
已回答 1 年前
profile picture
专家
iwasa
已审核 1 年前
0

Hi, based upon the sample you linked to, I removed AWSSDK.XRay from my project references and moved the XRay calls to a static constructor. Seems to be good now, I'm not sure which of these did the trick, I'll do some research over the weekend and see if I can figure out what caused the issue.

Thank you for the response!

Jason T
已回答 1 年前
0

The static constructor won't have changed things, it will be the removal of the AWSSDK.XRay library that made the difference. Glad to hear you've resolved the problem though.

profile pictureAWS
jamesuk
已回答 1 年前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则