Skip to content

Commit 4bb5946

Browse files
Add observability feature IDs to User Agent header (#3760)
1 parent 89b3090 commit 4bb5946

File tree

9 files changed

+207
-45
lines changed

9 files changed

+207
-45
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"core": {
3+
"changeLogMessages": [
4+
"Add observability feature IDs to User Agent header"
5+
],
6+
"type": "patch",
7+
"updateMinimum": false
8+
}
9+
}

generator/ServiceClientGeneratorLib/Generators/SourceFiles/CoreAssemblyInfo.cs

Lines changed: 48 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace ServiceClientGenerator.Generators.SourceFiles
1515
/// Class to produce the template output
1616
/// </summary>
1717

18-
#line 1 "C:\Projects\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\SourceFiles\CoreAssemblyInfo.tt"
18+
#line 1 "C:\repos\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\SourceFiles\CoreAssemblyInfo.tt"
1919
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "17.0.0.0")]
2020
public partial class CoreAssemblyInfo : BaseGenerator
2121
{
@@ -30,7 +30,7 @@ public override string TransformText()
3030
"bly is controlled through the following \r\n// set of attributes. Change these att" +
3131
"ribute values to modify the information\r\n// associated with an assembly.\r\n[assem" +
3232
"bly: AssemblyTitle(\"AWSSDK.Core\")]\r\n#if BCL\r\n[assembly: AssemblyDescription(\"The" +
33-
" Amazon Web Services SDK for .NET (4.6.2) - Core Runtime\")]\r\n#elif NETSTANDARD20" +
33+
" Amazon Web Services SDK for .NET (4.7.2) - Core Runtime\")]\r\n#elif NETSTANDARD20" +
3434
"\r\n[assembly: AssemblyDescription(\"The Amazon Web Services SDK for .NET (NetStand" +
3535
"ard 2.0) - Core Runtime\")]\r\n#elif NETCOREAPP3_1\r\n[assembly: AssemblyDescription(" +
3636
"\"The Amazon Web Services SDK for .NET (.NET Core 3.1) - Core Runtime\")]\r\n#elif N" +
@@ -41,56 +41,65 @@ public override string TransformText()
4141
"004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aedbe7252745db7" +
4242
"274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84eecd0ba891f2" +
4343
"b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2413f00a28f3a" +
44-
"0752a81203f03ccb7f684db373518b4\")]\r\n// Assembly name of UnitTests.NetStandard\r\n[" +
45-
"assembly: InternalsVisibleTo(\"UnitTests, PublicKey=00240000048000009400000006020" +
46-
"00000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9d" +
47-
"f0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09" +
48-
"d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf12" +
49-
"52ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4\")]\r\n[assembly: InternalsVisi" +
50-
"bleTo(\"AWSSDK.UnitTests.Custom.NetStandard, PublicKey=00240000048000009400000006" +
51-
"02000000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9" +
52-
"a9df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0" +
53-
"d09d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddb" +
54-
"f1252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4\")]\r\n[assembly: InternalsV" +
55-
"isibleTo(\"UnitTests.NetStandard.CoreOnly, PublicKey=0024000004800000940000000602" +
56-
"000000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9" +
57-
"df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d0" +
58-
"9d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1" +
59-
"252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4\")]\r\n// Allows moq to access" +
60-
" internals for testing\r\n[assembly: InternalsVisibleTo(\"DynamicProxyGenAssembly2," +
61-
" PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547c" +
62-
"ac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d" +
63-
"9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1" +
64-
"d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e924" +
65-
"84cf7045cc7\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyProduc" +
66-
"t(\"Amazon Web Services SDK for .NET\")]\r\n[assembly: AssemblyCompany(\"Amazon.com, " +
67-
"Inc\")]\r\n[assembly: AssemblyCopyright(\"Copyright Amazon.com, Inc. or its affiliat" +
68-
"es. All Rights Reserved.\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: Assem" +
69-
"blyCulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assemb" +
70-
"ly not visible \r\n// to COM components. If you need to access a type in this ass" +
71-
"embly from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assemb" +
72-
"ly: ComVisible(false)]\r\n\r\n// Version information for an assembly consists of the" +
73-
" following four values:\r\n//\r\n// Major Version\r\n// Minor Version \r\n// " +
74-
" Build Number\r\n// Revision\r\n//\r\n// You can specify all the values or you" +
75-
" can default the Build and Revision Numbers \r\n// by using the \'*\' as shown below" +
76-
":\r\n// [assembly: AssemblyVersion(\"1.0.*\")]\r\n#if BCL\r\n[assembly: AssemblyVersion(" +
77-
"\"");
44+
"0752a81203f03ccb7f684db373518b4\")]\r\n[assembly: InternalsVisibleTo(\"AWSSDK.UnitTe" +
45+
"stUtilities, PublicKey=002400000480000094000000060200000024000052534131000400000" +
46+
"1000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aedbe7252745db7274d5271" +
47+
"fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84eecd0ba891f2b8a2fc55" +
48+
"141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2413f00a28f3a0752a812" +
49+
"03f03ccb7f684db373518b4\")]\r\n// Assembly name of UnitTests.NetStandard\r\n[assembly" +
50+
": InternalsVisibleTo(\"UnitTests, PublicKey=0024000004800000940000000602000000240" +
51+
"000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aed" +
52+
"be7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84" +
53+
"eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2" +
54+
"413f00a28f3a0752a81203f03ccb7f684db373518b4\")]\r\n[assembly: InternalsVisibleTo(\"A" +
55+
"WSSDK.UnitTestUtilities.NetStandard, PublicKey=002400000480000094000000060200000" +
56+
"0240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b5" +
57+
"2aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc" +
58+
"0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed" +
59+
"08a2413f00a28f3a0752a81203f03ccb7f684db373518b4\")]\r\n[assembly: InternalsVisibleT" +
60+
"o(\"AWSSDK.UnitTests.Custom.NetStandard, PublicKey=002400000480000094000000060200" +
61+
"0000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df" +
62+
"0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d" +
63+
"3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf125" +
64+
"2ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4\")]\r\n[assembly: InternalsVisib" +
65+
"leTo(\"UnitTests.NetStandard.CoreOnly, PublicKey=00240000048000009400000006020000" +
66+
"00240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b" +
67+
"52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3b" +
68+
"c0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252e" +
69+
"d08a2413f00a28f3a0752a81203f03ccb7f684db373518b4\")]\r\n// Allows moq to access int" +
70+
"ernals for testing\r\n[assembly: InternalsVisibleTo(\"DynamicProxyGenAssembly2, Pub" +
71+
"licKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37" +
72+
"abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266" +
73+
"654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d4" +
74+
"6ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf" +
75+
"7045cc7\")]\r\n[assembly: AssemblyConfiguration(\"\")]\r\n[assembly: AssemblyProduct(\"A" +
76+
"mazon Web Services SDK for .NET\")]\r\n[assembly: AssemblyCompany(\"Amazon.com, Inc\"" +
77+
")]\r\n[assembly: AssemblyCopyright(\"Copyright Amazon.com, Inc. or its affiliates. " +
78+
"All Rights Reserved.\")]\r\n[assembly: AssemblyTrademark(\"\")]\r\n[assembly: AssemblyC" +
79+
"ulture(\"\")]\r\n\r\n// Setting ComVisible to false makes the types in this assembly n" +
80+
"ot visible \r\n// to COM components. If you need to access a type in this assembl" +
81+
"y from \r\n// COM, set the ComVisible attribute to true on that type.\r\n[assembly: " +
82+
"ComVisible(false)]\r\n\r\n// Version information for an assembly consists of the fol" +
83+
"lowing four values:\r\n//\r\n// Major Version\r\n// Minor Version \r\n// " +
84+
"Build Number\r\n// Revision\r\n//\r\n// You can specify all the values or you can" +
85+
" default the Build and Revision Numbers \r\n// by using the \'*\' as shown below:\r\n/" +
86+
"/ [assembly: AssemblyVersion(\"1.0.*\")]\r\n#if BCL\r\n[assembly: AssemblyVersion(\"");
7887

79-
#line 54 "C:\Projects\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\SourceFiles\CoreAssemblyInfo.tt"
88+
#line 56 "C:\repos\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\SourceFiles\CoreAssemblyInfo.tt"
8089
this.Write(this.ToStringHelper.ToStringWithCulture(this.Session["Version"]));
8190

8291
#line default
8392
#line hidden
8493
this.Write("\")]\r\n#else\r\n[assembly: AssemblyVersion(\"");
8594

86-
#line 56 "C:\Projects\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\SourceFiles\CoreAssemblyInfo.tt"
95+
#line 58 "C:\repos\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\SourceFiles\CoreAssemblyInfo.tt"
8796
this.Write(this.ToStringHelper.ToStringWithCulture(this.Session["FileVersion"]));
8897

8998
#line default
9099
#line hidden
91100
this.Write("\")]\r\n#endif\r\n[assembly: AssemblyFileVersion(\"");
92101

93-
#line 58 "C:\Projects\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\SourceFiles\CoreAssemblyInfo.tt"
102+
#line 60 "C:\repos\aws-sdk-net-v4\generator\ServiceClientGeneratorLib\Generators\SourceFiles\CoreAssemblyInfo.tt"
94103
this.Write(this.ToStringHelper.ToStringWithCulture(this.Session["FileVersion"]));
95104

96105
#line default

generator/ServiceClientGeneratorLib/Generators/SourceFiles/CoreAssemblyInfo.tt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ using System.Runtime.CompilerServices;
1111
// associated with an assembly.
1212
[assembly: AssemblyTitle("AWSSDK.Core")]
1313
#if BCL
14-
[assembly: AssemblyDescription("The Amazon Web Services SDK for .NET (4.6.2) - Core Runtime")]
14+
[assembly: AssemblyDescription("The Amazon Web Services SDK for .NET (4.7.2) - Core Runtime")]
1515
#elif NETSTANDARD20
1616
[assembly: AssemblyDescription("The Amazon Web Services SDK for .NET (NetStandard 2.0) - Core Runtime")]
1717
#elif NETCOREAPP3_1
@@ -22,8 +22,10 @@ using System.Runtime.CompilerServices;
2222
#error Unknown platform constant - unable to set correct AssemblyDescription
2323
#endif
2424
[assembly: InternalsVisibleTo("AWSSDK.UnitTests.NetFramework, PublicKey=0024000004800000940000000602000000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4")]
25+
[assembly: InternalsVisibleTo("AWSSDK.UnitTestUtilities, PublicKey=0024000004800000940000000602000000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4")]
2526
// Assembly name of UnitTests.NetStandard
2627
[assembly: InternalsVisibleTo("UnitTests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4")]
28+
[assembly: InternalsVisibleTo("AWSSDK.UnitTestUtilities.NetStandard, PublicKey=0024000004800000940000000602000000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4")]
2729
[assembly: InternalsVisibleTo("AWSSDK.UnitTests.Custom.NetStandard, PublicKey=0024000004800000940000000602000000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4")]
2830
[assembly: InternalsVisibleTo("UnitTests.NetStandard.CoreOnly, PublicKey=0024000004800000940000000602000000240000525341310004000001000100db5f59f098d27276c7833875a6263a3cc74ab17ba9a9df0b52aedbe7252745db7274d5271fd79c1f08f668ecfa8eaab5626fa76adc811d3c8fc55859b0d09d3bc0a84eecd0ba891f2b8a2fc55141cdcc37c2053d53491e650a479967c3622762977900eddbf1252ed08a2413f00a28f3a0752a81203f03ccb7f684db373518b4")]
2931
// Allows moq to access internals for testing

