Quarkus Jakartaを使用してカスタムPrometheusエクスポーターを構築し、高いカーディナリティを避け、効率的なメトリクスを確保することに焦点を当てています。メトリクスの魔法を体験しましょう!

なぜカスタムエクスポーター?車輪の再発明ではないのか?

始める前に、なぜ既製のソリューションがたくさんあるのにカスタムエクスポーターを作るのか、その理由を説明しましょう。

  • カスタマイズされたメトリクス:アプリはユニークで、時には標準で提供されないメトリクスが必要です。
  • パフォーマンスの最適化:カスタムエクスポーターを使用すると、測定する内容を微調整でき、オーバーヘッドを減らすことができます。
  • メトリクスの爆発を回避:大きな力には大きな責任が伴い、高いカーディナリティの落とし穴を避ける能力もあります。

Quarkus Jakartaプロジェクトのセットアップ

まず最初に、Quarkusプロジェクトを立ち上げましょう。Quarkusが初めての方は、Jakarta EEのスーパーヒーローバージョンと考えてください。弾丸よりも速く、機関車よりも強力です。

次のMavenコマンドを使用して新しいQuarkusプロジェクトを作成します:

mvn io.quarkus:quarkus-maven-plugin:2.16.5.Final:create \
    -DprojectGroupId=com.example \
    -DprojectArtifactId=custom-prometheus-exporter \
    -DclassName="com.example.ExporterResource" \
    -Dpath="/exporter"

次に、必要な依存関係をpom.xmlに追加します:

<dependencies>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-resteasy-reactive</artifactId>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-micrometer-registry-prometheus</artifactId>
    </dependency>
</dependencies>

エクスポーターの構築

プロジェクトのセットアップが完了したので、カスタムエクスポーターを作成しましょう。ここでは、複雑なeコマースシステムを監視する仮想シナリオに焦点を当てます。

package com.example;

import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Tags;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

import java.util.Random;

@Path("/exporter")
public class ExporterResource {

    @Inject
    MeterRegistry registry;

    private final Random random = new Random();

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        // メトリクスをシミュレート
        recordOrderMetrics();
        recordUserMetrics();
        return "メトリクスが更新されました!";
    }

    private void recordOrderMetrics() {
        // 各製品ごとのメトリクス(高いカーディナリティ)を記録する代わりに、
        // カテゴリごとの集計メトリクスを記録します
        String[] categories = {"Electronics", "Clothing", "Books", "Home"};
        for (String category : categories) {
            double orderValue = 100 + random.nextDouble() * 900; // 100から1000の間のランダムな注文値
            registry.gauge("ecommerce.order.value", Tags.of("category", category), orderValue);
        }
    }

    private void recordUserMetrics() {
        // 各ユーザーごとのメトリクスを記録する代わりに、バケットを使用します
        int activeUsers = 1000 + random.nextInt(9000); // 1000から10000の間のランダムな数
        String userBucket = activeUsers < 5000 ? "low" : "high";
        registry.gauge("ecommerce.active.users", Tags.of("load", userBucket), activeUsers);
    }
}

高いカーディナリティの罠を避ける

高いカーディナリティは、Prometheusのセットアップにおける悪夢です。都市全体をホームパーティーに招待するようなもので、手に負えなくなる可能性があります。これを避ける方法は次のとおりです:

  • カテゴリ化:各製品ごとのメトリクスを追跡する代わりに(数千になる可能性があります)、カテゴリにグループ化します。
  • バケット化:ユーザーメトリクスには、各ユーザーを個別に追跡する代わりに、シンプルな「low」または「high」バケットを使用します。

目標は、データに溺れることなく、役立つ詳細を持つことです。

効率的なメトリクスの確保

効率は高いカーディナリティを避けることだけではありません。メトリクスをスリムで強力に保つための他のヒントをいくつか紹介します:

  1. ラベルを慎重に使用する:ラベルは強力ですが、過剰に使用するとメトリクスの爆発を引き起こす可能性があります。
  2. 可能な限り集計する:時には、合計や平均が個々のデータポイントよりも有用です。
  3. 適切なメトリクスタイプを選択する:ゲージ、カウンター、ヒストグラムにはそれぞれの役割があります。賢く使いましょう。
  4. 保持ポリシーを設定する:すべてのメトリクスを永遠に保持する必要はありません。Prometheusで適切な保持期間を設定します。

エクスポーターのテスト

自分を褒める前に、実際に動作するか確認しましょう。Quarkusアプリケーションを実行します:

./mvnw quarkus:dev

次に、エンドポイントにアクセスしてメトリクスを生成します:

curl http://localhost:8080/exporter

最後に、メトリクスを確認します:

curl http://localhost:8080/q/metrics

次のようなものが表示されるはずです:

# HELP ecommerce_order_value 
# TYPE ecommerce_order_value gauge
ecommerce_order_value{category="Electronics"} 543.21
ecommerce_order_value{category="Clothing"} 321.54
ecommerce_order_value{category="Books"} 123.45
ecommerce_order_value{category="Home"} 987.65

# HELP ecommerce_active_users 
# TYPE ecommerce_active_users gauge
ecommerce_active_users{load="high"} 7523.0

メトリクスの分析

エクスポーターが稼働したので、これらのメトリクスで何ができるかを見てみましょう。役立つかもしれないPrometheusクエリをいくつか紹介します:

# すべてのカテゴリの平均注文値
avg(ecommerce_order_value)

# アクティブユーザーの総数
sum(ecommerce_active_users)

# カテゴリごとの最高注文値
max(ecommerce_order_value) by (category)

これらのクエリは、慎重に作成されたメトリクスから得られる洞察の一部を示しています。

まとめ:学んだこと

カスタムPrometheusエクスポーターを構築することは、単にメトリクスをまとめて終わりにすることではありません。それは、何を測定し、どのように測定するかを慎重に考慮する必要があるアートです。ここでの重要なポイントは次のとおりです:

  • 常に高いカーディナリティに注意を払うこと。これはPrometheusセットアップの静かな殺し屋です。
  • メトリクスを意味のあるものに保つために、可能な限り集計し、カテゴリ化すること。
  • ラベルを慎重に選択すること。それらは強力ですが、大きな力には大きな責任が伴います。
  • テスト、反復、改善を行うこと。最初の試みが完璧でないことは普通です。

目標は、行動可能な洞察を提供するメトリクスを持つことであり、単なる数字の海ではありません。モニタリングを楽しんでください!

考えるための食糧

"コンピューティングの目標は洞察であり、数字ではない。" - リチャード・ハミング

カスタムエクスポーターを改良し続ける際には、この引用を心に留めておいてください。生成できるメトリクスの数ではなく、それらから得られる洞察が重要です。

追加リソース

さらに深く掘り下げたいですか?次のリソースをチェックしてください:

さあ、プロのようにメトリクスをエクスポートしましょう!モニタリングの世界では、少ない方が多いことがよくあります。ただし、稼働時間については、より多い方が確実に良いです。