Eventbridgeイベントをサンプリングするための奇妙なトリック


Amazon EventBridge Serverlessなイベントバスとイベント駆動アプリケーションのキーコンポーネントです.しかし,テスト環境のための例題イベントデータを構築することは困難であり,模擬イベントに対する開発は制限できる.また、プロダクションイベントに対していくつかの連続テストを実行したい場合もありますが、イベントの量はこの実行不可能になる可能性があります.これらの理由の全てにとって、生産EventBusからイベントのランダムな部分をサンプルすることができることは、素晴らしいことである.残念ながら、これを行うにはネイティブの機能はありませんが、この1つの奇妙なトリックを使用して近似することができます!

トリック


それは可能でしたmatch events based on complex content patterns 2020年初期以降.EventBridgeイベントには、常にid UUID形式のフィールド.この二つの性質を用いて与えられたサンプリング率に近似する規則を作成することができる.の各文字id フィールドは16 - 1 , 0 - F ( 16進値)のいずれかです.これは、我々がEventPattern です.
{ "id": [{ "prefix": "0" }] }
これは1/16番目、または我々のイベントの6.25 %にマッチします.我々は、我々が一致する数字の数を増やすことによって、粒度を増やすことができます.つの文字から成る接頭辞はイベントの0.39 %にマッチします、そして、3つのキャラクタから成る接頭辞はイベントの0.0244 %にマッチします.
たとえば、1 %のイベントにマッチしたい場合は、次のような接頭辞のリストを与えます.
{
  "id": [
    { "prefix": "00" },  // 0.39%
    { "prefix": "01" },  // 0.78%
    { "prefix": "020" }, // 0.81%
    { "prefix": "021" }, // 0.83%
    { "prefix": "022" }, // 0.85%
    { "prefix": "023" }, // 0.88%
    { "prefix": "024" }, // 0.90%
    { "prefix": "025" }, // 0.93%
    { "prefix": "026" }, // 0.95%
    { "prefix": "027" }, // 0.98%
    { "prefix": "028" }  // 1.00%
  ]
}
注意: EventBridgeによって生成されたUUIDは一様に分散されているという保証はありませんが、ほとんどの目的のために十分であるべきです.
これらの接頭語リストをCDK構成に生成するロジックを構築できます.

SamplingRuleのコンストラクタ


すべてのサンプルコードは、このgithubリポジトリにあります.rogerchi/cdk-events-sampling
現在はopen issue EventBridge規則のコンテントベースのMatcherを定義するためのAWS - CDKリポジトリでは、我々の構成のために、エスケープハッチを使用して、下にあるL 1 CloudFormation構成にドロップダウンしてパターンを設定する必要があります.
import { RuleProps, Rule, CfnRule } from 'aws-cdk-lib/aws-events';
import { Construct } from 'constructs';

export interface SamplingRuleProps extends RuleProps {
  percentage: number;
}

export class SamplingRule extends Rule {
  constructor(
    scope: Construct,
    id: string,
    { percentage, ...props }: SamplingRuleProps
  ) {
    // Construct the base class with a dummy eventPattern
    super(scope, id, { ...props, eventPattern: { version: [''] } });

    // Escape hatch for getting the CfnRule to be able to use content-based
    //   filtering until this issue is resolved:
    //   https://github.com/aws/aws-cdk/issues/6184
    const cfnRule = this.node.defaultChild as CfnRule;
    const idPattern = this.getIdPatternFromPercentage(percentage);
    if (!props.eventPattern) {
      cfnRule.eventPattern = { id: idPattern };
    } else {
      cfnRule.eventPattern = { ...props.eventPattern, id: idPattern };
    }
  }

  // Convert percentage into list of uuid prefix patterns
  private getIdPatternFromPercentage(percentage: number): { prefix: string }[] {
    if (percentage >= 1 || percentage <= 0) {
      throw new Error('Percentage must be between 0 and 1');
    }
    // Get the first three significant hex digits from the percentage
    const hexString = percentage.toString(16).slice(0, 5).slice(-3);

    // Build up list of prefixes, starting from most significant digit
    let prefixes: string[] = [];
    let a;
    for (a = 0x0; a < parseInt(hexString[0], 16); a++) {
      prefixes.push(a.toString(16));
    }
    let b;
    for (b = 0x0; b < parseInt(hexString[1], 16); b++) {
      prefixes.push(a.toString(16) + b.toString(16));
    }
    let c;
    for (c = 0x0; c < parseInt(hexString[2], 16); c++) {
      prefixes.push(a.toString(16) + b.toString(16) + c.toString(16));
    }

    return prefixes.map((prefix) => ({ prefix }));
  }
}

ユースケース


以下に、プロダクションイベントをサンプリングするユースケースを示します.
  • より信頼性の高い実世界テストのためのQA/テストとdevアカウントに実際のイベントの一部を送信し、実際のイベントで開発.(最初にペイロード内の特定のキーを匿名化して機密情報を削除するラムダ関数をターゲットにすることができました)
  • 連続エンドツーエンドテスト環境への実イベントの一部の送信
  • 公開されたスキーマに準拠していることを確認するために、実際のイベントのサンプルを連続的にチェックする
  • 試験する


    REPOの例は、いくつかのスタックを作成するために設定されたCDKアプリケーションを持っています:プロダクションEventBusスタック、開発EventBusスタック、および3 %のサンプリングパーセンテージを使用して、プロダクションEventBusからイベントエフェクバスへのイベントレプリケーションを構成するスタック.CDKアプリケーションをサンドボックスアカウントに配備し、scripts/put-events.ts スクリプトは、我々の生産EventBusに10000イベントを置く.我々は、これらのイベントの3 %程度にサンプリングルールをマッチさせることを期待し、開発スタックに複製します(もちろん開発スタックは別々の開発アカウントにも住んでいるかもしれません).
    ts-node scripts/put-events.ts {prodEventBusName}
    
    我々はイベントバスのためにCloudWatchメトリックをチェックします、そして、我々は我々のイベントの2.81 %がサンプルされて、我々のdev eventbusに送られるのを見ることができます.

    結論


    私の望みは、あなたがあなたのServerlessでイベント駆動のアプリケーション開発を促進するのを助けるためにSamplingRoom建設/パターンを使用することができるということです!これが役に立つならば、知らせてください、そして、さえずりの上で私の後を追うことを考えてください:

    アバウトミー


    私はスタッフエンジニアですVeho . 我々は、最近我々のシリーズAとB資金調達ラウンドを上げて、活発に採用しています!あなたがServerlessについて情熱的であるならば、あるいは、あなたの技術を育てることさえ見て、我々の観察を見てくださいopen positions !