diff --git a/prometheus-integration/com.tibco.bw.prometheus.monitor/src/com/tibco/bw/prometheus/monitor/PrometheusCollector.java b/prometheus-integration/com.tibco.bw.prometheus.monitor/src/com/tibco/bw/prometheus/monitor/PrometheusCollector.java
index 07bc565..37adfe4 100644
--- a/prometheus-integration/com.tibco.bw.prometheus.monitor/src/com/tibco/bw/prometheus/monitor/PrometheusCollector.java
+++ b/prometheus-integration/com.tibco.bw.prometheus.monitor/src/com/tibco/bw/prometheus/monitor/PrometheusCollector.java
@@ -31,7 +31,7 @@
public class PrometheusCollector extends Collector {
private static Logger logger = LoggerFactory.getLogger(PrometheusCollector.class);
public static HTTPServer server;
- private final static InetSocketAddress DEFAULT_PROMETHEUS_MONITOR_PORT = new InetSocketAddress(9095);
+ private final static InetSocketAddress DEFAULT_PROMETHEUS_MONITOR_PORT = new InetSocketAddress("0.0.0.0",9095);
private static final QName HTTPCONNECTOR_TYPE = new QName("http://xsd.tns.tibco.com/bw/models/sharedresource/httpconnector","HttpConnectorConfiguration");
private final static CountDownLatch proxyInitLatch = new CountDownLatch(1);
diff --git a/turbine-server/README.md b/turbine-server/README.md
new file mode 100644
index 0000000..697d457
--- /dev/null
+++ b/turbine-server/README.md
@@ -0,0 +1,35 @@
+# turbine-server
+___
+
+## Turbine server for TIBCO BWCE
+### Environment Variables -
+
+PLATFORM = Openshit/Kubernetes (Default - Kubernetes)
+
+NAMESPACE = k8s namespace to monitor (Default - Current Namespace)
+
+### Label Selector
+
+To include a particular application, add the following label to pods.
+
+hystrix.enabled=true
+
+### Build docker image
+
+From the project path, execute -
+
+mvn clean package docker:build
+
+### Monitoring applications in projects/namespaces other than current
+
+Permissions need to be provided to view services from other projects/namespaces.
+
+##### Kubernetes (Tested on minikube)
+Add clusterrolebinding
+
+kubectl create clusterrolebinding [hystrix-namespace] --clusterrole cluster-admin --serviceaccount=[hystrix-namespace]:[user]
+
+##### Openshift
+oc project [project to monitor]
+
+oc policy add-role-to-user view system:serviceaccount:[hystrix-namespace]:[user]
diff --git a/turbine-server/com.tibco.bw.turbine.server/.classpath b/turbine-server/com.tibco.bw.turbine.server/.classpath
new file mode 100644
index 0000000..af1430b
--- /dev/null
+++ b/turbine-server/com.tibco.bw.turbine.server/.classpath
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/turbine-server/com.tibco.bw.turbine.server/.gitignore b/turbine-server/com.tibco.bw.turbine.server/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/turbine-server/com.tibco.bw.turbine.server/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/turbine-server/com.tibco.bw.turbine.server/.project b/turbine-server/com.tibco.bw.turbine.server/.project
new file mode 100644
index 0000000..e7a2fd9
--- /dev/null
+++ b/turbine-server/com.tibco.bw.turbine.server/.project
@@ -0,0 +1,23 @@
+
+
+ com.tibco.bw.turbine.server
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+ org.eclipse.m2e.core.maven2Nature
+
+
diff --git a/turbine-server/com.tibco.bw.turbine.server/.settings/org.eclipse.core.resources.prefs b/turbine-server/com.tibco.bw.turbine.server/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..e9441bb
--- /dev/null
+++ b/turbine-server/com.tibco.bw.turbine.server/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding/=UTF-8
diff --git a/turbine-server/com.tibco.bw.turbine.server/.settings/org.eclipse.jdt.core.prefs b/turbine-server/com.tibco.bw.turbine.server/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..714351a
--- /dev/null
+++ b/turbine-server/com.tibco.bw.turbine.server/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,5 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/turbine-server/com.tibco.bw.turbine.server/.settings/org.eclipse.m2e.core.prefs b/turbine-server/com.tibco.bw.turbine.server/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/turbine-server/com.tibco.bw.turbine.server/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/turbine-server/com.tibco.bw.turbine.server/pom.xml b/turbine-server/com.tibco.bw.turbine.server/pom.xml
new file mode 100644
index 0000000..6fae6a9
--- /dev/null
+++ b/turbine-server/com.tibco.bw.turbine.server/pom.xml
@@ -0,0 +1,104 @@
+
+
+
+
+ 4.0.0
+
+ com.tibco
+ turbine-server
+ 2.0.0-SNAPSHOT
+ war
+ Netflix Turbine
+
+
+ 1.8
+ 1.8
+ UTF-8
+ tibco
+
+
+
+
+ javax.servlet
+ javax.servlet-api
+ 3.1.0
+ provided
+
+
+ com.netflix.turbine
+ turbine-core
+ 1.0.0
+
+
+ io.fabric8
+ openshift-client
+ 4.0.3
+
+
+ io.fabric8
+ kubernetes-client
+ 4.0.3
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-war-plugin
+ 2.6
+
+ false
+
+
+
+ io.fabric8
+ docker-maven-plugin
+ 0.26.1
+
+ http://localhost:2375
+
+
+ ${docker.group.name}/${project.artifactId}:${project.version}
+
+ tomcat:8.0.30-jre8
+
+ latest
+ ${project.version}
+
+
+ 8080
+
+
+ rm -rf /usr/local/tomcat/webapps/ROOT
+ rm -rf /usr/local/tomcat/webapps/docs
+ rm -rf /usr/local/tomcat/webapps/examples
+ rm -rf /usr/local/tomcat/webapps/host-manager
+ rm -rf /usr/local/tomcat/webapps/manager
+
+
+ /usr/local
+
+
+
+ ${project.build.directory}/${project.artifactId}-${project.version}.war
+ tomcat/webapps/
+ ROOT.war
+
+
+
+
+
+
+
+ http.port:8080
+
+
+
+
+
+
+
+
+
diff --git a/turbine-server/com.tibco.bw.turbine.server/src/main/java/com/tibco/bw/turbine/server/DiscoveryFeedbackServlet.java b/turbine-server/com.tibco.bw.turbine.server/src/main/java/com/tibco/bw/turbine/server/DiscoveryFeedbackServlet.java
new file mode 100644
index 0000000..b3476f6
--- /dev/null
+++ b/turbine-server/com.tibco.bw.turbine.server/src/main/java/com/tibco/bw/turbine/server/DiscoveryFeedbackServlet.java
@@ -0,0 +1,34 @@
+/*Copyright © 2019. TIBCO Software Inc. All Rights Reserved.*/
+package com.tibco.bw.turbine.server;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.netflix.turbine.discovery.Instance;
+
+public class DiscoveryFeedbackServlet extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+ private static final OpenShiftDiscovery DISCOVERY = OpenShiftDiscovery.getOpenShiftDiscovery();
+
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+ resp.setContentType("text/html");
+ PrintWriter out = resp.getWriter();
+ out.println("Hystrix Endpoints: "+OpenShiftDiscovery.getNamespace() +"
");
+ try {
+ for (Instance instance : DISCOVERY.getInstanceList()) {
+ out.println("" + instance.getHostname() + " : " + (instance.isUp()?"Running":"Unreachable") + "
");
+ }
+ } catch (Throwable t) {
+ t.printStackTrace(out);
+ }
+ out.flush();
+ }
+
+}
diff --git a/turbine-server/com.tibco.bw.turbine.server/src/main/java/com/tibco/bw/turbine/server/OpenShiftDiscovery.java b/turbine-server/com.tibco.bw.turbine.server/src/main/java/com/tibco/bw/turbine/server/OpenShiftDiscovery.java
new file mode 100644
index 0000000..1f43e16
--- /dev/null
+++ b/turbine-server/com.tibco.bw.turbine.server/src/main/java/com/tibco/bw/turbine/server/OpenShiftDiscovery.java
@@ -0,0 +1,70 @@
+/*Copyright © 2019. TIBCO Software Inc. All Rights Reserved.*/
+package com.tibco.bw.turbine.server;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import com.netflix.turbine.discovery.Instance;
+import com.netflix.turbine.discovery.InstanceDiscovery;
+
+import io.fabric8.kubernetes.api.model.Pod;
+import io.fabric8.kubernetes.api.model.PodList;
+import io.fabric8.kubernetes.client.DefaultKubernetesClient;
+import io.fabric8.kubernetes.client.KubernetesClient;
+import io.fabric8.openshift.client.DefaultOpenShiftClient;
+
+public class OpenShiftDiscovery implements InstanceDiscovery {
+
+ private static final Logger logger = Logger.getLogger(OpenShiftDiscovery.class.getName());
+ private static String platform= System.getenv("PLATFORM");
+ private static String namespace= System.getenv("NAMESPACE");
+ private static final String HYSTRIX_ENABLED = "hystrix.enabled";
+ private static final String TRUE = "true";
+ private static final String DEFAULT = "default";
+ private static final String OPENSHIFT = "Openshift";
+ private static final String KUBERNETES = "Kubernetes";
+ private static OpenShiftDiscovery openshiftDiscovery;
+ private boolean isOpenshift;
+ private KubernetesClient client;
+
+ public OpenShiftDiscovery() {
+
+ isOpenshift=(platform!=null && platform.equalsIgnoreCase(OPENSHIFT));
+ logger.log(Level.INFO,"Configuring for "+ (isOpenshift?OPENSHIFT:KUBERNETES));
+ try{
+ client=(isOpenshift)?new DefaultOpenShiftClient():new DefaultKubernetesClient();
+ }catch (Exception e){
+ logger.log(Level.SEVERE,"Cannot connect to master server.",e);
+ }
+ if(namespace==null)
+ namespace=client.getNamespace();
+ logger.log(Level.INFO,"Using Namespace " + namespace);
+ openshiftDiscovery=this;
+ }
+
+ public Collection getInstanceList() throws Exception {
+ List result = new ArrayList();
+ try{
+ PodList podList=client.pods().inNamespace(namespace).withLabel(HYSTRIX_ENABLED, TRUE).list();
+ for(Pod pod : podList.getItems()){
+ String podip=pod.getStatus().getPodIP();
+ Instance instance = new Instance(podip, DEFAULT, true);
+ result.add(instance);
+ }
+ }catch(Exception e){
+ logger.log(Level.SEVERE,"Cannot fetch endpoints.",e);
+ }
+ return result;
+ }
+
+ public static String getNamespace(){
+ return namespace;
+ }
+
+ public static OpenShiftDiscovery getOpenShiftDiscovery(){
+ return openshiftDiscovery;
+ }
+}
diff --git a/turbine-server/com.tibco.bw.turbine.server/src/main/java/com/tibco/bw/turbine/server/TurbineInitializer.java b/turbine-server/com.tibco.bw.turbine.server/src/main/java/com/tibco/bw/turbine/server/TurbineInitializer.java
new file mode 100644
index 0000000..d8fcd9d
--- /dev/null
+++ b/turbine-server/com.tibco.bw.turbine.server/src/main/java/com/tibco/bw/turbine/server/TurbineInitializer.java
@@ -0,0 +1,28 @@
+/*Copyright © 2019. TIBCO Software Inc. All Rights Reserved.*/
+package com.tibco.bw.turbine.server;
+
+import java.util.logging.Logger;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+
+import com.netflix.turbine.plugins.PluginsFactory;
+import com.netflix.turbine.init.TurbineInit;
+
+public class TurbineInitializer implements ServletContextListener {
+
+ private static final Logger logger = Logger.getLogger(TurbineInitializer.class.getName());
+
+ @Override
+ public void contextInitialized(ServletContextEvent sce) {
+ logger.info("Starting Turbine server");
+ PluginsFactory.setInstanceDiscovery(new OpenShiftDiscovery());
+ TurbineInit.init();
+ }
+
+ @Override
+ public void contextDestroyed(ServletContextEvent sce) {
+ logger.info("Stopping Turbine server");
+ TurbineInit.stop();
+ }
+}
diff --git a/turbine-server/com.tibco.bw.turbine.server/src/main/webapp/WEB-INF/classes/config.properties b/turbine-server/com.tibco.bw.turbine.server/src/main/webapp/WEB-INF/classes/config.properties
new file mode 100644
index 0000000..2533e9b
--- /dev/null
+++ b/turbine-server/com.tibco.bw.turbine.server/src/main/webapp/WEB-INF/classes/config.properties
@@ -0,0 +1,10 @@
+#Copyright © 2019. TIBCO Software Inc. All Rights Reserved.#
+
+#################################
+# Turbine
+#################################
+# turbine clusters
+turbine.aggregator.clusterConfig=default
+# turbine url suffix to where the hystrix stream can be retrieved from each cluster instance
+turbine.instanceUrlSuffix=:8090/hystrix.stream
+#################################
diff --git a/turbine-server/com.tibco.bw.turbine.server/src/main/webapp/WEB-INF/web.xml b/turbine-server/com.tibco.bw.turbine.server/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 0000000..2dfdc35
--- /dev/null
+++ b/turbine-server/com.tibco.bw.turbine.server/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+ com.tibco.bw.turbine.server.TurbineInitializer
+
+
+
+
+ TurbineStreamServlet
+ TurbineStreamServlet
+ com.netflix.turbine.streaming.servlet.TurbineStreamServlet
+
+
+
+ Discovery Feedback Servlet
+ DiscoveryFeedbackServlet
+ DiscoveryFeedbackServlet
+ com.tibco.bw.turbine.server.DiscoveryFeedbackServlet
+
+
+
+ TurbineStreamServlet
+ /turbine.stream
+
+
+
+ DiscoveryFeedbackServlet
+ /discovery
+
+
+
\ No newline at end of file