Cache#exist? のインストルメンテーションに呼び出しオプションを追加
Rails のキャッシュ API で Cache#exist? が、read・write・delete と同様に呼び出し時のオプションをインストルメンテーションペイロードに含めるようになりました。これにより、通知を購読するコードが :namespace や :expires_in といったメタ情報を取得でき、他のキャッシュ操作と一貫した監視が可能になります。
背景
Cache#exist? のインストルメンテーションは従来、オプションをペイロードに含めていませんでした。その結果、cache_exist?.active_support 通知では namespace や version が常に nil となり、read・write・delete で得られる情報と齟齬が生じていました。統一された監視データが欠如していたことは、キャッシュヒット率やキー管理の分析を阻害していました。
技術的な変更
Cache#exist? の instrument 呼び出しに options を渡すよう変更しました。具体的には activesupport/lib/active_support/cache.rb の該当箇所で、
- instrument(:exist?, key) do |payload|
+ instrument(:exist?, key, options) do |payload|
とし、instrument が受け取る追加引数としてオプションハッシュを伝播させています。この変更により、payload[:namespace] などが正しく設定されます。
さらに、テストスイートに test_exist_instrumentation を追加し、オプションがペイロードへ含まれることを自動的に検証しています。
def test_exist_instrumentation
key = SecureRandom.uuid
options = { namespace: "foo" }
events = capture_notifications("cache_exist?.active_support") { @cache.exist?(key, options) }
assert_equal %w[ cache_exist?.active_support ], events.map(&:name)
assert_equal "foo", events[0].payload[:namespace]
end
このテストにより、将来的なリグレッションが防止され、実装の正確性が保証されています。
設計判断
オプション情報をペイロードに含める方針は、既存のインストルメンテーション API を拡張する形で実装されました。新しいメソッドやキーを導入せず、instrument のシグネチャに options を追加するだけで済んだため、既存コードへの影響は最小限です。結果として、Cache#exist? も他のキャッシュ操作と同じ情報を提供でき、監視ロジックの統一が容易になりました。
まとめ
Cache#exist? が呼び出しオプションを payload に含めるようになったことで、cache_exist?.active_support 通知は namespace・version・expires_in などのメタ情報を提供し、キャッシュ監視の一貫性が向上します。変更はシンプルなパラメータ追加とテスト追加のみで、既存利用者への互換性を保ちつつ機能拡張を実現しました。