mirror of https://github.com/Icinga/icinga2.git
Merge pull request #7662 from Icinga/feature/icingadb-overdue
IcingaDB: populate icinga:nextupdate:*
This commit is contained in:
commit
b84ceccfb7
|
@ -90,6 +90,10 @@ void IcingaDB::ConfigStaticInitialize()
|
||||||
Comment::OnCommentRemoved.connect(&IcingaDB::CommentRemovedHandler);
|
Comment::OnCommentRemoved.connect(&IcingaDB::CommentRemovedHandler);
|
||||||
|
|
||||||
Checkable::OnFlappingChanged.connect(&IcingaDB::FlappingChangedHandler);
|
Checkable::OnFlappingChanged.connect(&IcingaDB::FlappingChangedHandler);
|
||||||
|
|
||||||
|
Checkable::OnNewCheckResult.connect([](const Checkable::Ptr& checkable, const CheckResult::Ptr&, const MessageOrigin::Ptr&) {
|
||||||
|
IcingaDB::NewCheckResultHandler(checkable);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void IcingaDB::UpdateAllConfigObjects()
|
void IcingaDB::UpdateAllConfigObjects()
|
||||||
|
@ -121,6 +125,7 @@ void IcingaDB::UpdateAllConfigObjects()
|
||||||
m_PrefixConfigObject + "icon_image",
|
m_PrefixConfigObject + "icon_image",
|
||||||
};
|
};
|
||||||
DeleteKeys(globalKeys, Prio::Config);
|
DeleteKeys(globalKeys, Prio::Config);
|
||||||
|
DeleteKeys({"icinga:nextupdate:host", "icinga:nextupdate:service"}, Prio::CheckResult);
|
||||||
|
|
||||||
upq.ParallelFor(types, [this](const TypePair& type) {
|
upq.ParallelFor(types, [this](const TypePair& type) {
|
||||||
String lcType = type.second;
|
String lcType = type.second;
|
||||||
|
@ -137,6 +142,7 @@ void IcingaDB::UpdateAllConfigObjects()
|
||||||
std::map<String, std::vector<String>> hMSets, publishes;
|
std::map<String, std::vector<String>> hMSets, publishes;
|
||||||
std::vector<String> states = {"HMSET", m_PrefixStateObject + lcType};
|
std::vector<String> states = {"HMSET", m_PrefixStateObject + lcType};
|
||||||
std::vector<std::vector<String> > transaction = {{"MULTI"}};
|
std::vector<std::vector<String> > transaction = {{"MULTI"}};
|
||||||
|
std::vector<String> hostZAdds = {"ZADD", "icinga:nextupdate:host"}, serviceZAdds = {"ZADD", "icinga:nextupdate:service"};
|
||||||
|
|
||||||
bool dumpState = (lcType == "host" || lcType == "service");
|
bool dumpState = (lcType == "host" || lcType == "service");
|
||||||
|
|
||||||
|
@ -189,6 +195,23 @@ void IcingaDB::UpdateAllConfigObjects()
|
||||||
transaction = {{"MULTI"}};
|
transaction = {{"MULTI"}};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto checkable (dynamic_pointer_cast<Checkable>(object));
|
||||||
|
|
||||||
|
if (checkable) {
|
||||||
|
auto zAdds (dynamic_pointer_cast<Service>(checkable) ? &serviceZAdds : &hostZAdds);
|
||||||
|
|
||||||
|
zAdds->emplace_back(Convert::ToString(checkable->GetNextUpdate()));
|
||||||
|
zAdds->emplace_back(GetObjectIdentifier(checkable));
|
||||||
|
|
||||||
|
if (zAdds->size() >= 102u) {
|
||||||
|
std::vector<String> header (zAdds->begin(), zAdds->begin() + 2u);
|
||||||
|
|
||||||
|
m_Rcon->FireAndForgetQuery(std::move(*zAdds), Prio::CheckResult);
|
||||||
|
|
||||||
|
*zAdds = std::move(header);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& kv : hMSets) {
|
for (auto& kv : hMSets) {
|
||||||
|
@ -219,6 +242,12 @@ void IcingaDB::UpdateAllConfigObjects()
|
||||||
m_Rcon->FireAndForgetQueries(std::move(transaction), Prio::Config);
|
m_Rcon->FireAndForgetQueries(std::move(transaction), Prio::Config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (auto zAdds : {&hostZAdds, &serviceZAdds}) {
|
||||||
|
if (zAdds->size() > 2u) {
|
||||||
|
m_Rcon->FireAndForgetQuery(std::move(*zAdds), Prio::CheckResult);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Log(LogNotice, "IcingaDB")
|
Log(LogNotice, "IcingaDB")
|
||||||
<< "Dumped " << bulkCounter << " objects of type " << type.second;
|
<< "Dumped " << bulkCounter << " objects of type " << type.second;
|
||||||
});
|
});
|
||||||
|
@ -773,6 +802,10 @@ void IcingaDB::SendConfigUpdate(const ConfigObject::Ptr& object, bool runtimeUpd
|
||||||
transaction.push_back({"EXEC"});
|
transaction.push_back({"EXEC"});
|
||||||
m_Rcon->FireAndForgetQueries(std::move(transaction), Prio::Config);
|
m_Rcon->FireAndForgetQueries(std::move(transaction), Prio::Config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (checkable) {
|
||||||
|
SendNextUpdate(checkable);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Takes object and collects IcingaDB relevant attributes and computes checksums. Returns whether the object is relevant
|
// Takes object and collects IcingaDB relevant attributes and computes checksums. Returns whether the object is relevant
|
||||||
|
@ -1092,6 +1125,19 @@ void IcingaDB::SendConfigDelete(const ConfigObject::Ptr& object)
|
||||||
{"DEL", m_PrefixStateObject + typeName + ":" + objectKey},
|
{"DEL", m_PrefixStateObject + typeName + ":" + objectKey},
|
||||||
{"PUBLISH", "icinga:config:delete", typeName + ":" + objectKey}
|
{"PUBLISH", "icinga:config:delete", typeName + ":" + objectKey}
|
||||||
}, Prio::Config);
|
}, Prio::Config);
|
||||||
|
|
||||||
|
auto checkable (dynamic_pointer_cast<Checkable>(object));
|
||||||
|
|
||||||
|
if (checkable) {
|
||||||
|
m_Rcon->FireAndForgetQuery(
|
||||||
|
{
|
||||||
|
"ZREM",
|
||||||
|
dynamic_pointer_cast<Service>(checkable) ? "icinga:nextupdate:service" : "icinga:nextupdate:host",
|
||||||
|
GetObjectIdentifier(checkable)
|
||||||
|
},
|
||||||
|
Prio::CheckResult
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
|
@ -1572,6 +1618,22 @@ void IcingaDB::SendFlappingChanged(const Checkable::Ptr& checkable, const Value&
|
||||||
m_Rcon->FireAndForgetQuery(std::move(xAdd), Prio::History);
|
m_Rcon->FireAndForgetQuery(std::move(xAdd), Prio::History);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IcingaDB::SendNextUpdate(const Checkable::Ptr& checkable)
|
||||||
|
{
|
||||||
|
if (!m_Rcon || !m_Rcon->IsConnected())
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_Rcon->FireAndForgetQuery(
|
||||||
|
{
|
||||||
|
"ZADD",
|
||||||
|
dynamic_pointer_cast<Service>(checkable) ? "icinga:nextupdate:service" : "icinga:nextupdate:host",
|
||||||
|
Convert::ToString(checkable->GetNextUpdate()),
|
||||||
|
GetObjectIdentifier(checkable)
|
||||||
|
},
|
||||||
|
Prio::CheckResult
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Dictionary::Ptr IcingaDB::SerializeState(const Checkable::Ptr& checkable)
|
Dictionary::Ptr IcingaDB::SerializeState(const Checkable::Ptr& checkable)
|
||||||
{
|
{
|
||||||
Dictionary::Ptr attrs = new Dictionary();
|
Dictionary::Ptr attrs = new Dictionary();
|
||||||
|
@ -1811,3 +1873,10 @@ void IcingaDB::FlappingChangedHandler(const Checkable::Ptr& checkable, const Val
|
||||||
rw->m_WorkQueue.Enqueue([rw, checkable, value]() { rw->SendFlappingChanged(checkable, value); });
|
rw->m_WorkQueue.Enqueue([rw, checkable, value]() { rw->SendFlappingChanged(checkable, value); });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IcingaDB::NewCheckResultHandler(const Checkable::Ptr& checkable)
|
||||||
|
{
|
||||||
|
for (auto& rw : ConfigType::GetObjectsByType<IcingaDB>()) {
|
||||||
|
rw->m_WorkQueue.Enqueue([rw, checkable]() { rw->SendNextUpdate(checkable); });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -66,6 +66,7 @@ private:
|
||||||
void SendAddedComment(const Comment::Ptr& comment);
|
void SendAddedComment(const Comment::Ptr& comment);
|
||||||
void SendRemovedComment(const Comment::Ptr& comment);
|
void SendRemovedComment(const Comment::Ptr& comment);
|
||||||
void SendFlappingChanged(const Checkable::Ptr& checkable, const Value& value);
|
void SendFlappingChanged(const Checkable::Ptr& checkable, const Value& value);
|
||||||
|
void SendNextUpdate(const Checkable::Ptr& checkable);
|
||||||
|
|
||||||
std::vector<String> UpdateObjectAttrs(const ConfigObject::Ptr& object, int fieldType, const String& typeNameOverride);
|
std::vector<String> UpdateObjectAttrs(const ConfigObject::Ptr& object, int fieldType, const String& typeNameOverride);
|
||||||
Dictionary::Ptr SerializeState(const Checkable::Ptr& checkable);
|
Dictionary::Ptr SerializeState(const Checkable::Ptr& checkable);
|
||||||
|
@ -107,6 +108,7 @@ private:
|
||||||
static void CommentAddedHandler(const Comment::Ptr& comment);
|
static void CommentAddedHandler(const Comment::Ptr& comment);
|
||||||
static void CommentRemovedHandler(const Comment::Ptr& comment);
|
static void CommentRemovedHandler(const Comment::Ptr& comment);
|
||||||
static void FlappingChangedHandler(const Checkable::Ptr& checkable, const Value& value);
|
static void FlappingChangedHandler(const Checkable::Ptr& checkable, const Value& value);
|
||||||
|
static void NewCheckResultHandler(const Checkable::Ptr& checkable);
|
||||||
|
|
||||||
void AssertOnWorkQueue();
|
void AssertOnWorkQueue();
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,8 @@ namespace icinga
|
||||||
Heartbeat,
|
Heartbeat,
|
||||||
Config,
|
Config,
|
||||||
State,
|
State,
|
||||||
History
|
History,
|
||||||
|
CheckResult
|
||||||
};
|
};
|
||||||
|
|
||||||
RedisConnection(const String& host, const int port, const String& path,
|
RedisConnection(const String& host, const int port, const String& path,
|
||||||
|
|
Loading…
Reference in New Issue