Skip to content

Commit 2f938a6

Browse files
authored
Adding useragent to cosmos client (#1486)
## Why make this change? Fixes #1485 Adds user agent to cosmos client. ## What is this change? Adding user agent to cosmos client. ## How was this tested? - [x] Integration Tests - [ ] Unit Tests
1 parent 24fc8f7 commit 2f938a6

File tree

7 files changed

+115
-20
lines changed

7 files changed

+115
-20
lines changed

src/Cli.Tests/EndToEndTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// Copyright (c) Microsoft Corporation.
22
// Licensed under the MIT License.
3+
using static Azure.DataApiBuilder.Service.Utils;
34

45
namespace Cli.Tests;
56

src/Cli/Program.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using CommandLine;
55
using Microsoft.Extensions.Logging;
6+
using static Azure.DataApiBuilder.Service.Utils;
67
using static Cli.Utils;
78

89
namespace Cli

src/Cli/Utils.cs

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
// Copyright (c) Microsoft Corporation.
22
// Licensed under the MIT License.
33

4-
using System.Diagnostics;
54
using System.Diagnostics.CodeAnalysis;
6-
using System.Reflection;
75
using System.Text.Encodings.Web;
86
using System.Text.Json;
97
using System.Text.Json.Serialization;
@@ -26,7 +24,6 @@ public class Utils
2624
{
2725
public const string WILDCARD = "*";
2826
public static readonly string SEPARATOR = ":";
29-
public const string DEFAULT_VERSION = "1.0.0";
3027

3128
#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
3229
private static ILogger<Utils> _logger;
@@ -37,19 +34,6 @@ public static void SetCliUtilsLogger(ILogger<Utils> cliUtilsLogger)
3734
_logger = cliUtilsLogger;
3835
}
3936

40-
/// <summary>
41-
/// Reads the product version from the executing assembly's file version information.
42-
/// </summary>
43-
/// <returns>Product version if not null, default version 1.0.0 otherwise.</returns>
44-
public static string GetProductVersion()
45-
{
46-
Assembly assembly = Assembly.GetExecutingAssembly();
47-
FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location);
48-
string? version = fileVersionInfo.ProductVersion;
49-
50-
return version ?? DEFAULT_VERSION;
51-
}
52-
5337
/// <summary>
5438
/// Creates the REST object which can be either a boolean value
5539
/// or a RestEntitySettings object containing api route based on the input.
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
using System;
5+
using System.Collections.Generic;
6+
using System.IO.Abstractions;
7+
using System.IO.Abstractions.TestingHelpers;
8+
using Azure.DataApiBuilder.Auth;
9+
using Azure.DataApiBuilder.Service.Authorization;
10+
using Azure.DataApiBuilder.Service.Configurations;
11+
using Azure.DataApiBuilder.Service.Resolvers;
12+
using Azure.DataApiBuilder.Service.Services;
13+
using Azure.DataApiBuilder.Service.Services.MetadataProviders;
14+
using Microsoft.AspNetCore.Mvc.Testing;
15+
using Microsoft.AspNetCore.TestHost;
16+
using Microsoft.Azure.Cosmos;
17+
using Microsoft.Extensions.DependencyInjection;
18+
using Microsoft.Extensions.Logging;
19+
using Microsoft.VisualStudio.TestTools.UnitTesting;
20+
using Moq;
21+
22+
namespace Azure.DataApiBuilder.Service.Tests.CosmosTests
23+
{
24+
[TestClass, TestCategory(TestCategory.COSMOSDBNOSQL)]
25+
public class CosmosClientTests : TestBase
26+
{
27+
[TestMethod]
28+
public void CosmosClientDefaultUserAgent()
29+
{
30+
CosmosClient client = _application.Services.GetService<CosmosClientProvider>().Client;
31+
// Validate results
32+
Assert.AreEqual(client.ClientOptions.ApplicationName,
33+
CosmosClientProvider.DEFAULT_APP_NAME);
34+
}
35+
36+
[TestMethod]
37+
public void CosmosClientEnvUserAgent()
38+
{
39+
40+
MockFileSystem fileSystem = new(new Dictionary<string, MockFileData>()
41+
{
42+
{ @"../schema.gql", new MockFileData(TestBase.GRAPHQL_SCHEMA) }
43+
});
44+
45+
RuntimeConfigProvider runtimeConfigProvider = TestHelper.GetRuntimeConfigProvider(CosmosTestHelper.ConfigPath);
46+
ISqlMetadataProvider cosmosSqlMetadataProvider = new CosmosSqlMetadataProvider(runtimeConfigProvider, fileSystem);
47+
Mock<ILogger<AuthorizationResolver>> authorizationResolverLogger = new();
48+
IAuthorizationResolver authorizationResolverCosmos = new AuthorizationResolver(runtimeConfigProvider, cosmosSqlMetadataProvider, authorizationResolverLogger.Object);
49+
string appName = "gql_dab_cosmos";
50+
Environment.SetEnvironmentVariable(CosmosClientProvider.DAB_APP_NAME_ENV, appName);
51+
WebApplicationFactory<Startup> application = new WebApplicationFactory<Startup>()
52+
.WithWebHostBuilder(builder =>
53+
{
54+
_ = builder.ConfigureTestServices(services =>
55+
{
56+
services.AddSingleton<IFileSystem>(fileSystem);
57+
services.AddSingleton(runtimeConfigProvider);
58+
services.AddSingleton(authorizationResolverCosmos);
59+
});
60+
});
61+
62+
CosmosClient client = application.Services.GetService<CosmosClientProvider>().Client;
63+
// Validate results
64+
Assert.AreEqual(client.ClientOptions.ApplicationName, appName);
65+
}
66+
67+
}
68+
}

