Skip to content

Commit 78bee52

Browse files
committed
Finish
1 parent 970fb2e commit 78bee52

File tree

15 files changed

+1917
-98
lines changed

15 files changed

+1917
-98
lines changed

instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/genai/GenAiAttributesGetter.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public interface GenAiAttributesGetter<REQUEST, RESPONSE> {
5050
@Nullable
5151
Double getRequestTopP(REQUEST request);
5252

53+
@Nullable
5354
List<String> getResponseFinishReasons(REQUEST request, RESPONSE response);
5455

5556
@Nullable
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.openai.v1_1;
7+
8+
import com.openai.client.OpenAIClient;
9+
import com.openai.client.OpenAIClientAsync;
10+
import io.opentelemetry.instrumentation.openai.v1_1.AbstractEmbeddingsTest;
11+
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
12+
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
13+
import io.opentelemetry.sdk.testing.assertj.SpanDataAssert;
14+
import java.util.ArrayList;
15+
import java.util.List;
16+
import java.util.function.Consumer;
17+
import org.junit.jupiter.api.extension.RegisterExtension;
18+
19+
class EmbeddingsTest extends AbstractEmbeddingsTest {
20+
21+
@RegisterExtension
22+
private static final AgentInstrumentationExtension testing =
23+
AgentInstrumentationExtension.create();
24+
25+
@Override
26+
protected InstrumentationExtension getTesting() {
27+
return testing;
28+
}
29+
30+
@Override
31+
protected OpenAIClient wrap(OpenAIClient client) {
32+
return client;
33+
}
34+
35+
@Override
36+
protected OpenAIClientAsync wrap(OpenAIClientAsync client) {
37+
return client;
38+
}
39+
40+
@Override
41+
protected final List<Consumer<SpanDataAssert>> maybeWithTransportSpan(
42+
Consumer<SpanDataAssert> span) {
43+
List<Consumer<SpanDataAssert>> result = new ArrayList<>();
44+
result.add(span);
45+
// Do a very simple assertion since the telemetry is not part of this library.
46+
result.add(s -> s.hasName("POST"));
47+
return result;
48+
}
49+
}

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

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
16
package io.opentelemetry.instrumentation.openai.v1_1;
27

38
import static java.util.Collections.singletonList;
49

5-
import java.util.List;
6-
import javax.annotation.Nullable;
710
import com.openai.models.embeddings.CreateEmbeddingResponse;
811
import com.openai.models.embeddings.EmbeddingCreateParams;
912
import io.opentelemetry.instrumentation.api.incubator.semconv.genai.GenAiAttributesGetter;
13+
import java.util.List;
14+
import javax.annotation.Nullable;
1015

11-
enum EmbeddingAttributesGetter implements GenAiAttributesGetter<EmbeddingCreateParams, CreateEmbeddingResponse> {
16+
enum EmbeddingAttributesGetter
17+
implements GenAiAttributesGetter<EmbeddingCreateParams, CreateEmbeddingResponse> {
1218
INSTANCE;
1319

1420
@Override
@@ -80,23 +86,24 @@ public Double getRequestTopP(EmbeddingCreateParams request) {
8086
return null;
8187
}
8288

89+
@Nullable
8390
@Override
84-
public List<String> getResponseFinishReasons(EmbeddingCreateParams request,
85-
@Nullable CreateEmbeddingResponse response) {
91+
public List<String> getResponseFinishReasons(
92+
EmbeddingCreateParams request, @Nullable CreateEmbeddingResponse response) {
8693
return null;
8794
}
8895

8996
@Nullable
9097
@Override
91-
public String getResponseId(EmbeddingCreateParams request,
92-
@Nullable CreateEmbeddingResponse response) {
98+
public String getResponseId(
99+
EmbeddingCreateParams request, @Nullable CreateEmbeddingResponse response) {
93100
return null;
94101
}
95102

96103
@Nullable
97104
@Override
98-
public String getResponseModel(EmbeddingCreateParams request,
99-
@Nullable CreateEmbeddingResponse response) {
105+
public String getResponseModel(
106+
EmbeddingCreateParams request, @Nullable CreateEmbeddingResponse response) {
100107
if (response == null) {
101108
return null;
102109
}
@@ -105,8 +112,8 @@ public String getResponseModel(EmbeddingCreateParams request,
105112

106113
@Nullable
107114
@Override
108-
public Long getUsageInputTokens(EmbeddingCreateParams request,
109-
@Nullable CreateEmbeddingResponse response) {
115+
public Long getUsageInputTokens(
116+
EmbeddingCreateParams request, @Nullable CreateEmbeddingResponse response) {
110117
if (response == null) {
111118
return null;
112119
}
@@ -115,8 +122,8 @@ public Long getUsageInputTokens(EmbeddingCreateParams request,
115122

116123
@Nullable
117124
@Override
118-
public Long getUsageOutputTokens(EmbeddingCreateParams request,
119-
@Nullable CreateEmbeddingResponse response) {
125+
public Long getUsageOutputTokens(
126+
EmbeddingCreateParams request, @Nullable CreateEmbeddingResponse response) {
120127
return null;
121128
}
122129
}

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,26 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
16
package io.opentelemetry.instrumentation.openai.v1_1;
27

3-
import java.lang.reflect.Method;
48
import com.openai.core.RequestOptions;
59
import com.openai.models.embeddings.CreateEmbeddingResponse;
610
import com.openai.models.embeddings.EmbeddingCreateParams;
711
import com.openai.services.blocking.EmbeddingService;
812
import io.opentelemetry.context.Context;
913
import io.opentelemetry.context.Scope;
1014
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
15+
import java.lang.reflect.Method;
1116

1217
final class InstrumentedEmbeddingService
1318
extends DelegatingInvocationHandler<EmbeddingService, InstrumentedEmbeddingService> {
1419

1520
private final Instrumenter<EmbeddingCreateParams, CreateEmbeddingResponse> instrumenter;
1621

17-
public InstrumentedEmbeddingService(EmbeddingService delegate,
22+
public InstrumentedEmbeddingService(
23+
EmbeddingService delegate,
1824
Instrumenter<EmbeddingCreateParams, CreateEmbeddingResponse> instrumenter) {
1925
super(delegate);
2026
this.instrumenter = instrumenter;

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
16
package io.opentelemetry.instrumentation.openai.v1_1;
27

38
import com.openai.core.RequestOptions;
49
import com.openai.models.embeddings.CreateEmbeddingResponse;
510
import com.openai.models.embeddings.EmbeddingCreateParams;
611
import com.openai.services.async.EmbeddingServiceAsync;
7-
import com.openai.services.blocking.EmbeddingService;
812
import io.opentelemetry.context.Context;
913
import io.opentelemetry.context.Scope;
1014
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
@@ -16,8 +20,9 @@ final class InstrumentedEmbeddingServiceAsync
1620

1721
private final Instrumenter<EmbeddingCreateParams, CreateEmbeddingResponse> instrumenter;
1822

19-
public InstrumentedEmbeddingServiceAsync(EmbeddingServiceAsync delegate,
20-
Instrumenter<EmbeddingCreateParams, CreateEmbeddingResponse> instrumenter) {
23+
public InstrumentedEmbeddingServiceAsync(
24+
EmbeddingServiceAsync delegate,
25+
Instrumenter<EmbeddingCreateParams, CreateEmbeddingResponse> instrumenter) {
2126
super(delegate);
2227
this.instrumenter = instrumenter;
2328
}

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,17 @@ public Object invoke(Object proxy, Method method, Object[] args) throws Throwabl
4949
delegate.chat(), chatInstrumenter, eventLogger, captureMessageContent)
5050
.createProxy();
5151
}
52+
if (methodName.equals("embeddings") && parameterTypes.length == 0) {
53+
return new InstrumentedEmbeddingService(delegate.embeddings(), embeddingInstrumenter)
54+
.createProxy();
55+
}
5256
if (methodName.equals("async") && parameterTypes.length == 0) {
5357
return new InstrumentedOpenAiClientAsync(
54-
delegate.async(), chatInstrumenter, eventLogger, captureMessageContent)
58+
delegate.async(),
59+
chatInstrumenter,
60+
embeddingInstrumenter,
61+
eventLogger,
62+
captureMessageContent)
5563
.createProxy();
5664
}
5765
return super.invoke(proxy, method, args);

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import com.openai.client.OpenAIClientAsync;
99
import com.openai.models.chat.completions.ChatCompletion;
1010
import com.openai.models.chat.completions.ChatCompletionCreateParams;
11+
import com.openai.models.embeddings.CreateEmbeddingResponse;
12+
import com.openai.models.embeddings.EmbeddingCreateParams;
1113
import io.opentelemetry.api.logs.Logger;
1214
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1315
import java.lang.reflect.Method;
@@ -16,16 +18,19 @@ final class InstrumentedOpenAiClientAsync
1618
extends DelegatingInvocationHandler<OpenAIClientAsync, InstrumentedOpenAiClientAsync> {
1719

1820
private final Instrumenter<ChatCompletionCreateParams, ChatCompletion> chatInstrumenter;
21+
private final Instrumenter<EmbeddingCreateParams, CreateEmbeddingResponse> embeddingInstrumenter;
1922
private final Logger eventLogger;
2023
private final boolean captureMessageContent;
2124

2225
InstrumentedOpenAiClientAsync(
2326
OpenAIClientAsync delegate,
2427
Instrumenter<ChatCompletionCreateParams, ChatCompletion> chatInstrumenter,
28+
Instrumenter<EmbeddingCreateParams, CreateEmbeddingResponse> embeddingInstrumenter,
2529
Logger eventLogger,
2630
boolean captureMessageContent) {
2731
super(delegate);
2832
this.chatInstrumenter = chatInstrumenter;
33+
this.embeddingInstrumenter = embeddingInstrumenter;
2934
this.eventLogger = eventLogger;
3035
this.captureMessageContent = captureMessageContent;
3136
}
@@ -44,9 +49,17 @@ public Object invoke(Object proxy, Method method, Object[] args) throws Throwabl
4449
delegate.chat(), chatInstrumenter, eventLogger, captureMessageContent)
4550
.createProxy();
4651
}
52+
if (methodName.equals("embeddings") && parameterTypes.length == 0) {
53+
return new InstrumentedEmbeddingServiceAsync(delegate.embeddings(), embeddingInstrumenter)
54+
.createProxy();
55+
}
4756
if (methodName.equals("sync") && parameterTypes.length == 0) {
4857
return new InstrumentedOpenAiClient(
49-
delegate.sync(), chatInstrumenter, eventLogger, captureMessageContent)
58+
delegate.sync(),
59+
chatInstrumenter,
60+
embeddingInstrumenter,
61+
eventLogger,
62+
captureMessageContent)
5063
.createProxy();
5164
}
5265
return super.invoke(proxy, method, args);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public OpenAIClient wrap(OpenAIClient client) {
5858
/** Wraps the provided OpenAIClientAsync, enabling telemetry for it. */
5959
public OpenAIClientAsync wrap(OpenAIClientAsync client) {
6060
return new InstrumentedOpenAiClientAsync(
61-
client, chatInstrumenter, eventLogger, captureMessageContent)
61+
client, chatInstrumenter, embeddingsInstrumenter, eventLogger, captureMessageContent)
6262
.createProxy();
6363
}
6464
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,13 @@ public OpenAITelemetry build() {
6060
openTelemetry,
6161
INSTRUMENTATION_NAME,
6262
GenAiSpanNameExtractor.create(EmbeddingAttributesGetter.INSTANCE))
63-
.addAttributesExtractor(GenAiAttributesExtractor.create(EmbeddingAttributesGetter.INSTANCE))
63+
.addAttributesExtractor(
64+
GenAiAttributesExtractor.create(EmbeddingAttributesGetter.INSTANCE))
6465
.addOperationMetrics(GenAiClientMetrics.get())
6566
.buildInstrumenter();
6667

6768
Logger eventLogger = openTelemetry.getLogsBridge().get(INSTRUMENTATION_NAME);
68-
return new OpenAITelemetry(chatInstrumenter, embeddingsInstrumenter, eventLogger, captureMessageContent);
69+
return new OpenAITelemetry(
70+
chatInstrumenter, embeddingsInstrumenter, eventLogger, captureMessageContent);
6971
}
7072
}

instrumentation/openai/openai-java-1.1/library/src/test/java/io/opentelemetry/instrumentation/openai/v1_1/EmbeddingsTest.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
16
package io.opentelemetry.instrumentation.openai.v1_1;
27

38
import static java.util.Collections.singletonList;
49

5-
import java.util.List;
6-
import java.util.function.Consumer;
7-
import org.junit.jupiter.api.BeforeAll;
8-
import org.junit.jupiter.api.extension.RegisterExtension;
910
import com.openai.client.OpenAIClient;
1011
import com.openai.client.OpenAIClientAsync;
1112
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
1213
import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension;
1314
import io.opentelemetry.sdk.testing.assertj.SpanDataAssert;
15+
import java.util.List;
16+
import java.util.function.Consumer;
17+
import org.junit.jupiter.api.BeforeAll;
18+
import org.junit.jupiter.api.extension.RegisterExtension;
1419

1520
class EmbeddingsTest extends AbstractEmbeddingsTest {
1621

0 commit comments

Comments
 (0)