Netflix / Prana

A sidecar for your NetflixOSS based services.
Apache License 2.0
502 stars 98 forks source link

Prana service breaks Eureka console #18

Open turick opened 8 years ago

turick commented 8 years ago

I just downloaded the Prana zip file and tried to fire it up. Perhaps this should be a separate issue, but no matter what command line arguments I provided, it wouldn't use my external config file and kept defaulting to the config file bundled in the Prana-0.0.1.jar file. After unzipping the jar, editing the config to point to my Eureka server, then zipping it back up and replacing the jar, Prana successfully registered my service. Going to http://localhost:8761/eureka/apps, I see all of my registered apps, however if I go to the dashboard at http://localhost:8761/, it get a pretty nasty error. As soon as I take down my Prana service, the Eureka dashboard displays properly again. I'm not sure if this is an issue with Prana or Eureka, but I don't see this problem with any of the spring cloud services I've developed. Here is the error:

FreeMarker template error (DEBUG mode; use RETHROW in production!): The following has evaluated to null or missing: ==> amiCount.key [in template "eureka/status.ftl" at line 35, column 26] ---- Tip: It's the step after the last dot that caused this error, not those before it. ---- Tip: If the failing expression is known to be legally refer to something that's null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${amiCount.key} [in template "eureka/status.ftl" at line 35, column 24] ---- Java stack trace (for programmers): ---- freemarker.core.InvalidReferenceException: [... Exception message was already printed; see it above ...] at freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:116) at freemarker.core.EvalUtil.coerceModelToString(EvalUtil.java:346) at freemarker.core.Expression.evalAndCoerceToString(Expression.java:82) at freemarker.core.DollarVariable.accept(DollarVariable.java:40) at freemarker.core.Environment.visit(Environment.java:312) at freemarker.core.MixedContent.accept(MixedContent.java:62) at freemarker.core.Environment.visitByHiddingParent(Environment.java:333) at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:159) at freemarker.core.Environment.visitIteratorBlock(Environment.java:559) at freemarker.core.IteratorBlock.accept(IteratorBlock.java:67) at freemarker.core.Environment.visit(Environment.java:312) at freemarker.core.MixedContent.accept(MixedContent.java:62) at freemarker.core.Environment.visitByHiddingParent(Environment.java:333) at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:159) at freemarker.core.Environment.visitIteratorBlock(Environment.java:559) at freemarker.core.IteratorBlock.accept(IteratorBlock.java:67) at freemarker.core.Environment.visitByHiddingParent(Environment.java:333) at freemarker.core.IfBlock.accept(IfBlock.java:48) at freemarker.core.Environment.visit(Environment.java:312) at freemarker.core.MixedContent.accept(MixedContent.java:62) at freemarker.core.Environment.visit(Environment.java:312) at freemarker.core.Environment.process(Environment.java:290) at freemarker.template.Template.process(Template.java:312) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.processTemplate(FreeMarkerView.java:367) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.doRender(FreeMarkerView.java:284) at org.springframework.web.servlet.view.freemarker.FreeMarkerView.renderMergedTemplateModel(FreeMarkerView.java:234) at org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:167) at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:303) at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1244) at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1027) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:971) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:858) at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration$ApplicationContextHeaderFilter.doFilterInternal(EndpointWebMvcAutoConfiguration.java:295) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:102) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:68) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback. Mon Sep 21 13:53:03 EDT 2015 There was an unexpected error (type=OK, status=200). The following has evaluated to null or missing: ==> amiCount.key [in template "eureka/status.ftl" at line 35, column 26] ---- Tip: It's the step after the last dot that caused this error, not those before it. ---- Tip: If the failing expression is known to be legally refer to something that's null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${amiCount.key} [in template "eureka/status.ftl" at line 35, column 24] ----

eureka error

chadjnsn commented 8 years ago

For the first part of your issue, what command line args are you passing?

I've got prana working by doing /path/to/Prana -a MyAppName -c /path/to/prana.properties

Not sure on the second part.

buliq commented 8 years ago

Hello,

I have the same problem. My command is:

Prana -p 8990 -c /root/prana.properties

Adding -a didn't help

turick commented 8 years ago

Ya, -a doesn't do anything for me either. This is obviously me running on Windows, but I get the same results on Centos 6.5. You can see on the very first line after execution that it's using the properties file from the jar file. I've tried referencing the file using a full file path and as a file URI, etc. It always resorts to the properties file in the jar file.

prana config error

Prateek479 commented 8 years ago

Any Update on this ...??

turick commented 8 years ago

I'm kind of championing the cause to use Netflix OSS within my organization. Prana is pretty central to allow our Python developers to participate. Being able to show a pretty Eureka GUI so everybody can say WOW about the service discovery (vs looking at the XML in /eureka/apps/) and allowing the non-Java devs to quickly deploy Prana by specifying an external properties file is pretty central to getting buy-in from our teams.

I'm kind of on the edge of my seat hoping somebody notices the issues and can resolve them without too much effort.

spencergibb commented 8 years ago

btw @turick error you are seeing is in spring-cloud-netflix, not netflix core.

turick commented 8 years ago

Good point, I'll take up the Eureka GUI error with the spring team. But the configuration problem still stands. Prana refuses to pickup an external config file and I have to unzip the Prana jar, edit settings, recompress.

spencergibb commented 8 years ago

Sure. Btw, spring-cloud-netflix-sidecar is similar to prana and based off of spring boot/spring cloud.

turick commented 8 years ago

I have absolutely no idea how I missed that. Thanks!

aspyker commented 8 years ago

@turick Thank you for the contribution. More will be coming, but please see http://ispyker.blogspot.com/2015/10/towards-being-better-about-open-source.html for a bit of context on the status of this project.

turick commented 8 years ago

@aspkyker Thanks for the update. Just based on the version number I assumed this wasn't really what's being used internally. I'm glad the project is getting more attention as it is so critical to tying together non-Java and 3rd party apps.

On a side note, I'd like to propose an enhancement that is probably worthless to Netflix, but likely useful to outside developers. We use Prana to advertise other open source projects, where we don't necessarily want to modify the source to provide the specific health check URL and response. For instance, our team had a cluster of GeoServer instances that we were using Prana to advertise. Most of the developers not familiar with Netflix were baffled as to why I couldn't simply hit an existing, light-weight interface on GeoServer and just look at the response code to validate it's health. It would be interesting to see if there could be a config option for health checking that simply looks for an HTTP 200 (or other potential relevant status code) instead of a specific JSON response to verify health.

mljohns89 commented 4 years ago

I am getting this error when trying to register a Discovery Client Service to Eureka Server both running in Fargate.

I have 2 applications:

  1. Eureka Server application running in a Docker Container as an ECS Service (Service 1 in my Cluster)
  2. Discovery Client application running in a Docker Container as an ECS Service (Service 2 in my Cluster)

In the logs for Service 1 and Service 2, everything looks fine. I only get this exception inside of the Eureka Console.

It's worth noting that if I package my Discovery Client inside of the same Task Definition in ECS, everything works fine. That is, I have 1 ECS Cluster, running 1 Service, running 1 Task. This 1 Task has 2 containers: 1. Eureka Server application and 2. Discovery Client application.