Skip to content

Commit 0d8e54f

Browse files
committed
Add the Databricks Opentelemetry
1 parent 4d7cd11 commit 0d8e54f

38 files changed

Lines changed: 3472 additions & 1346 deletions

File tree

agents/agent-ai-sdk/package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,22 @@
1919
"@types/aws-lambda": "^8.10.161",
2020
"@types/node": "^24.12.2",
2121
"@vitest/eslint-plugin": "^1.6.16",
22-
"aws-cdk": "^2.1118.2",
22+
"aws-cdk": "^2.1118.4",
2323
"esbuild": "^0.27.7",
24-
"eslint": "^10.2.0",
24+
"eslint": "^10.2.1",
2525
"eslint-import-resolver-typescript": "^4.4.4",
2626
"eslint-plugin-awscdk": "^4.3.2",
2727
"eslint-plugin-import-x": "^4.16.2",
2828
"eslint-plugin-promise": "^7.2.1",
2929
"jiti": "^2.6.1",
3030
"tsx": "^4.21.0",
3131
"typescript": "^5.9.3",
32-
"typescript-eslint": "^8.58.2",
33-
"vite": "^8.0.8",
34-
"vitest": "^4.1.4"
32+
"typescript-eslint": "^8.59.0",
33+
"vite": "^8.0.9",
34+
"vitest": "^4.1.5"
3535
},
3636
"dependencies": {
37-
"@ai-sdk/amazon-bedrock": "^4.0.95",
37+
"@ai-sdk/amazon-bedrock": "^4.0.96",
3838
"@ai-sdk/azure": "^3.0.54",
3939
"@llm-ts-example/common-backend-core": "workspace:*",
4040
"@llm-ts-example/common-core": "workspace:*",

agents/agent-claude-agent-sdk/package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,19 @@
2121
"@vitest/eslint-plugin": "^1.6.16",
2222
"dotenv": "^17.4.2",
2323
"esbuild": "^0.27.7",
24-
"eslint": "^10.2.0",
24+
"eslint": "^10.2.1",
2525
"eslint-import-resolver-typescript": "^4.4.4",
2626
"eslint-plugin-import-x": "^4.16.2",
2727
"eslint-plugin-promise": "^7.2.1",
2828
"jiti": "^2.6.1",
2929
"tsx": "^4.21.0",
3030
"typescript": "^5.9.3",
31-
"typescript-eslint": "^8.58.2",
32-
"vite": "^8.0.8",
33-
"vitest": "^4.1.4"
31+
"typescript-eslint": "^8.59.0",
32+
"vite": "^8.0.9",
33+
"vitest": "^4.1.5"
3434
},
3535
"dependencies": {
36-
"@anthropic-ai/claude-agent-sdk": "^0.2.112",
36+
"@anthropic-ai/claude-agent-sdk": "^0.2.117",
3737
"source-map-support": "^0.5.21",
3838
"uuid": "^14.0.0",
3939
"zod": "^4.3.6"

agents/agent-deepagents/package.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
"@opentelemetry/exporter-trace-otlp-http": "^0.214.0",
2020
"@opentelemetry/exporter-trace-otlp-proto": "^0.214.0",
2121
"@opentelemetry/instrumentation": "^0.214.0",
22-
"@opentelemetry/resources": "^2.6.1",
22+
"@opentelemetry/resources": "^2.7.0",
2323
"@opentelemetry/sdk-node": "^0.214.0",
24-
"@opentelemetry/sdk-trace-base": "^2.6.1",
25-
"@opentelemetry/sdk-trace-node": "^2.6.1",
24+
"@opentelemetry/sdk-trace-base": "^2.7.0",
25+
"@opentelemetry/sdk-trace-node": "^2.7.0",
2626
"@opentelemetry/semantic-conventions": "^1.40.0",
2727
"@traceloop/node-server-sdk": "^0.25.0",
2828
"deepagents": "^1.9.0",
@@ -34,15 +34,15 @@
3434
"@eslint/js": "^10.0.1",
3535
"@stylistic/eslint-plugin": "^5.10.0",
3636
"@types/node": "^24.12.2",
37-
"eslint": "^10.2.0",
37+
"eslint": "^10.2.1",
3838
"eslint-import-resolver-typescript": "^4.4.4",
3939
"eslint-plugin-import-x": "^4.16.2",
4040
"eslint-plugin-promise": "^7.2.1",
4141
"langchain": "^1.3.3",
4242
"tsx": "^4.21.0",
4343
"typescript": "^5.9.3",
44-
"typescript-eslint": "^8.58.2",
45-
"vite": "^8.0.8",
46-
"vitest": "^4.1.4"
44+
"typescript-eslint": "^8.59.0",
45+
"vite": "^8.0.9",
46+
"vitest": "^4.1.5"
4747
}
4848
}

