Skip to content

Commit

Permalink
fix: coredump when table name contains '_' and prometheus is enabled (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
padmejin authored and hycdong committed Oct 25, 2021
1 parent 90fea54 commit cd44023
Showing 1 changed file with 11 additions and 9 deletions.
20 changes: 11 additions & 9 deletions src/reporter/pegasus_counter_reporter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -234,22 +234,19 @@ void pegasus_counter_reporter::update()
const dsn::perf_counters::counter_snapshot &cs) {
std::string metrics_name = cs.name;

// prometheus metric_name don't support characters like .*()@, it only support ":"
// and "_"
// so change the name to make it all right
format_metrics_name(metrics_name);

// split metric_name like "collector_app_pegasus_app_stat_multi_put_qps:1_0_p999" or
// "collector_app_pegasus_app_stat_multi_put_qps:1_0"
// Splits metric_name like:
// "collector*app.pegasus*app_stat_multi_put_qps@1.0.p999"
// "collector*app.pegasus*app_stat_multi_put_qps@1.0"
// app[0] = "1" which is the app(app name or app id)
// app[1] = "0" which is the partition_index
// app[2] = "p999" or "" which represent the percent
std::string app[3] = {"", "", ""};
std::list<std::string> lv;
::dsn::utils::split_args(metrics_name.c_str(), lv, ':');
::dsn::utils::split_args(metrics_name.c_str(), lv, '@');
if (lv.size() > 1) {
std::list<std::string> lv1;
::dsn::utils::split_args(lv.back().c_str(), lv1, '_');
::dsn::utils::split_args(lv.back().c_str(), lv1, '.');
dcheck_le(lv1.size(), 3);
int i = 0;
for (auto &v : lv1) {
app[i] = v;
Expand All @@ -268,6 +265,11 @@ void pegasus_counter_reporter::update()

// create metrics that prometheus support to report data
metrics_name = lv.front() + app[2];

// prometheus metric_name doesn't support characters like .*()@, it only supports ":"
// and "_" so change the name to make it all right.
format_metrics_name(metrics_name);

std::map<std::string, prometheus::Family<prometheus::Gauge> *>::iterator it =
_gauge_family_map.find(metrics_name);
if (it == _gauge_family_map.end()) {
Expand Down

0 comments on commit cd44023

Please sign in to comment.