Skip to content

Commit 13d2074

Browse files
tzolovilayaperumalg
authored andcommitted
feat(spring-ai): add operation type and provider metrics to advisor observations
Add AI_OPERATION_TYPE and AI_PROVIDER as low cardinality key names to advisor observations. The advisor AI_OPERATION_TYPE is set to 'framework' and the AI_PROVIDER to 'spring_ai'. Resolves #1660
1 parent 379f212 commit 13d2074

File tree

3 files changed

+38
-1
lines changed

3 files changed

+38
-1
lines changed

spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/observation/AdvisorObservationDocumentation.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import io.micrometer.observation.ObservationConvention;
2222
import io.micrometer.observation.docs.ObservationDocumentation;
2323

24+
import org.springframework.ai.observation.conventions.AiObservationAttributes;
25+
2426
/**
2527
* AI Advisor observation documentation.
2628
*
@@ -55,6 +57,26 @@ public KeyName[] getHighCardinalityKeyNames() {
5557
*/
5658
public enum LowCardinalityKeyNames implements KeyName {
5759

60+
/**
61+
* The name of the operation being performed.
62+
*/
63+
AI_OPERATION_TYPE {
64+
@Override
65+
public String asString() {
66+
return AiObservationAttributes.AI_OPERATION_TYPE.value();
67+
}
68+
},
69+
70+
/**
71+
* The model provider as identified by the client instrumentation.
72+
*/
73+
AI_PROVIDER {
74+
@Override
75+
public String asString() {
76+
return AiObservationAttributes.AI_PROVIDER.value();
77+
}
78+
},
79+
5880
/**
5981
* Spring AI kind.
6082
*/

spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/observation/DefaultAdvisorObservationConvention.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121

2222
import org.springframework.ai.chat.client.advisor.observation.AdvisorObservationDocumentation.HighCardinalityKeyNames;
2323
import org.springframework.ai.chat.client.advisor.observation.AdvisorObservationDocumentation.LowCardinalityKeyNames;
24+
import org.springframework.ai.observation.conventions.AiOperationType;
25+
import org.springframework.ai.observation.conventions.AiProvider;
2426
import org.springframework.ai.observation.conventions.SpringAiKind;
2527
import org.springframework.ai.util.ParsingUtils;
2628
import org.springframework.lang.Nullable;
@@ -64,7 +66,16 @@ public String getContextualName(AdvisorObservationContext context) {
6466

6567
@Override
6668
public KeyValues getLowCardinalityKeyValues(AdvisorObservationContext context) {
67-
return KeyValues.of(springAiKind(), advisorType(context), advisorName(context));
69+
return KeyValues.of(aiOperationType(context), aiProvider(context), springAiKind(), advisorType(context),
70+
advisorName(context));
71+
}
72+
73+
protected KeyValue aiOperationType(AdvisorObservationContext context) {
74+
return KeyValue.of(LowCardinalityKeyNames.AI_OPERATION_TYPE, AiOperationType.FRAMEWORK.value());
75+
}
76+
77+
protected KeyValue aiProvider(AdvisorObservationContext context) {
78+
return KeyValue.of(LowCardinalityKeyNames.AI_PROVIDER, AiProvider.SPRING_AI.value());
6879
}
6980

7081
protected KeyValue advisorType(AdvisorObservationContext context) {

spring-ai-core/src/test/java/org/springframework/ai/chat/client/advisor/observation/DefaultAdvisorObservationConventionTests.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222

2323
import org.springframework.ai.chat.client.advisor.observation.AdvisorObservationDocumentation.HighCardinalityKeyNames;
2424
import org.springframework.ai.chat.client.advisor.observation.AdvisorObservationDocumentation.LowCardinalityKeyNames;
25+
import org.springframework.ai.observation.conventions.AiOperationType;
26+
import org.springframework.ai.observation.conventions.AiProvider;
2527
import org.springframework.ai.observation.conventions.SpringAiKind;
2628

2729
import static org.assertj.core.api.Assertions.assertThat;
@@ -69,6 +71,8 @@ void shouldHaveLowCardinalityKeyValuesWhenDefined() {
6971
assertThat(this.observationConvention.getLowCardinalityKeyValues(observationContext)).contains(
7072
KeyValue.of(LowCardinalityKeyNames.ADVISOR_TYPE.asString(),
7173
AdvisorObservationContext.Type.AROUND.name()),
74+
KeyValue.of(LowCardinalityKeyNames.AI_OPERATION_TYPE.asString(), AiOperationType.FRAMEWORK.value()),
75+
KeyValue.of(LowCardinalityKeyNames.AI_PROVIDER.asString(), AiProvider.SPRING_AI.value()),
7276
KeyValue.of(LowCardinalityKeyNames.ADVISOR_NAME.asString(), "MyName"),
7377
KeyValue.of(LowCardinalityKeyNames.SPRING_AI_KIND.asString(), SpringAiKind.ADVISOR.value()));
7478
}

0 commit comments

Comments
 (0)