Skip to content

Commit 2f5ad29

Browse files
committed
Fix
1 parent 2a482b2 commit 2f5ad29

File tree

5 files changed

+74
-39
lines changed

5 files changed

+74
-39
lines changed

instrumentation/openai/openai-java-1.1/library/src/main/java/io/opentelemetry/instrumentation/openai/v1_1/EmbeddingAttributesGetter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ enum EmbeddingAttributesGetter
1919

2020
@Override
2121
public String getOperationName(EmbeddingCreateParams request) {
22-
return GenAiAttributes.GenAiOperationNameIncubatingValues.EMBEDDING;
22+
return GenAiAttributes.GenAiOperationNameIncubatingValues.EMBEDDINGS;
2323
}
2424

2525
@Override

instrumentation/openai/openai-java-1.1/library/src/main/java/io/opentelemetry/instrumentation/openai/v1_1/GenAiAttributes.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ final class GenAiAttributes {
1515

1616
static final class GenAiOperationNameIncubatingValues {
1717
static final String CHAT = "chat";
18-
static final String EMBEDDING = "embeddings";
18+
static final String EMBEDDINGS = "embeddings";
1919

2020
private GenAiOperationNameIncubatingValues() {}
2121
}

instrumentation/openai/openai-java-1.1/library/src/main/java/io/opentelemetry/instrumentation/openai/v1_1/OpenAITelemetryBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import io.opentelemetry.instrumentation.api.incubator.semconv.genai.GenAiClientMetrics;
1717
import io.opentelemetry.instrumentation.api.incubator.semconv.genai.GenAiSpanNameExtractor;
1818
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
19+
import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor;
1920

2021
/** A builder of {@link OpenAITelemetry}. */
2122
@SuppressWarnings("IdentifierName") // Want to match library's convention
@@ -63,7 +64,7 @@ public OpenAITelemetry build() {
6364
.addAttributesExtractor(
6465
GenAiAttributesExtractor.create(EmbeddingAttributesGetter.INSTANCE))
6566
.addOperationMetrics(GenAiClientMetrics.get())
66-
.buildInstrumenter();
67+
.buildInstrumenter(SpanKindExtractor.alwaysClient());
6768

6869
Logger eventLogger = openTelemetry.getLogsBridge().get(INSTRUMENTATION_NAME);
6970
return new OpenAITelemetry(

instrumentation/openai/openai-java-1.1/testing/src/main/java/io/opentelemetry/instrumentation/openai/v1_1/AbstractEmbeddingsTest.java

Lines changed: 47 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package io.opentelemetry.instrumentation.openai.v1_1;
77

88
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
9+
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies;
910
import static io.opentelemetry.semconv.incubating.GenAiIncubatingAttributes.GEN_AI_OPERATION_NAME;
1011
import static io.opentelemetry.semconv.incubating.GenAiIncubatingAttributes.GEN_AI_REQUEST_ENCODING_FORMATS;
1112
import static io.opentelemetry.semconv.incubating.GenAiIncubatingAttributes.GEN_AI_REQUEST_MODEL;
@@ -85,16 +86,27 @@ void basic() {
8586
getTesting()
8687
.waitAndAssertTraces(
8788
trace ->
88-
maybeWithTransportSpan(
89-
span ->
90-
span.hasName("embeddings text-embedding-3-small")
91-
.hasKind(SpanKind.CLIENT)
92-
.hasAttributesSatisfyingExactly(
93-
equalTo(GEN_AI_SYSTEM, OPENAI),
94-
equalTo(GEN_AI_OPERATION_NAME, EMBEDDINGS),
95-
equalTo(GEN_AI_REQUEST_MODEL, MODEL),
96-
equalTo(GEN_AI_RESPONSE_MODEL, MODEL),
97-
equalTo(GEN_AI_USAGE_INPUT_TOKENS, 4))));
89+
trace.hasSpansSatisfyingExactly(
90+
maybeWithTransportSpan(
91+
span ->
92+
span.hasName("embeddings text-embedding-3-small")
93+
.hasKind(SpanKind.CLIENT)
94+
.hasAttributesSatisfyingExactly(
95+
equalTo(GEN_AI_SYSTEM, OPENAI),
96+
equalTo(GEN_AI_OPERATION_NAME, EMBEDDINGS),
97+
equalTo(GEN_AI_REQUEST_MODEL, MODEL),
98+
equalTo(GEN_AI_RESPONSE_MODEL, MODEL),
99+
equalTo(GEN_AI_USAGE_INPUT_TOKENS, 4),
100+
// Newer versions of the library populate base64 when unset by
101+
// the user.
102+
satisfies(
103+
GEN_AI_REQUEST_ENCODING_FORMATS,
104+
val ->
105+
val.satisfiesAnyOf(
106+
v -> assertThat(v).isNull(),
107+
v ->
108+
assertThat(v)
109+
.isEqualTo(singletonList("base64"))))))));
98110

99111
getTesting()
100112
.waitAndAssertMetrics(
@@ -147,17 +159,19 @@ void allTheClientOptions() {
147159
getTesting()
148160
.waitAndAssertTraces(
149161
trace ->
150-
maybeWithTransportSpan(
151-
span ->
152-
span.hasName("embeddings text-embedding-3-small")
153-
.hasKind(SpanKind.CLIENT)
154-
.hasAttributesSatisfyingExactly(
155-
equalTo(GEN_AI_SYSTEM, OPENAI),
156-
equalTo(GEN_AI_OPERATION_NAME, EMBEDDINGS),
157-
equalTo(GEN_AI_REQUEST_MODEL, MODEL),
158-
equalTo(GEN_AI_REQUEST_ENCODING_FORMATS, singletonList("base64")),
159-
equalTo(GEN_AI_RESPONSE_MODEL, MODEL),
160-
equalTo(GEN_AI_USAGE_INPUT_TOKENS, 4))));
162+
trace.hasSpansSatisfyingExactly(
163+
maybeWithTransportSpan(
164+
span ->
165+
span.hasName("embeddings text-embedding-3-small")
166+
.hasKind(SpanKind.CLIENT)
167+
.hasAttributesSatisfyingExactly(
168+
equalTo(GEN_AI_SYSTEM, OPENAI),
169+
equalTo(GEN_AI_OPERATION_NAME, EMBEDDINGS),
170+
equalTo(GEN_AI_REQUEST_MODEL, MODEL),
171+
equalTo(
172+
GEN_AI_REQUEST_ENCODING_FORMATS, singletonList("base64")),
173+
equalTo(GEN_AI_RESPONSE_MODEL, MODEL),
174+
equalTo(GEN_AI_USAGE_INPUT_TOKENS, 4)))));
161175

162176
getTesting()
163177
.waitAndAssertMetrics(
@@ -226,11 +240,22 @@ void connectionError() {
226240
maybeWithTransportSpan(
227241
span ->
228242
span.hasName("embeddings text-embedding-3-small")
243+
.hasKind(SpanKind.CLIENT)
229244
.hasException(thrown)
230245
.hasAttributesSatisfyingExactly(
231246
equalTo(GEN_AI_SYSTEM, OPENAI),
232247
equalTo(GEN_AI_OPERATION_NAME, EMBEDDINGS),
233-
equalTo(GEN_AI_REQUEST_MODEL, MODEL)))));
248+
equalTo(GEN_AI_REQUEST_MODEL, MODEL),
249+
// Newer versions of the library populate base64 when unset by
250+
// the user.
251+
satisfies(
252+
GEN_AI_REQUEST_ENCODING_FORMATS,
253+
val ->
254+
val.satisfiesAnyOf(
255+
v -> assertThat(v).isNull(),
256+
v ->
257+
assertThat(v)
258+
.isEqualTo(singletonList("base64"))))))));
234259

