Unverified Commit 2fe7ee83 authored by Hong Minhee's avatar Hong Minhee
Browse files

Instrument `lookupObject()`

parent 1eec926c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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]
+6 −5
Original line number Diff line number Diff line
@@ -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.        |

+2 −1
Original line number Diff line number Diff line
@@ -4,7 +4,7 @@ import {
  SpanKind,
  SpanStatusCode,
  trace,
  Tracer,
  type Tracer,
  type TracerProvider,
} from "@opentelemetry/api";
import {
@@ -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,
    });
  }

+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"]);
@@ -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 =
@@ -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 });
@@ -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) {
+0 −1
Original line number Diff line number Diff line
@@ -28,7 +28,6 @@ export interface LookupWebFingerOptions {

  /**
   * The OpenTelemetry tracer provider.
   * @since 1.3.0
   */
  tracerProvider?: TracerProvider;
}