Loading CHANGES.md +1 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,7 @@ To be released. - Added `CreateFederationOptions.tracerProvider` option. - Added `LookupWebFingerOptions.tracerProvider` option. - Added `LookupObjectOptions.tracerProvider` option. - Added `@fedify/fedify/x/sveltekit` module for integrating with [SvelteKit] hook. [[#171], [#183] by Jiyu Park] Loading docs/manual/opentelemetry.md +6 −5 Original line number Diff line number Diff line Loading @@ -116,8 +116,9 @@ Fedify automatically instruments the following operations with OpenTelemetry spans: | Operation | Span type | Description | |----------------------|-----------|-----------------------------------| |----------------------|-----------|---------------------------------------| | `Federation.fetch()` | Server | Serves the incoming HTTP request. | | `lookupObject()` | Client | Looks up the Activity Streams object. | | `lookupWebFinger()` | Client | Looks up the WebFinger resource. | | `handleWebFinger()` | Server | Handles the WebFinger request. | Loading src/federation/middleware.ts +2 −1 Original line number Diff line number Diff line Loading @@ -4,7 +4,7 @@ import { SpanKind, SpanStatusCode, trace, Tracer, type Tracer, type TracerProvider, } from "@opentelemetry/api"; import { Loading Loading @@ -2643,6 +2643,7 @@ export class ContextImpl<TContextData> implements Context<TContextData> { documentLoader: options.documentLoader ?? this.documentLoader, contextLoader: options.contextLoader ?? this.contextLoader, userAgent: options.userAgent ?? this.federation.userAgent, tracerProvider: options.tracerProvider ?? this.federation.tracerProvider, }); } Loading src/vocab/lookup.ts +53 −0 Original line number Diff line number Diff line import { getLogger } from "@logtape/logtape"; import { SpanStatusCode, type TracerProvider } from "@opentelemetry/api"; import { delay } from "@std/async/delay"; import metadata from "../deno.json" with { type: "json" }; import { type DocumentLoader, getDocumentLoader, type GetUserAgentOptions, } from "../runtime/docloader.ts"; import { lookupWebFinger } from "../webfinger/lookup.ts"; import { getTypeId } from "./type.ts"; import { type Collection, type Link, Object } from "./vocab.ts"; const logger = getLogger(["fedify", "vocab", "lookup"]); Loading Loading @@ -35,6 +38,12 @@ export interface LookupObjectOptions { * @since 1.3.0 */ userAgent?: GetUserAgentOptions | string; /** * The OpenTelemetry tracer provider. * @since 1.3.0 */ tracerProvider?: TracerProvider; } const handleRegexp = Loading Loading @@ -75,6 +84,49 @@ const handleRegexp = export async function lookupObject( identifier: string | URL, options: LookupObjectOptions = {}, ): Promise<Object | null> { if (options.tracerProvider == null) { return await lookupObjectInternal(identifier, options); } const tracer = options.tracerProvider.getTracer( metadata.name, metadata.version, ); return await tracer.startActiveSpan( "LookupObject", async (span) => { try { const result = await lookupObjectInternal(identifier, options); if (result == null) span.setStatus({ code: SpanStatusCode.ERROR }); else { if (result.id != null) { span.setAttribute("activitypub.object.id", result.id.href); } span.setAttribute("activitypub.object.type", getTypeId(result).href); if (result.replyTargetIds.length > 0) { span.setAttribute( "activitypub.object.in_reply_to", result.replyTargetIds.map((id) => id.href), ); } } return result; } catch (error) { span.setStatus({ code: SpanStatusCode.ERROR, message: String(error), }); throw error; } finally { span.end(); } }, ); } async function lookupObjectInternal( identifier: string | URL, options: LookupObjectOptions = {}, ): Promise<Object | null> { const documentLoader = options.documentLoader ?? getDocumentLoader({ userAgent: options.userAgent }); Loading @@ -95,6 +147,7 @@ export async function lookupObject( if (document == null) { const jrd = await lookupWebFinger(identifier, { userAgent: options.userAgent, tracerProvider: options.tracerProvider, }); if (jrd?.links == null) return null; for (const l of jrd.links) { Loading src/webfinger/lookup.ts +0 −1 Original line number Diff line number Diff line Loading @@ -28,7 +28,6 @@ export interface LookupWebFingerOptions { /** * The OpenTelemetry tracer provider. * @since 1.3.0 */ tracerProvider?: TracerProvider; } Loading Loading
CHANGES.md +1 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,7 @@ To be released. - Added `CreateFederationOptions.tracerProvider` option. - Added `LookupWebFingerOptions.tracerProvider` option. - Added `LookupObjectOptions.tracerProvider` option. - Added `@fedify/fedify/x/sveltekit` module for integrating with [SvelteKit] hook. [[#171], [#183] by Jiyu Park] Loading
docs/manual/opentelemetry.md +6 −5 Original line number Diff line number Diff line Loading @@ -116,8 +116,9 @@ Fedify automatically instruments the following operations with OpenTelemetry spans: | Operation | Span type | Description | |----------------------|-----------|-----------------------------------| |----------------------|-----------|---------------------------------------| | `Federation.fetch()` | Server | Serves the incoming HTTP request. | | `lookupObject()` | Client | Looks up the Activity Streams object. | | `lookupWebFinger()` | Client | Looks up the WebFinger resource. | | `handleWebFinger()` | Server | Handles the WebFinger request. | Loading
src/federation/middleware.ts +2 −1 Original line number Diff line number Diff line Loading @@ -4,7 +4,7 @@ import { SpanKind, SpanStatusCode, trace, Tracer, type Tracer, type TracerProvider, } from "@opentelemetry/api"; import { Loading Loading @@ -2643,6 +2643,7 @@ export class ContextImpl<TContextData> implements Context<TContextData> { documentLoader: options.documentLoader ?? this.documentLoader, contextLoader: options.contextLoader ?? this.contextLoader, userAgent: options.userAgent ?? this.federation.userAgent, tracerProvider: options.tracerProvider ?? this.federation.tracerProvider, }); } Loading
src/vocab/lookup.ts +53 −0 Original line number Diff line number Diff line import { getLogger } from "@logtape/logtape"; import { SpanStatusCode, type TracerProvider } from "@opentelemetry/api"; import { delay } from "@std/async/delay"; import metadata from "../deno.json" with { type: "json" }; import { type DocumentLoader, getDocumentLoader, type GetUserAgentOptions, } from "../runtime/docloader.ts"; import { lookupWebFinger } from "../webfinger/lookup.ts"; import { getTypeId } from "./type.ts"; import { type Collection, type Link, Object } from "./vocab.ts"; const logger = getLogger(["fedify", "vocab", "lookup"]); Loading Loading @@ -35,6 +38,12 @@ export interface LookupObjectOptions { * @since 1.3.0 */ userAgent?: GetUserAgentOptions | string; /** * The OpenTelemetry tracer provider. * @since 1.3.0 */ tracerProvider?: TracerProvider; } const handleRegexp = Loading Loading @@ -75,6 +84,49 @@ const handleRegexp = export async function lookupObject( identifier: string | URL, options: LookupObjectOptions = {}, ): Promise<Object | null> { if (options.tracerProvider == null) { return await lookupObjectInternal(identifier, options); } const tracer = options.tracerProvider.getTracer( metadata.name, metadata.version, ); return await tracer.startActiveSpan( "LookupObject", async (span) => { try { const result = await lookupObjectInternal(identifier, options); if (result == null) span.setStatus({ code: SpanStatusCode.ERROR }); else { if (result.id != null) { span.setAttribute("activitypub.object.id", result.id.href); } span.setAttribute("activitypub.object.type", getTypeId(result).href); if (result.replyTargetIds.length > 0) { span.setAttribute( "activitypub.object.in_reply_to", result.replyTargetIds.map((id) => id.href), ); } } return result; } catch (error) { span.setStatus({ code: SpanStatusCode.ERROR, message: String(error), }); throw error; } finally { span.end(); } }, ); } async function lookupObjectInternal( identifier: string | URL, options: LookupObjectOptions = {}, ): Promise<Object | null> { const documentLoader = options.documentLoader ?? getDocumentLoader({ userAgent: options.userAgent }); Loading @@ -95,6 +147,7 @@ export async function lookupObject( if (document == null) { const jrd = await lookupWebFinger(identifier, { userAgent: options.userAgent, tracerProvider: options.tracerProvider, }); if (jrd?.links == null) return null; for (const l of jrd.links) { Loading
src/webfinger/lookup.ts +0 −1 Original line number Diff line number Diff line Loading @@ -28,7 +28,6 @@ export interface LookupWebFingerOptions { /** * The OpenTelemetry tracer provider. * @since 1.3.0 */ tracerProvider?: TracerProvider; } Loading