Skip to content

Commit dd314b2

Browse files
authored
feat: otel for ai workers (#5358)
1 parent abe5cfd commit dd314b2

27 files changed

Lines changed: 654 additions & 188 deletions

File tree

.github/workspace-dep-closures.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
"crates/macro_queues",
8181
"crates/macro_service_urls",
8282
"crates/macro_sync_service_jwt",
83+
"crates/macro_tower_layers",
8384
"crates/macro_user_id",
8485
"crates/macro_uuid",
8586
"crates/mcp_client",
@@ -247,6 +248,7 @@
247248
"crates/macro_queues",
248249
"crates/macro_service_urls",
249250
"crates/macro_sync_service_jwt",
251+
"crates/macro_tower_layers",
250252
"crates/macro_user_id",
251253
"crates/macro_uuid",
252254
"crates/mcp_client",
@@ -686,6 +688,7 @@
686688
"crates/macro_queues",
687689
"crates/macro_service_urls",
688690
"crates/macro_sync_service_jwt",
691+
"crates/macro_tower_layers",
689692
"crates/macro_user_id",
690693
"crates/macro_uuid",
691694
"crates/mcp_client",
@@ -941,6 +944,7 @@
941944
"crates/macro_service_urls",
942945
"crates/macro_sha_count_client",
943946
"crates/macro_sync_service_jwt",
947+
"crates/macro_tower_layers",
944948
"crates/macro_user_id",
945949
"crates/macro_uuid",
946950
"crates/mention_utils",
@@ -1338,6 +1342,7 @@
13381342
"crates/macro_service_urls",
13391343
"crates/macro_sha_count_client",
13401344
"crates/macro_sync_service_jwt",
1345+
"crates/macro_tower_layers",
13411346
"crates/macro_user_id",
13421347
"crates/macro_uuid",
13431348
"crates/mention_utils",
@@ -1445,6 +1450,7 @@
14451450
"crates/macro_queues",
14461451
"crates/macro_service_urls",
14471452
"crates/macro_sync_service_jwt",
1453+
"crates/macro_tower_layers",
14481454
"crates/macro_user_id",
14491455
"crates/macro_uuid",
14501456
"crates/mcp_client",
@@ -1747,6 +1753,7 @@
17471753
"crates/macro_event_topics",
17481754
"crates/macro_service_urls",
17491755
"crates/macro_sync_service_jwt",
1756+
"crates/macro_tower_layers",
17501757
"crates/macro_user_id",
17511758
"crates/macro_uuid",
17521759
"crates/mention_utils",
@@ -1828,6 +1835,7 @@
18281835
"crates/macro_event_topics",
18291836
"crates/macro_service_urls",
18301837
"crates/macro_sync_service_jwt",
1838+
"crates/macro_tower_layers",
18311839
"crates/macro_user_id",
18321840
"crates/macro_uuid",
18331841
"crates/mention_utils",
@@ -2622,6 +2630,7 @@
26222630
"crates/macro_event_topics",
26232631
"crates/macro_service_urls",
26242632
"crates/macro_sync_service_jwt",
2633+
"crates/macro_tower_layers",
26252634
"crates/macro_user_id",
26262635
"crates/macro_uuid",
26272636
"crates/mention_utils",
@@ -2851,6 +2860,7 @@
28512860
"crates/macro_service_urls",
28522861
"crates/macro_sha_count_client",
28532862
"crates/macro_sync_service_jwt",
2863+
"crates/macro_tower_layers",
28542864
"crates/macro_user_id",
28552865
"crates/macro_uuid",
28562866
"crates/mention_utils",
@@ -3084,6 +3094,7 @@
30843094
"crates/macro_service_urls",
30853095
"crates/macro_sha_count_client",
30863096
"crates/macro_sync_service_jwt",
3097+
"crates/macro_tower_layers",
30873098
"crates/macro_user_id",
30883099
"crates/macro_uuid",
30893100
"crates/mention_utils",
@@ -3759,6 +3770,7 @@
37593770
"crates/macro_queues",
37603771
"crates/macro_service_urls",
37613772
"crates/macro_sync_service_jwt",
3773+
"crates/macro_tower_layers",
37623774
"crates/macro_user_id",
37633775
"crates/macro_uuid",
37643776
"crates/mcp_client",
@@ -3864,6 +3876,7 @@
38643876
"crates/macro_queues",
38653877
"crates/macro_service_urls",
38663878
"crates/macro_sync_service_jwt",
3879+
"crates/macro_tower_layers",
38673880
"crates/macro_user_id",
38683881
"crates/macro_uuid",
38693882
"crates/mcp_client",
@@ -4624,6 +4637,7 @@
46244637
"crates/macro_service_urls",
46254638
"crates/macro_sha_count_client",
46264639
"crates/macro_sync_service_jwt",
4640+
"crates/macro_tower_layers",
46274641
"crates/macro_user_id",
46284642
"crates/macro_uuid",
46294643
"crates/mention_utils",
@@ -4873,6 +4887,7 @@
48734887
"crates/macro_queues",
48744888
"crates/macro_service_urls",
48754889
"crates/macro_sync_service_jwt",
4890+
"crates/macro_tower_layers",
48764891
"crates/macro_user_id",
48774892
"crates/macro_uuid",
48784893
"crates/mcp_client",
@@ -4981,6 +4996,7 @@
49814996
"crates/macro_service_urls",
49824997
"crates/macro_sha_count_client",
49834998
"crates/macro_sync_service_jwt",
4999+
"crates/macro_tower_layers",
49845000
"crates/macro_user_id",
49855001
"crates/macro_uuid",
49865002
"crates/mention_utils",
@@ -5449,6 +5465,7 @@
54495465
"crates/macro_service_urls",
54505466
"crates/macro_sha_count_client",
54515467
"crates/macro_sync_service_jwt",
5468+
"crates/macro_tower_layers",
54525469
"crates/macro_user_id",
54535470
"crates/macro_uuid",
54545471
"crates/mention_utils",
@@ -6045,6 +6062,7 @@
60456062
"crates/macro_event_topics",
60466063
"crates/macro_service_urls",
60476064
"crates/macro_sync_service_jwt",
6065+
"crates/macro_tower_layers",
60486066
"crates/macro_user_id",
60496067
"crates/macro_uuid",
60506068
"crates/mention_utils",

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/web/src/lib/service-clients/ai-editing-worker/client.ts

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import type { DocumentOp } from '@ai-ops/editor';
2+
import { resumeDocumentSpan } from '@block-md/observability';
23
import { toast } from '@core/component/Toast/Toast';
4+
import { Telemetry } from '@macro-inc/observability';
35
import { getDocumentPermissionToken } from '@service-storage/client';
46
import { createSignal } from 'solid-js';
57

@@ -78,11 +80,25 @@ export async function requestAiEdit(args: {
7880
const controller = new AbortController();
7981
editControllers.set(args.documentId, controller);
8082
syncActiveEditDocs();
83+
// Parent under the document's long-lived span when one exists, so the
84+
// worker's whole edit trace joins the user's editing session; the injected
85+
// traceparent makes the worker's request span a child of this one.
86+
const documentSpan = resumeDocumentSpan(args.documentId);
87+
const span = documentSpan
88+
? documentSpan.run(() => Telemetry.clientSpan('http POST /edit'))
89+
: Telemetry.clientSpan('http POST /edit');
90+
span.setAttr('http.method', 'POST');
91+
span.setAttr('http.url', `${AI_EDITING_WORKER_HOST}/edit`);
92+
span.setAttr('document.id', args.documentId);
8193
try {
8294
const token = await getDocumentPermissionToken(args.documentId);
95+
const headers: Record<string, string> = {
96+
'Content-Type': 'application/json',
97+
};
98+
span.injectTraceHeaders(headers);
8399
const res = await fetch(`${AI_EDITING_WORKER_HOST}/edit`, {
84100
method: 'POST',
85-
headers: { 'Content-Type': 'application/json' },
101+
headers,
86102
body: JSON.stringify({
87103
documentToken: token,
88104
documentId: args.documentId,
@@ -93,9 +109,16 @@ export async function requestAiEdit(args: {
93109
}),
94110
signal: controller.signal,
95111
});
112+
span.setAttr('http.status_code', res.status);
96113
if (!res.ok) {
97114
const body = await res.text().catch(() => '');
98115
console.error('ai edit request failed', res.status, body);
116+
const message = `HTTP ${res.status} for POST /edit`;
117+
span.error({
118+
name: 'HttpError',
119+
message,
120+
stack: new Error(message).stack,
121+
});
99122
return 'failed';
100123
}
101124
if (args.onOps) {
@@ -104,10 +127,15 @@ export async function requestAiEdit(args: {
104127
}
105128
return 'ok';
106129
} catch (e) {
107-
if (controller.signal.aborted) return 'cancelled';
130+
if (controller.signal.aborted) {
131+
span.setAttr('http.aborted', true);
132+
return 'cancelled';
133+
}
108134
console.error('ai edit request failed', e);
135+
span.error(e);
109136
return 'failed';
110137
} finally {
138+
span.end();
111139
if (editControllers.get(args.documentId) === controller) {
112140
editControllers.delete(args.documentId);
113141
syncActiveEditDocs();

0 commit comments

Comments
 (0)