Something very strange has just started happening. Our API on Google Cloud Endpoints won't startup. This happened just after trying to deploy to a new test environment. Now we can't deploy to the old test environment either.
We deploy the API, as we always have:
gcloud endpoints services deploy openapi.json
Note that we changed the "host" to the new test URL in the openapi.
openapi.json
{
"swagger": "2.0",
"info": {
"version": "1.2.0",
"title": "Our App API"
},
"host": "test2-ourappapi.appspot",
"basePath": "/_ah/api",
"schemes": [
"https"
],
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"paths": {
...
}
}
Now this appears in the logs when after deploying to GAE.
GAE logs
Failed to load service
endpoints.repackaged.google.api.config.ServiceConfigException: Failed to parse the HTTP response as service configuration
at endpoints.repackaged.google.api.config.ServiceConfigSupplier.parseHttpResponse(ServiceConfigSupplier.java:197)
at endpoints.repackaged.google.api.config.ServiceConfigSupplier.fetch(ServiceConfigSupplier.java:170)
at endpoints.repackaged.google.api.config.ServiceConfigSupplier.get(ServiceConfigSupplier.java:131)
at endpoints.repackaged.google.api.config.ServiceConfigSupplier.get(ServiceConfigSupplier.java:50)
at endpoints.repackaged.googlemon.base.Suppliers$ExpiringMemoizingSupplier.get(Suppliers.java:241)
at endpoints.repackaged.google.api.config.ServiceConfigFetcher.fetch(ServiceConfigFetcher.java:41)
at com.google.api.control.ServiceManagementConfigFilter$1.load(ServiceManagementConfigFilter.java:33)
at com.google.api.control.ConfigFilter.init(ConfigFilter.java:90)
at org.eclipse.jetty.servlet.FilterHolder.initialize(FilterHolder.java:140)
at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$0(ServletHandler.java:750)
at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:992)
at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734)
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:774)
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:379)
at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1449)
at com.google.apphosting.runtime.jetty9.AppEngineWebAppContext.startWebapp(AppEngineWebAppContext.java:273)
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1414)
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:916)
at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:288)
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:524)
at com.google.apphosting.runtime.jetty9.AppEngineWebAppContext.doStart(AppEngineWebAppContext.java:219)
at org.eclipse.jetty.utilponent.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
at com.google.apphosting.runtime.jetty9.AppVersionHandlerFactory.doCreateHandler(AppVersionHandlerFactory.java:225)
at com.google.apphosting.runtime.jetty9.AppVersionHandlerFactory.createHandler(A… [message truncated due to size]
After researching this, it seems like one workaround is to comment out the lines in the web.xml (see below).
web.xml
<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns=";
xmlns:xsi=";
xsi:schemaLocation=" .xsd"
version="3.1">
<servlet>
<servlet-name>EndpointsServlet</servlet-name>
<servlet-class>com.google.api.server.spi.EndpointsServlet</servlet-class>
<init-param>
<param-name>services</param-name>
<param-value>company.api.OurAppApi</param-value>
</init-param>
<init-param>
<param-name>restricted</param-name>
<param-value>false</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>EndpointsServlet</servlet-name>
<url-pattern>/_ah/api/*</url-pattern>
</servlet-mapping>
<!-- COMMENTING THIS OUT WORKS.
<filter>
<filter-name>endpoints-api-configuration</filter-name>
<filter-class>com.google.api.control.ServiceManagementConfigFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>endpoints-api-configuration</filter-name>
<servlet-name>EndpointsServlet</servlet-name>
</filter-mapping>
-->
<filter>
<filter-name>endpoints-api-controller</filter-name>
<filter-class>com.google.api.control.extensions.appengine.GoogleAppEngineControlFilter</filter-class>
<init-param>
<param-name>endpoints.projectId</param-name>
<param-value>test2-ourappapi</param-value>
</init-param>
<init-param>
<param-name>endpoints.serviceName</param-name>
<param-value>test2-ourappapi.appspot</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>endpoints-api-controller</filter-name>
<servlet-name>EndpointsServlet</servlet-name>
</filter-mapping>
</web-app>
appengine-web.xml
</system-properties>
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns=".0">
<sessions-enabled>false</sessions-enabled>
<runtime>java17</runtime>
<app-engine-apis>true</app-engine-apis>
<automatic-scaling>
<min-instances>1</min-instances>
</automatic-scaling>
<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
</system-properties>
<env-variables>
<env-var name="ENDPOINTS_SERVICE_NAME" value="test2-ourappapi.appspot" />
</env-variables>
</appengine-web-app>
I can confirm this works. However, the documentation indicates removing these lines bypassess GCE's management of the endpoint.
What is going on?
Note that I've updated to the latest Google Cloud SDK. I've also run "gcloud auth application-default login" after setting the project.
Something very strange has just started happening. Our API on Google Cloud Endpoints won't startup. This happened just after trying to deploy to a new test environment. Now we can't deploy to the old test environment either.
We deploy the API, as we always have:
gcloud endpoints services deploy openapi.json
Note that we changed the "host" to the new test URL in the openapi.
openapi.json
{
"swagger": "2.0",
"info": {
"version": "1.2.0",
"title": "Our App API"
},
"host": "test2-ourappapi.appspot.com",
"basePath": "/_ah/api",
"schemes": [
"https"
],
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"paths": {
...
}
}
Now this appears in the logs when after deploying to GAE.
GAE logs
Failed to load service
endpoints.repackaged.com.google.api.config.ServiceConfigException: Failed to parse the HTTP response as service configuration
at endpoints.repackaged.com.google.api.config.ServiceConfigSupplier.parseHttpResponse(ServiceConfigSupplier.java:197)
at endpoints.repackaged.com.google.api.config.ServiceConfigSupplier.fetch(ServiceConfigSupplier.java:170)
at endpoints.repackaged.com.google.api.config.ServiceConfigSupplier.get(ServiceConfigSupplier.java:131)
at endpoints.repackaged.com.google.api.config.ServiceConfigSupplier.get(ServiceConfigSupplier.java:50)
at endpoints.repackaged.com.google.common.base.Suppliers$ExpiringMemoizingSupplier.get(Suppliers.java:241)
at endpoints.repackaged.com.google.api.config.ServiceConfigFetcher.fetch(ServiceConfigFetcher.java:41)
at com.google.api.control.ServiceManagementConfigFilter$1.load(ServiceManagementConfigFilter.java:33)
at com.google.api.control.ConfigFilter.init(ConfigFilter.java:90)
at org.eclipse.jetty.servlet.FilterHolder.initialize(FilterHolder.java:140)
at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$0(ServletHandler.java:750)
at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:992)
at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734)
at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:774)
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:379)
at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1449)
at com.google.apphosting.runtime.jetty9.AppEngineWebAppContext.startWebapp(AppEngineWebAppContext.java:273)
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1414)
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:916)
at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:288)
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:524)
at com.google.apphosting.runtime.jetty9.AppEngineWebAppContext.doStart(AppEngineWebAppContext.java:219)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
at com.google.apphosting.runtime.jetty9.AppVersionHandlerFactory.doCreateHandler(AppVersionHandlerFactory.java:225)
at com.google.apphosting.runtime.jetty9.AppVersionHandlerFactory.createHandler(A… [message truncated due to size]
After researching this, it seems like one workaround is to comment out the lines in the web.xml (see below).
web.xml
<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>EndpointsServlet</servlet-name>
<servlet-class>com.google.api.server.spi.EndpointsServlet</servlet-class>
<init-param>
<param-name>services</param-name>
<param-value>com.company.api.OurAppApi</param-value>
</init-param>
<init-param>
<param-name>restricted</param-name>
<param-value>false</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>EndpointsServlet</servlet-name>
<url-pattern>/_ah/api/*</url-pattern>
</servlet-mapping>
<!-- COMMENTING THIS OUT WORKS.
<filter>
<filter-name>endpoints-api-configuration</filter-name>
<filter-class>com.google.api.control.ServiceManagementConfigFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>endpoints-api-configuration</filter-name>
<servlet-name>EndpointsServlet</servlet-name>
</filter-mapping>
-->
<filter>
<filter-name>endpoints-api-controller</filter-name>
<filter-class>com.google.api.control.extensions.appengine.GoogleAppEngineControlFilter</filter-class>
<init-param>
<param-name>endpoints.projectId</param-name>
<param-value>test2-ourappapi</param-value>
</init-param>
<init-param>
<param-name>endpoints.serviceName</param-name>
<param-value>test2-ourappapi.appspot.com</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>endpoints-api-controller</filter-name>
<servlet-name>EndpointsServlet</servlet-name>
</filter-mapping>
</web-app>
appengine-web.xml
</system-properties>
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<sessions-enabled>false</sessions-enabled>
<runtime>java17</runtime>
<app-engine-apis>true</app-engine-apis>
<automatic-scaling>
<min-instances>1</min-instances>
</automatic-scaling>
<system-properties>
<property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
</system-properties>
<env-variables>
<env-var name="ENDPOINTS_SERVICE_NAME" value="test2-ourappapi.appspot.com" />
</env-variables>
</appengine-web-app>
I can confirm this works. However, the documentation indicates removing these lines bypassess GCE's management of the endpoint.
What is going on?
Note that I've updated to the latest Google Cloud SDK. I've also run "gcloud auth application-default login" after setting the project.
Share Improve this question edited Jan 20 at 4:58 Mike Dee asked Jan 19 at 15:37 Mike DeeMike Dee 5801 gold badge7 silver badges16 bronze badges1 Answer
Reset to default 0I think I discovered the problem. This was in the POM.
<dependency>
<groupId>com.google.endpoints</groupId>
<artifactId>endpoints-management-control-appengine-all</artifactId>
<version>1.0.14</version>
</dependency>
It seems to work when the version is changed to 1.0.15. I don't quite trust it yet. So, I'll have to work with it for a while longer.