メインコンテンツまでスキップ
バージョン: v2602

可視化方法とテレメトリデータをカスタムする

AIBooster PO(以下、PO)はOpenTelemetryやGrafanaなどのOSSをベースに構築されており、テレメトリデータの収集からダッシュボードの表示まで柔軟にカスタマイズできます。 このページではカスタマイズする方法について説明します。

Grafana ダッシュボードの作成

Grafana上で独自のダッシュボードを構築することも可能です。 独自のダッシュボードを追加するにはダッシュボード一覧の右上の「New」から「New dashboard」を選択します。

add new dashboard

PO標準ダッシュボード

POが提供するダッシュボード(PO標準ダッシュボード)の内容は将来的に変更される可能性があります。 PO標準ダッシュボードを直接編集してしまうと将来的にアップデートされた内容が反映されないことがあります。 PO標準ダッシュボードに独自のパネルを追加したい場合は、PO標準ダッシュボードを直接編集せずにダッシュボードを一旦コピーして編集するようにしてください。

POパネルライブラリ

PO標準ダッシュボードには代表的なメトリクスのみが表示されていますが、その他の詳細なメトリクスを確認したい場合は次の手順でパネルライブラリを使用し簡単に追加できます。

  1. ダッシュボード画面で「Edit」モードに切り替え
  2. 「Add」をクリック
  3. 「Import from library」をクリック
  4. ライブラリパネル一覧から使用したいパネルをクリック
  5. パネルを追加後、必要に応じて右上の「Save dashboard」をクリック

grafana-panel-1 grafana-panel-2 grafana-panel-3 grafana-panel-4

利用可能なパネル

POには以下のようなパネルが用意されています:

  • GPU関連メトリクス(DCGM): GPU使用率、温度、電力消費、メモリ使用量、プロファイリング情報など
  • システムメトリクス(Node Exporter): CPU負荷、メモリ、ファイルシステム、ネットワークなど
  • プロセス・アプリケーションメトリクス: プロセス情報、スクレイピング統計など

完全なメトリクス一覧と詳細説明については、メトリクス詳細を参照してください。

独自のテレメトリデータを追加する

POが取得していないテレメトリデータを独自に収集し、ダッシュボードに表示することもできます。 この場合、テレメトリデータの追加とパネルの実装の2つのステップが必要です。

Step 1: テレメトリデータの追加

POではテレメトリデータの収集にOpenTelemetryを採用しています。 OpenTelemetryで対応しているシグナルのトレース、メトリクス、ログを追加することができます。

独自のテレメトリデータを追加する方法として、主に二つの方法があります。

以下に、それぞれの方法について説明します。

テレメトリデータを追加する際の注意点

POが標準で収集するテレメトリデータとの競合を避けるために独自のテレメトリデータを作成する場合は以下の点に注意してください。

  • サービス名が既存のテレメトリデータと重複しないようにしてください
    • サービス名に custom または組織固有のプレフィックスを付けることを推奨します
    • 特に次のプレフィックスは予約されているので使用しないでください
      • aibooster, faib, JobTracer

アプリケーションから追加する

POではAgentがインストールされたノードの26697ポートでOTLPレシーバー(gRPC)が起動しています。 OpenTelemetryプロトコル(OTLP)に準拠しているツールであれば、localhost:26697にテレメトリデータを送信できます。 これにより、独自のアプリケーションから得られるテレメトリデータをPOが収集するデータと共に記録することが可能です。

以下に例として、Pythonコードから独自のメトリクスを追加する方法を示します。

  1. Python用OpenTelemetry SDKをインストールします。

    pip install \
    opentelemetry-api \
    opentelemetry-sdk \
    opentelemetry-exporter-otlp-proto-grpc
  2. 以下のようにメトリクス送信スクリプトを作成して実行します。

    import time
    import random

    from opentelemetry import metrics
    from opentelemetry.sdk.resources import SERVICE_NAME, Resource
    from opentelemetry.sdk.metrics import MeterProvider
    from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
    from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import OTLPMetricExporter

    MY_SERVICE_NAME = "custom-my-application"

    def configure_opentelemetry():
    resource = Resource(attributes={
    # サービス名を設定 (テレメトリデータを追加する際の注意点を参照)
    SERVICE_NAME: MY_SERVICE_NAME
    })
    exporter = OTLPMetricExporter(
    endpoint="http://localhost:26697", # POのコレクターに送信
    insecure=True # 同一ホストへの通信のためhttpで送る
    )
    # 一定時間ごとにメトリクスを読み取り送信する
    reader = PeriodicExportingMetricReader(
    exporter,
    export_interval_millis=30000 # 送信間隔を設定
    )
    provider = MeterProvider(resource=resource, metric_readers=[reader])
    metrics.set_meter_provider(provider)
    print("configure_opentelemetry done", flush=True)


    def main():
    configure_opentelemetry()
    # 必要なメトリクスを生成
    meter = metrics.get_meter(MY_SERVICE_NAME)
    my_metric = meter.create_gauge(
    name="sdk_random",
    description="Random value by Python OpenTelemetry SDK",
    unit="1"
    )
    count = 0
    while True:
    # メトリクスに値とアトリビュートを設定
    # 実際に値が送信されるのは送信間隔なので注意
    # (10秒ごとではなく30秒ごとになる)
    my_metric.set(random.random(), {"device_id": "0"})
    time.sleep(10)
    print(f"sending... {count}", flush=True)
    count += 1


    if __name__ == "__main__":
    main()

    十分にメトリクスが溜まるまで3分ほど待ってから終了してください。(もしくは待っている間にStep 2: 独自のパネルを実装するを進めても良いでしょう)

