nodemanager/core/MetricCollectorBase.cpp (81 lines of code) (raw):
#include "MetricCollectorBase.h"
using namespace hpc::core;
void MetricCollectorBase::ApplyConfig(const MetricCounter& config, pplx::cancellation_token token)
{
if (this->instanceNamesFunc)
{
try
{
auto instanceNames = this->instanceNamesFunc(config.InstanceName);
Logger::Debug("Filtered instance names: {0}", String::Join<','>(instanceNames));
if (!instanceNames.empty())
{
auto client = HttpHelper::GetHttpClient(NodeManagerConfig::ResolveMetricInstanceIdsUri(token));
json::value jsonBody = JsonHelper<std::vector<std::string>>::ToJson(instanceNames);
auto request = HttpHelper::GetHttpRequest(web::http::methods::POST, jsonBody);
client->request(*request).then([config, instanceNames, this](pplx::task<web::http::http_response> t)
{
auto response = t.get().extract_json().then([config, instanceNames, this](pplx::task<json::value> t)
{
auto jsonIds = t.get();
std::vector<int> ids = JsonHelper<std::vector<int>>::FromJson(jsonIds);
Logger::Debug("Queued instance ids {0} for instance names {1}", String::Join<','>(ids), String::Join<','>(instanceNames));
if (ids.size() != instanceNames.size())
{
Logger::Error(
"queried ids size {0} != instanceNames size {1}, ids '{2}', names '{3}'",
ids.size(), instanceNames.size(), String::Join<','>(ids), String::Join<','>(instanceNames));
this->enabled = false;
}
else
{
this->counters[config.MetricId].clear();
for (size_t i = 0; i < ids.size(); i++)
{
this->counters[config.MetricId][ids[i]] = instanceNames[i];
}
this->enabled = true;
}
}).then([instanceNames](pplx::task<void> t)
{
try
{
t.wait();
}
catch (const std::exception& ex)
{
Logger::Error("Unabled to get instance ids for instance names {0}, ex {1}", String::Join<','>(instanceNames), ex.what());
}
});
}).then([instanceNames](pplx::task<void> t)
{
try
{
t.wait();
}
catch (const std::exception& ex)
{
Logger::Error("Error when query instance ids for {0}, ex {1}, resetting naming cache", String::Join<','>(instanceNames), ex.what());
NamingClient::InvalidateCache();
}
});
}
else
{
Logger::Warn("No instances returned for metric {0}, instance filter {1}", config.MetricId, config.InstanceName);
this->counters[config.MetricId][config.InstanceId] = config.InstanceName;
this->enabled = true;
}
}
catch (const std::exception& ex)
{
Logger::Error("Exception happened while applying Config for {0}, ex {1}", config.MetricId, ex.what());
}
}
else
{
Logger::Debug("Config instance name {0}, instance id {1}", config.InstanceName, config.InstanceId);
this->counters[config.MetricId][config.InstanceId] = config.InstanceName;
this->enabled = true;
}
}