要約

この正規表現ジェネレーターは、ホスト名、パス、バージョン、メールドメイン、HTTPステータスコードの一覧を、ロールアウトのターゲティング条件、Prometheus の matcher、ログフィルター向けのエスケープ済みパターンに変換します。検索一致(JavaScript、Go、grep)と完全一致(Prometheus、Alertmanager、Envoy)のどちらかを選び、ブラウザ上で行をテストできます。入力値はサーバーに送信されません。

無料ツール

正規表現 ジェネレーター:ロールアウト条件とログフィルターのために

照合したいホスト名、パス、バージョン、ステータスコードを入力します。お使いの正規表現エンジン向けにエスケープ済みのパターンを取得し、本番に入れる前に実際のログ行で確認できます。

夜のノートPCの前で、フィルター済みのターミナル出力を見る開発者のデスク

正規表現をリストから生成

何を照合するかを選び、値を一覧にして、エンジンを選んでください。入力に合わせて、パターンとテスト結果が更新されます。

生成されたパターン

    仕組み

    入力値からジェネレーターが行うこと

    リテラルをすべてエスケープ

    値に含まれるドット、スラッシュ、括弧、プラス記号はエスケープされます。そのため api.internal.example.com が api-internal-example-com に一致することはありません。手書きの許可リストは、ここで最も失敗しやすい箇所です。

    実行するエンジン向けに書く

    検索型エンジンではマッチを ^ と $ で固定する必要がありますが、Prometheus、Alertmanager、Envoy は文字列全体にマッチさせるため、前方一致や後方一致には .* が必要です。エンジンを選べば、ジェネレーターがパターンを合わせます。

    出荷前にテスト

    テスト行ごとに、これからコピーするパターンを使った一致または不一致のバッジが表示されます。意図的に近い誤一致も入れてください。例えば checkout-v2 に対する checkout-v22、example.com に対する example.com.evil.io です。

    パターンが失敗する場面

    レビューを通過しても、夜中にページを鳴らした正規表現

    ロールアウトやアラートの設定で起きる正規表現の障害は、特殊なものではありません。3つの内部ホストだけを対象にするはずのターゲティング条件が、紛らわしいホスト名まで対象にしてしまう。Prometheus には不要なアンカーを付けたアラートの matcher が、いつの間にかあるサービスを外す。部分一致のログフィルターが、数えるべきエラーを隠してしまう。 パターンが複雑すぎることは稀で、ほとんどは緩すぎるか、一致すべき行だけでテストされたことが原因です。ロールアウトをゲートする規則は、まず一致してはいけない行でテストすべきです。

    • ホスト名のドットをすべてエスケープする
    • 使っているエンジンが自動でアンカーするかを確認する
    • 一致する行だけでなく、近い誤一致もテストする
    • 候補が少なく安定しているなら、正規表現よりリテラルの一覧を選ぶ
    緑のステータスランプが並ぶサーバーラックの通路
    使い方

    値の一覧から、信頼できるパターンへ

    1. 1

      照合の種類を選ぶ

      ホストやフラグキーの許可リストには完全一致、ルートのグループには前方一致、アラートルールにはステータスコード、アプリバージョン単位のロールアウトにはバージョンファミリーを使います。

    2. 2

      エンジンを選ぶ

      コードや grep には検索一致、Prometheus の matcher、Alertmanager のルート、Envoy には完全一致を使います。この一つの選択で、最も多いアンカーの取り違えを防げます。

    3. 3

      近い誤一致をテスト欄に入れる

      似たホスト名、隣接するバージョン、範囲のすぐ外にあるステータスコードを追加します。いずれかが一致と表示されたら、パターンをコピーする前に値を絞ってください。

    よくある質問

    このジェネレーターは無料ですか。入力値はどこかに送信されますか。
    無料で、すべてブラウザ内で動作します。入力した値、生成されたパターン、テスト行がサーバーに送信されることはありません。送信されるのは、ツールが使われたことだけを記録する匿名のカウンターのリクエストのみです。
    出力はどの正規表現エンジン向けですか。
    多くのインフラ作業は2つの動作でカバーできます。検索一致は JavaScript、Go の regexp、grep -E、PCRE に適しています。行の任意の位置にマッチするため、必要な場合にツールが ^ と $ を追加します。完全一致は Prometheus、Alertmanager、Envoy に適しています。これらは文字列全体をマッチとして扱うため、前方一致、後方一致、部分一致のルールには .* を追加します。
    なぜ Prometheus は ^ と $ のアンカーを無視するように見えるのですか。
    Prometheus のラベル matcher は完全にアンカーされています。式 env=~"prod" は ^(?:prod)$ として評価されるため、grep 向けに書いたパターンは想定より狭く一致するか、まったく一致しないことがあります。完全一致エンジンを選ぶと、Prometheus の読み方に合わせたパターンが生成されます。
    パターンは破滅的バックトラッキングを避けられますか。
    生成されるパターンはリテラル、範囲の限られた文字クラス、フラットな選択肢だけを使います。ネストした量指定子は含みません。これは JavaScript や PCRE で暴走的なバックトラッキングが起きる典型的な原因です。Go や Envoy のような RE2 系エンジンは、いずれにしても線形時間で動作します。
    特殊文字はどう扱われますか。
    すべてのリテラル値がエスケープされます。例えば api.internal.example.com は api\.internal\.example\.com になるため、ドットがどの文字にも一致しなくなります。手書きの許可リストで最も多いバグがこれで、api-internal-example-com をすり抜けさせてしまいます。
    フラグのターゲティング条件でこのパターンを使えますか。
    はい。フラグ管理の基盤が、hostname、path、ユーザーのメールアドレスなどのコンテキスト属性に対する正規表現または matches-pattern 演算子をサポートしていれば使えます。貼り付ける前に、どのエンジンを使っているか確認してください。完全一致や前方一致の演算子しかない場合は、正規表現より値のリストの方が安全です。
    このツールにできないことは何ですか。
    例からパターンを推測することはなく、数値の範囲や先読みも生成しません。自分が与えた値の一覧から、読めるルールに従ってパターンを組み立てます。テスト行は JavaScript エンジンで評価されるため、出荷前に、自分のスタックでエンジン固有の動作を必ず確認してください。

    ロールアウトの判断を、勘ではなく SLO に基づかせる

    ターゲティング条件は誰に変更を届けるかを決めます。upstreamapi の AI Pilot は、そのまま進めてよいかを判断し、エラー率が SLO のしきい値を超えると自動でリバートします。