This is an automated email from the ASF dual-hosted git repository.
masaori pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/master by this push:
new c1336f6d7d Use ts::Metrics for PreWarm stats (#10465)
c1336f6d7d is described below
commit c1336f6d7dc74feeb0a7755b5a3bc8d92f0dbe5d
Author: Masaori Koshiba <[email protected]>
AuthorDate: Fri Sep 29 07:44:27 2023 +0900
Use ts::Metrics for PreWarm stats (#10465)
* Use ts::Metrics for PreWarm stats
* Use ts::Metrics::increment and store
---
doc/admin-guide/files/records.yaml.en.rst | 4 --
iocore/net/PreWarmManager.cc | 68 ++++++++++------------
iocore/net/PreWarmManager.h | 11 +---
proxy/http/PreWarmConfig.cc | 1 -
proxy/http/PreWarmConfig.h | 7 +--
src/records/RecordsConfig.cc | 2 -
tests/gold_tests/records/gold/full_records.yaml | 1 -
.../records/legacy_config/full_records.config | 1 -
8 files changed, 38 insertions(+), 57 deletions(-)
diff --git a/doc/admin-guide/files/records.yaml.en.rst
b/doc/admin-guide/files/records.yaml.en.rst
index f87157ac52..048b92927d 100644
--- a/doc/admin-guide/files/records.yaml.en.rst
+++ b/doc/admin-guide/files/records.yaml.en.rst
@@ -4227,10 +4227,6 @@ SNI Routing
Enable :ref:`pre-warming-tls-tunnel`. The feature is disabled by default.
-.. ts:cv:: CONFIG proxy.config.tunnel.prewarm.max_stats_size INT 100
-
- Max size of :ref:`dynamic stats for Pre-warming TLS Tunnel
<pre-warming-tls-tunnel-stats>`.
-
.. ts:cv:: CONFIG proxy.config.tunnel.prewarm.algorithm INT 2
Version of pre-warming algorithm.
diff --git a/iocore/net/PreWarmManager.cc b/iocore/net/PreWarmManager.cc
index 2a569cb8c7..51ee2f3eff 100644
--- a/iocore/net/PreWarmManager.cc
+++ b/iocore/net/PreWarmManager.cc
@@ -29,6 +29,7 @@
#include "P_VConnection.h"
#include "I_NetProcessor.h"
+#include "api/Metrics.h"
#include "tscore/ink_time.h"
#include "tscpp/util/PostScript.h"
@@ -83,21 +84,16 @@ parse_authority(std::string &fqdn, int32_t &port,
std::string_view authority)
//
constexpr std::string_view STAT_NAME_PREFIX = "proxy.process.tunnel.prewarm"sv;
-struct StatEntry {
- std::string_view name;
- RecRawStatSyncCb cb;
-};
-
// the order is the same as PreWarm::Stat
// clang-format off
-constexpr StatEntry STAT_ENTRIES[] = {
- {"current_init"sv, RecRawStatSyncSum},
- {"current_open"sv, RecRawStatSyncSum},
- {"total_hit"sv, RecRawStatSyncSum},
- {"total_miss"sv, RecRawStatSyncSum},
- {"total_handshake_time"sv, RecRawStatSyncSum},
- {"total_handshake_count"sv, RecRawStatSyncSum},
- {"total_retry"sv, RecRawStatSyncSum},
+constexpr std::string_view STAT_ENTRIES[] = {
+ "current_init"sv,
+ "current_open"sv,
+ "total_hit"sv,
+ "total_miss"sv,
+ "total_handshake_time"sv,
+ "total_handshake_count"sv,
+ "total_retry"sv,
};
// clang-format on
@@ -140,7 +136,8 @@ PreWarmSM::retry()
ink_hrtime delay = HRTIME_SECONDS(1 << _retry_counter);
++_retry_counter;
-
prewarmManager.stats.increment(_stats_ids->at(static_cast<int>(PreWarm::Stat::RETRY)),
1);
+
+
ts::Metrics::increment(_stats_ids->at(static_cast<int>(PreWarm::Stat::RETRY)));
EThread *ethread = this_ethread();
_retry_event = ethread->schedule_in_local(this, delay, EVENT_IMMEDIATE);
@@ -630,8 +627,8 @@ PreWarmSM::_record_handshake_time()
return;
}
-
prewarmManager.stats.increment(_stats_ids->at(static_cast<int>(PreWarm::Stat::HANDSHAKE_TIME)),
duration);
-
prewarmManager.stats.increment(_stats_ids->at(static_cast<int>(PreWarm::Stat::HANDSHAKE_COUNT)),
1);
+
ts::Metrics::increment(_stats_ids->at(static_cast<int>(PreWarm::Stat::HANDSHAKE_TIME)),
duration);
+
ts::Metrics::increment(_stats_ids->at(static_cast<int>(PreWarm::Stat::HANDSHAKE_COUNT)),
1);
}
////
@@ -704,10 +701,10 @@ PreWarmQueue::state_running(int event, void *data)
dst->port, (int)dst->type, dst->alpn_index, info.stat.miss,
info.stat.hit, (int)info.init_list->size(),
(int)info.open_list->size());
-
prewarmManager.stats.set_sum(info.stats_ids->at(static_cast<int>(PreWarm::Stat::INIT_LIST_SIZE)),
info.init_list->size());
-
prewarmManager.stats.set_sum(info.stats_ids->at(static_cast<int>(PreWarm::Stat::OPEN_LIST_SIZE)),
info.open_list->size());
-
prewarmManager.stats.increment(info.stats_ids->at(static_cast<int>(PreWarm::Stat::HIT)),
info.stat.hit);
-
prewarmManager.stats.increment(info.stats_ids->at(static_cast<int>(PreWarm::Stat::MISS)),
info.stat.miss);
+
ts::Metrics::write(info.stats_ids->at(static_cast<int>(PreWarm::Stat::INIT_LIST_SIZE)),
info.init_list->size());
+
ts::Metrics::write(info.stats_ids->at(static_cast<int>(PreWarm::Stat::OPEN_LIST_SIZE)),
info.open_list->size());
+
ts::Metrics::increment(info.stats_ids->at(static_cast<int>(PreWarm::Stat::HIT)),
info.stat.hit);
+
ts::Metrics::increment(info.stats_ids->at(static_cast<int>(PreWarm::Stat::MISS)),
info.stat.miss);
// clear PreWarmQueue::Stat
info.stat.miss = 0;
@@ -901,7 +898,6 @@ PreWarmQueue::_reconfigure()
const PreWarm::StatsIdMap &new_stats_id_map =
prewarmManager.get_stats_id_map();
Map new_map;
-
for (auto &entry : new_conf_list) {
const PreWarm::SPtrConstDst &dst = entry.first;
PreWarm::SPtrConstConf conf = entry.second;
@@ -930,8 +926,8 @@ PreWarmQueue::_reconfigure()
// free unexisting entries
for (auto &[dst, info] : _map) {
if (auto entry = new_conf_list.find(dst); entry == new_conf_list.end()) {
-
prewarmManager.stats.set_sum(info.stats_ids->at(static_cast<int>(PreWarm::Stat::INIT_LIST_SIZE)),
0);
-
prewarmManager.stats.set_sum(info.stats_ids->at(static_cast<int>(PreWarm::Stat::OPEN_LIST_SIZE)),
0);
+
ts::Metrics::write(info.stats_ids->at(static_cast<int>(PreWarm::Stat::INIT_LIST_SIZE)),
0);
+
ts::Metrics::write(info.stats_ids->at(static_cast<int>(PreWarm::Stat::OPEN_LIST_SIZE)),
0);
_make_queue_empty(info.init_list);
delete info.init_list;
@@ -1029,10 +1025,6 @@ PreWarmManager::reconfigure()
}
if (is_prewarm_enabled) {
- if (!stats.is_allocated()) {
- stats.init(prewarm_conf->max_stats_size);
- }
-
_parsed_conf.clear();
_parse_sni_conf(_parsed_conf, sni_conf);
_register_stats(_parsed_conf);
@@ -1134,6 +1126,8 @@ PreWarmManager::_register_stats(const
PreWarm::ParsedSNIConf &parsed_conf)
{
int stats_counter = 0;
+ ts::Metrics &intm = ts::Metrics::getInstance();
+
for (auto &entry : parsed_conf) {
const PreWarm::SPtrConstDst &dst = entry.first;
@@ -1145,26 +1139,28 @@ PreWarmManager::_register_stats(const
PreWarm::ParsedSNIConf &parsed_conf)
std::string_view alpn_name = alpn_name_for_stat(dst->alpn_index);
snprintf(name, sizeof(name), "%s.%.*s:%d.tls.%s.%s",
STAT_NAME_PREFIX.data(), static_cast<int>(dst->host.size()),
- dst->host.data(), dst->port, alpn_name.data(),
STAT_ENTRIES[j].name.data());
+ dst->host.data(), dst->port, alpn_name.data(),
STAT_ENTRIES[j].data());
} else {
snprintf(name, sizeof(name), "%s.%.*s:%d.%s.%s",
STAT_NAME_PREFIX.data(), static_cast<int>(dst->host.size()),
- dst->host.data(), dst->port, (dst->type ==
SNIRoutingType::PARTIAL_BLIND) ? "tls" : "tcp",
- STAT_ENTRIES[j].name.data());
+ dst->host.data(), dst->port, (dst->type ==
SNIRoutingType::PARTIAL_BLIND) ? "tls" : "tcp", STAT_ENTRIES[j].data());
}
- int stats_id = stats.find(name);
- if (stats_id < 0) {
- stats_id = stats.create(RECT_PROCESS, name, RECD_INT,
STAT_ENTRIES[j].cb);
+ ts::Metrics::IdType stats_id = intm.lookup(name);
+ ts::Metrics::IntType *metric = nullptr;
- if (stats_id < 0) {
- // proxy.config.tunnel.prewarm.max_stats_size is enough?
+ if (stats_id == ts::Metrics::NOT_FOUND) {
+ metric = intm.newMetricPtr(name);
+
+ if (metric == nullptr) {
Error("couldn't register stat name=%s", name);
} else {
++stats_counter;
}
+ } else {
+ metric = intm.lookup(stats_id);
}
- ids[j] = stats_id;
+ ids[j] = metric;
Debug("v_prewarm_init", "stat id=%d name=%s", stats_id, name);
}
diff --git a/iocore/net/PreWarmManager.h b/iocore/net/PreWarmManager.h
index b660194b89..cc1b866ce4 100644
--- a/iocore/net/PreWarmManager.h
+++ b/iocore/net/PreWarmManager.h
@@ -32,8 +32,8 @@
#include "NetTimeout.h"
#include "Milestones.h"
+#include "api/Metrics.h"
#include "records/I_RecHttp.h"
-#include "records/DynamicStats.h"
#include <map>
#include <unordered_map>
@@ -136,7 +136,7 @@ enum class Stat {
LAST_ENTRY,
};
-using StatsIds = std::array<int,
static_cast<size_t>(PreWarm::Stat::LAST_ENTRY)>;
+using StatsIds = std::array<ts::Metrics::IntType *,
static_cast<size_t>(PreWarm::Stat::LAST_ENTRY)>;
using SPtrConstStatsIds = std::shared_ptr<const StatsIds>;
using StatsIdMap = std::unordered_map<SPtrConstDst, SPtrConstStatsIds,
DstHash, DstKeyEqual>;
@@ -247,7 +247,7 @@ class PreWarmQueue : public Continuation
{
public:
PreWarmQueue();
- ~PreWarmQueue();
+ ~PreWarmQueue() override;
// States
int state_init(int event, void *data);
@@ -323,11 +323,6 @@ public:
const PreWarm::ParsedSNIConf &get_parsed_conf() const;
const PreWarm::StatsIdMap &get_stats_id_map() const;
- ////
- // Variables
- //
- DynamicStats stats;
-
private:
void _parse_sni_conf(PreWarm::ParsedSNIConf &parsed_conf, const
SNIConfigParams *sni_conf) const;
void _register_stats(const PreWarm::ParsedSNIConf &parsed_conf);
diff --git a/proxy/http/PreWarmConfig.cc b/proxy/http/PreWarmConfig.cc
index 832ab52357..5180a17d26 100644
--- a/proxy/http/PreWarmConfig.cc
+++ b/proxy/http/PreWarmConfig.cc
@@ -31,7 +31,6 @@ PreWarmConfigParams::PreWarmConfigParams()
{
// RECU_RESTART_TS
REC_EstablishStaticConfigByte(enabled,
"proxy.config.tunnel.prewarm.enabled");
- REC_EstablishStaticConfigInteger(max_stats_size,
"proxy.config.tunnel.prewarm.max_stats_size");
// RECU_DYNAMIC
REC_ReadConfigInteger(event_period,
"proxy.config.tunnel.prewarm.event_period");
diff --git a/proxy/http/PreWarmConfig.h b/proxy/http/PreWarmConfig.h
index e199722e10..b4ae24029d 100644
--- a/proxy/http/PreWarmConfig.h
+++ b/proxy/http/PreWarmConfig.h
@@ -31,10 +31,9 @@ struct PreWarmConfigParams : public ConfigInfo {
PreWarmConfigParams &operator=(const HttpConfigParams &) = delete;
// Config Params
- int8_t enabled = 0;
- int8_t algorithm = 0;
- int64_t event_period = 0;
- int64_t max_stats_size = 0;
+ int8_t enabled = 0;
+ int8_t algorithm = 0;
+ int64_t event_period = 0;
};
class PreWarmConfig
diff --git a/src/records/RecordsConfig.cc b/src/records/RecordsConfig.cc
index edbf33083b..1a5ecfa3ab 100644
--- a/src/records/RecordsConfig.cc
+++ b/src/records/RecordsConfig.cc
@@ -950,8 +950,6 @@ static const RecordElement RecordsConfig[] =
,
{RECT_CONFIG, "proxy.config.tunnel.prewarm.enabled", RECD_INT, "0",
RECU_RESTART_TS, RR_NULL, RECC_INT, "[0-1]", RECA_NULL}
,
- {RECT_CONFIG, "proxy.config.tunnel.prewarm.max_stats_size", RECD_INT, "100",
RECU_RESTART_TS, RR_NULL, RECC_INT, "[5-65536]", RECA_NULL}
- ,
{RECT_CONFIG, "proxy.config.tunnel.prewarm.event_period", RECD_INT, "1000",
RECU_DYNAMIC, RR_NULL, RECC_INT, "[10-3600000]", RECA_NULL}
,
{RECT_CONFIG, "proxy.config.tunnel.prewarm.algorithm", RECD_INT, "2",
RECU_DYNAMIC, RR_NULL, RECC_INT, "[1-2]", RECA_NULL}
diff --git a/tests/gold_tests/records/gold/full_records.yaml
b/tests/gold_tests/records/gold/full_records.yaml
index f182bf9990..8e019b37b7 100644
--- a/tests/gold_tests/records/gold/full_records.yaml
+++ b/tests/gold_tests/records/gold/full_records.yaml
@@ -585,7 +585,6 @@ ts:
algorithm: 2
enabled: 0
event_period: 1000
- max_stats_size: 100
udp:
enable_gso: 0
free_cancelled_pkts_sec: 10
diff --git a/tests/gold_tests/records/legacy_config/full_records.config
b/tests/gold_tests/records/legacy_config/full_records.config
index e0292a59e9..8febc6069b 100644
--- a/tests/gold_tests/records/legacy_config/full_records.config
+++ b/tests/gold_tests/records/legacy_config/full_records.config
@@ -305,7 +305,6 @@ CONFIG proxy.config.hostdb.host_file.path STRING nullptr
CONFIG proxy.config.hostdb.host_file.interval INT 86400
CONFIG proxy.config.tunnel.activity_check_period INT 0
CONFIG proxy.config.tunnel.prewarm INT 0
-CONFIG proxy.config.tunnel.prewarm.max_stats_size INT 100
CONFIG proxy.config.tunnel.prewarm.event_period INT 1000
CONFIG proxy.config.tunnel.prewarm.algorithm INT 2
CONFIG proxy.config.http.connect_ports STRING 443