Skip to content

Commit

Permalink
Kafdrop 2.0.0 sync from HomeAdvisor
Browse files Browse the repository at this point in the history
  • Loading branch information
Michael Pratt committed Jun 21, 2017
1 parent 43e4ec4 commit 987978e
Show file tree
Hide file tree
Showing 37 changed files with 480 additions and 55 deletions.
9 changes: 8 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

<groupId>com.homeadvisor.kafka</groupId>
<artifactId>kafdrop</artifactId>
<version>1.2.2-SNAPSHOT</version>
<version>2.0.0</version>

<description>For when you have a Kaf(ka) cluster to monitor</description>

Expand Down Expand Up @@ -108,6 +108,13 @@
<artifactId>spring-beans</artifactId>
</dependency>

<!-- Swagger API docs -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.7.0</version>
</dependency>

<!-- Test Dependencies -->
<dependency>
<groupId>junit</groupId>
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/com/homeadvisor/kafdrop/KafDrop.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2016 HomeAdvisor, Inc.
* Copyright 2017 HomeAdvisor, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -23,6 +23,7 @@
import com.homeadvisor.kafdrop.config.ini.IniFileReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.Banner;
import org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
Expand All @@ -44,7 +45,7 @@ public class KafDrop
public static void main(String[] args)
{
new SpringApplicationBuilder(KafDrop.class)
.showBanner(false)
.bannerMode(Banner.Mode.OFF)
.listeners(new EnvironmentSetupListener(),
new LoggingConfigurationListener())
.run(args);
Expand Down
106 changes: 106 additions & 0 deletions src/main/java/com/homeadvisor/kafdrop/config/CorsConfiguration.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
/*
* Copyright 2017 HomeAdvisor, 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.
*
*
*/

package com.homeadvisor.kafdrop.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
* Auto configuration for enabling CORS support. Can override behavior with
* various configs:
*
* <ul>
* <li>cors.enabled</li>
* <li>cors.allowOrigins</li>
* <li>cors.allowMethods</li>
* <li>cors.maxAge</li>
* <li>cors.allowCredentials</li>
* <li>cors.allowHeaders</li>
* </ul>
* <br/>
* To disable CORS entirely, set <b>cors.enabled=false</b>. All other configs are
* just Strings that get used as-is to set the corresponding CORS header.
*/
@Configuration
@ConditionalOnProperty(value = "cors.enabled", matchIfMissing = true)
public class CorsConfiguration
{
@Value("${cors.allowOrigins:*}")
private String corsAllowOrigins;

@Value("${cors.allowMethods:GET,POST,PUT,DELETE}")
private String corsAllowMethods;

@Value("${cors.maxAge:3600}")
private String corsMaxAge;

@Value("${cors.allowCredentials:true}")
private String corsAllowCredentials;

@Value("${cors.allowHeaders:Origin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization}")
private String corsAllowHeaders;

@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public Filter corsFilter()
{
return new Filter()
{
@Override
public void init(FilterConfig filterConfig) throws ServletException
{}

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException
{
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;

response.setHeader("Access-Control-Allow-Origin", corsAllowOrigins);
response.setHeader("Access-Control-Allow-Methods", corsAllowMethods);
response.setHeader("Access-Control-Max-Age", corsMaxAge);
response.setHeader("Access-Control-Allow-Credentials", corsAllowCredentials);
response.setHeader("Access-Control-Allow-Headers", corsAllowHeaders);

if(request.getMethod().equals(HttpMethod.OPTIONS.name()))
{
response.setStatus(HttpStatus.NO_CONTENT.value());
}
else
{
chain.doFilter(req, res);
}
}

@Override
public void destroy() {}
};
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2016 HomeAdvisor, Inc.
* Copyright 2017 HomeAdvisor, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2016 HomeAdvisor, Inc.
* Copyright 2017 HomeAdvisor, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2016 HomeAdvisor, Inc.
* Copyright 2017 HomeAdvisor, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
/*
* Copyright 2017 HomeAdvisor, 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.
*
*
*/

package com.homeadvisor.kafdrop.config;

import com.google.common.base.Predicate;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import springfox.documentation.RequestHandler;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
* Auto configuration for Swagger. Can be disabled by setting swagger.enabled=false.
*/
@Configuration
@EnableSwagger2
@ConditionalOnProperty(value = "swagger.enabled", matchIfMissing = true)
public class SwaggerConfiguration
{
@Bean
public Docket swagger()
{
return new Docket(DocumentationType.SWAGGER_2)
.useDefaultResponseMessages(false)
.apiInfo(new ApiInfoBuilder()
.title("Kafdrop API")
.description("JSON APIs for Kafdrop")
.build())
.select()
.apis(new JsonRequestHandlerPredicate())
.paths(new IgnoreDebugPathPredicate())
.build();
}

/**
* Swagger Predicate for only selecting JSON endpoints.
*/
public class JsonRequestHandlerPredicate implements Predicate<RequestHandler>
{
@Override
public boolean apply(RequestHandler input)
{
return input.produces().contains(MediaType.APPLICATION_JSON);
}
}

/**
* Swagger Predicate for ignoring /debug endpoints.
*/
public class IgnoreDebugPathPredicate implements Predicate<String>
{
@Override
public boolean apply(String input)
{
return !input.startsWith("/debug");
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2016 HomeAdvisor, Inc.
* Copyright 2017 HomeAdvisor, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2016 HomeAdvisor, Inc.
* Copyright 2017 HomeAdvisor, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2016 HomeAdvisor, Inc.
* Copyright 2017 HomeAdvisor, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2016 HomeAdvisor, Inc.
* Copyright 2017 HomeAdvisor, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -18,13 +18,22 @@

package com.homeadvisor.kafdrop.controller;

import com.homeadvisor.kafdrop.model.BrokerVO;
import com.homeadvisor.kafdrop.service.BrokerNotFoundException;
import com.homeadvisor.kafdrop.service.KafkaMonitor;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

@Controller
public class BrokerController
Expand All @@ -40,4 +49,25 @@ public String brokerDetails(@PathVariable("id") int brokerId, Model model)
model.addAttribute("topics", kafkaMonitor.getTopics());
return "broker-detail";
}

@ApiOperation(value = "getBroker", notes = "Get details for a specific Kafka broker")
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Success", response = BrokerVO.class),
@ApiResponse(code = 404, message = "Invalid Broker ID")
})
@RequestMapping(path = "/broker/{id}", produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.GET)
public @ResponseBody BrokerVO brokerDetailsJson(@PathVariable("id") int brokerId)
{
return kafkaMonitor.getBroker(brokerId).orElseThrow(() -> new BrokerNotFoundException(String.valueOf(brokerId)));
}

@ApiOperation(value = "getAllBrokers", notes = "Get details for all known Kafka brokers")
@ApiResponses(value = {
@ApiResponse(code = 200, message = "Success", response = BrokerVO.class)
})
@RequestMapping(path = "/broker", produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.GET)
public @ResponseBody List<BrokerVO> brokerDetailsJson()
{
return kafkaMonitor.getBrokers();
}
}
Loading

0 comments on commit 987978e

Please sign in to comment.