1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.hbase.http.jmx;
19
20 import java.io.IOException;
21 import java.io.PrintWriter;
22 import java.lang.management.ManagementFactory;
23
24 import javax.management.MBeanServer;
25 import javax.management.MalformedObjectNameException;
26 import javax.management.ObjectName;
27 import javax.management.ReflectionException;
28 import javax.management.RuntimeErrorException;
29 import javax.management.RuntimeMBeanException;
30 import javax.management.openmbean.CompositeData;
31 import javax.management.openmbean.TabularData;
32 import javax.servlet.ServletException;
33 import javax.servlet.http.HttpServlet;
34 import javax.servlet.http.HttpServletRequest;
35 import javax.servlet.http.HttpServletResponse;
36
37 import org.apache.commons.logging.Log;
38 import org.apache.commons.logging.LogFactory;
39 import org.apache.hadoop.hbase.http.HttpServer;
40 import org.apache.hadoop.hbase.util.JSONBean;
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109 public class JMXJsonServlet extends HttpServlet {
110 private static final Log LOG = LogFactory.getLog(JMXJsonServlet.class);
111
112 private static final long serialVersionUID = 1L;
113
114 private static final String CALLBACK_PARAM = "callback";
115
116
117
118
119
120 private static final String INCLUDE_DESCRIPTION = "description";
121
122
123
124
125 protected transient MBeanServer mBeanServer;
126
127 protected transient JSONBean jsonBeanWriter;
128
129
130
131
132 @Override
133 public void init() throws ServletException {
134
135 mBeanServer = ManagementFactory.getPlatformMBeanServer();
136 this.jsonBeanWriter = new JSONBean();
137 }
138
139
140
141
142
143
144
145
146
147 @Override
148 public void doGet(HttpServletRequest request, HttpServletResponse response) {
149 try {
150 if (!HttpServer.isInstrumentationAccessAllowed(getServletContext(), request, response)) {
151 return;
152 }
153 String jsonpcb = null;
154 PrintWriter writer = null;
155 JSONBean.Writer beanWriter = null;
156 try {
157 writer = response.getWriter();
158 beanWriter = this.jsonBeanWriter.open(writer);
159
160 jsonpcb = request.getParameter(CALLBACK_PARAM);
161 if (jsonpcb != null) {
162 response.setContentType("application/javascript; charset=utf8");
163 writer.write(jsonpcb + "(");
164 } else {
165 response.setContentType("application/json; charset=utf8");
166 }
167
168 String tmpStr = request.getParameter(INCLUDE_DESCRIPTION);
169 boolean description = tmpStr != null && tmpStr.length() > 0;
170
171
172 String getmethod = request.getParameter("get");
173 if (getmethod != null) {
174 String[] splitStrings = getmethod.split("\\:\\:");
175 if (splitStrings.length != 2) {
176 beanWriter.write("result", "ERROR");
177 beanWriter.write("message", "query format is not as expected.");
178 beanWriter.flush();
179 response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
180 return;
181 }
182 if (beanWriter.write(this.mBeanServer, new ObjectName(splitStrings[0]),
183 splitStrings[1], description) != 0) {
184 beanWriter.flush();
185 response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
186 }
187 return;
188 }
189
190
191 String qry = request.getParameter("qry");
192 if (qry == null) {
193 qry = "*:*";
194 }
195 if (beanWriter.write(this.mBeanServer, new ObjectName(qry), null, description) != 0) {
196 beanWriter.flush();
197 response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
198 }
199 } finally {
200 if (beanWriter != null) beanWriter.close();
201 if (jsonpcb != null) {
202 writer.write(");");
203 }
204 if (writer != null) {
205 writer.close();
206 }
207 }
208 } catch (IOException e) {
209 LOG.error("Caught an exception while processing JMX request", e);
210 response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
211 } catch (MalformedObjectNameException e) {
212 LOG.error("Caught an exception while processing JMX request", e);
213 response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
214 }
215 }
216 }