BREAKINGCHANGE(Metrics): Support InfluxDB v2 (#22358)

This commit introduces support for InfluxDB v2 in the metric logging system, updates configuration options, and enhances the code to handle both InfluxDB v1 and v2. The changes include updates to the `Metric` class, configuration file, and logging behavior.

### InfluxDB v2 Support:
* Added support for InfluxDB v2 in the `Metric` class by introducing new configuration options (`Metric.InfluxDB.Org`, `Metric.InfluxDB.Bucket`, `Metric.InfluxDB.Token`) and logic to handle v2-specific parameters.
* Updated the `SendBatch` method to construct HTTP requests differently based on whether v1 or v2 is enabled. 

### Configuration Updates:
* Replaced the `Metric.ConnectionInfo` configuration with `Metric.InfluxDB.Connection` and added detailed comments and examples for both InfluxDB v1 and v2 configurations in `worldserver.conf.dist`.
* Added placeholder configuration entries for InfluxDB v2 parameters (`Metric.InfluxDB.Org`, `Metric.InfluxDB.Bucket`, `Metric.InfluxDB.Token`) in `worldserver.conf.dist`. 

### Logging Enhancements:
* Added a commented-out logger configuration (`Logger.metric`) in `worldserver.conf.dist` for potential use in metric-specific logging.
This commit is contained in:
Kitzunu
2025-07-05 12:00:08 +02:00
committed by GitHub
parent 161898b7e6
commit a1a11a7c38
3 changed files with 77 additions and 17 deletions

View File

@@ -99,25 +99,48 @@ void Metric::LoadFromConfigs()
// Cancel any scheduled operation if the config changed from Enabled to Disabled.
if (_enabled && !previousValue)
{
std::string connectionInfo = sConfigMgr->GetOption<std::string>("Metric.ConnectionInfo", "");
std::string connectionInfo = sConfigMgr->GetOption<std::string>("Metric.InfluxDB.Connection", "");
if (connectionInfo.empty())
{
LOG_ERROR("metric", "'Metric.ConnectionInfo' not specified in configuration file.");
LOG_ERROR("metric", "Metric.InfluxDB.Connection not specified in configuration file.");
return;
}
std::vector<std::string_view> tokens = Acore::Tokenize(connectionInfo, ';', true);
if (tokens.size() != 3)
if (tokens.size() != 2)
{
LOG_ERROR("metric", "'Metric.ConnectionInfo' specified with wrong format in configuration file.");
LOG_ERROR("metric", "Metric.InfluxDB.Connection specified with wrong format in configuration file.");
return;
}
_hostname.assign(tokens[0]);
_port.assign(tokens[1]);
_databaseName.assign(tokens[2]);
Connect();
_useV2 = sConfigMgr->GetOption<bool>("Metric.InfluxDB.v2", false);
if (_useV2)
{
_org = sConfigMgr->GetOption<std::string>("Metric.InfluxDB.Org", "");
_bucket = sConfigMgr->GetOption<std::string>("Metric.InfluxDB.Bucket", "");
_token = sConfigMgr->GetOption<std::string>("Metric.InfluxDB.Token", "");
if (_org.empty() || _bucket.empty() || _token.empty())
{
LOG_ERROR("metric", "InfluxDB v2 parameters missing: org, bucket, or token.");
return;
}
}
else
{
if (tokens.size() != 3)
{
LOG_ERROR("metric", "Metric.InfluxDB.Connection specified with wrong format in configuration file.");
return;
}
_databaseName.assign(tokens[2]);
}
Connect();
ScheduleSend();
ScheduleOverallStatusLog();
}
@@ -206,8 +229,18 @@ void Metric::SendBatch()
if (!GetDataStream().good() && !Connect())
return;
GetDataStream() << "POST " << "/write?db=" << _databaseName << " HTTP/1.1\r\n";
GetDataStream() << "Host: " << _hostname << ":" << _port << "\r\n";
if (_useV2)
{
GetDataStream() << "POST " << "/api/v2/write?bucket=" << _bucket
<< "&org=" << _org << "&precision=ns HTTP/1.1\r\n";
GetDataStream() << "Host: " << _hostname << ":" << _port << "\r\n";
GetDataStream() << "Authorization: Token " << _token << "\r\n";
}
else
{
GetDataStream() << "POST " << "/write?db=" << _databaseName << " HTTP/1.1\r\n";
GetDataStream() << "Host: " << _hostname << ":" << _port << "\r\n";
}
GetDataStream() << "Accept: */*\r\n";
GetDataStream() << "Content-Type: application/octet-stream\r\n";
GetDataStream() << "Content-Transfer-Encoding: binary\r\n";