Skip to content

Commit 01747d7

Browse files
Rename TracingHelper to ObservabilityHelper
The package was also renamed as well as one of the methods in the class: concatenateMaps -> concatenateEntries. ObservabilityHelperTests was also added.
1 parent 879f30d commit 01747d7

File tree

7 files changed

+73
-19
lines changed

7 files changed

+73
-19
lines changed

spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/observation/ChatClientPromptContentObservationFilter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import io.micrometer.observation.Observation;
2020
import io.micrometer.observation.ObservationFilter;
2121
import org.springframework.ai.chat.observation.ChatModelObservationDocumentation;
22-
import org.springframework.ai.observation.tracing.TracingHelper;
22+
import org.springframework.ai.observation.ObservabilityHelper;
2323
import org.springframework.util.CollectionUtils;
2424

2525
import java.util.HashMap;
@@ -44,7 +44,7 @@ public Observation.Context map(Observation.Context context) {
4444

4545
chatClientObservationContext
4646
.addHighCardinalityKeyValue(ChatModelObservationDocumentation.HighCardinalityKeyNames.PROMPT
47-
.withValue(TracingHelper.concatenateMaps(prompts)));
47+
.withValue(ObservabilityHelper.concatenateEntries(prompts)));
4848

4949
return chatClientObservationContext;
5050
}

spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/observation/DefaultChatClientObservationConvention.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,21 @@
1616

1717
package org.springframework.ai.chat.client.observation;
1818

19-
import java.util.ArrayList;
20-
2119
import io.micrometer.common.KeyValue;
2220
import io.micrometer.common.KeyValues;
23-
2421
import org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor;
2522
import org.springframework.ai.chat.client.advisor.api.Advisor;
2623
import org.springframework.ai.chat.client.observation.ChatClientObservationDocumentation.LowCardinalityKeyNames;
2724
import org.springframework.ai.chat.observation.ChatModelObservationDocumentation;
2825
import org.springframework.ai.model.tool.ToolCallingChatOptions;
26+
import org.springframework.ai.observation.ObservabilityHelper;
2927
import org.springframework.ai.observation.conventions.SpringAiKind;
30-
import org.springframework.ai.observation.tracing.TracingHelper;
3128
import org.springframework.lang.Nullable;
3229
import org.springframework.util.CollectionUtils;
3330
import org.springframework.util.StringUtils;
3431

32+
import java.util.ArrayList;
33+
3534
/**
3635
* Default conventions to populate observations for chat client workflows.
3736
*
@@ -103,7 +102,7 @@ protected KeyValues advisors(KeyValues keyValues, ChatClientObservationContext c
103102
}
104103
var advisorNames = context.getAdvisors().stream().map(Advisor::getName).toList();
105104
return keyValues.and(ChatClientObservationDocumentation.HighCardinalityKeyNames.CHAT_CLIENT_ADVISORS.asString(),
106-
TracingHelper.concatenateStrings(advisorNames));
105+
ObservabilityHelper.concatenateStrings(advisorNames));
107106
}
108107

109108
protected KeyValues conversationId(KeyValues keyValues, ChatClientObservationContext context) {
@@ -143,7 +142,7 @@ protected KeyValues tools(KeyValues keyValues, ChatClientObservationContext cont
143142

144143
return keyValues.and(
145144
ChatClientObservationDocumentation.HighCardinalityKeyNames.CHAT_CLIENT_TOOL_NAMES.asString(),
146-
TracingHelper.concatenateStrings(toolNames.stream().sorted().toList()));
145+
ObservabilityHelper.concatenateStrings(toolNames.stream().sorted().toList()));
147146
}
148147

149148
}
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,23 @@
1414
* limitations under the License.
1515
*/
1616

17-
package org.springframework.ai.observation.tracing;
17+
package org.springframework.ai.observation;
1818

1919
import java.util.List;
2020
import java.util.Map;
2121
import java.util.StringJoiner;
2222

