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>)メソッドは、複数の記録が同時に実行されている場合に、使用する値を解決するために起動されます。