mirror of
https://github.com/microsoft/agent-framework.git
synced 2026-06-16 21:04:09 +08:00
0f483fa968
Added CosmosOptionsHelper (in Microsoft.Agents.AI.CosmosNoSql namespace)
that sets CosmosClientOptions.ApplicationName per component, producing
wire-visible UserAgent suffixes:
- CosmosChatHistoryProvider: Microsoft.Agents.CosmosNoSql.ChatHistory/{version}
- CosmosCheckpointStore: Microsoft.Agents.CosmosNoSql.Checkpoint/{version}
This ensures Cosmos DB requests from the Agent Framework are identifiable
in telemetry, enabling usage tracking and diagnostics queries that can
distinguish between chat history and checkpoint workloads.
Addressed review feedback:
- Truncates ApplicationName to 64 chars (Cosmos SDK max length)
- Moved helper to Microsoft.Agents.AI.CosmosNoSql namespace (scoped ownership)
- Uses StringComparison.Ordinal for IndexOf call
When users provide their own CosmosClient instance, the ApplicationName
is not overridden - users retain full control.
Co-authored-by: TheovanKraay <TheovanKraay@users.noreply.github.com>
76 lines
2.6 KiB
C#
76 lines
2.6 KiB
C#
// Copyright (c) Microsoft. All rights reserved.
|
|
|
|
using Microsoft.Agents.AI.CosmosNoSql;
|
|
using Microsoft.Azure.Cosmos;
|
|
|
|
namespace Microsoft.Agents.AI.CosmosNoSql.UnitTests;
|
|
|
|
public sealed class CosmosOptionsHelperTests
|
|
{
|
|
[Fact]
|
|
public void CreateOptions_SetsApplicationName_WithComponentAndVersion()
|
|
{
|
|
// Act
|
|
var options = CosmosOptionsHelper.CreateOptions("CosmosChatHistoryProvider");
|
|
|
|
// Assert
|
|
Assert.NotNull(options.ApplicationName);
|
|
Assert.StartsWith("Microsoft.Agents.AI.CosmosNoSql.CosmosChatHistoryProvider/", options.ApplicationName);
|
|
}
|
|
|
|
[Fact]
|
|
public void CreateOptions_DifferentComponents_ProduceDifferentNames()
|
|
{
|
|
// Act
|
|
var chatOptions = CosmosOptionsHelper.CreateOptions("CosmosChatHistoryProvider");
|
|
var checkpointOptions = CosmosOptionsHelper.CreateOptions("CosmosCheckpointStore");
|
|
|
|
// Assert
|
|
Assert.NotEqual(chatOptions.ApplicationName, checkpointOptions.ApplicationName);
|
|
Assert.Contains("CosmosChatHistoryProvider", chatOptions.ApplicationName);
|
|
Assert.Contains("CosmosCheckpointStore", checkpointOptions.ApplicationName);
|
|
}
|
|
|
|
[Fact]
|
|
public void CreateOptions_ApplicationName_DoesNotExceedMaxLength()
|
|
{
|
|
// Use a deliberately long component name to trigger truncation
|
|
var longComponent = new string('X', 100);
|
|
|
|
// Act
|
|
var options = CosmosOptionsHelper.CreateOptions(longComponent);
|
|
|
|
// Assert
|
|
Assert.True(options.ApplicationName!.Length <= 64,
|
|
$"ApplicationName length {options.ApplicationName.Length} exceeds max 64");
|
|
}
|
|
|
|
[Fact]
|
|
public void EnsureApplicationName_SetsName_WhenClientHasNone()
|
|
{
|
|
// Arrange
|
|
var clientOptions = new CosmosClientOptions();
|
|
Assert.Null(clientOptions.ApplicationName);
|
|
|
|
// Act
|
|
var options = CosmosOptionsHelper.CreateOptions("CosmosChatHistoryProvider");
|
|
|
|
// Assert - verify the returned options have ApplicationName set
|
|
Assert.NotNull(options.ApplicationName);
|
|
Assert.NotEmpty(options.ApplicationName);
|
|
}
|
|
|
|
[Fact]
|
|
public void CreateOptions_ApplicationName_ContainsVersion()
|
|
{
|
|
// Act
|
|
var options = CosmosOptionsHelper.CreateOptions("CosmosChatHistoryProvider");
|
|
|
|
// Assert - should contain a "/" followed by version info
|
|
Assert.Contains("/", options.ApplicationName);
|
|
var parts = options.ApplicationName!.Split('/');
|
|
Assert.Equal(2, parts.Length);
|
|
Assert.False(string.IsNullOrWhiteSpace(parts[1]), "Version portion should not be empty");
|
|
}
|
|
}
|