agents/agent-langchain-nextjs/package.json

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
"dependencies": {
1313
"@ai-sdk/langchain": "^2.0.174",
1414
"@ai-sdk/react": "^3.0.170",
15-
"@arizeai/openinference-instrumentation-bedrock": "^0.4.10",
16-
"@arizeai/openinference-instrumentation-langchain": "^4.0.8",
15+
"@arizeai/openinference-instrumentation-bedrock": "^0.4.11",
16+
"@arizeai/openinference-instrumentation-langchain": "^4.0.9",
1717
"@aws-lambda-powertools/logger": "^2.33.0",
1818
"@aws-sdk/credential-provider-node": "^3.972.36",
1919
"@langchain/aws": "^1.3.5",
@@ -28,12 +28,12 @@
2828
"@opentelemetry/exporter-trace-otlp-http": "^0.214.0",
2929
"@opentelemetry/exporter-trace-otlp-proto": "^0.214.0",
3030
"@opentelemetry/instrumentation": "^0.214.0",
31-
"@opentelemetry/resources": "^2.6.1",
31+
"@opentelemetry/resources": "^2.7.0",
3232
"@opentelemetry/sdk-logs": "^0.214.0",
33-
"@opentelemetry/sdk-metrics": "^2.6.1",
33+
"@opentelemetry/sdk-metrics": "^2.7.0",
3434
"@opentelemetry/sdk-node": "^0.214.0",
35-
"@opentelemetry/sdk-trace-base": "^2.6.1",
36-
"@opentelemetry/sdk-trace-node": "^2.6.1",
35+
"@opentelemetry/sdk-trace-base": "^2.7.0",
36+
"@opentelemetry/sdk-trace-node": "^2.7.0",
3737
"@opentelemetry/semantic-conventions": "^1.40.0",
3838
"@radix-ui/react-accordion": "^1.2.12",
3939
"@radix-ui/react-avatar": "^1.1.11",
@@ -51,7 +51,7 @@
5151
"@radix-ui/react-tabs": "^1.1.13",
5252
"@radix-ui/react-tooltip": "^1.2.8",
5353
"@radix-ui/react-use-controllable-state": "^1.2.2",
54-
"@rive-app/react-webgl2": "^4.28.0",
54+
"@rive-app/react-webgl2": "^4.28.1",
5555
"@smithy/eventstream-codec": "^4.2.14",
5656
"@streamdown/cjk": "^1.0.3",
5757
"@streamdown/code": "^1.1.1",
@@ -83,20 +83,20 @@
8383
"@eslint/compat": "^2.0.5",
8484
"@eslint/js": "^10.0.1",
8585
"@stylistic/eslint-plugin": "^5.10.0",
86-
"@tailwindcss/postcss": "^4.2.2",
86+
"@tailwindcss/postcss": "^4.2.4",
8787
"@types/node": "^24.12.2",
8888
"@types/react": "^19.2.14",
8989
"@types/react-dom": "^19.2.3",
90-
"eslint": "^10.2.0",
90+
"eslint": "^10.2.1",
9191
"eslint-config-next": "^16.2.4",
9292
"eslint-import-resolver-typescript": "^4.4.4",
9393
"eslint-plugin-import-x": "^4.16.2",
9494
"eslint-plugin-promise": "^7.2.1",
95-
"tailwindcss": "^4.2.2",
95+
"tailwindcss": "^4.2.4",
9696
"tw-animate-css": "^1.4.0",
9797
"typescript": "^5.9.3",
98-
"typescript-eslint": "^8.58.2",
99-
"vite": "^8.0.8",
100-
"vitest": "^4.1.4"
98+
"typescript-eslint": "^8.59.0",
99+
"vite": "^8.0.9",
100+
"vitest": "^4.1.5"
101101
}
102102
}

