io.crate.jmx.MBeanPropertyCache Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of crate-jmx-exporter Show documentation
Show all versions of crate-jmx-exporter Show documentation
Crate.IO Java Agent to expose JMX metrics via HTTP
The newest version!
/*
* Licensed to Crate under one or more contributor license agreements.
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership. Crate licenses this file
* to you under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may
* obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*
* However, if you have executed another commercial license agreement
* with Crate these terms will supersede the license and you may use the
* software solely pursuant to the terms of the relevant commercial
* agreement.
*/
package io.crate.jmx;
import javax.management.ObjectName;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* This object stores a mapping of mBean objectNames to mBean key property lists. The main purpose of it is to reduce
* the frequency with which we invoke PROPERTY_PATTERN when discovering mBeans.
*
* Implementation derived from
* https://github.com/prometheus/jmx_exporter/blob/master/collector/src/main/java/io/prometheus/jmx/JmxMBeanPropertyCache.java
*/
class MBeanPropertyCache {
private static final Pattern PROPERTY_PATTERN = Pattern.compile(
"([^,=:\\*\\?]+)" + // Name - non-empty, anything but comma, equals, colon, star, or question mark
"=" + // Equals
"(" + // Either
"\"" + // Quoted
"(?:" + // A possibly empty sequence of
"[^\\\\\"]" + // Anything but backslash or quote
"|\\\\\\\\" + // or an escaped backslash
"|\\\\n" + // or an escaped newline
"|\\\\\"" + // or an escaped quote
"|\\\\\\?" + // or an escaped question mark
"|\\\\\\*" + // or an escaped star
")*" +
"\"" +
"|" + // Or
"[^,=:\"]*" + // Unquoted - can be empty, anything but comma, equals, colon, or quote
")");
// Implement a version of ObjectName.getKeyPropertyList that returns the
// properties in the order they were added.
private final Map> keyPropertiesPerBean;
MBeanPropertyCache() {
this.keyPropertiesPerBean = new ConcurrentHashMap<>();
}
public LinkedHashMap getKeyPropertyList(ObjectName mbeanName) {
LinkedHashMap keyProperties = keyPropertiesPerBean.get(mbeanName);
if (keyProperties == null) {
keyProperties = new LinkedHashMap<>();
String properties = mbeanName.getKeyPropertyListString();
Matcher match = PROPERTY_PATTERN.matcher(properties);
while (match.lookingAt()) {
keyProperties.put(match.group(1), match.group(2));
properties = properties.substring(match.end());
if (properties.startsWith(",")) {
properties = properties.substring(1);
}
match.reset(properties);
}
keyPropertiesPerBean.put(mbeanName, keyProperties);
}
return keyProperties;
}
}