mon.h 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. #pragma once
  2. #include "events.h"
  3. #include "event_local.h"
  4. #include <library/cpp/monlib/service/monservice.h>
  5. #include <library/cpp/monlib/service/pages/mon_page.h>
  6. namespace NActors {
  7. namespace NMon {
  8. enum {
  9. HttpInfo = EventSpaceBegin(NActors::TEvents::ES_MON),
  10. HttpInfoRes,
  11. RemoteHttpInfo,
  12. RemoteHttpInfoRes,
  13. RemoteJsonInfoRes,
  14. RemoteBinaryInfoRes,
  15. End
  16. };
  17. static_assert(End < EventSpaceEnd(NActors::TEvents::ES_MON), "expect End < EventSpaceEnd(NActors::TEvents::ES_MON)");
  18. // request info from an actor in HTML format
  19. struct TEvHttpInfo: public NActors::TEventLocal<TEvHttpInfo, HttpInfo> {
  20. TEvHttpInfo(const NMonitoring::IMonHttpRequest& request, int subReqId = 0)
  21. : Request(request)
  22. , SubRequestId(subReqId)
  23. {
  24. }
  25. TEvHttpInfo(const NMonitoring::IMonHttpRequest& request, const TString& userToken)
  26. : Request(request)
  27. , UserToken(userToken)
  28. , SubRequestId(0)
  29. {
  30. }
  31. const NMonitoring::IMonHttpRequest& Request;
  32. TString UserToken; // built and serialized
  33. // SubRequestId != 0 means that we assemble reply from multiple parts and SubRequestId contains this part id
  34. int SubRequestId;
  35. };
  36. // base class for HTTP info response
  37. struct IEvHttpInfoRes: public NActors::TEventLocal<IEvHttpInfoRes, HttpInfoRes> {
  38. enum EContentType {
  39. Html,
  40. Custom,
  41. };
  42. IEvHttpInfoRes() {
  43. }
  44. virtual ~IEvHttpInfoRes() {
  45. }
  46. virtual void Output(IOutputStream& out) const = 0;
  47. virtual EContentType GetContentType() const = 0;
  48. };
  49. // Ready to output HTML in TString
  50. struct TEvHttpInfoRes: public IEvHttpInfoRes {
  51. TEvHttpInfoRes(const TString& answer, int subReqId = 0, EContentType contentType = Html)
  52. : Answer(answer)
  53. , SubRequestId(subReqId)
  54. , ContentType(contentType)
  55. {
  56. }
  57. void Output(IOutputStream& out) const override {
  58. out << Answer;
  59. }
  60. EContentType GetContentType() const override {
  61. return ContentType;
  62. }
  63. const TString Answer;
  64. const int SubRequestId;
  65. const EContentType ContentType;
  66. };
  67. struct TEvRemoteHttpInfo: public NActors::TEventBase<TEvRemoteHttpInfo, RemoteHttpInfo> {
  68. TEvRemoteHttpInfo() {
  69. }
  70. TEvRemoteHttpInfo(const TString& query)
  71. : Query(query)
  72. {
  73. }
  74. TEvRemoteHttpInfo(const TString& query, HTTP_METHOD method)
  75. : Query(query)
  76. , Method(method)
  77. {
  78. }
  79. TString Query;
  80. HTTP_METHOD Method;
  81. TString PathInfo() const {
  82. const size_t pos = Query.find('?');
  83. return (pos == TString::npos) ? TString() : Query.substr(0, pos);
  84. }
  85. TCgiParameters Cgi() const {
  86. const size_t pos = Query.find('?');
  87. return TCgiParameters((pos == TString::npos) ? TString() : Query.substr(pos + 1));
  88. }
  89. TString ToStringHeader() const override {
  90. return "TEvRemoteHttpInfo";
  91. }
  92. bool SerializeToArcadiaStream(TChunkSerializer *serializer) const override {
  93. return serializer->WriteString(&Query);
  94. }
  95. ui32 CalculateSerializedSize() const override {
  96. return Query.size();
  97. }
  98. bool IsSerializable() const override {
  99. return true;
  100. }
  101. static IEventBase* Load(TEventSerializedData* bufs) {
  102. return new TEvRemoteHttpInfo(bufs->GetString());
  103. }
  104. HTTP_METHOD GetMethod() const
  105. {
  106. return Method;
  107. }
  108. };
  109. struct TEvRemoteHttpInfoRes: public NActors::TEventBase<TEvRemoteHttpInfoRes, RemoteHttpInfoRes> {
  110. TEvRemoteHttpInfoRes() {
  111. }
  112. TEvRemoteHttpInfoRes(const TString& html)
  113. : Html(html)
  114. {
  115. }
  116. TString Html;
  117. TString ToStringHeader() const override {
  118. return "TEvRemoteHttpInfoRes";
  119. }
  120. bool SerializeToArcadiaStream(TChunkSerializer *serializer) const override {
  121. return serializer->WriteString(&Html);
  122. }
  123. ui32 CalculateSerializedSize() const override {
  124. return Html.size();
  125. }
  126. bool IsSerializable() const override {
  127. return true;
  128. }
  129. static IEventBase* Load(TEventSerializedData* bufs) {
  130. return new TEvRemoteHttpInfoRes(bufs->GetString());
  131. }
  132. };
  133. struct TEvRemoteJsonInfoRes: public NActors::TEventBase<TEvRemoteJsonInfoRes, RemoteJsonInfoRes> {
  134. TEvRemoteJsonInfoRes() {
  135. }
  136. TEvRemoteJsonInfoRes(const TString& json)
  137. : Json(json)
  138. {
  139. }
  140. TString Json;
  141. TString ToStringHeader() const override {
  142. return "TEvRemoteJsonInfoRes";
  143. }
  144. bool SerializeToArcadiaStream(TChunkSerializer *serializer) const override {
  145. return serializer->WriteString(&Json);
  146. }
  147. ui32 CalculateSerializedSize() const override {
  148. return Json.size();
  149. }
  150. bool IsSerializable() const override {
  151. return true;
  152. }
  153. static IEventBase* Load(TEventSerializedData* bufs) {
  154. return new TEvRemoteJsonInfoRes(bufs->GetString());
  155. }
  156. };
  157. struct TEvRemoteBinaryInfoRes: public NActors::TEventBase<TEvRemoteBinaryInfoRes, RemoteBinaryInfoRes> {
  158. TEvRemoteBinaryInfoRes() {
  159. }
  160. TEvRemoteBinaryInfoRes(const TString& blob)
  161. : Blob(blob)
  162. {
  163. }
  164. TString Blob;
  165. TString ToStringHeader() const override {
  166. return "TEvRemoteBinaryInfoRes";
  167. }
  168. bool SerializeToArcadiaStream(TChunkSerializer *serializer) const override {
  169. return serializer->WriteString(&Blob);
  170. }
  171. ui32 CalculateSerializedSize() const override {
  172. return Blob.size();
  173. }
  174. bool IsSerializable() const override {
  175. return true;
  176. }
  177. static IEventBase* Load(TEventSerializedData* bufs) {
  178. return new TEvRemoteBinaryInfoRes(bufs->GetString());
  179. }
  180. };
  181. }
  182. }