agents/agent-langchain/package.json

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,42 +20,52 @@
2020
"@types/aws-lambda": "^8.10.161",
2121
"@types/node": "^24.12.2",
2222
"@vitest/eslint-plugin": "^1.6.16",
23-
"dotenv": "^17.4.2",
24-
"eslint": "^10.2.0",
23+
"eslint": "^10.2.1",
2524
"eslint-import-resolver-typescript": "^4.4.4",
2625
"eslint-plugin-import-x": "^4.16.2",
2726
"eslint-plugin-promise": "^7.2.1",
2827
"jiti": "^2.6.1",
2928
"tsx": "^4.21.0",
3029
"typescript": "^5.9.3",
31-
"typescript-eslint": "^8.58.2",
32-
"vite": "^8.0.8",
33-
"vitest": "^4.1.4"
30+
"typescript-eslint": "^8.59.0",
31+
"vite": "^8.0.9",
32+
"vitest": "^4.1.5"
3433
},
3534
"dependencies": {
36-
"@arizeai/openinference-instrumentation-bedrock": "^0.4.10",
37-
"@arizeai/openinference-instrumentation-langchain": "^4.0.8",
35+
"@arizeai/openinference-instrumentation-bedrock": "^0.4.11",
36+
"@arizeai/openinference-instrumentation-langchain": "^4.0.9",
3837
"@aws-lambda-powertools/logger": "^2.33.0",
3938
"@aws-sdk/credential-provider-node": "^3.972.36",
39+
"@dotenvx/dotenvx": "^1.61.4",
40+
"@grpc/grpc-js": "^1.14.3",
4041
"@langchain/aws": "^1.3.5",
4142
"@langchain/classic": "^1.0.31",
4243
"@langchain/core": "^1.1.40",
4344
"@langchain/langgraph": "^1.2.9",
4445
"@langchain/mcp-adapters": "^1.1.3",
4546
"@langchain/openai": "^1.4.4",
4647
"@opentelemetry/api": "^1.9.1",
47-
"@opentelemetry/exporter-trace-otlp-http": "^0.214.0",
48-
"@opentelemetry/exporter-trace-otlp-proto": "^0.214.0",
49-
"@opentelemetry/instrumentation": "^0.214.0",
50-
"@opentelemetry/resources": "^2.6.1",
51-
"@opentelemetry/sdk-node": "^0.214.0",
52-
"@opentelemetry/sdk-trace-base": "^2.6.1",
53-
"@opentelemetry/sdk-trace-node": "^2.6.1",
48+
"@opentelemetry/api-logs": "^0.215.0",
49+
"@opentelemetry/auto-instrumentations-node": "^0.69.0",
50+
"@opentelemetry/exporter-logs-otlp-grpc": "^0.215.0",
51+
"@opentelemetry/exporter-logs-otlp-proto": "^0.215.0",
52+
"@opentelemetry/exporter-metrics-otlp-grpc": "^0.215.0",
53+
"@opentelemetry/exporter-metrics-otlp-http": "^0.215.0",
54+
"@opentelemetry/exporter-metrics-otlp-proto": "^0.215.0",
55+
"@opentelemetry/exporter-trace-otlp-grpc": "^0.215.0",
56+
"@opentelemetry/exporter-trace-otlp-proto": "^0.215.0",
57+
"@opentelemetry/instrumentation": "^0.215.0",
58+
"@opentelemetry/otlp-exporter-base": "^0.215.0",
59+
"@opentelemetry/resources": "^2.7.0",
60+
"@opentelemetry/sdk-logs": "^0.215.0",
61+
"@opentelemetry/sdk-metrics": "^2.7.0",
62+
"@opentelemetry/sdk-node": "^0.215.0",
63+
"@opentelemetry/sdk-trace-base": "^2.7.0",
64+
"@opentelemetry/sdk-trace-node": "^2.7.0",
5465
"@opentelemetry/semantic-conventions": "^1.40.0",
5566
"@smithy/eventstream-codec": "^4.2.14",
5667
"constructs": "^10.6.0",
5768
"langchain": "^1.3.3",
58-
"source-map-support": "^0.5.21",
5969
"uuid": "^14.0.0",
6070
"zod": "^4.3.6"
6171
}

agents/agent-langchain/src/index.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
import { MultiServerMCPClient } from "@langchain/mcp-adapters";
22
import { createAgent } from "langchain";
3+
import dotenv from '@dotenvx/dotenvx';
4+
5+
dotenv.config({ path: ['.env', '.env.test'], override: true });
6+
7+
import { initialize } from './instrumentation.js';
8+
9+
const exporters = process.env.ENABLED_OPENINFERENCE_TELEMETRY === 'true' ? await initialize() : { flush: async () => {
10+
// pass
11+
} };
312

