aboutsummaryrefslogtreecommitdiff
path: root/catapult/telemetry/third_party/web-page-replay/documentation/Rules.md
diff options
context:
space:
mode:
Diffstat (limited to 'catapult/telemetry/third_party/web-page-replay/documentation/Rules.md')
-rw-r--r--catapult/telemetry/third_party/web-page-replay/documentation/Rules.md95
1 files changed, 95 insertions, 0 deletions
diff --git a/catapult/telemetry/third_party/web-page-replay/documentation/Rules.md b/catapult/telemetry/third_party/web-page-replay/documentation/Rules.md
new file mode 100644
index 00000000..35176357
--- /dev/null
+++ b/catapult/telemetry/third_party/web-page-replay/documentation/Rules.md
@@ -0,0 +1,95 @@
+WebPageReplay Rule Language
+===========================
+
+WebPageReplay rules allows developers to customize record/replay handling.
+
+Motiviation
+-----------
+
+Web sites often require custom replay logic, e.g.:
+
+ 1. The recording uploads various metrics/logs to:
+
+ http://example.com/gen_204?emsg=foo
+
+ but, during replay, it uploads different parameters:
+
+ http://example.com/gen_204?emsg=bar
+
+ so (as-is) our replay fails. We want "*/gen_204" to always respond
+ "HTTP 204 No Change".
+
+ 2. The recording fetches data from one server:
+
+ http://mirrorA.example.com/stuff
+
+ but replay selects a different server:
+
+ http://mirrorB.example.com/stuff
+
+ which breaks replay. We want "mirror*.example.com/stuff" to be equivalent.
+
+ 3. The recorded URL + response contains a UID, e.g.:
+
+ http://example.com?q=foo --> "you sent foo."
+
+ but the replay asks for:
+
+ http://example.com?q=bar --> replay error!
+
+ We want it to reply "you sent bar."
+
+We could hack all the above rules into the code, but that can''t be (cleanly) extended or open sourced.
+
+Instead, we want a simple config file of "predicate --> action" rules.
+
+
+Format
+------
+
+The JSON-formatted rule file is specified on the command line:
+
+ replay.py ... --rules_path my_rules ...
+
+The rules file must contain an array of single-item objects, e.g.:
+
+ [{"comment": "ignore me"},
+ {"LogUrl": {"url": "example\\.com/logme.*"}},
+ {"LogUrl": {"url": "example\\.com/someotherpath"}}
+ ]
+
+All "comment" items are ignored and support arbitrary values, e.g., a string
+or commented-out rule(s).
+
+All other items must specify a string TYPE key and object ARGS value, e.g.:
+
+ {"LogUrl": {"url": "example\\.com/test", "stop": false}}
+
+The default TYPE package is "rules" and the default rule_parser
+"allowed_imports" is similarly restricted to only allow "rules" classes.
+
+The TYPE implementation class must match the Rule API defined in
+"rules/rule.py":
+
+ class Rule(object):
+ def IsType(self, rule_type_name): ...
+ def ApplyRule(self, return_value, request, response): ...
+
+The ARGS must match the rule-specific constructor, e.g.:
+
+ class LogUrl(rule.Rule):
+ def __init__(self, url, stop=False):
+ self._url_re = re.compile(url)
+ self._stop = stop
+ ...
+
+All rules of the same rule_type_name are chained together and applied in the
+same order as they appear in the input JSON file.
+
+
+Rules
+-------
+
+### rules.LogUrl:
+
+If the url pattern matches then log the request URL.