2323
/**
24-
* Utilities to prepare and process traces for observability.
24+
* Utilities for observability.
2525
*
2626
* @author Thomas Vitale
2727
*/
28-
public final class TracingHelper {
28+
public final class ObservabilityHelper {
2929

30-
private TracingHelper() {
30+
private ObservabilityHelper() {
3131
}
3232

33-
public static String concatenateMaps(Map<String, Object> keyValues) {
33+
public static String concatenateEntries(Map<String, Object> keyValues) {
3434
var keyValuesJoiner = new StringJoiner(", ", "[", "]");
3535
keyValues.forEach((key, value) -> keyValuesJoiner.add("\"" + key + "\":\"" + value + "\""));
3636
return keyValuesJoiner.toString();
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* Copyright 2023-2025 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.ai.observation;
18+
19+
import org.junit.jupiter.api.Test;
20+
21+
import java.util.List;
22+
import java.util.Map;
23+
import java.util.TreeMap;
24+
25+
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
26+
27+
/**
28+
* Unit tests for {@link ObservabilityHelper}.
29+
*
30+
* @author Jonatan Ivanov
31+
*/
32+
class ObservabilityHelperTests {
33+
34+
@Test
35+
void shouldGetEmptyBracketsForEmptyMap() {
36+
assertThat(ObservabilityHelper.concatenateEntries(Map.of())).isEqualTo("[]");
37+
}
38+
39+
@Test
40+
void shouldGetEntriesForNonEmptyMap() {
41+
TreeMap<String, Object> map = new TreeMap<>(Map.of("a", "1", "b", "2"));
42+
assertThat(ObservabilityHelper.concatenateEntries(map)).isEqualTo("[\"a\":\"1\", \"b\":\"2\"]");
43+
}
44+
45+
@Test
46+
void shouldGetEmptyBracketsForEmptyList() {
47+
assertThat(ObservabilityHelper.concatenateStrings(List.of())).isEqualTo("[]");
48+
}
49+
50+
@Test
51+
void shouldGetEntriesForNonEmptyList() {
52+
assertThat(ObservabilityHelper.concatenateStrings(List.of("a", "b"))).isEqualTo("[\"a\", \"b\"]");
53+
}
54+
55+
}

spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationFilter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import io.micrometer.observation.Observation;
2020
import io.micrometer.observation.ObservationFilter;
2121

22-
import org.springframework.ai.observation.tracing.TracingHelper;
22+
import org.springframework.ai.observation.ObservabilityHelper;
2323

2424
/**
2525
* An {@link ObservationFilter} to include the chat completion content in the observation.
@@ -39,7 +39,7 @@ public Observation.Context map(Observation.Context context) {
3939

4040
chatModelObservationContext
4141
.addHighCardinalityKeyValue(ChatModelObservationDocumentation.HighCardinalityKeyNames.COMPLETION
42-
.withValue(TracingHelper.concatenateStrings(completions)));
42+
.withValue(ObservabilityHelper.concatenateStrings(completions)));
4343

4444
return chatModelObservationContext;
4545
}

spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationFilter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import io.micrometer.observation.Observation;
2020
import io.micrometer.observation.ObservationFilter;
2121

22-
import org.springframework.ai.observation.tracing.TracingHelper;
22+
import org.springframework.ai.observation.ObservabilityHelper;
2323

2424
/**
2525
* An {@link ObservationFilter} to include the chat prompt content in the observation.
@@ -39,7 +39,7 @@ public Observation.Context map(Observation.Context context) {
3939

4040
chatModelObservationContext
4141
.addHighCardinalityKeyValue(ChatModelObservationDocumentation.HighCardinalityKeyNames.PROMPT
42-
.withValue(TracingHelper.concatenateStrings(prompts)));
42+
.withValue(ObservabilityHelper.concatenateStrings(prompts)));
4343

4444
return chatModelObservationContext;
4545
}

spring-ai-vector-store/src/main/java/org/springframework/ai/vectorstore/observation/VectorStoreQueryResponseObservationFilter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import io.micrometer.observation.Observation;
2020
import io.micrometer.observation.ObservationFilter;
2121

22-
import org.springframework.ai.observation.tracing.TracingHelper;
22+
import org.springframework.ai.observation.ObservabilityHelper;
2323
import org.springframework.util.CollectionUtils;
2424

2525
/**
@@ -44,7 +44,7 @@ public Observation.Context map(Observation.Context context) {
4444
if (!CollectionUtils.isEmpty(documents)) {
4545
observationContext.addHighCardinalityKeyValue(
4646
VectorStoreObservationDocumentation.HighCardinalityKeyNames.DB_VECTOR_QUERY_RESPONSE_DOCUMENTS
47-
.withValue(TracingHelper.concatenateStrings(documents)));
47+
.withValue(ObservabilityHelper.concatenateStrings(documents)));
4848
}
4949

5050
return observationContext;

0 commit comments

Comments
 (0)