TS-2316: header_rewrite: added optional counter to each rule
Now you can count each rule's tripping by providing one or more "counter"
statements e.g::
cond %{SEND_RESPONSE_HDR_HOOK} [AND]
add-header X-DC "DC1"
counter plugins.header_rewrite.POP
counter plugins.header_rewrite.ALL
Submitted by: Alexey Ivanov <[email protected]>
Sponsored by: LinkedIn
Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/b79c9074
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/b79c9074
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/b79c9074
Branch: refs/heads/5.0.x
Commit: b79c9074455e4634d2a809a71e6cc6122567f610
Parents: 8e2cc15
Author: Alexey Ivanov <[email protected]>
Authored: Tue Nov 5 11:14:06 2013 -0800
Committer: Alexey Ivanov <[email protected]>
Committed: Sun Nov 10 18:07:53 2013 -0800
----------------------------------------------------------------------
plugins/header_rewrite/factory.cc | 2 ++
plugins/header_rewrite/operators.cc | 37 ++++++++++++++++++++++++++++++++
plugins/header_rewrite/operators.h | 19 ++++++++++++++++
3 files changed, 58 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/b79c9074/plugins/header_rewrite/factory.cc
----------------------------------------------------------------------
diff --git a/plugins/header_rewrite/factory.cc
b/plugins/header_rewrite/factory.cc
index 7810c8c..9af8f25 100644
--- a/plugins/header_rewrite/factory.cc
+++ b/plugins/header_rewrite/factory.cc
@@ -53,6 +53,8 @@ operator_factory(const std::string& op)
o = new OperatorSetTimeoutOut();
} else if (op == "no-op") {
o = new OperatorNoOp();
+ } else if (op == "counter") {
+ o = new OperatorCounter();
} else {
TSError("%s: unknown operator: %s", PLUGIN_NAME, op.c_str());
return NULL;
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/b79c9074/plugins/header_rewrite/operators.cc
----------------------------------------------------------------------
diff --git a/plugins/header_rewrite/operators.cc
b/plugins/header_rewrite/operators.cc
index 881e058..f06b1d0 100644
--- a/plugins/header_rewrite/operators.cc
+++ b/plugins/header_rewrite/operators.cc
@@ -466,3 +466,40 @@ OperatorSetHeader::exec(const Resources& res) const
}
}
}
+
+// OperatorCounter
+void
+OperatorCounter::initialize(Parser& p) {
+ Operator::initialize(p);
+
+ _counter_name = p.get_arg();
+
+ // Sanity
+ if (_counter_name.length() == 0) {
+ TSError("%s: counter name is empty", PLUGIN_NAME);
+ return;
+ }
+
+ // Check if counter already created by another rule
+ if (TSStatFindName(_counter_name.c_str(), &_counter) == TS_ERROR) {
+ _counter = TSStatCreate(_counter_name.c_str(), TS_RECORDDATATYPE_INT,
TS_STAT_NON_PERSISTENT, TS_STAT_SYNC_COUNT);
+ if (_counter == TS_ERROR) {
+ TSError("%s: TSStatCreate() failed. Can't create counter: %s",
PLUGIN_NAME, _counter_name.c_str());
+ return;
+ }
+ TSDebug(PLUGIN_NAME, "OperatorCounter::initialize(%s) created counter with
id: %d", _counter_name.c_str(), _counter);
+ } else {
+ TSDebug(PLUGIN_NAME, "OperatorCounter::initialize(%s) reusing id: %d",
_counter_name.c_str(), _counter);
+ }
+}
+
+void
+OperatorCounter::exec(const Resources& res) const
+{
+ // Sanity
+ if (_counter == TS_ERROR)
+ return;
+
+ TSDebug(PLUGIN_NAME, "OperatorCounter::exec() invoked on counter %s",
_counter_name.c_str());
+ TSStatIntIncrement(_counter, 1);
+}
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/b79c9074/plugins/header_rewrite/operators.h
----------------------------------------------------------------------
diff --git a/plugins/header_rewrite/operators.h
b/plugins/header_rewrite/operators.h
index 65bbcb4..6ab67ff 100644
--- a/plugins/header_rewrite/operators.h
+++ b/plugins/header_rewrite/operators.h
@@ -240,5 +240,24 @@ private:
Value _value;
};
+class OperatorCounter : public Operator
+{
+public:
+ OperatorCounter()
+ : _counter_name(""), _counter(TS_ERROR)
+ {
+ TSDebug(PLUGIN_NAME_DBG, "Calling CTOR for OperatorCounter");
+ }
+ void initialize(Parser& p);
+
+protected:
+ void exec(const Resources& res) const;
+
+private:
+ DISALLOW_COPY_AND_ASSIGN(OperatorCounter);
+
+ std::string _counter_name;
+ int _counter;
+};
#endif // __OPERATORS_H