ヒント

Agentが動作しているホスト名はPOがデフォルトで収集するため、個別での収集は不要です。 そのため、コンテナアプリケーションとして動かす場合も特別な対応は不要です(ただし、コンテナ内からOTLPレシーバーを参照できるようにポート設定は必要です)。

Prometheus準拠のexporterを追加する

Prometheusに準拠したexporterからのメトリクスを収集することも可能です。 既存のexporterを利用することも、独自に作成したexporterを利用することもできます。

以下に例として、ランダムな値を報告する独自のexporter(custom-my-exporter)を作成し、設定ファイルにcustom-my-exporterを追加する例を示します。

  1. prometheus_client をインストールします。

    pip install prometheus-client
  2. 以下のようなexporterスクリプトを作成して実行します。ポート8000でメトリクスを公開します。

    import random
    import time
    from prometheus_client import start_http_server, Gauge

    my_gauge = Gauge(
    "exporter_random",
    "A random value for testing",
    ["device_id"],
    )

    if __name__ == "__main__":
    start_http_server(8000)
    while True:
    my_gauge.labels(device_id="1").set(random.random())
    time.sleep(5)

    curl http://localhost:8000/metrics でメトリクスが取得可能か確認すると良いでしょう。

  3. OpenTelemetry Collectorの設定ファイル(/opt/aibooster/agent/static/agent-otel-collector.template.yaml)にexporterを追加します。

    receivers:
    # ...(省略)
    # prometheus/は固定、custom-my-exporter の部分は他と重複しないように設定する
    prometheus/custom-my-exporter:
    config:
    scrape_configs:
    # job_nameはサービス名として使用されます (テレメトリデータを追加する際の注意点を参照)
    - job_name: 'custom-my-exporter'
    static_configs:
    - targets: ['localhost:8000'] # exporterのポート設定に合わせる
    scrape_interval: 30s # 収集間隔を設定する
    # ...(省略)


    service:
    pipelines:
    traces:
    receivers: [otlp]
    processors: [batch, resourcedetection]
    exporters: [clickhouse]
    metrics:
    receivers:
    - prometheus/custom-my-exporter # この行を追加
    - otlp{{"\n"}}
    # - ...(省略)
    注記

    AIBooster PO Agentをインストールした全てのノードでテンプレートファイルを更新する必要があります。

    設定ができたら、AIBooster PO Agentサービスを再起動して設定を反映させます。

    sudo systemctl restart aibooster-agent-endpoint

    十分にメトリクスが溜まるまで3分ほど待ってください。(もしくは待っている間にStep 2: 独自のパネルを実装するを進めても良いでしょう)

Step 2: 独自のパネルを実装する

独自のテレメトリデータや集計方法を実装したパネルをブラウザ上で構築することができます。

「Edit」モード -> 「Add」-> 「Visualization」を選択するとパネルのエディタ画面が表示されます。

ここでは例として、Step 1: テレメトリデータの追加の例で作成した二種類のメトリクスの推移を折れ線の時系列グラフとして表示するパネルを作成します。

パネルのエディタ画面を開き、次の画像のように設定してください。 画像は、「アプリケーションから追加する方法」で作成したメトリクスを表示する例です。 「Prometheus準拠のexporterを追加する」で作成したメトリクスを表示する場合は、 WHERE句の条件を ServiceName = 'custom-my-exporter', MetricName = 'exporter_random' にそれぞれ修正してください。

add custom metric

データソースをClickHouseに設定してパネルの種類(右上)とQuery Typeの設定(中央付近)が画像通りになっているか確認してください。

SELECT
toStartOfInterval(TimeUnix, INTERVAL 60 SECOND) AS time_bucket,
ResourceAttributes['host.name'] AS node,
avg(Value) AS result
FROM otel_metrics_gauge
WHERE
TimeUnix BETWEEN $__fromTime AND $__toTime
AND ServiceName = 'custom-my-application'
AND MetricName = 'sdk_random'
GROUP BY time_bucket, node
ORDER BY time_bucket, node
ヒント

グラフが表示されない場合、以下の点を確認してください。

  • 画面上部にある表示範囲の時間設定が適切か確認してください。
  • 画面上部のTable Viewをオンにすると、クエリ結果をテーブルで確認できます。クエリ結果が空でないことを確認してください。

二つのカスタムパネルを追加したダッシュボードは以下のようになります。 パネルの表示方法を調整したい場合はパネル編集画面右のパラメータを調整することもできます。 ダッシュボード/パネルの編集後は右上のSave dashboardで保存することを忘れないでください。

result custom dashboard

POが収集したテレメトリデータは全てOpenTelemetryを経由してClickHouseに格納されています。 ClickHouseにおけるOpenTelemetryシグナル(テレメトリデータ)の扱いに関して、詳細は clickhouseexporter 等を参照してください。

注記

独自にSQLを書く場合は以下の点にご注意ください。

  • 独自に追加したテレメトリデータを参照する際はWHERE句に ServiceName を含めるようにしてください
  • POのアップデートによって、収集するテレメトリデータの廃止や変更が生じる可能性があります
    • 独自に作成したパネルがPO標準のテレメトリデータを参照している場合、アップデート後に正常に動作するかご確認ください
    • 変更点はリリースノートをご確認ください。ご不明な点はカスタマーサポートへご相談ください。