8.6. ソルバーの監視
OptaPlanner は、Java アプリケーション用のメトリック計測ライブラリーである Micrometer を介してメトリックを公開します。一般的な監視システムで Micrometer を使用して、OptaPlanner ソルバーを監視できます。
8.6.1. Micrometer 用の Quarkus OptaPlanner アプリケーションの設定
OptaPlanner Quarkus アプリケーションを Micrometer および指定された監視システムを使用するように設定するには、Micrometer 依存関係を pom.xml
ファイルに追加します。
前提条件
- Quarkus OptaPlanner アプリケーションがあります。
手順
次の依存関係をアプリケーションの
pom.xml
ファイルに追加します。ここで<MONITORING_SYSTEM>
は Micrometer と Quarkus でサポートされている監視システムです。注記Prometheus は現在、Quarkus でサポートされている唯一の監視システムです。
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-micrometer-registry-<MONITORING_SYSTEM></artifactId> </dependency>
アプリケーションを開発モードで実行するには、次のコマンドを入力します。
mvn compile quarkus:dev
アプリケーションのメトリックを表示するには、ブラウザーに次の URL を入力します。
http://localhost:8080/q/metrics
8.6.2. Micrometer 用の Spring Boot OptaPlanner アプリケーションの設定
Micrometer と指定された監視システムを使用するように Spring Boot OptaPlanner アプリケーションを設定するには、pom.xml
ファイルに Micrometer 依存関係を追加します。
前提条件
- Spring Boot OptaPlanner アプリケーションがあります。
手順
次の依存関係をアプリケーションの
pom.xml
ファイルに追加します。ここで<MONITORING_SYSTEM>
は Micrometer と Spring Boot でサポートされている監視システムです。<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-<MONITORING_SYSTEM></artifactId> </dependency>
-
アプリケーションの
application.properties
ファイルに設定情報を追加します。詳細は、Micrometer Web サイトを参照してください。 アプリケーションを実行するには、以下のコマンドを入力します。
mvn spring-boot:run
アプリケーションのメトリックを表示するには、ブラウザーに次の URL を入力します。
http://localhost:8080/actuator/metrics
注記次の URL を Prometheus スクレイパーパスとして使用します:
http://localhost:8080/actuator/prometheus
8.6.3. Micrometer 用のプレーンな Java OptaPlanner アプリケーションの設定
Micrometer を使用するようにプレーンな Java OptaPlanner アプリケーションを設定するには、Micrometer の依存関係と、選択した監視システムの設定情報をプロジェクトの POM.XML
ファイルに追加する必要があります。
前提条件
- プレーンな Java OptaPlanner アプリケーションがあります。
手順
次の依存関係をアプリケーションの
pom.xml
ファイルに追加します。ここで、<MONITORING_SYSTEM>
は Micrometer で設定された監視システムであり、<VERSION>
は使用している Micrometer のバージョンです。<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-<MONITORING_SYSTEM></artifactId> <version><VERSION></version> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-core</artifactId> <version>`<VERSION>`</version> </dependency>
-
プロジェクトの
pom.xml
ファイルの先頭に、監視システムの Micrometer 設定情報を追加します。詳細は、Micrometer Web サイトを参照してください。 設定情報の下に次の行を追加します。ここで、
<MONITORING_SYSTEM>
は追加した監視システムです。Metrics.addRegistry(<MONITORING_SYSTEM>);
次の例は、Prometheus 監視システムを追加する方法を示しています。
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);
監視システムを開いて、OptaPlanner プロジェクトのメトリックを表示します。次のメトリックが公開されます。
注記メトリックの名前と形式は、レジストリーによって異なります。
-
optaplanner.solver.errors.total
: 測定開始以降に解決中に発生したエラーの総数。 -
optaplanner.solver.solve-length.active-count
: 現在解いているソルバーの数。 -
optaplanner.solver.solve-length.seconds-max
: 現在アクティブなソルバーの実行時間が最も長い実行時間。 -
optaplanner.solver.solve-length.seconds-duration-sum
: アクティブな各ソルバーの解決時間の合計。たとえば、アクティブなソルバーが 2 つあり、一方が 3 分間実行され、もう一方が 1 分間実行されている場合、合計計算時間は 4 分です。
-
8.6.4. 追加メトリクス
より詳細な監視を行うには、ソルバー設定で OptaPlanner を設定して、パフォーマンスコストで追加のメトリックを監視できます。次の例では、BEST_SCORE
および SCORE_CALCULATION_COUNT
メトリクスを使用しています。
<solver xmlns="https://www.optaplanner.org/xsd/solver" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.optaplanner.org/xsd/solver https://www.optaplanner.org/xsd/solver/solver.xsd"> <monitoring> <metric>BEST_SCORE</metric> <metric>SCORE_CALCULATION_COUNT</metric> ... </monitoring> ... </solver>
この設定では、次のメトリックを有効にできます。
-
SOLVE_DURATION
(デフォルトで有効、マイクロメータメーター ID:optaplanner.solver.solve.duration
): 最長のアクティブソルバーの解決時間、アクティブソルバーの数、アクティブなすべてのソルバーの累積時間を測定します。 -
ERROR_COUNT
(デフォルトで有効、マイクロメーターメーター ID:optaplanner.solver.errors
): 解決中に発生したエラーの数を測定します。 -
SCORE_CALCULATION_COUNT
(デフォルトで有効、マイクロメーターメーター ID:optaplanner.solver.score.calculation.count
): OptaPlanner が実行したスコア計算の数を測定します。 -
BEST_SCORE
(マイクロメーターメーター ID:optaplanner.solver.best.score.*
): OptaPlanner がこれまでに見つけた最適解のスコアを測定します。スコアのレベルごとに個別のメーターがあります。たとえば、HardSoftScore
の場合、optaplanner.solver.best.score.hard.score
およびoptaplanner.solver.best.score.soft.score
メーターがあります。 -
STEP_SCORE
(マイクロメーターメーター ID:optaplanner.solver.step.score.*
): OptaPlanner が実行する各ステップのスコアを測定します。スコアのレベルごとに個別のメーターがあります。たとえば、HardSoftScore
の場合、optaplanner.solver.step.score.hard.score
およびoptaplanner.solver.step.score.soft.score
メーターがあります。 -
BEST_SOLUTION_MUTATION
(マイクロメーターメーター ID:optaplanner.solver.best.solution.mutation
): 連続する最適解の間で変更された計画変数の数を測定します。 -
MOVE_COUNT_PER_STEP
(マイクロメータメーター ID:optaplanner.solver.step.move.count
): ステップで評価された移動の数を測定します。 -
MEMORY_USE
(マイクロメーターメーター ID:jvm.memory.used
): JVM 全体で使用されるメモリーの量を測定します。このメトリクスは、ソルバーが使用するメモリーの量を測定するものではありません。同じ JVM 上の 2 つのソルバーは、このメトリックに対して同じ値を報告します。 -
CONSTRAINT_MATCH_TOTAL_BEST_SCORE
(マイクロメーターメーター ID:optaplanner.solver.constraint.match.best.score.*
): OptaPlanner がこれまでに見つけた最適解に対する各制約のスコアの影響を測定します。スコアのレベルごとに個別のメーターがあり、各制約のタグが付いています。たとえば、パッケージ "com.example" の制約 "Minimize Cost" のHardSoftScore
には、optaplanner.solver.constraint.match.best.score.hard.score
とoptaplanner.solver.constraint.match.best.score.soft.score
があります。これらは、タグ "constraint.package=com.example" と "constraint.name=Minimize Cost" を持ちます。 -
CONSTRAINT_MATCH_TOTAL_STEP_SCORE
(マイクロメーターメーター ID:optaplanner.solver.constraint.match.step.score.*
): 現在のステップに対する各制約のスコアの影響を測定します。スコアのレベルごとに個別のメーターがあり、各制約のタグが付いています。たとえば、パッケージ "com.example" の制約 "Minimize Cost" のHardSoftScore
には、optaplanner.solver.constraint.match.step.score.hard.score
とoptaplanner.solver.constraint.match.step.score.soft.score
があります。これらには、タグ "constraint.package=com.example" と "constraint.name=Minimize Cost" があります。 -
PICKED_MOVE_TYPE_BEST_SCORE_DIFF
(マイクロメーターメーター ID:optaplanner.solver.move.type.best.score.diff.*
): 特定の移動タイプが最適解をどの程度改善するかを測定します。スコアのレベルごとに個別のメーターがあり、移動タイプのタグが付いています。たとえば、プロセスのコンピューターのHardSoftScore
とChangeMove
には、optaplanner.solver.move.type.best.score.diff.hard.score
とoptaplanner.solver.move.type.best.score.diff.soft.score
メーターがあります。これには、move.type=ChangeMove(Process.computer)
タグがあります。 -
PICKED_MOVE_TYPE_STEP_SCORE_DIFF
(マイクロメーターメーター ID:optaplanner.solver.move.type.step.score.diff.*
): 特定の移動タイプが最適解をどの程度改善するかを測定します。スコアのレベルごとに個別のメーターがあり、移動タイプのタグが付いています。たとえば、プロセスのコンピューターのHardSoftScore
とChangeMove
には、optaplanner.solver.move.type.step.score.diff.hard.score
とoptaplanner.solver.move.type.step.score.diff.soft.score
メーターがあります。これには、タグmove.type=ChangeMove(Process.computer)
が含まれます。