// If this is the last metric with this name, remove the type as well.
if (!((it != metrics.begin() && prev(it)->first.name == name) ||
- (it != metrics.end() && next(it)->first.name == name))) {
+ (it != metrics.end() && next(it) != metrics.end() && next(it)->first.name == name))) {
+ types.erase(name);
+ }
+
+ metrics.erase(it);
+}
+
+void Metrics::remove_if_exists(const string &name, const vector<pair<string, string>> &labels)
+{
+ lock_guard<mutex> lock(mu);
+ auto it = metrics.find(MetricKey(name, labels));
+ if (it == metrics.end()) {
+ return;
+ }
+
+ // If this is the last metric with this name, remove the type as well.
+ if (!((it != metrics.begin() && prev(it)->first.name == name) ||
+ (it != metrics.end() && next(it) != metrics.end() && next(it)->first.name == name))) {
types.erase(name);
}