Eventbridgeイベントをサンプリングするための奇妙なトリック
16919 ワード
Amazon EventBridge Serverlessなイベントバスとイベント駆動アプリケーションのキーコンポーネントです.しかし,テスト環境のための例題イベントデータを構築することは困難であり,模擬イベントに対する開発は制限できる.また、プロダクションイベントに対していくつかの連続テストを実行したい場合もありますが、イベントの量はこの実行不可能になる可能性があります.これらの理由の全てにとって、生産EventBusからイベントのランダムな部分をサンプルすることができることは、素晴らしいことである.残念ながら、これを行うにはネイティブの機能はありませんが、この1つの奇妙なトリックを使用して近似することができます!
それは可能でしたmatch events based on complex content patterns 2020年初期以降.EventBridgeイベントには、常に
たとえば、1 %のイベントにマッチしたい場合は、次のような接頭辞のリストを与えます.
これらの接頭語リストをCDK構成に生成するロジックを構築できます.
すべてのサンプルコードは、このgithubリポジトリにあります.rogerchi/cdk-events-sampling
現在はopen issue EventBridge規則のコンテントベースのMatcherを定義するためのAWS - CDKリポジトリでは、我々の構成のために、エスケープハッチを使用して、下にあるL 1 CloudFormation構成にドロップダウンしてパターンを設定する必要があります.
以下に、プロダクションイベントをサンプリングするユースケースを示します. より信頼性の高い実世界テストのためのQA/テストとdevアカウントに実際のイベントの一部を送信し、実際のイベントで開発.(最初にペイロード内の特定のキーを匿名化して機密情報を削除するラムダ関数をターゲットにすることができました) 連続エンドツーエンドテスト環境への実イベントの一部の送信 公開されたスキーマに準拠していることを確認するために、実際のイベントのサンプルを連続的にチェックする
REPOの例は、いくつかのスタックを作成するために設定されたCDKアプリケーションを持っています:プロダクションEventBusスタック、開発EventBusスタック、および3 %のサンプリングパーセンテージを使用して、プロダクションEventBusからイベントエフェクバスへのイベントレプリケーションを構成するスタック.CDKアプリケーションをサンドボックスアカウントに配備し、
私の望みは、あなたがあなたのServerlessでイベント駆動のアプリケーション開発を促進するのを助けるためにSamplingRoom建設/パターンを使用することができるということです!これが役に立つならば、知らせてください、そして、さえずりの上で私の後を追うことを考えてください:
私はスタッフエンジニアですVeho . 我々は、最近我々のシリーズAとB資金調達ラウンドを上げて、活発に採用しています!あなたがServerlessについて情熱的であるならば、あるいは、あなたの技術を育てることさえ見て、我々の観察を見てくださいopen positions !
トリック
それは可能でした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 }));
}
}
ユースケース
以下に、プロダクションイベントをサンプリングするユースケースを示します.
試験する
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 !
Reference
この問題について(Eventbridgeイベントをサンプリングするための奇妙なトリック), 我々は、より多くの情報をここで見つけました https://dev.to/aws-builders/one-weird-trick-for-sampling-eventbridge-events-mlpテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol