Skip to content

Commit

Permalink
Merge pull request #1197 from diegopacheco/master
Browse files Browse the repository at this point in the history
New Feature -- Eureka Integration to Hystrix Dashbaord
  • Loading branch information
mattrjacobs authored Jul 13, 2016
2 parents 8f96fde + fe82af9 commit 8e6830c
Show file tree
Hide file tree
Showing 6 changed files with 197 additions and 1 deletion.
4 changes: 3 additions & 1 deletion hystrix-dashboard/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@ dependencies {
compile 'org.apache.httpcomponents:httpclient:4.2.1'
compile 'log4j:log4j:1.2.17'
compile 'org.slf4j:slf4j-log4j12:1.7.0'
compile 'commons-io:commons-io:2.5'
testCompile 'junit:junit:4.12'
}

jettyRun {
httpPort = 7979
httpPort = 7979
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.netflix.hystrix.dashboard.stream;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;

/**
* Copyright 2013 Netflix, Inc.
*
* 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.
*/

/**
* Servlet that calls eureka REST api in order to get instances information. <BR>
* You need provide a url parameter. i.e: eureka?url=http://127.0.0.1:8080/eureka/v2/apps
*
* @author diegopacheco
*
*/
public class EurekaInfoServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String uri = request.getParameter("url");
if (uri==null || "".equals(uri)) response.getOutputStream().write("Error. You need supply a valid eureka URL ".getBytes());

try{
response.setContentType("application/xml");
response.setHeader("Content-Encoding", "gzip");
IOUtils.copy( UrlUtils.readXmlInputStream(uri) ,response.getOutputStream());
}catch(Exception e){
response.getOutputStream().write(("Error. You need supply a valid eureka URL. Ex: " + e + "").getBytes());
}

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.netflix.hystrix.dashboard.stream;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
* Copyright 2013 Netflix, Inc.
*
* 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.
*/
/**
* Utility class to work with InputStreams
*
* @author diegopacheco
*
*/
public class UrlUtils {

public static InputStream readXmlInputStream(String uri){

if (uri==null || "".equals(uri)) throw new IllegalArgumentException("Invalid uri. URI cannot be null or blank. ");

try{
URL url = new URL(uri);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Accept", "application/xml");

return connection.getInputStream();

}catch(Exception e){
throw new RuntimeException(e);
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.netflix.hystrix.dashboard.stream;

import org.junit.Test;

/**
* Copyright 2013 Netflix, Inc.
*
* 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.
*/
/**
* UrlUtilsTest unit tests
*
* @author diegopacheco
*
*/
public class UrlUtilsTest {

@Test(expected=IllegalArgumentException.class)
public void testReadXmlInputStreamWithNull() {
UrlUtils.readXmlInputStream(null);
}

@Test(expected=IllegalArgumentException.class)
public void testReadXmlInputStreamWithBlank() {
UrlUtils.readXmlInputStream("");
}

}
11 changes: 11 additions & 0 deletions hystrix-dashboard/src/main/webapp/WEB-INF/web.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,16 @@
<servlet-name>ProxyStreamServlet</servlet-name>
<url-pattern>/proxy.stream</url-pattern>
</servlet-mapping>

<servlet>
<description />
<display-name>EurekaInfoServlet</display-name>
<servlet-name>EurekaInfoServlet</servlet-name>
<servlet-class>com.netflix.hystrix.dashboard.stream.EurekaInfoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>EurekaInfoServlet</servlet-name>
<url-pattern>/eureka</url-pattern>
</servlet-mapping>

</web-app>
45 changes: 45 additions & 0 deletions hystrix-dashboard/src/main/webapp/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,39 @@
}
});
});

$(document).ready(function(){

$('#eurekaURL').on('input',function(e){
url = window.location.pathname + "eureka?url=" + $('#eurekaURL').val()
$.get(url,function( data ) {

$(data.children).find("application").each(function(index,item){
appName = $(item).find("name")[0].innerHTML

ip = null;
$($(item).find("instance")).each(function(i,d){
ip = $(d).find("ipAddr")[0].innerHTML;
});

$('#eurekaApp').append($("<option></option>")
.attr("value",ip)
.text(appName));

$('#eurekaApp').on('change click',function(item){
var $this = $(this),
$value = $this.val();
streamType = $('input[name=streamType]:checked').val()
$('#stream').val("http://" + $value + ":8080/" + streamType + "?cluster=default");
});

});
});

});

});

</script>
</head>
<body>
Expand All @@ -57,6 +90,18 @@
<br>

<h2>Hystrix Dashboard</h2>

Eureka URL: <input id="eurekaURL" name="eurekaURL" class="eurekaURL" type="text" size="42" placeholder="http://hostname:8080/eureka/v2/apps"> <br>

Eureka Application:
<select id="eurekaApp" name="eurekaApp" class="eurekaApp">
<option selected disabled>Choose here</option>
</select>

Stream Type:
Hystrix <input type="radio" name="streamType" value="hystrix.stream">
Turbine <input type="radio" name="streamType" value="turbine.stream" checked> <br><br>

<input id="stream" type="textfield" size="120" placeholder="http://hostname:port/turbine/turbine.stream"></input>
<br><br>
<i>Cluster via Turbine (default cluster):</i> http://turbine-hostname:port/turbine.stream
Expand Down

0 comments on commit 8e6830c

Please sign in to comment.