src/Service.Tests/CosmosTests/TestBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ namespace Azure.DataApiBuilder.Service.Tests.CosmosTests
2929
public class TestBase
3030
{
3131
internal const string DATABASE_NAME = "graphqldb";
32-
private const string GRAPHQL_SCHEMA = @"
32+
internal const string GRAPHQL_SCHEMA = @"
3333
type Character @model(name:""Character"") {
3434
id : ID,
3535
name : String,

src/Service/Resolvers/CosmosClientProvider.cs

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ public class CosmosClientProvider
2121
private string? _accountEndpoint;
2222
private string? _accountKey;
2323
private readonly string? _accessToken;
24+
public const string DAB_APP_NAME_ENV = "DAB_APP_NAME_ENV";
25+
public static readonly string DEFAULT_APP_NAME = $"dab_oss_{Utils.GetProductVersion()}";
2426

2527
public CosmosClient? Client { get; private set; }
2628
public CosmosClientProvider(RuntimeConfigProvider runtimeConfigProvider)
@@ -58,21 +60,29 @@ private void InitializeClient(RuntimeConfig? configuration)
5860

5961
if (string.IsNullOrEmpty(_connectionString) || configuration.ConnectionString != _connectionString)
6062
{
63+
string userAgent = GetCosmosUserAgent();
64+
CosmosClientOptions options = new()
65+
{
66+
ApplicationName = userAgent
67+
};
68+
6169
_connectionString = configuration.ConnectionString;
6270
ParseCosmosConnectionString();
6371

6472
if (!string.IsNullOrEmpty(_accountKey))
6573
{
66-
Client = new CosmosClientBuilder(_connectionString).WithContentResponseOnWrite(true).Build();
74+
Client = new CosmosClientBuilder(_connectionString).WithContentResponseOnWrite(true)
75+
.WithApplicationName(userAgent)
76+
.Build();
6777
}
6878
else if (string.IsNullOrEmpty(_accessToken))
6979
{
70-
Client = new CosmosClient(_accountEndpoint, new DefaultAzureCredential());
80+
Client = new CosmosClient(_accountEndpoint, new DefaultAzureCredential(), options);
7181
}
7282
else
7383
{
7484
TokenCredential servicePrincipal = new AADTokenCredential(_accessToken);
75-
Client = new CosmosClient(_accountEndpoint, servicePrincipal);
85+
Client = new CosmosClient(_accountEndpoint, servicePrincipal, options);
7686
}
7787
}
7888
}
@@ -117,5 +127,10 @@ private void ParseCosmosConnectionString()
117127
_accountEndpoint = dbConnectionStringBuilder.ContainsKey("AccountEndpoint") ? (string)dbConnectionStringBuilder["AccountEndpoint"] : null;
118128
_accountKey = dbConnectionStringBuilder.ContainsKey("AccountKey") ? (string)dbConnectionStringBuilder["AccountKey"] : null;
119129
}
130+
131+
private static string GetCosmosUserAgent()
132+
{
133+
return Environment.GetEnvironmentVariable(DAB_APP_NAME_ENV) ?? DEFAULT_APP_NAME;
134+
}
120135
}
121136
}

src/Service/Utils.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
using System.Diagnostics;
5+
using System.Reflection;
6+
7+
namespace Azure.DataApiBuilder.Service
8+
{
9+
public class Utils
10+
{
11+
public const string DEFAULT_VERSION = "1.0.0";
12+
13+
/// <summary>
14+
/// Reads the product version from the executing assembly's file version information.
15+
/// </summary>
16+
/// <returns>Product version if not null, default version 1.0.0 otherwise.</returns>
17+
public static string GetProductVersion()
18+
{
19+
Assembly assembly = Assembly.GetExecutingAssembly();
20+
FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(assembly.Location);
21+
string? version = fileVersionInfo.ProductVersion;
22+
23+
return version ?? DEFAULT_VERSION;
24+
}
25+
}
26+
}

0 commit comments

Comments
 (0)