235260
getTesting()
236261
.waitAndAssertMetrics(

instrumentation/openai/openai-java-1.1/testing/src/main/java/io/opentelemetry/instrumentation/openai/v1_1/AbstractOpenAiTest.java

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,26 +41,35 @@ enum TestType {
4141

4242
protected abstract OpenAIClientAsync wrap(OpenAIClientAsync client);
4343

44+
private OpenAIClient rawClient;
45+
private OpenAIClientAsync rawClientAsync;
46+
4447
protected final OpenAIClient getRawClient() {
45-
OpenAIOkHttpClient.Builder builder =
46-
OpenAIOkHttpClient.builder().baseUrl("http://localhost:" + recording.getPort());
47-
if (recording.isRecording()) {
48-
builder.apiKey(System.getenv("OPENAI_API_KEY"));
49-
} else {
50-
builder.apiKey("unused");
48+
if (rawClient == null) {
49+
OpenAIOkHttpClient.Builder builder =
50+
OpenAIOkHttpClient.builder().baseUrl("http://localhost:" + recording.getPort());
51+
if (recording.isRecording()) {
52+
builder.apiKey(System.getenv("OPENAI_API_KEY"));
53+
} else {
54+
builder.apiKey("unused");
55+
}
56+
rawClient = builder.build();
5157
}
52-
return builder.build();
58+
return rawClient;
5359
}
5460

5561
protected final OpenAIClientAsync getRawClientAsync() {
56-
OpenAIOkHttpClientAsync.Builder builder =
57-
OpenAIOkHttpClientAsync.builder().baseUrl("http://localhost:" + recording.getPort());
58-
if (recording.isRecording()) {
59-
builder.apiKey(System.getenv("OPENAI_API_KEY"));
60-
} else {
61-
builder.apiKey("unused");
62+
if (rawClientAsync == null) {
63+
OpenAIOkHttpClientAsync.Builder builder =
64+
OpenAIOkHttpClientAsync.builder().baseUrl("http://localhost:" + recording.getPort());
65+
if (recording.isRecording()) {
66+
builder.apiKey(System.getenv("OPENAI_API_KEY"));
67+
} else {
68+
builder.apiKey("unused");
69+
}
70+
rawClientAsync = builder.build();
6271
}
63-
return builder.build();
72+
return rawClientAsync;
6473
}
6574

6675
protected final OpenAIClient getClient() {

0 commit comments

Comments
 (0)