sdk/src/Core/Amazon.Runtime/Internal/UserAgent/UserAgentFeatureId.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,26 @@ public class UserAgentFeatureId : ConstantClass
240240
/// </summary>
241241
public static readonly UserAgentFeatureId SSO_LOGIN_AUTH = new UserAgentFeatureId("2");
242242

243+
/// <summary>
244+
/// Indicates that an AWS SDK client has been configured with a non-null, non-NoOp tracing provider.
245+
/// </summary>
246+
public static readonly UserAgentFeatureId OBSERVABILITY_TRACING = new UserAgentFeatureId("4");
247+
248+
/// <summary>
249+
/// Indicates that an AWS SDK client has been configured with a non-null, non-NoOp metrics provider.
250+
/// </summary>
251+
public static readonly UserAgentFeatureId OBSERVABILITY_METRICS = new UserAgentFeatureId("5");
252+
253+
/// <summary>
254+
/// Indicates that an AWS SDK client has been configured with an OpenTelemetry tracing provider.
255+
/// </summary>
256+
public static readonly UserAgentFeatureId OBSERVABILITY_OTEL_TRACING = new UserAgentFeatureId("6");
257+
258+
/// <summary>
259+
/// Indicates that an AWS SDK client has been configured with an OpenTelemetry metrics provider.
260+
/// </summary>
261+
public static readonly UserAgentFeatureId OBSERVABILITY_OTEL_METRICS = new UserAgentFeatureId("7");
262+
243263
public UserAgentFeatureId(string value) : base(value) { }
244264

245265
public static UserAgentFeatureId FindValue(string value)

sdk/src/Core/Amazon.Runtime/Pipeline/Handlers/Marshaller.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
using Amazon.Runtime.Internal.UserAgent;
2222
using Amazon.Runtime.Telemetry;
2323
using Amazon.Runtime.Telemetry.Metrics;
24+
using Amazon.Runtime.Telemetry.Metrics.NoOp;
25+
using Amazon.Runtime.Telemetry.Tracing.NoOp;
2426
using Amazon.Util;
2527
using Amazon.Util.Internal;
2628

@@ -143,6 +145,35 @@ private static void UpdateUserAgentDetails(IRequestContext requestContext)
143145
requestContext.UserAgentDetails.AddUserAgentComponent($"md/{(requestContext.IsAsync ? "ClientAsync" : "ClientSync")}");
144146

145147
requestContext.UserAgentDetails.AddUserAgentComponent($"cfg/init-coll#{(AWSConfigs.InitializeCollections ? '1' : '0')}");
148+
149+
SetObservabilityFeatureIds(requestContext);
150+
}
151+
152+
private static void SetObservabilityFeatureIds(IRequestContext requestContext)
153+
{
154+
var config = requestContext.ClientConfig;
155+
156+
if (!(config.TelemetryProvider.TracerProvider is NoOpTracerProvider))
157+
{
158+
requestContext.UserAgentDetails.AddFeature(UserAgentFeatureId.OBSERVABILITY_TRACING);
159+
160+
var tracerType = config.TelemetryProvider.TracerProvider.GetType();
161+
if (tracerType.Namespace.StartsWith("OpenTelemetry.Instrumentation.AWS"))
162+
{
163+
requestContext.UserAgentDetails.AddFeature(UserAgentFeatureId.OBSERVABILITY_OTEL_TRACING);
164+
}
165+
}
166+
167+
if (!(config.TelemetryProvider.MeterProvider is NoOpMeterProvider))
168+
{
169+
requestContext.UserAgentDetails.AddFeature(UserAgentFeatureId.OBSERVABILITY_METRICS);
170+
171+
var meterType = config.TelemetryProvider.MeterProvider.GetType();
172+
if (meterType.Namespace.StartsWith("OpenTelemetry.Instrumentation.AWS"))
173+
{
174+
requestContext.UserAgentDetails.AddFeature(UserAgentFeatureId.OBSERVABILITY_OTEL_METRICS);
175+
}
176+
}
146177
}
147178
}
148179
}

0 commit comments

Comments
 (0)