Skip to content

Commit 99434bc

Browse files
committed
.
1 parent 3af75a0 commit 99434bc

File tree

6 files changed

+61
-1
lines changed

6 files changed

+61
-1
lines changed

dev-packages/browser-integration-tests/suites/tracing/ai-providers/google-genai/test.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,26 @@ sentryTest('manual Google GenAI instrumentation sends gen_ai transactions', asyn
2929
'gen_ai.request.model': 'gemini-1.5-pro',
3030
});
3131
});
32+
33+
sentryTest('manual Google GenAI instrumentation sends embeddings transactions', async ({ getLocalTestUrl, page }) => {
34+
const transactionPromise = waitForTransactionRequest(page, event => {
35+
return !!event.transaction?.includes('text-embedding-004');
36+
});
37+
38+
const url = await getLocalTestUrl({ testDir: __dirname });
39+
await page.goto(url);
40+
41+
const req = await transactionPromise;
42+
43+
const eventData = envelopeRequestParser(req);
44+
45+
// Verify it's a gen_ai embeddings transaction
46+
expect(eventData.transaction).toBe('embeddings text-embedding-004');
47+
expect(eventData.contexts?.trace?.op).toBe('gen_ai.embeddings');
48+
expect(eventData.contexts?.trace?.origin).toBe('auto.ai.google_genai');
49+
expect(eventData.contexts?.trace?.data).toMatchObject({
50+
'gen_ai.operation.name': 'embeddings',
51+
'gen_ai.system': 'google_genai',
52+
'gen_ai.request.model': 'text-embedding-004',
53+
});
54+
});

dev-packages/cloudflare-integration-tests/suites/tracing/google-genai/index.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,13 @@ export default Sentry.withSentry(
5555
],
5656
});
5757

58-
return new Response(JSON.stringify({ chatResponse, modelResponse }));
58+
// Test 3: models.embedContent
59+
const embedResponse = await client.models.embedContent({
60+
model: 'text-embedding-004',
61+
contents: 'Hello world',
62+
});
63+
64+
return new Response(JSON.stringify({ chatResponse, modelResponse, embedResponse }));
5965
},
6066
},
6167
);

dev-packages/cloudflare-integration-tests/suites/tracing/google-genai/mocks.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export class MockGoogleGenAI implements GoogleGenAIClient {
44
public models: {
55
generateContent: (...args: unknown[]) => Promise<GoogleGenAIResponse>;
66
generateContentStream: (...args: unknown[]) => Promise<AsyncGenerator<GoogleGenAIResponse, any, unknown>>;
7+
embedContent: (...args: unknown[]) => Promise<{ embeddings: { values: number[] }[] }>;
78
};
89
public chats: {
910
create: (...args: unknown[]) => GoogleGenAIChat;
@@ -49,6 +50,20 @@ export class MockGoogleGenAI implements GoogleGenAIClient {
4950
},
5051
};
5152
},
53+
embedContent: async (...args: unknown[]) => {
54+
const params = args[0] as { model: string; contents?: unknown };
55+
await new Promise(resolve => setTimeout(resolve, 10));
56+
57+
if (params.model === 'error-model') {
58+
const error = new Error('Model not found');
59+
(error as unknown as { status: number }).status = 404;
60+
throw error;
61+
}
62+
63+
return {
64+
embeddings: [{ values: [0.1, 0.2, 0.3, 0.4, 0.5] }],
65+
};
66+
},
5267
generateContentStream: async () => {
5368
// Return a promise that resolves to an async generator
5469
return (async function* (): AsyncGenerator<GoogleGenAIResponse, any, unknown> {

dev-packages/cloudflare-integration-tests/suites/tracing/google-genai/test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,19 @@ it('traces Google GenAI chat creation and message sending', async () => {
7878
op: 'gen_ai.generate_content',
7979
origin: 'auto.ai.google_genai',
8080
}),
81+
// Fourth span - models.embedContent
82+
expect.objectContaining({
83+
data: expect.objectContaining({
84+
[GEN_AI_OPERATION_NAME_ATTRIBUTE]: 'embeddings',
85+
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'gen_ai.embeddings',
86+
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ai.google_genai',
87+
[GEN_AI_SYSTEM_ATTRIBUTE]: 'google_genai',
88+
[GEN_AI_REQUEST_MODEL_ATTRIBUTE]: 'text-embedding-004',
89+
}),
90+
description: 'embeddings text-embedding-004',
91+
op: 'gen_ai.embeddings',
92+
origin: 'auto.ai.google_genai',
93+
}),
8194
]),
8295
);
8396
})

packages/core/src/tracing/google-genai/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* eslint-disable max-lines */
12
import { captureException } from '../../exports';
23
import { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '../../semanticAttributes';
34
import { SPAN_STATUS_ERROR } from '../../tracing';

packages/core/src/tracing/google-genai/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,8 @@ export interface GoogleGenAIClient {
163163
// https://googleapis.github.io/js-genai/release_docs/classes/models.Models.html#generatecontentstream
164164
// eslint-disable-next-line @typescript-eslint/no-explicit-any
165165
generateContentStream: (...args: unknown[]) => Promise<AsyncGenerator<GenerateContentResponse, any, unknown>>;
166+
// https://googleapis.github.io/js-genai/release_docs/classes/models.Models.html#embedcontent
167+
embedContent: (...args: unknown[]) => Promise<unknown>;
166168
};
167169
chats: {
168170
create: (...args: unknown[]) => GoogleGenAIChat;

0 commit comments

Comments
 (0)