13.9. Micrometer と Prometheus を使用して学校の時間割を監視する OptaPlanner Java アプリケーション
OptaPlanner は、Java アプリケーション用のメトリック計測ライブラリーである Micrometer を介してメトリックを公開します。Prometheus で Micrometer を使用して、学校の時間割アプリケーションで OptaPlanner ソルバーを監視できます。
前提条件
- OptaPlanner 学校の時間割アプリケーションを Java で作成しました。
- Prometheus がインストールされている。Prometheus のインストールについては、Prometheus の Web サイトを参照してください。
手順
Micrometer Prometheus 依存関係を学校の時間割
pom.xml
ファイルに追加します。<MICROMETER_VERSION>
は、インストールした Micrometer のバージョンです。<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> <version><MICROMETER_VERSION></version> </dependency>
注記micrometer-core
依存関係も必要です。ただし、この依存関係はoptaplanner-core
依存関係に含まれているため、pom.xml
ファイルに追加する必要はありません。次の import ステートメントを
TimeTableApp.java
クラスに追加します。import io.micrometer.core.instrument.Metrics; import io.micrometer.prometheus.PrometheusConfig; import io.micrometer.prometheus.PrometheusMeterRegistry;
TimeTableApp.java
クラスのメインメソッドの先頭に次の行を追加して、ソリューションが開始する前に Prometheus がcom.sun.net.httpserver.HttpServer
からデータを破棄できるようにします。PrometheusMeterRegistry prometheusRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT); try { HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0); server.createContext("/prometheus", httpExchange -> { String response = prometheusRegistry.scrape(); httpExchange.sendResponseHeaders(200, response.getBytes().length); try (OutputStream os = httpExchange.getResponseBody()) { os.write(response.getBytes()); } }); new Thread(server::start).start(); } catch (IOException e) { throw new RuntimeException(e); } Metrics.addRegistry(prometheusRegistry); solve(); }
次の行を追加して、解決時間を制御します。解決時間を調整することで、解決に費やされた時間に基づいて指標がどのように変化するかを確認できます。
withTerminationSpentLimit(Duration.ofMinutes(5)));
- 学校の時間割アプリケーションを開始します。
-
Web ブラウザーで
http://localhost:8080/prometheus
を開き、Prometheus で timetable アプリケーションを表示します。 監視システムを開いて、OptaPlanner プロジェクトのメトリックを表示します。
次のメトリックが公開されます。
-
optaplanner_solver_errors_total
: 測定開始以降に解決中に発生したエラーの総数。 -
optaplanner_solver_solve_duration_seconds_active_count
: 現在解決しているソルバーの数。 -
optaplanner_solver_solve_duration_seconds_max
: 現在アクティブなソルバーの実行時間が最も長い実行時間。 -
optaplanner_solver_solve_duration_seconds_duration_sum
: アクティブな各ソルバーの解決時間の合計。たとえば、アクティブなソルバーが 2 つあり、一方が 3 分間実行され、もう一方が 1 分間実行されている場合、合計計算時間は 4 分です。
-