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.018198043
Kafkaエクステンションを使用している場合も同様です。これらの設定については、 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: true
Openshiftは自動的に 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のメトリクスを公開出来ています!