MicrometerとPrometheusでOpenShiftにおけるQuarkusアプリのモニタリング
メトリクスは、リソースの使用状況や動作など、アプリケーションのあらゆる側面の測定値です。Quarkusのアプリケーションからこれらのメトリクスを公開するには、 /q/metrics エンドポイント経由で Micrometerエクステンションを使用します。
どのようなメトリクスが公開されますか?Micrometerエクステンションを追加するだけで、多くのメトリクスがデフォルトで公開されます。例えば、現在のライブスレッド数のようなJVMエンジンに関するメトリクス jvm_threads_live_threads や、現在のCPU使用率のようなシステム自体に関するメトリクス system_cpu_usage などがあります。さらに、使用している他のQuarkusエクステンションに応じて、より多くのメトリクスが自動的に公開されます。例えば、ResteasyのようなQuarkusのRESTエクステンションを使用している場合、実行中のサービスに関するメトリクスが自動的に公開されます。
http_server_requests_seconds_count{method="GET",outcome="SUCCESS",status="200",uri="/hello",} 1.0
http_server_requests_seconds_sum{method="GET",outcome="SUCCESS",status="200",uri="/hello",} 0.018198043Kafkaエクステンションを使用している場合も同様です。これらの設定については、 Quarkus Micrometerガイドによく書かれています。
これらのメトリクスはどのように消費されるのですか? 前述の通り、Micrometer は Prometheus のようなサードパーティが利用できるように /q/metrics エンドポイントでメトリクスを公開しています。OpenShiftにはPrometheusのインスタンスが埋め込まれているので、それを利用することができます。それでは、Quarkus Applicationsのメトリクスと、OpenShiftで提供されているPrometheusの埋め込みインスタンスを統合するために必要なことを見ていきましょう。
基本的には、次のようなステップを踏む必要があります。
- 
OpenShiftでユーザー定義のプロジェクトのモニタリングの有効化 
- 
Quarkusアプリケーションのデプロイ 
- 
プロジェクトにサービスモニターを作成 
ステップ1 - OpenShiftでユーザー定義のプロジェクトのモニタリングを有効化
ユーザー定義のプロジェクトのモニタリングを有効にするためには、 OpenShiftのドキュメントの指示に従う必要があります。
突きつめると、名前空間 openshift-monitoring に ConfigMap を作成する必要があります。
cluster-monitoring-config.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
    name: cluster-monitoring-config
    namespace: openshift-monitoring
data:
    config.yaml: |
    enableUserWorkload: trueそして、それを以下のように適用します:
oc apply -f cluster-monitoring-config.yaml| OpenShiftの4.5以前のバージョンでは、代わりに以下を実行する必要があります: | 
apiVersion: v1
kind: ConfigMap
metadata:
    name: cluster-monitoring-config
    namespace: openshift-monitoring
data:
    config.yaml: |
    techPreviewUserWorkload:
        enabled: trueOpenshiftは自動的に openshift-user-workload-monitoring 名前空間を作成し、そこにPrometheusに必要なリソースをデプロイします。
2. Quarkusアプリケーションのデプロイ
OpenShiftで必要なインフラの準備ができたら、次にQuarkusアプリケーションを進めていきましょう。REST APIを実装し、prometheusでmicrometerを有効にします。そのためには、 pom.xml ファイルに2つのQuarkusエクステンションを追加する必要があります。
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-resteasy</artifactId>
</dependency>
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-micrometer-registry-prometheus</artifactId>
</dependency>そして、Greetingリソースを追加します。
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tags;
@Path("/hello")
public class GreetingsResource {
    @Inject
    MeterRegistry registry;
    @GET
    @Path("/{name}")
    public String sayHello(@PathParam(value = "name") String name) {
        registry.counter("greeting_counter", Tags.of("name", name)).increment();
        return "Hello!";
    }
}ご覧のように、micrometer レジストリファサードを使用して、タグ名を持つカウンタを作成し、起動するたびにインクリメントしています。
このアプリケーションを実行して試してみましょう:
mvn compile quarkus:devこれで、私たちのサービスを呼び出すことができるはずです:
curl http://localhost:8080/hello/quarkusそして、 Hello! を返すはずです。ここまではいいとして、 http://localhost:8080/q/metrics でメトリクスを見ることもできます。ここでは、 greeting_counter のカウンターを確認できます:
# HELP greeting_counter_total
# TYPE greeting_counter_total counter
greeting_counter_total{name="quarkus",} 1.0次に、QuarkusアプリケーションをOpenShiftにデプロイする必要があります。このステップを簡単にするために、Quarkusは quarkus-openshift という非常に便利なエクステンションを提供していますので、これを pom.xml ファイルに追加しましょう。
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-openshift</artifactId>
</dependency>それでは、OpenShiftで新たに作成したプロジェクト my-project にアプリケーションをデプロイしてみましょう。
oc new-project my-project
mvn clean package -Dquarkus.kubernetes.deploy=true -Dquarkus.openshift.expose=true -Dquarkus.openshift.labels.app-with-metrics=quarkus-appラベル app-with-metrics は、後のステップで OpenShift が監視するアプリケーションを選択するために使用されます。
3. プロジェクトにサービスモニターを作成
先に進む前に、まずPrometheusの仕組みを説明しましょう。Prometheus は、アプリケーションからメトリクスを取得するためにプル・モデルを使用します。つまり、Prometheus はメトリクスを取得するためにエンドポイントをスクレイピングしたり、ウォッチしたりします。
前のステップから、サービスは OpenShift で実行されていますが、Prometheus でサービスをスクレイプするための設定はまだ何もしていません。これは Service Monitor リソースで行います。
service-monitor.yaml:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    k8s-app: prometheus-app-monitor
  name: prometheus-app-monitor
  namespace: my-project
spec:
  endpoints:
  - interval: 30s
    targetPort: 8080
    path: /q/metrics
    scheme: http
  selector:
    matchLabels:
      app-with-metrics: 'quarkus-app'The path /q/metrics is the default metrics endpoint in Quarkus.
We could configure the /metrics endpoint Prometheus expects in application.properties instead of adding the path attribute above using the following property: quarkus.micrometer.export.prometheus.path=/metrics.
そして、それを以下のように適用します:
oc apply -f service-monitor.yaml今行ったのは、前のステップで追加した app-with-metrics: quarkus-app というラベルのついたアプリを選択する prometheus-app-monitor という名前の Service Monitor を作成することです。すると、OpenShiftは30秒ごとに、 app-with-metrics: quarkus-app というラベルのついたサービスすべてについて、エンドポイント /q/metrics を呼び出します。
いよいよ、使ってみましょう。
まず、グリーティングサービスを呼び出す必要があります: http://quarkus-micrometer-my-project.ocp.host/hello/quarkus 。これで greeting_counter_total カウンターが増加します。しかし、このメトリクスはどこで見ることができるでしょうか?OpenShift Console の Developer > Monitoring view, select Metrics を開き、 Metrics を選択し、次に Custom Query を選択し、 greeting_counter_total{name = "quarkus"} と入力してみましょう。これで次のように表示されます:
 
素晴らしい!OpenShiftにQuarkus Applicationのメトリクスを公開出来ています!