|
1 | 1 | using Microsoft.VisualStudio.TestPlatform.ObjectModel; |
2 | 2 | using NUnit.Framework; |
3 | 3 | using OpenAI.Chat; |
| 4 | +using OpenAI.Tests.Telemetry; |
4 | 5 | using OpenAI.Tests.Utility; |
5 | 6 | using System; |
6 | 7 | using System.ClientModel; |
|
12 | 13 | using System.Net; |
13 | 14 | using System.Text.Json; |
14 | 15 | using System.Threading.Tasks; |
| 16 | +using static OpenAI.Tests.Telemetry.TestMeterListener; |
15 | 17 | using static OpenAI.Tests.TestHelpers; |
16 | 18 |
|
17 | 19 | namespace OpenAI.Tests.Chat; |
@@ -334,4 +336,39 @@ public async Task JsonResult() |
334 | 336 | Assert.That(greenProperty.GetString().ToLowerInvariant(), Contains.Substring("00ff00")); |
335 | 337 | Assert.That(blueProperty.GetString().ToLowerInvariant(), Contains.Substring("0000ff")); |
336 | 338 | } |
| 339 | + |
| 340 | + |
| 341 | + [Test] |
| 342 | + [NonParallelizable] |
| 343 | + public async Task HelloWorldChatWithTracingAndMetrics() |
| 344 | + { |
| 345 | + using var _ = TestAppContextSwitchHelper.EnableOpenTelemetry(); |
| 346 | + using TestActivityListener activityListener = new TestActivityListener("OpenAI.ChatClient"); |
| 347 | + using TestMeterListener meterListener = new TestMeterListener("OpenAI.ChatClient"); |
| 348 | + |
| 349 | + ChatClient client = GetTestClient<ChatClient>(TestScenario.Chat); |
| 350 | + IEnumerable<ChatMessage> messages = [new UserChatMessage("Hello, world!")]; |
| 351 | + ClientResult<ChatCompletion> result = IsAsync |
| 352 | + ? await client.CompleteChatAsync(messages) |
| 353 | + : client.CompleteChat(messages); |
| 354 | + |
| 355 | + Assert.AreEqual(1, activityListener.Activities.Count); |
| 356 | + TestActivityListener.ValidateChatActivity(activityListener.Activities.Single(), result.Value); |
| 357 | + |
| 358 | + List<TestMeasurement> durations = meterListener.GetMeasurements("gen_ai.client.operation.duration"); |
| 359 | + Assert.AreEqual(1, durations.Count); |
| 360 | + ValidateChatMetricTags(durations.Single(), result.Value); |
| 361 | + |
| 362 | + List<TestMeasurement> usages = meterListener.GetMeasurements("gen_ai.client.token.usage"); |
| 363 | + Assert.AreEqual(2, usages.Count); |
| 364 | + |
| 365 | + Assert.True(usages[0].tags.TryGetValue("gen_ai.token.type", out var type)); |
| 366 | + Assert.IsInstanceOf<string>(type); |
| 367 | + |
| 368 | + TestMeasurement input = (type is "input") ? usages[0] : usages[1]; |
| 369 | + TestMeasurement output = (type is "input") ? usages[1] : usages[0]; |
| 370 | + |
| 371 | + Assert.AreEqual(result.Value.Usage.InputTokens, input.value); |
| 372 | + Assert.AreEqual(result.Value.Usage.OutputTokens, output.value); |
| 373 | + } |
337 | 374 | } |
0 commit comments