Skip to content

Commit 2fe7ee8

Browse files
committed
Instrument lookupObject()
1 parent 1eec926 commit 2fe7ee8

File tree

5 files changed

+62
-7
lines changed

5 files changed

+62
-7
lines changed

CHANGES.md

+1
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ To be released.
6363

6464
- Added `CreateFederationOptions.tracerProvider` option.
6565
- Added `LookupWebFingerOptions.tracerProvider` option.
66+
- Added `LookupObjectOptions.tracerProvider` option.
6667

6768
- Added `@fedify/fedify/x/sveltekit` module for integrating with [SvelteKit]
6869
hook. [[#171], [#183] by Jiyu Park]

docs/manual/opentelemetry.md

+6-5
Original file line numberDiff line numberDiff line change
@@ -115,11 +115,12 @@ Instrumented spans
115115
Fedify automatically instruments the following operations with OpenTelemetry
116116
spans:
117117

118-
| Operation | Span type | Description |
119-
|----------------------|-----------|-----------------------------------|
120-
| `Federation.fetch()` | Server | Serves the incoming HTTP request. |
121-
| `lookupWebFinger()` | Client | Looks up the WebFinger resource. |
122-
| `handleWebFinger()` | Server | Handles the WebFinger request. |
118+
| Operation | Span type | Description |
119+
|----------------------|-----------|---------------------------------------|
120+
| `Federation.fetch()` | Server | Serves the incoming HTTP request. |
121+
| `lookupObject()` | Client | Looks up the Activity Streams object. |
122+
| `lookupWebFinger()` | Client | Looks up the WebFinger resource. |
123+
| `handleWebFinger()` | Server | Handles the WebFinger request. |
123124

124125
More operations will be instrumented in the future releases.
125126

src/federation/middleware.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
SpanKind,
55
SpanStatusCode,
66
trace,
7-
Tracer,
7+
type Tracer,
88
type TracerProvider,
99
} from "@opentelemetry/api";
1010
import {
@@ -2643,6 +2643,7 @@ export class ContextImpl<TContextData> implements Context<TContextData> {
26432643
documentLoader: options.documentLoader ?? this.documentLoader,
26442644
contextLoader: options.contextLoader ?? this.contextLoader,
26452645
userAgent: options.userAgent ?? this.federation.userAgent,
2646+
tracerProvider: options.tracerProvider ?? this.federation.tracerProvider,
26462647
});
26472648
}
26482649

src/vocab/lookup.ts

+53
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
import { getLogger } from "@logtape/logtape";
2+
import { SpanStatusCode, type TracerProvider } from "@opentelemetry/api";
23
import { delay } from "@std/async/delay";
4+
import metadata from "../deno.json" with { type: "json" };
35
import {
46
type DocumentLoader,
57
getDocumentLoader,
68
type GetUserAgentOptions,
79
} from "../runtime/docloader.ts";
810
import { lookupWebFinger } from "../webfinger/lookup.ts";
11+
import { getTypeId } from "./type.ts";
912
import { type Collection, type Link, Object } from "./vocab.ts";
1013

1114
const logger = getLogger(["fedify", "vocab", "lookup"]);
@@ -35,6 +38,12 @@ export interface LookupObjectOptions {
3538
* @since 1.3.0
3639
*/
3740
userAgent?: GetUserAgentOptions | string;
41+
42+
/**
43+
* The OpenTelemetry tracer provider.
44+
* @since 1.3.0
45+
*/
46+
tracerProvider?: TracerProvider;
3847
}
3948

4049
const handleRegexp =
@@ -75,6 +84,49 @@ const handleRegexp =
7584
export async function lookupObject(
7685
identifier: string | URL,
7786
options: LookupObjectOptions = {},
87+
): Promise<Object | null> {
88+
if (options.tracerProvider == null) {
89+
return await lookupObjectInternal(identifier, options);
90+
}
91+
const tracer = options.tracerProvider.getTracer(
92+
metadata.name,
93+
metadata.version,
94+
);
95+
return await tracer.startActiveSpan(
96+
"LookupObject",
97+
async (span) => {
98+
try {
99+
const result = await lookupObjectInternal(identifier, options);
100+
if (result == null) span.setStatus({ code: SpanStatusCode.ERROR });
101+
else {
102+
if (result.id != null) {
103+
span.setAttribute("activitypub.object.id", result.id.href);
104+
}
105+
span.setAttribute("activitypub.object.type", getTypeId(result).href);
106+
if (result.replyTargetIds.length > 0) {
107+
span.setAttribute(
108+
"activitypub.object.in_reply_to",
109+
result.replyTargetIds.map((id) => id.href),
110+
);
111+
}
112+
}
113+
return result;
114+
} catch (error) {
115+
span.setStatus({
116+
code: SpanStatusCode.ERROR,
117+
message: String(error),
118+
});
119+
throw error;
120+
} finally {
121+
span.end();
122+
}
123+
},
124+
);
125+
}
126+
127+
async function lookupObjectInternal(
128+
identifier: string | URL,
129+
options: LookupObjectOptions = {},
78130
): Promise<Object | null> {
79131
const documentLoader = options.documentLoader ??
80132
getDocumentLoader({ userAgent: options.userAgent });
@@ -95,6 +147,7 @@ export async function lookupObject(
95147
if (document == null) {
96148
const jrd = await lookupWebFinger(identifier, {
97149
userAgent: options.userAgent,
150+
tracerProvider: options.tracerProvider,
98151
});
99152
if (jrd?.links == null) return null;
100153
for (const l of jrd.links) {

src/webfinger/lookup.ts

-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ export interface LookupWebFingerOptions {
2828

2929
/**
3030
* The OpenTelemetry tracer provider.
31-
* @since 1.3.0
3231
*/
3332
tracerProvider?: TracerProvider;
3433
}

0 commit comments

Comments
 (0)