OpenSDN source code
sandesh_trace.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 //
6 // sandesh_trace.cc
7 //
8 // Sandesh Trace Request Implementation
9 //
10 
11 #include <boost/bind/bind.hpp>
12 #include <ctime>
13 #include <base/trace.h>
14 #include <sandesh/sandesh_types.h>
15 #include <sandesh/sandesh.h>
16 #include <sandesh/sandesh_trace_types.h>
17 #include "sandesh_trace.h"
18 
19 using std::string;
20 using std::vector;
21 using namespace boost::placeholders;
22 
24 
26 
28 public:
30  const std::string& req_context,
31  const std::string& read_context,
32  uint32_t count) :
33  req_buf_(trace_buf),
34  req_context_(req_context),
35  read_context_(read_context),
36  sttr_(new SandeshTraceTextResponse),
37  req_count_(count),
38  read_count_(0) {
39  if (!req_count_) {
40  // Fill the read_count_ with the size of the trace buffer
41  req_count_ = SandeshTraceBufferSizeGet(req_buf_);
42  }
43  }
44 
46 
47  void Run() {
48  SandeshTraceBufferRead(req_buf_, read_context_, req_count_,
50  this, _1, _2));
51  if ("Collector" != read_context_) {
52  sttr_->set_context(req_context_);
53  sttr_->Response();
54  SandeshTraceBufferReadDone(req_buf_, read_context_);
55  }
56  }
57 
58 private:
59  void SandeshTraceRead(SandeshTrace *tsnh, bool more) {
60  read_count_++;
61  assert(tsnh);
62  vector<string>& tracebuf = const_cast<vector<string>&>(sttr_->get_traces());
63 
64  if ("Collector" != read_context_) {
65  tracebuf.push_back(tsnh->ToString());
66  return;
67  }
68 
69  if (!more || (read_count_ == req_count_)) {
70  tsnh->SendTrace(req_context_, false);
71  } else {
72  tsnh->SendTrace(req_context_, true);
73  }
74  }
75 
77  std::string req_context_;
78  std::string read_context_;
79  SandeshTraceTextResponse *sttr_;
80  uint32_t req_count_;
81  uint32_t read_count_;
82 };
83 
84 void SandeshTraceRequest::HandleRequest() const {
85  std::string read_context;
86 
87  // TODO:
88  // We should get the Sandesh Header to differentiate
89  // trace requests from non-http modules.
90  if ((0 == context().find("http%")) || (0 == context().find("https%"))) {
91  read_context = "Http";
92  } else {
93  read_context = "Collector";
94  }
95 
96  SandeshTraceBufferPtr trace_buf(SandeshTraceBufferGet(get_buf_name()));
97  if (!trace_buf) {
98  if (read_context != "Collector") {
99  SandeshTraceTextResponse *sttr = new SandeshTraceTextResponse;
100  sttr->set_context(context());
101  sttr->Response();
102  }
103  return;
104  }
105  std::unique_ptr<SandeshTraceRequestRunner> trace_req_runner(new
106  SandeshTraceRequestRunner(trace_buf, context(),
107  read_context, get_count()));
108  trace_req_runner->Run();
109 }
110 
111 void SandeshTraceSend(const std::string& buf_name, uint32_t trace_count) {
112  // TODO:
113  // Handle this in a separate task, so that the generator can resume its execution.
114  // Need to ensure that we don't run parallel tasks that send trace messages
115  // [in the same trace buffer] to the collector. It is possible that when the
116  // generator invoked this api, there may be another task running that handles
117  // the trace request (for the same trace buffer) from the Collector.
118  SandeshTraceBufferPtr trace_buf(SandeshTraceBufferGet(buf_name));
119  if (!trace_buf) {
120  return;
121  }
122  std::unique_ptr<SandeshTraceRequestRunner> trace_req_runner(new
123  SandeshTraceRequestRunner(trace_buf, "", "Collector", trace_count));
124  trace_req_runner->Run();
125 }
126 
127 void SandeshTraceBufferListRequest::HandleRequest() const {
128  std::vector<std::string> trace_buf_list;
129  SandeshTraceBufferListGet(trace_buf_list);
130  std::vector<SandeshTraceBufInfo> trace_buf_info_list;
131  for (std::vector<std::string>::const_iterator it = trace_buf_list.begin();
132  it != trace_buf_list.end(); ++it) {
133  SandeshTraceBufInfo trace_buf_info;
134  trace_buf_info.set_trace_buf_name(*it);
135  trace_buf_info_list.push_back(trace_buf_info);
136  }
137  SandeshTraceBufferListResponse *resp = new SandeshTraceBufferListResponse;
138  resp->set_trace_buffer_list(trace_buf_info_list);
139  resp->set_context(context());
140  resp->set_more(false);
141  resp->Response();
142 }
143 
144 void SandeshTraceEnableDisableReq::HandleRequest() const {
145  std::string status;
146  if (__isset.enable) {
147  if (get_enable()) {
149  status = "Sandesh Trace Enabled";
150  } else {
152  status = "Sandesh Trace Disabled";
153  }
154  } else {
155  // If the user has not specified whether to enable or disable
156  // trace, then toggle the trace status.
157  if (IsSandeshTraceEnabled()) {
159  status = "Sandesh Trace Disabled";
160  } else {
162  status = "Sandesh Trace Enabled";
163  }
164  }
165  SandeshTraceEnableDisableRes *resp = new
166  SandeshTraceEnableDisableRes;
167  resp->set_enable_disable_status(status);
168  resp->set_context(context());
169  resp->set_more(false);
170  resp->Response();
171 }
172 
173 void SandeshTraceBufStatusReq::HandleRequest() const {
174  std::vector<std::string> trace_buf_list;
175  SandeshTraceBufferListGet(trace_buf_list);
176  std::vector<SandeshTraceBufStatusInfo> trace_buf_status_list;
177  for (std::vector<std::string>::const_iterator it = trace_buf_list.begin();
178  it != trace_buf_list.end(); ++it) {
179  SandeshTraceBufStatusInfo trace_buf_status;
180  trace_buf_status.set_trace_buf_name(*it);
182  assert(tbp);
183  if (IsSandeshTraceBufferEnabled(tbp)) {
184  trace_buf_status.set_enable_disable("Enabled");
185  } else {
186  trace_buf_status.set_enable_disable("Disabled");
187  }
188  trace_buf_status_list.push_back(trace_buf_status);
189  trace_buf_status.set_buffer_length(SandeshTraceBufferSizeGet(tbp));
190  }
191  SandeshTraceBufStatusRes *resp = new SandeshTraceBufStatusRes;
192  resp->set_trace_buf_status_list(trace_buf_status_list);
193  resp->set_context(context());
194  resp->set_more(false);
195  resp->Response();
196 }
197 
198 void SandeshTraceBufferEnableDisableReq::HandleRequest() const {
199  SandeshTraceBufferEnableDisableRes *resp = new
200  SandeshTraceBufferEnableDisableRes;
201  std::string status;
202  SandeshTraceBufferPtr trace_buf(
203  SandeshTraceBufferGet(get_trace_buf_name()));
204  if (trace_buf) {
205  if (__isset.enable) {
206  if (get_enable()) {
207  SandeshTraceBufferEnable(trace_buf);
208  status = "Trace buffer Enabled";
209  } else {
210  SandeshTraceBufferDisable(trace_buf);
211  status = "Trace buffer Disabled";
212  }
213  } else {
214  // If the user has not specified whether to enable or disable
215  // trace, then toggle the trace status.
216  if (IsSandeshTraceBufferEnabled(trace_buf)) {
217  SandeshTraceBufferDisable(trace_buf);
218  status = "Trace buffer Disabled";
219  } else {
220  SandeshTraceBufferEnable(trace_buf);
221  status = "Trace buffer Enabled";
222  }
223  }
224  } else {
225  status = "Invalid Trace buffer";
226  }
227  resp->set_enable_disable_status(status);
228  resp->set_context(context());
229  resp->set_more(false);
230  resp->Response();
231 }
SandeshTraceBufferPtr req_buf_
void SandeshTraceRead(SandeshTrace *tsnh, bool more)
SandeshTraceRequestRunner(SandeshTraceBufferPtr trace_buf, const std::string &req_context, const std::string &read_context, uint32_t count)
SandeshTraceTextResponse * sttr_
virtual void SendTrace(const std::string &context, bool more)=0
virtual std::string ToString() const =0
Definition: trace.h:288
static Trace * trace_
A pointer to the table (singleton) used in this program.
Definition: trace.h:401
void SandeshTraceSend(const std::string &buf_name, uint32_t trace_count)
int PullSandeshTraceReq
void SandeshTraceEnable()
Definition: sandesh_trace.h:23
SandeshTraceBufferPtr SandeshTraceBufferGet(const std::string &buf_name)
Definition: sandesh_trace.h:54
void SandeshTraceBufferDisable(SandeshTraceBufferPtr trace_buf)
Definition: sandesh_trace.h:62
size_t SandeshTraceBufferSizeGet(SandeshTraceBufferPtr trace_buf)
Definition: sandesh_trace.h:70
void SandeshTraceDisable()
Definition: sandesh_trace.h:27
void SandeshTraceBufferReadDone(SandeshTraceBufferPtr trace_buf, const std::string &read_context)
Definition: sandesh_trace.h:80
bool IsSandeshTraceEnabled()
Definition: sandesh_trace.h:31
void SandeshTraceBufferEnable(SandeshTraceBufferPtr trace_buf)
Definition: sandesh_trace.h:58
void SandeshTraceBufferListGet(std::vector< std::string > &trace_buf_list)
Definition: sandesh_trace.h:85
boost::shared_ptr< TraceBuffer< SandeshTrace > > SandeshTraceBufferPtr
Definition: sandesh_trace.h:18
bool IsSandeshTraceBufferEnabled(SandeshTraceBufferPtr trace_buf)
Definition: sandesh_trace.h:66
void SandeshTraceBufferRead(SandeshTraceBufferPtr trace_buf, const std::string &read_context, const int count, boost::function< void(SandeshTrace *, bool)> cb)
Definition: sandesh_trace.h:74