Fedify 1.3.0: OpenTelemetry対応と強化されたメッセージキューを実装

Fedify 1.3.0のリリースをお知らせします。本バージョンでは、可観測性、メッセージキューの設定、開発者体験に関して大幅な改善が行われました。フェデレーションサーバーアプリケーションの構築と監視をより簡単にする新機能と改善点が多数導入されています。

## OpenTelemetryの統合

本リリースの目玉機能は、[OpenTelemetry](https://opentelemetry.io/)の包括的なサポートです。Fedifyは様々な操作を自動的にOpenTelemetryのスパンで計測し、アプリケーションの動作に関する詳細な洞察を提供します。この機能により以下が可能になります：

- 詳細なタイミング情報を含むHTTPリクエストとレスポンスの追跡
- アクターとコレクションのディスパッチの監視
- インボックスとアウトボックスの操作の観察
- 署名検証プロセスの分析
- その他多数

FedifyアプリケーションでのOpenTelemetryのセットアップは簡単です。OpenTelemetry SDKを設定すると、Fedifyは自動的に様々な操作のスパンを作成します。以下は簡単な例です：

```typescript
import { NodeSDK } from "@opentelemetry/sdk-node";
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto";

const sdk = new NodeSDK({
  serviceName: "my-fedify-app",
  traceExporter: new OTLPTraceExporter({
    url: "http://localhost:4317",
  }),
});

sdk.start();
```

[Sentry](https://sentry.io/)のOpenTelemetryサポートとの統合も可能です：

```typescript
import { createFederation } from "@fedify/fedify";
import { getClient } from "@sentry/node";

const federation = createFederation({
  tracerProvider: getClient()?.traceProvider,
  // ... その他のオプション
});
```

なお、SentryのOpenTelemetry統合は@sentry/node 8.0.0から利用可能ですが、2024年11月時点では@sentry/denoや@sentry/bunではまだ利用できません。

計測されるスパンとその属性の完全なリストについては、[OpenTelemetryのドキュメント](https://fedify.dev/manual/opentelemetry)をご覧ください。

## メッセージキュー設定の強化

Fedify 1.3.0では、受信アクティビティと送信アクティビティに対して異なるメッセージキューを設定できるようになりました。この機能により、異なる種類のアクティビティの処理においてより大きな柔軟性が得られます。以下が可能です：

- 受信アクティビティと送信アクティビティに異なるメッセージキューを使用
- 受信アクティビティのみにメッセージキューを使用
- 送信アクティビティのみにメッセージキューを使用
- またはそれらの任意の組み合わせ

設定例を示します：

受信と送信で異なるキューを使用する場合：

```typescript
import { createFederation } from "@fedify/fedify";
import { RedisMessageQueue } from "@fedify/redis";
import { PostgresMessageQueue } from "@fedify/postgres";

const federation = createFederation({
  queue: {
    inbox: new PostgresMessageQueue(postgres("postgresql://...")),
    outbox: new RedisMessageQueue(redis),
  },
  // ... その他のオプション
});
```

受信アクティビティのみにメッセージキューを使用する場合：

```typescript
const federation = createFederation({
  queue: {
    inbox: new PostgresMessageQueue(postgres("postgresql://...")),
    // outboxは指定なし - 送信アクティビティはキューイングされません
  },
  // ... その他のオプション
});
```

## アクティビティの手動ルーティング

実際のHTTPリクエストなしでアクティビティをインボックスリスナーに手動でルーティングできるようになりました。これは特に、別のアクティビティ内に含まれるアクティビティオブジェクトを処理する必要がある場合に便利です。例：

```typescript
federation.setInboxListeners("/users/{identifier}/inbox", "/inbox")
  .on(Announce, async (ctx, announce) => {
    const object = await announce.getObject();
    if (object instanceof Activity) {
      // 含まれているアクティビティを適切なインボックスリスナーにルーティング
      await ctx.routeActivity(ctx.recipient, object);
    }
  });
```

詳細については[関連ドキュメント](https://fedify.dev/manual/inbox#manual-routing)をご覧ください。

## SvelteKitの統合

[Jiyu Park](https://github.com/robin-maki)氏（[@robin_maki@planet.moe](https://planet.moe/@robin_maki)）の貢献により、FedifyはSvelteKitを新しい`@fedify/fedify/x/sveltekit`モジュールを通じて公式にサポートするようになりました。この統合により、SvelteKitを使用したフェデレーションアプリケーションの構築がより簡単になります：

```typescript
import { createFederation } from "@fedify/fedify";
import { fedifyHook } from "@fedify/fedify/x/sveltekit";

const federation = createFederation({
  // ... 設定
});

export const handle = fedifyHook(federation, (req) => "context data");
```

詳細については[関連ドキュメント](https://fedify.dev/manual/integration#sveltekit)をご覧ください。

## HTTPリクエストの識別性の向上

Fedifyは作成するすべてのHTTPリクエストに適切な`User-Agent`ヘッダーを含めるようになりました。これにより、サーバーログ内でFedifyが生成したリクエストの識別と追跡が容易になります。デフォルトのフォーマットは以下の通りです：

```
Fedify/1.3.0 (Deno/2.1.2)
```

[独自のユーザーエージェント文字列やオプションを提供してカスタマイズ可能です：](https://fedify.dev/manual/federation#useragent)

```typescript
createFederation({
  userAgent: {
    software: "MyApp/1.0.0",
    url: "https://myinstance.com/"
  },
  // ... その他のオプション
});
```

## その他の改善点

- `Context.sendActivity()`と`InboxContext.forwardActivity()`メソッドが、タスクのエンキューに失敗した際に適切にエラーを返すようになりました
- 様々なバグ修正とパフォーマンスの改善
- ドキュメントと例の充実

## 1.3.0へのアップグレード

Fedify 1.3.0は[JSR](https://jsr.io/@fedify/fedify@1.3.0)と[npm](https://www.npmjs.com/package/@fedify/fedify/v/1.3.0)の両方で利用可能です。アップグレード方法：

JSR（Deno）の場合：

```sh
deno add jsr:@fedify/fedify@1.3.0
```

npm（Node.jsとBun）の場合：

```sh
npm  add @fedify/fedify@1.3.0
pnpm add @fedify/fedify@1.3.0
yarn add @fedify/fedify@1.3.0
bun  add @fedify/fedify@1.3.0 
```

## 今後の展望

これらの新機能と改善点に私たちは大きな期待を寄せており、Fedifyを使用したフェデレーションアプリケーションの構築がより一層楽しいものになると確信しています。引き続き更新をお楽しみに！質問やフィードバックがございましたら、[Matrixチャット](https://matrix.to/#/#fedify:matrix.org) （英語）や[Discordサーバー](https://discord.gg/FYcAM3eWgz) （日本語）にお気軽にご参加ください。

変更点の完全なリストについては[チェンジログ](https://github.com/dahlia/fedify/releases/tag/1.3.0)をご覧ください。