Skip to content

Commit 577cbed

Browse files
authored
Add ts::Metrics::StaticString and remove RecRegisterStatString (#12591)
* Add ts::Metrics::StaticString and remove RecRegisterStatString * include optional * only check static strings for certain rec types * Use std::unordered_map for string storage
1 parent 287d534 commit 577cbed

File tree

9 files changed

+120
-42
lines changed

9 files changed

+120
-42
lines changed

include/records/RecCore.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,6 @@ RecErrT _RecRegisterStatFloat(RecT rec_type, const char *name, RecFloat data_def
8484
#define RecRegisterStatFloat(rec_type, name, data_default, persist_type) \
8585
_RecRegisterStatFloat((rec_type), (name), (data_default), REC_PERSISTENCE_TYPE(persist_type))
8686

87-
RecErrT _RecRegisterStatString(RecT rec_type, const char *name, RecStringConst data_default, RecPersistT persist_type);
88-
#define RecRegisterStatString(rec_type, name, data_default, persist_type) \
89-
_RecRegisterStatString((rec_type), (name), (data_default), REC_PERSISTENCE_TYPE(persist_type))
90-
9187
RecErrT _RecRegisterStatCounter(RecT rec_type, const char *name, RecCounter data_default, RecPersistT persist_type);
9288
#define RecRegisterStatCounter(rec_type, name, data_default, persist_type) \
9389
_RecRegisterStatCounter((rec_type), (name), (data_default), REC_PERSISTENCE_TYPE(persist_type))

include/tsutil/Metrics.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include <string>
3434
#include <string_view>
3535
#include <variant>
36+
#include <optional>
3637

3738
#include "swoc/MemSpan.h"
3839

@@ -535,6 +536,41 @@ class Metrics
535536

536537
}; // class Counter
537538

539+
class StaticString
540+
{
541+
public:
542+
using StringStorage = std::unordered_map<std::string, std::string>;
543+
using iterator = StringStorage::iterator;
544+
545+
static void
546+
createString(const std::string &name, const std::string_view value)
547+
{
548+
auto &instance = Metrics::StaticString::instance();
549+
return instance._createString(name, value);
550+
}
551+
552+
static StaticString &instance();
553+
554+
iterator
555+
begin()
556+
{
557+
return _strings.begin();
558+
}
559+
iterator
560+
end()
561+
{
562+
return _strings.end();
563+
};
564+
565+
std::optional<std::string_view> lookup(const std::string &name);
566+
567+
private:
568+
void _createString(const std::string &name, const std::string_view value);
569+
570+
StringStorage _strings;
571+
mutable std::mutex _mutex;
572+
};
573+
538574
/**
539575
* Derive metrics by summing a set of other metrics.
540576
*

src/proxy/logging/LogStandalone.cc

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "tscore/ink_sys_control.h"
3434
#include "tscore/signals.h"
3535
#include "tscore/Layout.h"
36+
#include "tsutil/Metrics.h"
3637
#include "proxy/shared/DiagsConfig.h"
3738

3839
// Needs LibRecordsConfigInit()
@@ -89,13 +90,13 @@ initialize_records()
8990
// Define version info records
9091
//
9192
auto &version = AppVersionInfo::get_version();
92-
RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.short", version.version(), RECP_NON_PERSISTENT);
93-
RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.long", version.full_version(), RECP_NON_PERSISTENT);
94-
RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.build_number", version.build_number(), RECP_NON_PERSISTENT);
95-
RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.build_time", version.build_time(), RECP_NON_PERSISTENT);
96-
RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.build_date", version.build_date(), RECP_NON_PERSISTENT);
97-
RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.build_machine", version.build_machine(), RECP_NON_PERSISTENT);
98-
RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.build_person", version.build_person(), RECP_NON_PERSISTENT);
93+
ts::Metrics::StaticString::createString("proxy.process.version.server.short", version.version());
94+
ts::Metrics::StaticString::createString("proxy.process.version.server.long", version.full_version());
95+
ts::Metrics::StaticString::createString("proxy.process.version.server.build_number", version.build_number());
96+
ts::Metrics::StaticString::createString("proxy.process.version.server.build_time", version.build_time());
97+
ts::Metrics::StaticString::createString("proxy.process.version.server.build_date", version.build_date());
98+
ts::Metrics::StaticString::createString("proxy.process.version.server.build_machine", version.build_machine());
99+
ts::Metrics::StaticString::createString("proxy.process.version.server.build_person", version.build_person());
99100
}
100101

101102
/*-------------------------------------------------------------------------

src/records/P_RecCore.cc

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,6 @@ _RecRegisterStatFloat(RecT rec_type, const char *name, RecFloat data_default, Re
6666
REC_REGISTER_STAT_XXX(rec_float, RECD_FLOAT);
6767
}
6868

69-
RecErrT
70-
_RecRegisterStatString(RecT rec_type, const char *name, RecStringConst data_in, RecPersistT persist_type)
71-
{
72-
// NOTE(cmcfarlen): RecRegisterState calls RecDataSet which call strdup on the string data.
73-
// therefore, this const cast will not be modified nor escape the stack past here.
74-
char *data_default = const_cast<char *>(data_in);
75-
REC_REGISTER_STAT_XXX(rec_string, RECD_STRING);
76-
}
77-
7869
RecErrT
7970
_RecRegisterStatCounter(RecT rec_type, const char *name, RecCounter data_default, RecPersistT persist_type)
8071
{

src/records/RecCore.cc

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,23 @@ RecLookupRecord(const char *name, void (*callback)(const RecRecord *, void *), v
547547
if (lock) {
548548
ink_rwlock_unlock(&g_records_rwlock);
549549
}
550+
551+
// Also check for StaticString metrics
552+
if (err == REC_ERR_FAIL) {
553+
auto &strings = ts::Metrics::StaticString::instance();
554+
555+
if (auto m = strings.lookup(std::string{name}); m) {
556+
RecRecord r;
557+
r.rec_type = RECT_PLUGIN;
558+
r.data_type = RECD_STRING;
559+
r.name = name;
560+
r.data.rec_string = const_cast<char *>(m->data());
561+
r.data_default.rec_string = const_cast<char *>(m->data());
562+
563+
callback(&r, data);
564+
err = REC_ERR_OKAY;
565+
}
566+
}
550567
}
551568

552569
return err;
@@ -556,7 +573,6 @@ RecErrT
556573
RecLookupMatchingRecords(unsigned rec_type, const char *match, void (*callback)(const RecRecord *, void *), void *data,
557574
bool /* lock ATS_UNUSED */)
558575
{
559-
int num_records;
560576
Regex regex;
561577

562578
if (!regex.compile(match, RE_CASE_INSENSITIVE | RE_UNANCHORED)) {
@@ -566,22 +582,36 @@ RecLookupMatchingRecords(unsigned rec_type, const char *match, void (*callback)(
566582
if ((rec_type & (RECT_PROCESS | RECT_NODE | RECT_PLUGIN))) {
567583
// First find the new metrics, this is a bit of a hack, because we still use the old
568584
// librecords callback with a "pseudo" record.
569-
RecRecord tmp;
570-
571-
tmp.rec_type = RECT_PROCESS;
572-
573585
for (auto &&[name, type, val] : ts::Metrics::instance()) {
574586
if (regex.exec(name.data())) {
587+
RecRecord tmp;
588+
589+
tmp.rec_type = RECT_PROCESS;
590+
575591
tmp.name = name.data();
576592
tmp.data_type = type == ts::Metrics::MetricType::COUNTER ? RECD_COUNTER : RECD_INT;
577593
tmp.data.rec_int = val;
578594
callback(&tmp, data);
579595
}
580596
}
581-
// Fall through to return any matching string metrics
597+
// Finally check string metrics
598+
for (auto &&[name, value] : ts::Metrics::StaticString::instance()) {
599+
if (regex.exec(name)) {
600+
RecRecord tmp;
601+
602+
tmp.rec_type = RECT_PROCESS;
603+
604+
tmp.name = name.data();
605+
tmp.data_type = RECD_STRING;
606+
// NOTE(cmcfarlen): unfortunate relic here that the callbacks expect a non-const rec_string
607+
// This should be temp until traffic_ctl uses ts::Metrics directly
608+
tmp.data.rec_string = const_cast<char *>(value.c_str());
609+
callback(&tmp, data);
610+
}
611+
}
582612
}
583613

584-
num_records = g_num_records;
614+
int num_records = g_num_records;
585615
for (int i = 0; i < num_records; i++) {
586616
RecRecord *r = &(g_records[i]);
587617

src/records/RecordsConfigUtils.cc

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,6 @@ initialize_record(const RecordElement *record, void *)
102102
RecRegisterStatFloat(type, record->name, tempFloat, RECP_NON_PERSISTENT);
103103
break;
104104

105-
case RECD_STRING:
106-
RecRegisterStatString(type, record->name, (RecString)record->value, RECP_NON_PERSISTENT);
107-
break;
108-
109105
case RECD_COUNTER:
110106
tempCounter = static_cast<RecCounter>(ink_atoi64(record->value));
111107
RecRegisterStatCounter(type, record->name, tempCounter, RECP_NON_PERSISTENT);

src/records/test_RecordsConfig.cc

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@ RecordsConfigRegister()
4747
RecRegisterConfigCounter(RECT_CONFIG, "proxy.config.link_test_3", 0, RECU_DYNAMIC, RECC_NULL, nullptr);
4848

4949
// NODE
50-
RecRegisterStatString(RECT_NODE, "proxy.node.cb_test_1", "cb_test_1__original", RECP_NON_PERSISTENT);
51-
RecRegisterStatString(RECT_NODE, "proxy.node.cb_test_2", "cb_test_2__original", RECP_NON_PERSISTENT);
5250
RecRegisterStatInt(RECT_NODE, "proxy.node.cb_test_int", 0, RECP_NON_PERSISTENT);
5351
RecRegisterStatFloat(RECT_NODE, "proxy.node.cb_test_float", 0.0f, RECP_NON_PERSISTENT);
5452
RecRegisterStatCounter(RECT_NODE, "proxy.node.cb_test_count", 0, RECP_NON_PERSISTENT);

src/traffic_server/traffic_server.cc

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848

4949
#include "ts/ts.h" // This is sadly needed because of us using TSThreadInit() for some reason.
5050
#include "swoc/swoc_file.h"
51+
#include "tsutil/Metrics.h"
5152

5253
#include <syslog.h>
5354
#include <algorithm>
@@ -712,13 +713,13 @@ initialize_records()
712713
// Define version info records
713714
//
714715
auto &version = AppVersionInfo::get_version();
715-
RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.short", version.version(), RECP_NON_PERSISTENT);
716-
RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.long", version.full_version(), RECP_NON_PERSISTENT);
717-
RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.build_number", version.build_number(), RECP_NON_PERSISTENT);
718-
RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.build_time", version.build_time(), RECP_NON_PERSISTENT);
719-
RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.build_date", version.build_date(), RECP_NON_PERSISTENT);
720-
RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.build_machine", version.build_machine(), RECP_NON_PERSISTENT);
721-
RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.build_person", version.build_person(), RECP_NON_PERSISTENT);
716+
ts::Metrics::StaticString::createString("proxy.process.version.server.short", version.version());
717+
ts::Metrics::StaticString::createString("proxy.process.version.server.long", version.full_version());
718+
ts::Metrics::StaticString::createString("proxy.process.version.server.build_number", version.build_number());
719+
ts::Metrics::StaticString::createString("proxy.process.version.server.build_time", version.build_time());
720+
ts::Metrics::StaticString::createString("proxy.process.version.server.build_date", version.build_date());
721+
ts::Metrics::StaticString::createString("proxy.process.version.server.build_machine", version.build_machine());
722+
ts::Metrics::StaticString::createString("proxy.process.version.server.build_person", version.build_person());
722723
}
723724

724725
void
@@ -2030,8 +2031,7 @@ main(int /* argc ATS_UNUSED */, const char **argv)
20302031
Machine::init(hostname, &machine_addr.sa);
20312032
}
20322033

2033-
RecRegisterStatString(RECT_PROCESS, "proxy.process.version.server.uuid", (char *)Machine::instance()->process_uuid.getString(),
2034-
RECP_NON_PERSISTENT);
2034+
ts::Metrics::StaticString::createString("proxy.process.version.server.uuid", Machine::instance()->process_uuid.getString());
20352035

20362036
res_track_memory = RecGetRecordInt("proxy.config.res_track_memory").value_or(0);
20372037

src/tsutil/Metrics.cc

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "tsutil/Assert.h"
2525
#include <memory>
2626
#include <mutex>
27+
#include <optional>
2728
#include <variant>
2829
#include <vector>
2930
#include "tsutil/Metrics.h"
@@ -292,4 +293,33 @@ Metrics::Derived::update_derived()
292293
details::DerivativeMetrics::instance().update();
293294
}
294295

296+
Metrics::StaticString &
297+
Metrics::StaticString::instance()
298+
{
299+
static Metrics::StaticString i{};
300+
return i;
301+
}
302+
303+
void
304+
Metrics::StaticString::_createString(const std::string &name, const std::string_view value)
305+
{
306+
std::lock_guard l(_mutex);
307+
308+
_strings[name] = value;
309+
}
310+
311+
std::optional<std::string_view>
312+
Metrics::StaticString::lookup(const std::string &name)
313+
{
314+
std::lock_guard l(_mutex);
315+
auto it = _strings.find(name);
316+
std::optional<std::string_view> result{};
317+
318+
if (it != _strings.end()) {
319+
result = it->second;
320+
}
321+
322+
return result;
323+
}
324+
295325
} // namespace ts

0 commit comments

Comments
 (0)