413
const client = new MultiServerMCPClient({
514
'aws-knowledge-mcp-server': {
@@ -16,7 +25,7 @@ const client = new MultiServerMCPClient({
1625
const tools = await client.getTools();
1726

1827
const agent = createAgent({
19-
model: "bedrock:global.amazon.nova-2-lite-v1:0",
28+
model: "bedrock:us.amazon.nova-lite-v1:0",
2029
systemPrompt: `
2130
You are an assistant that helps architects design systems using Amazon Web Services (AWS). Your primary function is to answer user questions based on AWS knowledge and propose system architectures. When responding, follow these guidelines:
2231
@@ -37,6 +46,7 @@ const stream = await agent.stream({
3746

3847
}, { streamMode: "values" });
3948
for await (const chunk of stream) {
40-
console.log('Agent', chunk.messages);
49+
console.info('Agent', { messages: chunk.messages });
4150
}
51+
await exporters.flush()
4252
process.exit(0);
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
import { logger } from './logging.js';
2+
import * as opentelemetry from '@opentelemetry/api';
3+
import { registerInstrumentations } from '@opentelemetry/instrumentation';
4+
import {
5+
NodeTracerProvider,
6+
SimpleSpanProcessor,
7+
} from '@opentelemetry/sdk-trace-node';
8+
import {
9+
ATTR_SERVICE_NAME,
10+
ATTR_SERVICE_VERSION,
11+
} from '@opentelemetry/semantic-conventions';
12+
import { diag, DiagConsoleLogger, DiagLogLevel } from '@opentelemetry/api';
13+
import { LangChainInstrumentation } from '@arizeai/openinference-instrumentation-langchain';
14+
import * as lcCallbackManager from '@langchain/core/callbacks/manager';
15+
import {
16+
defaultResource,
17+
resourceFromAttributes,
18+
} from '@opentelemetry/resources';
19+
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
20+
import {
21+
MeterProvider,
22+
PeriodicExportingMetricReader,
23+
} from '@opentelemetry/sdk-metrics';
24+
25+
import { logs } from '@opentelemetry/api-logs';
26+
import {
27+
LoggerProvider,
28+
SimpleLogRecordProcessor,
29+
} from '@opentelemetry/sdk-logs';
30+
31+
import type { Exporters } from './otel/otel-exporters.js';
32+
import { Provider, createExporters } from './otel/otel-exporters.js';
33+
import dotenv from '@dotenvx/dotenvx';
34+
35+
dotenv.config({ path: ['.env', '.env.test'], override: true });
36+
37+
const initialize = async (): Promise<Exporters & { flush?: () => Promise<void> }> => {
38+
39+
diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.WARN);
40+
41+
logger.info('begin initialize opentelemetry exporters');
42+
43+
const exporters = await createExporters(
44+
process.env.OTEL_PROVIDER ?? Provider.PROVIDER_DATABRICS,
45+
{ useGrpc: process.env.ENABLED_OTEL_EXPORTER_OTLP_GRPC === 'true' });
46+
47+
const resource = defaultResource().merge(
48+
resourceFromAttributes({
49+
[ATTR_SERVICE_NAME]: 'agent-langchain',
50+
[ATTR_SERVICE_VERSION]: '0.1.0',
51+
['openinference.project.name']: 'default',
52+
}),
53+
);
54+
55+
if (exporters.trace) {
56+
logger.info('Enable tracing');
57+
58+
const provider = new NodeTracerProvider({
59+
spanProcessors: [new SimpleSpanProcessor(
60+
exporters.trace,
61+
),
62+
],
63+
resource,
64+
});
65+
66+
registerInstrumentations({
67+
instrumentations: [],
68+
});
69+
70+
const lcInstrumentation = new LangChainInstrumentation();
71+
lcInstrumentation.manuallyInstrument(lcCallbackManager);
72+
73+
74+
registerInstrumentations({
75+
instrumentations: [
76+
getNodeAutoInstrumentations({
77+
}),
78+
],
79+
});
80+
provider.register();
81+
}
82+
83+
if (exporters.metric) {
84+
logger.info('Enable metrics');
85+
86+
const metricReader = new PeriodicExportingMetricReader({
87+
exporter: exporters.metric,
88+
exportIntervalMillis: 10000,
89+
});
90+
91+
const myServiceMeterProvider = new MeterProvider({
92+
resource: resource,
93+
readers: [metricReader],
94+
});
95+
96+
opentelemetry.metrics.setGlobalMeterProvider(myServiceMeterProvider);
97+
}
98+
99+
if (exporters.logs) {
100+
logger.info('Enable logs');
101+
102+
const loggerProvider = new LoggerProvider({
103+
processors: [
104+
new SimpleLogRecordProcessor(
105+
exporters.logs,
106+
),
107+
],
108+
});
109+
110+
logs.setGlobalLoggerProvider(loggerProvider);
111+
}
112+
113+
logger.info('👀 OpenInference initialized');
114+
115+
return {
116+
...exporters,
117+
flush: async () => {
118+
await exporters.trace?.forceFlush?.();
119+
await exporters.logs?.forceFlush?.();
120+
await exporters.metric?.forceFlush?.();
121+
}
122+
};
123+
}
124+
125+
export { initialize };
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import * as powertools from '@aws-lambda-powertools/logger';
2+
3+
const logger = new powertools.Logger();
4+
export { logger };

0 commit comments

Comments
 (0)