From 5828f286b971b86d5c163c2ffe6fcdbe0ac4c19b Mon Sep 17 00:00:00 2001 From: peng-yongsheng <8082209@qq.com> Date: Thu, 26 Oct 2017 22:26:28 +0800 Subject: [PATCH] add server component --- .../collector/server/grpc/GRPCHandler.java | 27 +++ .../apm/collector/server/grpc/GRPCServer.java | 73 ++++++++ .../server/grpc/GRPCServerException.java | 35 ++++ .../server/jetty/ArgumentsParseException.java | 35 ++++ .../collector/server/jetty/JettyHandler.java | 174 ++++++++++++++++++ .../collector/server/jetty/JettyServer.java | 81 ++++++++ .../server/jetty/JettyServerException.java | 35 ++++ 7 files changed, 460 insertions(+) create mode 100644 apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/grpc/GRPCHandler.java create mode 100644 apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/grpc/GRPCServer.java create mode 100644 apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/grpc/GRPCServerException.java create mode 100644 apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/jetty/ArgumentsParseException.java create mode 100644 apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/jetty/JettyHandler.java create mode 100644 apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/jetty/JettyServer.java create mode 100644 apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/jetty/JettyServerException.java diff --git a/apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/grpc/GRPCHandler.java b/apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/grpc/GRPCHandler.java new file mode 100644 index 000000000..b4ab728b9 --- /dev/null +++ b/apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/grpc/GRPCHandler.java @@ -0,0 +1,27 @@ +/* + * Copyright 2017, OpenSkywalking Organization All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Project repository: https://github.com/OpenSkywalking/skywalking + */ + +package org.skywalking.apm.collector.server.grpc; + +import org.skywalking.apm.collector.core.framework.Handler; + +/** + * @author peng-yongsheng + */ +public interface GRPCHandler extends Handler { +} diff --git a/apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/grpc/GRPCServer.java b/apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/grpc/GRPCServer.java new file mode 100644 index 000000000..89dd7d10a --- /dev/null +++ b/apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/grpc/GRPCServer.java @@ -0,0 +1,73 @@ +/* + * Copyright 2017, OpenSkywalking Organization All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Project repository: https://github.com/OpenSkywalking/skywalking + */ + +package org.skywalking.apm.collector.server.grpc; + +import io.grpc.netty.NettyServerBuilder; +import java.io.IOException; +import java.net.InetSocketAddress; +import org.skywalking.apm.collector.core.framework.Handler; +import org.skywalking.apm.collector.core.server.Server; +import org.skywalking.apm.collector.core.server.ServerException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author peng-yongsheng + */ +public class GRPCServer implements Server { + + private final Logger logger = LoggerFactory.getLogger(GRPCServer.class); + + private final String host; + private final int port; + private io.grpc.Server server; + private NettyServerBuilder nettyServerBuilder; + + public GRPCServer(String host, int port) { + this.host = host; + this.port = port; + } + + @Override public String hostPort() { + return host + ":" + port; + } + + @Override public String serverClassify() { + return "Google-RPC"; + } + + @Override public void initialize() throws ServerException { + InetSocketAddress address = new InetSocketAddress(host, port); + nettyServerBuilder = NettyServerBuilder.forAddress(address); + logger.info("Server started, host {} listening on {}", host, port); + } + + @Override public void start() throws ServerException { + try { + server = nettyServerBuilder.build(); + server.start(); + } catch (IOException e) { + throw new GRPCServerException(e.getMessage(), e); + } + } + + @Override public void addHandler(Handler handler) { + nettyServerBuilder.addService((io.grpc.BindableService)handler); + } +} diff --git a/apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/grpc/GRPCServerException.java b/apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/grpc/GRPCServerException.java new file mode 100644 index 000000000..6824f8538 --- /dev/null +++ b/apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/grpc/GRPCServerException.java @@ -0,0 +1,35 @@ +/* + * Copyright 2017, OpenSkywalking Organization All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Project repository: https://github.com/OpenSkywalking/skywalking + */ + +package org.skywalking.apm.collector.server.grpc; + +import org.skywalking.apm.collector.core.server.ServerException; + +/** + * @author peng-yongsheng + */ +public class GRPCServerException extends ServerException { + + public GRPCServerException(String message) { + super(message); + } + + public GRPCServerException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/jetty/ArgumentsParseException.java b/apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/jetty/ArgumentsParseException.java new file mode 100644 index 000000000..9e42d28a7 --- /dev/null +++ b/apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/jetty/ArgumentsParseException.java @@ -0,0 +1,35 @@ +/* + * Copyright 2017, OpenSkywalking Organization All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Project repository: https://github.com/OpenSkywalking/skywalking + */ + +package org.skywalking.apm.collector.server.jetty; + +import org.skywalking.apm.collector.core.CollectorException; + +/** + * @author peng-yongsheng + */ +public class ArgumentsParseException extends CollectorException { + + public ArgumentsParseException(String message) { + super(message); + } + + public ArgumentsParseException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/jetty/JettyHandler.java b/apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/jetty/JettyHandler.java new file mode 100644 index 000000000..1b8c22f48 --- /dev/null +++ b/apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/jetty/JettyHandler.java @@ -0,0 +1,174 @@ +/* + * Copyright 2017, OpenSkywalking Organization All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Project repository: https://github.com/OpenSkywalking/skywalking + */ + +package org.skywalking.apm.collector.server.jetty; + +import com.google.gson.JsonElement; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.Enumeration; +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.skywalking.apm.collector.core.framework.Handler; +import org.skywalking.apm.collector.core.util.ObjectUtils; + +/** + * @author peng-yongsheng + */ +public abstract class JettyHandler extends HttpServlet implements Handler { + + public abstract String pathSpec(); + + @Override + protected final void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + try { + reply(resp, doGet(req)); + } catch (ArgumentsParseException e) { + replyError(resp, e.getMessage(), HttpServletResponse.SC_BAD_REQUEST); + } + } + + protected abstract JsonElement doGet(HttpServletRequest req) throws ArgumentsParseException; + + @Override + protected final void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + try { + reply(resp, doPost(req)); + } catch (ArgumentsParseException e) { + replyError(resp, e.getMessage(), HttpServletResponse.SC_BAD_REQUEST); + } + } + + protected abstract JsonElement doPost(HttpServletRequest req) throws ArgumentsParseException; + + @Override + protected final void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + super.doHead(req, resp); + } + + @Override protected final long getLastModified(HttpServletRequest req) { + return super.getLastModified(req); + } + + @Override + protected final void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + super.doPut(req, resp); + } + + @Override + protected final void doDelete(HttpServletRequest req, + HttpServletResponse resp) throws ServletException, IOException { + super.doDelete(req, resp); + } + + @Override + protected final void doOptions(HttpServletRequest req, + HttpServletResponse resp) throws ServletException, IOException { + super.doOptions(req, resp); + } + + @Override + protected final void doTrace(HttpServletRequest req, + HttpServletResponse resp) throws ServletException, IOException { + super.doTrace(req, resp); + } + + @Override + protected final void service(HttpServletRequest req, + HttpServletResponse resp) throws ServletException, IOException { + super.service(req, resp); + } + + @Override public final void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { + super.service(req, res); + } + + @Override public final void destroy() { + super.destroy(); + } + + @Override public final String getInitParameter(String name) { + return super.getInitParameter(name); + } + + @Override public final Enumeration getInitParameterNames() { + return super.getInitParameterNames(); + } + + @Override public final ServletConfig getServletConfig() { + return super.getServletConfig(); + } + + @Override public final ServletContext getServletContext() { + return super.getServletContext(); + } + + @Override public final String getServletInfo() { + return super.getServletInfo(); + } + + @Override public final void init(ServletConfig config) throws ServletException { + super.init(config); + } + + @Override public final void init() throws ServletException { + super.init(); + } + + @Override public final void log(String msg) { + super.log(msg); + } + + @Override public final void log(String message, Throwable t) { + super.log(message, t); + } + + @Override public final String getServletName() { + return super.getServletName(); + } + + private void reply(HttpServletResponse response, JsonElement resJson) throws IOException { + response.setContentType("text/json"); + response.setCharacterEncoding("utf-8"); + response.setStatus(HttpServletResponse.SC_OK); + + PrintWriter out = response.getWriter(); + if (ObjectUtils.isNotEmpty(resJson)) { + out.print(resJson); + } + out.flush(); + out.close(); + } + + private void replyError(HttpServletResponse response, String errorMessage, int status) throws IOException { + response.setContentType("text/plain"); + response.setCharacterEncoding("utf-8"); + response.setStatus(status); + response.setHeader("error-message", errorMessage); + + PrintWriter out = response.getWriter(); + out.flush(); + out.close(); + } +} \ No newline at end of file diff --git a/apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/jetty/JettyServer.java b/apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/jetty/JettyServer.java new file mode 100644 index 000000000..95d9c5db9 --- /dev/null +++ b/apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/jetty/JettyServer.java @@ -0,0 +1,81 @@ +/* + * Copyright 2017, OpenSkywalking Organization All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Project repository: https://github.com/OpenSkywalking/skywalking + */ + +package org.skywalking.apm.collector.server.jetty; + +import java.net.InetSocketAddress; +import javax.servlet.http.HttpServlet; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHolder; +import org.skywalking.apm.collector.core.framework.Handler; +import org.skywalking.apm.collector.core.server.Server; +import org.skywalking.apm.collector.core.server.ServerException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author peng-yongsheng + */ +public class JettyServer implements Server { + + private final Logger logger = LoggerFactory.getLogger(JettyServer.class); + + private final String host; + private final int port; + private final String contextPath; + private org.eclipse.jetty.server.Server server; + private ServletContextHandler servletContextHandler; + + public JettyServer(String host, int port, String contextPath) { + this.host = host; + this.port = port; + this.contextPath = contextPath; + } + + @Override public String hostPort() { + return host + ":" + port; + } + + @Override public String serverClassify() { + return "Jetty"; + } + + @Override public void initialize() throws ServerException { + server = new org.eclipse.jetty.server.Server(new InetSocketAddress(host, port)); + + servletContextHandler = new ServletContextHandler(ServletContextHandler.NO_SESSIONS); + servletContextHandler.setContextPath(contextPath); + logger.info("http server root context path: {}", contextPath); + + server.setHandler(servletContextHandler); + } + + @Override public void addHandler(Handler handler) { + ServletHolder servletHolder = new ServletHolder(); + servletHolder.setServlet((HttpServlet)handler); + servletContextHandler.addServlet(servletHolder, ((JettyHandler)handler).pathSpec()); + } + + @Override public void start() throws ServerException { + try { + server.start(); + } catch (Exception e) { + throw new JettyServerException(e.getMessage(), e); + } + } +} diff --git a/apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/jetty/JettyServerException.java b/apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/jetty/JettyServerException.java new file mode 100644 index 000000000..538a4bcf8 --- /dev/null +++ b/apm-collector/apm-collector-component/server-component/src/main/java/org/skywalking/apm/collector/server/jetty/JettyServerException.java @@ -0,0 +1,35 @@ +/* + * Copyright 2017, OpenSkywalking Organization All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Project repository: https://github.com/OpenSkywalking/skywalking + */ + +package org.skywalking.apm.collector.server.jetty; + +import org.skywalking.apm.collector.core.server.ServerException; + +/** + * @author peng-yongsheng + */ +public class JettyServerException extends ServerException { + + public JettyServerException(String message) { + super(message); + } + + public JettyServerException(String message, Throwable cause) { + super(message, cause); + } +} -- GitLab