diff options
-rw-r--r-- | src/common/Metric/Metric.cpp | 49 | ||||
-rw-r--r-- | src/common/Metric/Metric.h | 4 | ||||
-rw-r--r-- | src/server/apps/worldserver/worldserver.conf.dist | 41 |
3 files changed, 77 insertions, 17 deletions
diff --git a/src/common/Metric/Metric.cpp b/src/common/Metric/Metric.cpp index 7c4771dcad..c35fa30b6c 100644 --- a/src/common/Metric/Metric.cpp +++ b/src/common/Metric/Metric.cpp @@ -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"; diff --git a/src/common/Metric/Metric.h b/src/common/Metric/Metric.h index 729d2f7fc5..7ebc3cabb0 100644 --- a/src/common/Metric/Metric.h +++ b/src/common/Metric/Metric.h @@ -71,6 +71,10 @@ private: std::string _hostname; std::string _port; std::string _databaseName; + bool _useV2 = false; + std::string _org; + std::string _bucket; + std::string _token; std::function<void()> _overallStatusLogger; std::string _realmName; std::unordered_map<std::string, int64> _thresholds; diff --git a/src/server/apps/worldserver/worldserver.conf.dist b/src/server/apps/worldserver/worldserver.conf.dist index 01dc00bb03..d2b5af453b 100644 --- a/src/server/apps/worldserver/worldserver.conf.dist +++ b/src/server/apps/worldserver/worldserver.conf.dist @@ -678,6 +678,7 @@ Appender.Errors=2,5,0,Errors.log,w # Logger.root=2,Console Server +#Logger.metric=2,Console Server #Logger.commands.gm=4,Console GM Logger.diff=3,Console Server Logger.mmaps=4,Server @@ -812,6 +813,37 @@ Log.Async.Enable = 0 Metric.Enable = 0 # +# Metric.InfluxDB +# Description: Connection settings for InfluxDB. +# +# For InfluxDB v1: +# Only fill in Metric.InfluxDB.Connection. +# +# Example: +# Metric.InfluxDB.Connection = "hostname;port;database" +# +# For InfluxDB v2: +# Fill in every field. +# +# NOTE: Currently, Grafana will not work with the provided json files to visualize +# data from InfluxDB v2. +# +# Example: +# Metric.InfluxDB.Connection = "hostname;port" +# Metric.InfluxDB.v2 = 0 - (Disabled) +# 1 - (Enabled) +# Metric.InfluxDB.Org = "my-org" +# Metric.InfluxDB.Bucket = "my-bucket" +# Metric.InfluxDB.Token = "my-token" +# + +Metric.InfluxDB.Connection = "127.0.0.1;8086;worldserver" +Metric.InfluxDB.v2 = 0 +Metric.InfluxDB.Org = "" +Metric.InfluxDB.Bucket = "" +Metric.InfluxDB.Token = "" + +# # Metric.Interval # Description: Interval between every batch of data sent in seconds. # Longer interval means larger batch of data. If the batch @@ -822,15 +854,6 @@ Metric.Enable = 0 Metric.Interval = 1 # -# Metric.ConnectionInfo -# Description: Connection settings for metric database (currently InfluxDB). -# Example: "hostname;port;database" -# Default: "127.0.0.1;8086;worldserver" -# - -Metric.ConnectionInfo = "127.0.0.1;8086;worldserver" - -# # Metric.OverallStatusInterval # Description: Interval between every gathering of overall worldserver status data in seconds # Default: 1 second |