14 SettingDefinitionを使用したイベントのフィルタ
FilteringSample.java
の例では(RegExpControl.java
とともに)、SettingDefinitionを使用してFlight Recorderが記録するイベントをフィルタします。この例では、message
フィールドにg
で始まる値があるHello
イベントが記録されます。
import java.io.IOException;
import jdk.jfr.Description;
import jdk.jfr.Event;
import jdk.jfr.Label;
import jdk.jfr.Name;
import jdk.jfr.Recording;
import jdk.jfr.SettingDefinition;
public class FilteringSample {
@Name("com.oracle.FilteredHello")
@Label("Hello With Message Filter")
static class FilteredHello extends Event {
@Label("Message")
String message;
@Label("Message Filter")
@Description("Filters messages with regular expressions")
@SettingDefinition
protected boolean messageFilter(RegExpControl control) {
return control.matches(message);
}
}
public static void main(String[] args) throws IOException {
try (Recording r = new Recording()) {
r.enable(FilteredHello.class).with("messageFilter", "g.*");
r.start();
FilteredHello greenEvent = new FilteredHello();
FilteredHello yellowEvent = new FilteredHello();
FilteredHello redEvent = new FilteredHello();
greenEvent.message = "green";
yellowEvent.message = "yellow";
redEvent.message = "red";
greenEvent.commit();
yellowEvent.commit();
redEvent.commit();
}
}
}
FilteringSample
の例には、RegExpControl.java
が必要です:
import java.util.Set;
import java.util.regex.Pattern;
import jdk.jfr.SettingControl;
public class RegExpControl extends SettingControl {
private Pattern pattern = Pattern.compile(".*");
@Override
public void setValue(String value) {
this.pattern = Pattern.compile(value);
}
@Override
public String combine(Set<String> values) {
return String.join("|", values);
}
@Override
public String getValue() {
return pattern.toString();
}
public boolean matches(String s) {
return pattern.matcher(s).find();
}
}
FilteringSample.java
およびRegExpControl.java
をコンパイルし、次のコマンドを使用してFilteringSample
を実行します:
java -XX:StartFlightRecording:filename=filteringsample.jfr FilteringSample
jfr print --events FilteredHello filteringsample.jfr
最後のコマンドでは、次のような出力が表示されます:
com.oracle.FilteredHello {
startTime = 23:38:28.364
message = "green"
...
}
注釈@SettingDefinitionは、特定のイベントを記録するかどうかを判断するためにFlight Recorderが呼び出すメソッドを指定します。この例では、messageFilter(RegExpControl)
が呼び出されます:
@SettingDefinition
protected boolean messageFilter(RegExpControl control) {
return control.matches(message);
}
このメソッドのパラメータであるRegExpControl
は、クラスSettingControlを拡張します。この例では、RegExpControl.java
に、正規表現設定controlが実装されています。メソッドmatches(String)
は、その文字列がフィールドpattern
に一致するとtrue
を戻します(これは、setValue(String)メソッドを使用してアプリケーションで変更できます)。
設定値が変更されると、メソッドsetValue()、getValue()およびcombine(Set<String>)が呼び出されますが、これは通常、記録の開始時や停止時に実行されます。combine(Set<String>)メソッドは、複数の記録が同時に実行されている場合に、使用する値を解決するために起動されます。