Skip to content

Commit 308563a

Browse files
committed
Added healthcheck and integrated with latest karyon
1 parent 0314817 commit 308563a

File tree

12 files changed

+168
-191
lines changed

12 files changed

+168
-191
lines changed

build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ subprojects {
4747
compile 'com.netflix.ribbon:ribbon-eureka:0.1.2'
4848
compile 'com.netflix.ribbon:ribbon-httpclient:0.1.2'
4949
compile 'com.netflix.governator:governator:1.0.3'
50-
compile 'com.netflix.karyon:karyon-server:0.1.2'
50+
compile 'com.netflix.karyon:karyon-core:1.0.0'
51+
compile 'com.netflix.karyon:karyon-admin-web:1.0.0'
5152
testCompile 'junit:junit:4.10'
5253
testCompile 'log4j:log4j:1.2.16'
5354

rss-core/src/main/java/com/netflix/recipes/rss/RSSConfiguration.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,39 +47,33 @@ public class RSSConfiguration implements AppConfiguration {
4747
public RSSConfiguration() {
4848
}
4949

50-
@Override
5150
public String getString(String key, String defaultValue) {
5251
final DynamicStringProperty property = DynamicPropertyFactory.getInstance().getStringProperty(key, defaultValue);
5352
return property.get();
5453
}
5554

56-
@Override
5755
public int getInt(String key, int defaultValue) {
5856
final DynamicIntProperty property = DynamicPropertyFactory.getInstance().getIntProperty(key, defaultValue);
5957
return property.get();
6058
}
6159

62-
@Override
6360
public long getLong(String key, int defaultValue) {
6461
final DynamicLongProperty property = DynamicPropertyFactory.getInstance().getLongProperty(key, defaultValue);
6562
return property.get();
6663
}
6764

68-
@Override
6965
public boolean getBoolean(String key, boolean defaultValue) {
7066
final DynamicBooleanProperty property = DynamicPropertyFactory.getInstance().getBooleanProperty(key, defaultValue);
7167
return property.get();
7268
}
7369

74-
@Override
7570
@VisibleForTesting
7671
public void setOverrideProperty(String key, Object value) {
7772
Preconditions.checkState(initialized, "Must initialize RSSConfiguration before use.");
7873
((ConcurrentCompositeConfiguration) ConfigurationManager
7974
.getConfigInstance()).setOverrideProperty(key, value);
8075
}
8176

82-
@Override
8377
public void close() {
8478
}
8579
}

rss-core/src/main/java/com/netflix/recipes/rss/netty/NettyServer.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ public final class NettyServer implements Closeable {
5656
InternalLoggerFactory.setDefaultFactory(new Slf4JLoggerFactory());
5757

5858
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
59-
@Override
6059
public void uncaughtException(Thread thread, Throwable exc) {
6160
logger.error("Thread Exc {}", thread.getName(), exc);
6261
for (Throwable exc2 = exc; exc2 != null; exc2 = exc2.getCause()) {
@@ -234,7 +233,6 @@ public ChannelPipeline getPipeline() throws Exception {
234233
}
235234
}
236235

237-
@Override
238236
public void close() {
239237
channelGroup.close();
240238
}

rss-core/src/main/java/com/netflix/recipes/rss/server/BaseJettyServer.java

Lines changed: 48 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -15,84 +15,77 @@
1515
*/
1616
package com.netflix.recipes.rss.server;
1717

18-
import com.google.inject.Injector;
19-
import com.netflix.blitz4j.LoggingConfiguration;
20-
import com.netflix.config.DynamicPropertyFactory;
21-
import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
22-
import com.netflix.karyon.server.KaryonServer;
23-
import com.netflix.recipes.rss.AppConfiguration;
24-
import com.netflix.recipes.rss.RSSConstants;
18+
import java.io.Closeable;
19+
2520
import org.apache.jasper.servlet.JspServlet;
2621
import org.mortbay.jetty.Server;
2722
import org.mortbay.jetty.servlet.Context;
2823
import org.slf4j.Logger;
2924
import org.slf4j.LoggerFactory;
3025

31-
import java.io.Closeable;
26+
import com.google.inject.Injector;
27+
import com.netflix.blitz4j.LoggingConfiguration;
28+
import com.netflix.config.ConfigurationManager;
29+
import com.netflix.config.DynamicPropertyFactory;
30+
import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
31+
import com.netflix.karyon.server.KaryonServer;
32+
import com.netflix.recipes.rss.RSSConstants;
3233

3334
/**
3435
* Base Jetty Server
3536
*
3637
* @author Chris Fregly ([email protected])
3738
*/
3839
public class BaseJettyServer implements Closeable {
40+
static {
41+
LoggingConfiguration.getInstance().configure();
42+
}
3943

40-
private static final Logger logger = LoggerFactory.getLogger(BaseJettyServer.class);
41-
42-
private final Server jettyServer;
43-
private final KaryonServer karyonServer;
44-
45-
private int port;
44+
private static final Logger logger = LoggerFactory.getLogger(BaseJettyServer.class);
4645

47-
protected final Injector injector;
48-
protected AppConfiguration config;
46+
private final Server jettyServer;
47+
private final KaryonServer karyonServer;
4948

50-
public BaseJettyServer() {
51-
System.setProperty(DynamicPropertyFactory.ENABLE_JMX, "true");
49+
protected final Injector injector;
5250

53-
this.karyonServer = new KaryonServer();
54-
this.injector = karyonServer.initialize();
55-
this.jettyServer = new Server();
56-
}
51+
public BaseJettyServer() {
52+
System.setProperty(DynamicPropertyFactory.ENABLE_JMX, "true");
5753

58-
public void start() {
59-
LoggingConfiguration.getInstance().configure();
54+
this.karyonServer = new KaryonServer();
55+
this.injector = karyonServer.initialize();
56+
this.jettyServer = new Server();
57+
}
6058

61-
try {
62-
karyonServer.start();
63-
} catch (Exception exc) {
64-
throw new RuntimeException("Cannot start karyon server ...", exc);
65-
}
59+
public void start() {
6660

67-
config = injector.getInstance(AppConfiguration.class);
68-
port = config.getInt(RSSConstants.JETTY_HTTP_PORT, Integer.MIN_VALUE);
61+
final int port = ConfigurationManager.getConfigInstance().getInt(RSSConstants.JETTY_HTTP_PORT, Integer.MIN_VALUE);
6962

70-
final Context context = new Context(jettyServer, "/", Context.SESSIONS);
71-
context.setResourceBase(RSSConstants.WEBAPPS_DIR);
72-
context.setClassLoader(Thread.currentThread().getContextClassLoader());
73-
context.addServlet(JspServlet.class, "*.jsp");
63+
final Context context = new Context(jettyServer, "/", Context.SESSIONS);
64+
context.setResourceBase(RSSConstants.WEBAPPS_DIR);
65+
context.setClassLoader(Thread.currentThread().getContextClassLoader());
66+
context.addServlet(JspServlet.class, "*.jsp");
7467

75-
// Enable hystrix.stream
76-
context.addServlet(HystrixMetricsStreamServlet.class, RSSConstants.HYSTRIX_STREAM_PATH);
68+
// Enable hystrix.stream
69+
context.addServlet(HystrixMetricsStreamServlet.class, RSSConstants.HYSTRIX_STREAM_PATH);
7770

78-
final Server server = new Server(port);
79-
server.setHandler(context);
71+
final Server server = new Server(port);
72+
server.setHandler(context);
8073

81-
try {
82-
server.start();
83-
} catch (Exception exc) {
84-
logger.error("Error starting jetty ...", exc);
85-
}
86-
}
74+
try {
75+
karyonServer.start();
76+
server.start();
77+
} catch (Exception exc) {
78+
throw new RuntimeException("Cannot start karyon server ...", exc);
79+
}
80+
}
8781

88-
@Override
89-
public void close() {
90-
try {
91-
jettyServer.stop();
92-
karyonServer.close();
93-
} catch (Exception exc) {
94-
logger.error("Error stopping jetty ...", exc);
95-
}
96-
LoggingConfiguration.getInstance().stop();
97-
}
82+
public void close() {
83+
try {
84+
jettyServer.stop();
85+
karyonServer.close();
86+
} catch (Exception exc) {
87+
logger.error("Error stopping jetty ...", exc);
88+
}
89+
LoggingConfiguration.getInstance().stop();
90+
}
9891
}

rss-core/src/main/java/com/netflix/recipes/rss/server/BaseNettyServer.java

Lines changed: 45 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -17,85 +17,71 @@
1717

1818
import java.io.Closeable;
1919

20-
import org.slf4j.Logger;
21-
import org.slf4j.LoggerFactory;
22-
23-
import com.netflix.recipes.rss.AppConfiguration;
24-
import com.netflix.recipes.rss.netty.NettyHandlerContainer;
25-
import com.netflix.recipes.rss.netty.NettyServer;
2620
import com.google.common.io.Closeables;
2721
import com.google.inject.Injector;
2822
import com.netflix.blitz4j.LoggingConfiguration;
23+
import com.netflix.config.ConfigurationManager;
2924
import com.netflix.config.DynamicPropertyFactory;
3025
import com.netflix.karyon.server.KaryonServer;
26+
import com.netflix.recipes.rss.netty.NettyHandlerContainer;
27+
import com.netflix.recipes.rss.netty.NettyServer;
3128
import com.sun.jersey.api.container.ContainerFactory;
3229
import com.sun.jersey.api.core.PackagesResourceConfig;
3330

3431
/**
3532
* @author Chris Fregly ([email protected])
3633
*/
3734
public class BaseNettyServer implements Closeable {
38-
private static final Logger logger = LoggerFactory
39-
.getLogger(BaseNettyServer.class);
35+
static {
36+
LoggingConfiguration.getInstance().configure();
37+
}
38+
39+
public NettyServer nettyServer;
40+
public final KaryonServer karyonServer;
4041

41-
public NettyServer nettyServer;
42-
public final KaryonServer karyonServer;
42+
public String host;
43+
public int port;
4344

44-
public String host;
45-
public int port;
45+
protected final Injector injector;
4646

47-
protected final Injector injector;
47+
//protected AppConfiguration config;
4848

49-
protected AppConfiguration config;
49+
public BaseNettyServer() {
5050

51-
public BaseNettyServer() {
52-
// This must be set before karyonServer.initialize() otherwise the
53-
// archaius properties will not be available in JMX/jconsole
54-
System.setProperty(DynamicPropertyFactory.ENABLE_JMX, "true");
51+
// This must be set before karyonServer.initialize() otherwise the
52+
// archaius properties will not be available in JMX/jconsole
53+
System.setProperty(DynamicPropertyFactory.ENABLE_JMX, "true");
5554

56-
this.karyonServer = new KaryonServer();
57-
this.injector = karyonServer.initialize();
58-
}
55+
this.karyonServer = new KaryonServer();
56+
this.injector = karyonServer.initialize();
57+
}
5958

60-
public void start() {
61-
LoggingConfiguration.getInstance().configure();
62-
63-
try {
64-
karyonServer.start();
65-
} catch (Exception exc) {
66-
throw new RuntimeException("Cannot start karyon server.", exc);
67-
}
68-
69-
// Note: after karyonServer.start(), the server will be marked as UP in eureka discovery.
70-
// this is not ideal, but we need to call karyonServer.start() in order to start the Guice LifecyleManager
71-
// to ultimately get the FluxConfiguration in the next step...
72-
73-
this.config = injector.getInstance(AppConfiguration.class);
74-
75-
// listen on any interface
76-
this.host = config.getString("netty.http.host", "not-found-in-configuration");
77-
this.port = config.getInt("netty.http.port", Integer.MIN_VALUE);
59+
public void start() {
60+
this.host = ConfigurationManager.getConfigInstance().getString("netty.http.host", "not-found-in-configuration");
61+
this.port = ConfigurationManager.getConfigInstance().getInt("netty.http.port", Integer.MIN_VALUE);
7862

79-
PackagesResourceConfig rcf = new PackagesResourceConfig(
80-
config.getString("jersey.resources.package",
81-
"not-found-in-configuration"));
63+
final PackagesResourceConfig rcf = new PackagesResourceConfig(ConfigurationManager.getConfigInstance().getString("jersey.resources.package","not-found-in-configuration"));
8264

83-
nettyServer = NettyServer
84-
.builder()
85-
.host(host)
86-
.port(port)
87-
.addHandler(
88-
"jerseyHandler",
89-
ContainerFactory.createContainer(
90-
NettyHandlerContainer.class, rcf))
91-
.numBossThreads(NettyServer.cpus)
92-
.numWorkerThreads(NettyServer.cpus * 4).build();
93-
}
65+
nettyServer = NettyServer
66+
.builder()
67+
.host(host)
68+
.port(port)
69+
.addHandler(
70+
"jerseyHandler",
71+
ContainerFactory.createContainer(
72+
NettyHandlerContainer.class, rcf))
73+
.numBossThreads(NettyServer.cpus)
74+
.numWorkerThreads(NettyServer.cpus * 4).build();
75+
try {
76+
karyonServer.start();
77+
} catch (Exception exc) {
78+
throw new RuntimeException("Cannot start karyon server.", exc);
79+
}
80+
}
9481

95-
@Override
96-
public void close() {
97-
Closeables.closeQuietly(nettyServer);
98-
Closeables.closeQuietly(karyonServer);
99-
LoggingConfiguration.getInstance().stop();
100-
}
82+
public void close() {
83+
Closeables.closeQuietly(nettyServer);
84+
Closeables.closeQuietly(karyonServer);
85+
LoggingConfiguration.getInstance().stop();
86+
}
10187
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.netflix.recipes.rss.server;
2+
3+
import com.netflix.karyon.spi.HealthCheckHandler;
4+
5+
public class EdgeHealthCheckHandler implements HealthCheckHandler {
6+
7+
public int getStatus() {
8+
return 200;
9+
}
10+
11+
}

rss-edge/src/main/java/com/netflix/recipes/rss/server/EdgeServer.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,10 @@
1515
*/
1616
package com.netflix.recipes.rss.server;
1717

18-
import com.google.inject.Inject;
19-
20-
import com.google.inject.Injector;
21-
import com.netflix.config.ConfigurationManager;
22-
import com.netflix.governator.guice.LifecycleInjector;
23-
import com.netflix.governator.lifecycle.LifecycleManager;
24-
import com.netflix.recipes.rss.AppConfiguration;
25-
import com.netflix.recipes.rss.util.RSSModule;
2618
import org.slf4j.Logger;
2719
import org.slf4j.LoggerFactory;
20+
21+
import com.netflix.config.ConfigurationManager;
2822
import com.netflix.karyon.spi.PropertyNames;
2923

3024
/**

rss-edge/src/main/resources/edge.properties

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,11 @@ middletier-client.ribbon.DeploymentContextBasedVipAddresses=middletier
4848
hystrix.command.RSSAdd.execution.isolation.thread.timeoutInMilliseconds=5000
4949
hystrix.command.RSSDel.execution.isolation.thread.timeoutInMilliseconds=2000
5050
hystrix.command.RSSGet.execution.isolation.thread.timeoutInMilliseconds=10000
51+
52+
53+
#############################################
54+
# Health Check Handler
55+
com.netflix.karyon.health.check.handler.classname=com.netflix.recipes.rss.server.EdgeHealthCheckHandler
56+
netflix.platform.admin.resources.port=9092
57+
com.netflix.karyon.unify.health.check.with.eureka=true
58+
#############################################
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.netflix.recipes.rss.manager;
2+
3+
import com.netflix.karyon.spi.HealthCheckHandler;
4+
5+
public class MiddleTierHealthCheckHandler implements HealthCheckHandler {
6+
7+
public int getStatus() {
8+
return RSSManager.getInstance().getStatus();
9+
}
10+
11+
}

0 commit comments

Comments
 (0)