aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/lwtrace/example3
diff options
context:
space:
mode:
authorDevtools Arcadia <arcadia-devtools@yandex-team.ru>2022-02-07 18:08:42 +0300
committerDevtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net>2022-02-07 18:08:42 +0300
commit1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch)
treee26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/lwtrace/example3
downloadydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/lwtrace/example3')
-rw-r--r--library/cpp/lwtrace/example3/example_query.tr13
-rw-r--r--library/cpp/lwtrace/example3/lwtrace_example3.cpp43
-rw-r--r--library/cpp/lwtrace/example3/my_action.h85
-rwxr-xr-xlibrary/cpp/lwtrace/example3/start_with_query.sh6
-rw-r--r--library/cpp/lwtrace/example3/ya.make13
5 files changed, 160 insertions, 0 deletions
diff --git a/library/cpp/lwtrace/example3/example_query.tr b/library/cpp/lwtrace/example3/example_query.tr
new file mode 100644
index 0000000000..1f841b0932
--- /dev/null
+++ b/library/cpp/lwtrace/example3/example_query.tr
@@ -0,0 +1,13 @@
+Blocks {
+ ProbeDesc {
+ Name: "IterationProbe"
+ Provider: "LWTRACE_EXAMPLE_PROVIDER"
+ }
+ Action {
+ CustomAction {
+ Name: "MyAction"
+ Opts: "/dev/stdout"
+ }
+ }
+}
+
diff --git a/library/cpp/lwtrace/example3/lwtrace_example3.cpp b/library/cpp/lwtrace/example3/lwtrace_example3.cpp
new file mode 100644
index 0000000000..4493dc0077
--- /dev/null
+++ b/library/cpp/lwtrace/example3/lwtrace_example3.cpp
@@ -0,0 +1,43 @@
+#include <library/cpp/lwtrace/all.h>
+#include <google/protobuf/text_format.h>
+#include "my_action.h"
+
+#define LWTRACE_EXAMPLE_PROVIDER(PROBE, EVENT, GROUPS, TYPES, NAMES) \
+ PROBE(IterationProbe, GROUPS(), TYPES(i32, double), NAMES("n", "result")) \
+ /**/
+
+LWTRACE_DECLARE_PROVIDER(LWTRACE_EXAMPLE_PROVIDER)
+LWTRACE_DEFINE_PROVIDER(LWTRACE_EXAMPLE_PROVIDER)
+
+void InitLWTrace() {
+ NLWTrace::StartLwtraceFromEnv([=](NLWTrace::TManager& mngr) {
+ mngr.RegisterCustomAction<TMyActionExecutor>();
+ });
+}
+
+long double Fact(int n) {
+ if (n < 0) {
+ ythrow yexception() << "N! is undefined for negative N (" << n << ")";
+ }
+ double result = 1;
+ for (; n > 1; --n) {
+ GLOBAL_LWPROBE(LWTRACE_EXAMPLE_PROVIDER, IterationProbe, n, result);
+ result *= n;
+ }
+ return result;
+}
+
+void FactorialCalculator() {
+ i32 n;
+ Cout << "Enter a number: ";
+ TString str;
+ Cin >> n;
+ double factN = Fact(n);
+ Cout << n << "! = " << factN << Endl << Endl;
+}
+
+int main() {
+ InitLWTrace();
+ FactorialCalculator();
+ return 0;
+}
diff --git a/library/cpp/lwtrace/example3/my_action.h b/library/cpp/lwtrace/example3/my_action.h
new file mode 100644
index 0000000000..9a04293ba2
--- /dev/null
+++ b/library/cpp/lwtrace/example3/my_action.h
@@ -0,0 +1,85 @@
+#pragma once
+
+#include <library/cpp/lwtrace/all.h>
+#include <util/stream/file.h>
+
+// Example of custom state for custom executors
+// Holds file for output from TMyActionExecutor
+class TMyFile: public NLWTrace::IResource {
+private:
+ TMutex Mutex;
+ THolder<TUnbufferedFileOutput> File;
+
+public:
+ // Note that this class must have default ctor (it's declared here just for clearness)
+ TMyFile() {
+ }
+
+ // Note that dtor will be called by TManager::Delete() after detachment and destruction of all executors
+ ~TMyFile() {
+ }
+
+ // Some kind of state initialization
+ // Can be called only from executor constructor, and should not be thread-safe
+ void Open(const TString& path) {
+ if (File) {
+ // We must avoid double open because each executor will call Open() on the same object
+ // if the same file was specified in Opts
+ return;
+ }
+ File.Reset(new TUnbufferedFileOutput(path));
+ }
+
+ // Outputs a line to opened file
+ // Can be called from DoExecute() and must be thread-safe
+ void Output(const TString& line) {
+ Y_VERIFY(File);
+ TGuard<TMutex> g(Mutex); // Because DoExecute() call can come from any thread
+ *File << line << Endl;
+ }
+};
+
+// Action that prints events to specified file
+class TMyActionExecutor: public NLWTrace::TCustomActionExecutor {
+private:
+ TMyFile& File;
+
+public:
+ TMyActionExecutor(NLWTrace::TProbe* probe, const NLWTrace::TCustomAction& action, NLWTrace::TSession* session)
+ : NLWTrace::TCustomActionExecutor(probe, false /* not destructive */)
+ , File(session->Resources().Get<TMyFile>("FileHolder/" + action.GetOpts(0))) // unique state id must include your d
+ {
+ if (action.GetOpts().size() != 1) {
+ yexception() << "wrong number of Opts in MyAction";
+ }
+ File.Open(action.GetOpts(0));
+ }
+
+ static const char* GetActionName() {
+ static const char name[] = "MyAction";
+ return name;
+ }
+
+private:
+ virtual bool DoExecute(NLWTrace::TOrbit&, const NLWTrace::TParams& params) {
+ // Serialize param values to strings
+ TString paramValues[LWTRACE_MAX_PARAMS];
+ Probe->Event.Signature.SerializeParams(params, paramValues);
+
+ // Generate output line
+ TStringStream ss;
+ ss << "TMyActionExecutor>>> ";
+ ss << Probe->Event.Name;
+ for (ui32 i = 0; i < Probe->Event.Signature.ParamCount; ++i) {
+ ss << " " << Probe->Event.Signature.ParamNames[i] << "=" << paramValues[i];
+ }
+
+ // Write line to file
+ File.Output(ss.Str());
+
+ // Executors can chain if you specify multiple actions in one block (in trace query).
+ // So return true to continue execution of actions for given trace query block (on current triggered event)
+ // or return false if this action is the last for this block
+ return true;
+ }
+};
diff --git a/library/cpp/lwtrace/example3/start_with_query.sh b/library/cpp/lwtrace/example3/start_with_query.sh
new file mode 100755
index 0000000000..5cd221856f
--- /dev/null
+++ b/library/cpp/lwtrace/example3/start_with_query.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+echo "Executing program with following trace query:"
+cat example_query.tr
+echo -n "Press any key to start program"
+read
+LWTRACE="example_query.tr" ./lwtrace-example3
diff --git a/library/cpp/lwtrace/example3/ya.make b/library/cpp/lwtrace/example3/ya.make
new file mode 100644
index 0000000000..c5b31586e9
--- /dev/null
+++ b/library/cpp/lwtrace/example3/ya.make
@@ -0,0 +1,13 @@
+PROGRAM(lwtrace-example3)
+
+OWNER(serxa)
+
+SRCS(
+ lwtrace_example3.cpp
+)
+
+PEERDIR(
+ library/cpp/lwtrace
+)
+
+END()