Broken pipe exception on spring boot application monitored by monit
Asked Answered
S

0

6

I have a spring-boot application which is monitored by monit. Monit just check the /health endpoint spring is exposing.

Basically, monit registered the following checks :

check host hopsearch_connection with address 127.0.0.1
 if failed url http://127.0.0.1:8089/health with timeout 15 seconds then alert

check host hopsearch_health with address 127.0.0.1
  if failed url http://127.0.0.1:8089/health
   and content != 'DOWN'
   with timeout 60 seconds
  then alert

and the web application return something like that :

{"status":"UP","jestHealth":{"status":"UP","lastQuerySuccess":true},"diskSpace":{"status":"UP","free":14439550976,"threshold":10485760},"rabbit":{"status":"UP","version":"3.3.2"},"redis":{"status":"UP","version":"3.0.0"},"mongo":{"status":"UP","version":"2.6.1"}}

In this spring application, I have a general @ExceptionHandler to log all unexpected errors and to display an error page :

@ExceptionHandler(Exception.class)
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
public String handleDefaultError(Exception ex, HttpServletRequest httpRequest) {
    logException(httpRequest, ex);

    return "error";
}

And this @ExceptionHandler logs every call from monit :

<11>May  1 13:20:39 IP 13:20:39.339 t=http-nio-8089-exec-3 l=ERROR c=c.h.s.w.c.ErrorManager m=Error 500 
----------------------------------------------------------------
Request Path=http://127.0.0.1:8089/health
Method=GET
----------------------------------------------------------------
Header :
----------------------------------------------------------------
host = 127.0.0.1:8089
accept = */*
connection = close
user-agent = monit/5.4
----------------------------------------------------------------
<11>May  1 13:20:39 IP 13:20:39.340 t=http-nio-8089-  exec-3 l=ERROR c=c.h.s.w.c.ErrorManager m=Unexpected error :   java.io.IOException: Broken pipe
at sun.nio.ch.FileDispatcherImpl.write0(Native Method) ~[na:1.8.0_25]
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47) ~[na:1.8.0_25]
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93) ~[na:1.8.0_25]
at sun.nio.ch.IOUtil.write(IOUtil.java:65) ~[na:1.8.0_25]

From monit perspective, everything is fine and the check works. From my perspective, the application works. But I have a lot of errors dumped in the log.

I don't succeed to reproduce on my workstation with curl. This exception only happens on the server with monit.

Is it possible to ignore an error based on a specific user agent in an ExceptionHandler ? (and how ?)

It wouldn't be the best solution but I don't see any other way.

Any thoughts about that ?

Susurration answered 1/5, 2015 at 11:48 Comment(2)
do you know what the issue with monit that is causing the broken pipes? I am seeing the same problemUnmanly
Getting same error when using monit with python application. Any leads on how to resolve this?Paramaribo

© 2022 - 2024 — McMap. All rights reserved.