mirror of https://github.com/Icinga/icinga2.git
Fix newline terminator for bulk requests in ElasticsearchWriter
This enables compatibility with 6.x. This commit also fixes an incorrect HTTP response parsing which could lead into false positives. Analysis and fix in https://github.com/Icinga/icinga2/issues/5795#issuecomment-349920587 fixes #5795
This commit is contained in:
parent
d91e5cd054
commit
f8e102c15a
|
@ -396,6 +396,11 @@ void ElasticsearchWriter::Flush(void)
|
|||
String body = boost::algorithm::join(m_DataBuffer, "\n");
|
||||
m_DataBuffer.clear();
|
||||
|
||||
/* Elasticsearch 6.x requires a new line. This is compatible to 5.x.
|
||||
* Tested with 6.0.0 and 5.6.4.
|
||||
*/
|
||||
body += "\n";
|
||||
|
||||
SendRequest(body);
|
||||
}
|
||||
|
||||
|
@ -455,12 +460,20 @@ void ElasticsearchWriter::SendRequest(const String& body)
|
|||
|
||||
try {
|
||||
resp.Parse(context, true);
|
||||
while (resp.Parse(context, true) && !resp.Complete)
|
||||
; /* Do nothing */
|
||||
} catch (const std::exception& ex) {
|
||||
Log(LogWarning, "ElasticsearchWriter")
|
||||
<< "Cannot read from HTTP API on host '" << GetHost() << "' port '" << GetPort() << "'.";
|
||||
<< "Failed to parse HTTP response from host '" << GetHost() << "' port '" << GetPort() << "': " << DiagnosticInformation(ex, false);
|
||||
throw ex;
|
||||
}
|
||||
|
||||
if (!resp.Complete) {
|
||||
Log(LogWarning, "ElasticsearchWriter")
|
||||
<< "Failed to read a complete HTTP response from the Elasticsearch server.";
|
||||
return;
|
||||
}
|
||||
|
||||
if (resp.StatusCode > 299) {
|
||||
if (resp.StatusCode == 401) {
|
||||
/* More verbose error logging with Elasticsearch is hidden behind a proxy. */
|
||||
|
@ -479,10 +492,6 @@ void ElasticsearchWriter::SendRequest(const String& body)
|
|||
Log(LogWarning, "ElasticsearchWriter")
|
||||
<< "Unexpected response code " << resp.StatusCode;
|
||||
|
||||
/* Finish parsing the headers and body. */
|
||||
while (!resp.Complete)
|
||||
resp.Parse(context, true);
|
||||
|
||||
String contentType = resp.Headers->Get("content-type");
|
||||
|
||||
if (contentType != "application/json") {
|
||||
|
@ -509,6 +518,8 @@ void ElasticsearchWriter::SendRequest(const String& body)
|
|||
|
||||
Log(LogCritical, "ElasticsearchWriter")
|
||||
<< "Elasticsearch error message:\n" << error;
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue