APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【さくらのクラウド】モニタリングスイートのオブザーバビリティ機能を試してみた

こんにちは。クラウド事業部の遠見です。

本記事は、さくらのクラウドの「モニタリングスイート」を検証したエンジニアが内容をできる限り客観的に共有することを目的に、生成AIを活用して作成したものです。

今回は、さくらのクラウドが提供するオブザーバビリティ基盤である「モニタリングスイート」の動作検証を行いました。
その内容をまとめます。

最終的には、以下のような分散トレースの可視化が実現できます。


目次


はじめに

モニタリングスイートとは

モニタリングスイートは、さくらのクラウドが提供するオブザーバビリティのマネージドプラットフォームです。

cloud.sakura.ad.jp

ログ・メトリクス・トレースのストレージとアラート、ダッシュボードを提供しています。

機能 内容
ログストレージ OTLP/HTTP対応。fluentbit、OTel Collectorなどから送信可能
メトリクスストレージ Prometheus Remote Write 1.0対応。PromQLでクエリ可能
トレースストレージ OTLP/HTTP対応。分散トレースの可視化が可能
ダッシュボード Perses(OSSのグラフ可視化ツール)ベース
アラート メトリクスの条件に基づき、シンプル通知・EventBusと連携可能

さくらのクラウド上のサービスだけでなく、オンプレや他社クラウド・ローカルPCからのデータも集約できる点が特徴です。

参考

manual.sakura.ad.jp

knowledge.sakura.ad.jp


OpenTelemetry Demoとは

モニタリングスイートを試す際、テレメトリデータ(ログ、メトリクス、トレースなどの総称)の「送信元」となるアプリが必要です。

さくらのクラウド公式マニュアルではサンプルアプリを見つけられなかったため、OpenTelemetry(OTel)コミュニティが公開している「opentelemetry-demo」を活用することにしました。

github.com

このデモアプリの特徴は以下のとおりです。

項目 内容
構成 分散マイクロサービスのECサイト
計装済み OTelの計装(ログ・メトリクス・トレース送信)がすでに組み込まれている
起動方法 docker compose upだけで全サービスが起動
ライセンス Apache-2.0(商用利用も可能)

デモアプリに内蔵されたOTel Collectorのエクスポート先を、sacloud-otel-collectorに向けるだけで、テレメトリデータをモニタリングスイートに流し込めます。

具体的には、デモアプリ側のexporterで中継用コレクター(sacloud-otel-collector)の4317ポート(OTLP/gRPC)を指定してあげるだけで、アプリケーションに手を加えることなく、テレメトリデータがバイパスされます。

sacloud-otel-collectorとは

sacloud-otel-collectorは、さくらインターネット公式が提供しているOTel Collectorのカスタムビルド(派生版)です。

github.com

各種テレメトリデータを、モニタリングスイートへ効率的かつ安全に送信するための機能が組み込まれています。

特徴として、公式が推奨する「sacloud exporter」が標準で用意されています。

sacloud exporterの特徴

  • モニタリングスイート向けに送信処理が最適化されている
  • インターネット経由の送信に適したデータ圧縮機能
  • ネットワーク一時切断時のリトライ・キュー管理(バッファリング)機能を内蔵

このコレクターを中継させることで、ローカル環境からでも安定してモニタリングスイートへデータを送り届けることが可能になります。


検証日時

2026年6月7日


検証のゴール

項目 確認内容
ログ デモアプリのログがモニタリングスイートに届くか
メトリクス メトリクスが可視化できるか
トレース リクエストの一連の処理フロー(サービスをまたぐ遷移)が追跡できるか

ポイントは、「sacloud-otel-collectorがインターネット経由でモニタリングスイートにHTTPS送信する」点です。


検証環境

構成

項目 内容
バックエンド さくらのクラウド モニタリングスイート
コレクター sacloud-otel-collector(さくら公式のカスタムOTel Collector)
送信元 OTelデモアプリ
実行環境 ローカルPC(Windows)のDocker Desktop

構成図

ローカル環境

項目 内容
OS(ローカルPC) Windows 11 Home 25H2
Docker Desktop for Windows 4.76.0
git 2.54.0.windows.1
opentelemetry-demo (GitHub) 2.2.0

事前準備

さくらのクラウド

アカウントの作成

さくらのクラウドのアカウントをまだ持っていない方は、新規登録する必要があります。

cloud.sakura.ad.jp

ローカルPC

Docker Desktopのインストール確認

Docker Desktop for Windowsをインストールします。

具体的なインストール方法は本題ではないので省略します。

ローカルPCでDockerおよびDocker composeが利用できることを確認します。

docker --version
docker compose version

result

# docker --version
Docker version 29.5.2, build 79eb04c
 
# docker compose version
Docker Compose version v5.1.4


構築

さくらのクラウド

モニタリングスイートのログ・メトリクス・トレースのストレージ作成

以下を作成します。

ストレージ種別 作成時の設定
ログストレージ 名前: otel-demo-logs、保存期間: デフォルト(40日)
メトリクスストレージ 名前: otel-demo-metrics、保存期間: デフォルト
トレースストレージ 名前: otel-demo-traces、保存期間: デフォルト
  • 最初に作成するログ・メトリクスストレージは「システム領域」になります。
  • 2つ目以降が「ユーザー領域」です。
  • 今回は「ユーザー領域」を使用します。

例として、ログストレージの作成方法を記載します。

[モニタリングスイート] > [ログストレージ] > [追加] をクリックします。

最初に作成するストレージでは、システム領域しか選べません。
任意の名前を記載し、[作成]をクリックします。

ステータスが「成功」となったら、[閉じる]をクリックします。

2つ目に作成するログストレージでは、ユーザー領域が選択可能になります。
任意の名前を記載し、[作成]をクリックします。

同じ要領で、メトリクス、トレースのストレージも作成します。


各ストレージのアクセスキー作成・情報取得

各ストレージの詳細画面から 「アクセスキー」タブを選択し、アクセスキーを追加します。

例として、ログストレージのアクセスキー作成方法を記載します。

[ログストレージ] > [ユーザー領域のストレージ] の右端にあるプルダウンから、[詳細]をクリックします。

[アクセスキー]タブを選択し、[追加]をクリックします。

[作成]をクリックします。

作成したアクセスキーの右端にあるプルダウンから、[詳細]をクリックします。

[アクセスキー 詳細]ダイアログが表示されます。 以下の情報を取得します。

  • エンドポイントURL
  • アクセストークン

同じ要領で、トレースとメトリクスのアクセスキーも作成します。

エンドポイントはxxxx.logs.monitoring.global.api.sacloud.jp 形式となっており、ストレージ種別ごとに異なります。
アクセストークンも同様にストレージ種別ごとに異なった形式となっています。

  • ログ:log-xxxx
  • メトリクス:met-xxxx
  • トレース:trc-xxxx

取得した6つの値(エンドポイント×3 + トークン×3)は、次のステップで設定ファイルに記載します。


ローカルPC

OTelデモアプリとsacloud-otel-collectorの起動

リポジトリのcloneと設定ファイルの作成

opentelemetry-demoをcloneします。

git clone https://github.com/open-telemetry/opentelemetry-demo.git

cloneしたディレクトリに移動します

cd opentelemetry-demo

次に、sacloud-otel-collector用の設定ファイルを作成します。

opentelemetry-demoディレクトリ内にsacloud-otelcolフォルダを作成し、config.ymlを配置します。

以下の内容で作成します。

<エンドポイントID>の部分を、先ほど取得した各エンドポイントURLの数字の部分に、トークンもそれぞれに対応する値に置き換えます。

sacloud-otelcol/config.yml

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318

processors:
  batch:

exporters:
  sacloud:
    metrics:
      endpoint: "<エンドポイントID>"
      token: "<met-*****>"
    logs:
      endpoint: "<エンドポイントID>"
      token: "<log-*****>"
    traces:
      endpoint: "<エンドポイントID>"
      token: "<trc-*****>"

service:
  pipelines:
    logs:
      receivers: [otlp]
      processors: [batch]
      exporters: [sacloud]
    metrics:
      receivers: [otlp]
      processors: [batch]
      exporters: [sacloud]
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [sacloud]

参考

  • <エンドポイントID>でうまく動作しない場合

もし、<エンドポイントID>でうまく動作しない場合は、下記のGitHubを参考に"https://<エンドポイントURL>を試してみてください。

github.com

# Replace endpoint identifiers and tokens with your monitoring suite's configurations.
exporters:
  sacloud:
    metrics:
      endpoint: "123456789012" # or "https://123456789012.metrics.monitoring.global.api.sacloud.jp/prometheus/api/v1/write"
      token: "${SACLOUD_METRICS_TOKEN}" # met-***************
    logs:
      endpoint: "123456789012" # or "https://123456789012.logs.monitoring.global.api.sacloud.jp"
      token: "${SACLOUD_LOGS_TOKEN}" # log-***************
    traces:
      endpoint: "123456789012" # or "https://123456789012.traces.monitoring.global.api.sacloud.jp"
      token: "${SACLOUD_TRACES_TOKEN}" # trc-***************
  • メトリクスのseries上限について

モニタリングスイートのメトリクスストレージは、1時間あたり5,000新規seriesの上限があります。
OTelデモはデフォルトで多数のreceiverを持つため、初めはseries数が上限を超えて429エラーになりました。
そのため、sacloud-otelcol/config.ymlのmetricsパイプラインのreceiverを[otlp]のみにすることで回避しています。

manual.sakura.ad.jp

| 書き込みレート制限 | 1時間あたり5,000の新規Series |

実際のエラー

```
error   prometheusremotewriteexporter@v0.142.0/exporter.go:487  failed to send WriteRequest to remote endpoint  {"resource": {"service.instance.id": "eb1475ba-698a-4933-b2b0-7165a57b76bb", "service.name": "sacloud-otel-collector", "service.version": "v0.6.1"}, "otelcol.component.id": "sacloud", "otelcol.component.kind": "exporter", "otelcol.signal": "metrics", "status_code": 429, "status": "429 Too Many Requests", "endpoint": "https://xxxx.metrics.monitoring.global.api.sacloud.jp/prometheus/api/v1/write", "retry_attempt": 1, "error": "request was rate limited by: \"new series limit reached\""}
```


sacloud-otelcolをcompose.yamlに追記

OTelデモのcompose管理ネットワークに参加させることで、サービス名(sacloud-otelcol)でコンテナ間通信が可能になります。

compose.yaml

sacloud-otelcol:
    image: ghcr.io/sacloud/sacloud-otel-collector:latest
    container_name: sacloud-otelcol
    restart: unless-stopped
    volumes:
      - ./sacloud-otelcol/config.yml:/config.yml
    command: ["--config", "/config.yml"]


otelcol-config-extras.ymlの設定

src/otel-collector/otelcol-config-extras.ymlは、OTelデモアプリが予め用意してくれている「外部バックエンド(今回は sacloud-otel-collector)と連携するための追加設定ファイル」です。

デモアプリのルート直下にあるcompose.ymlを確認すると、デモ内蔵のOTel Collectorを起動する際、以下のようにベース設定(本体)とこの追加設定の2つを続けて読み込む指定がされています。

    command:
      - --config=/etc/otelcol-config.yml
      - --config=/etc/otelcol-config-extras.yml

これにより、起動時に2つのファイルがマージされます。

注意として、YAMLの融合ルールでは、「オブジェクト(辞書型)は追記」されますが、「配列(リスト型 [ ... ])は丸ごと上書き」されてしまいます。

出力ルートを決めるexporters: [...]は配列のため、追加ファイル側にさくらの設定だけを書くと、ベース設定にあった標準の出力先(JaegerやPrometheusなど)が消えてしまいます。

今回は、ローカル側のバックエンド群(JaegerやOpenSearchなど)のコンテナ負荷を下げ、さくらへの送信に検証を絞り込みたかったため、それらへの送信はカットし、コンソール確認用のdebugだけをピックアップしてexporters: [debug, otlp/sacloud]と並べて記述しています。

これでローカル側はコンソールログ出力(debug)だけに絞り込みつつ、中継役のsacloud-otel-collector(ポート4317 / OTLP gRPC)へテレメトリデータを転送できます。

以下の内容で上書きします。

src/otel-collector/otelcol-config-extras.yml

exporters:
  otlp/sacloud:
    endpoint: http://sacloud-otelcol:4317
    tls:
      insecure: true

service:
  pipelines:
    traces:
      exporters: [debug, otlp/sacloud]
    metrics:
      receivers: [otlp]
      exporters: [debug, otlp/sacloud]
    logs:
      exporters: [debug, otlp/sacloud]


docker compose upで起動

docker compose up -d

起動後、全コンテナがUpになっていることを確認します。

docker compose ps

sacloud-otelcolを含む全コンテナがrunning状態であればOKです。

docker ps

> docker ps
CONTAINER ID   IMAGE                                                                                             COMMAND                  CREATED       STATUS                        PORTS                                                                                          NAMES
57457470f490   ghcr.io/open-telemetry/demo:latest-frontend-proxy                                                 "/bin/sh -c 'envsubs…"   3 hours ago   Up About a minute             0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp, 0.0.0.0:10000->10000/tcp, [::]:10000->10000/tcp   frontend-proxy
9e933d6ebba2   ghcr.io/open-telemetry/demo:latest-load-generator                                                 "locust --skip-log-s…"   3 hours ago   Up About a minute             0.0.0.0:53192->8089/tcp, [::]:53192->8089/tcp                                                  load-generator
e51d3a173a47   ghcr.io/open-telemetry/demo:latest-frontend                                                       "/nodejs/bin/node --…"   3 hours ago   Up About a minute (healthy)   0.0.0.0:53191->8080/tcp, [::]:53191->8080/tcp                                                  frontend
c93ee636821b   ghcr.io/open-telemetry/demo:latest-checkout                                                       "./checkout"             3 hours ago   Up About a minute             0.0.0.0:53188->5050/tcp, [::]:53188->5050/tcp                                                  checkout
b4811f54fa90   ghcr.io/open-telemetry/demo:latest-product-reviews                                                "/venv/bin/opentelem…"   3 hours ago   Up About a minute             0.0.0.0:53190->3551/tcp, [::]:53190->3551/tcp                                                  product-reviews
6390f47cfbdc   ghcr.io/open-telemetry/demo:latest-recommendation                                                 "/venv/bin/opentelem…"   3 hours ago   Up About a minute             0.0.0.0:53189->9001/tcp, [::]:53189->9001/tcp                                                  recommendation
00c6283635cb   ghcr.io/open-telemetry/demo:latest-ad                                                             "./build/install/ope…"   3 hours ago   Up About a minute             0.0.0.0:53183->9465/tcp, [::]:53183->9465/tcp, 0.0.0.0:53184->9555/tcp, [::]:53184->9555/tcp   ad
1dc48260d11f   ghcr.io/open-telemetry/demo:latest-product-catalog                                                "./product-catalog"      3 hours ago   Up About a minute             0.0.0.0:53187->3550/tcp, [::]:53187->3550/tcp                                                  product-catalog
128366a7bd1f   ghcr.io/open-telemetry/demo:latest-quote                                                          "docker-php-entrypoi…"   3 hours ago   Up About a minute             0.0.0.0:53186->8090/tcp, [::]:53186->8090/tcp                                                  quote
bbe5570ec0c3   ghcr.io/open-telemetry/demo:latest-image-provider                                                 "/docker-entrypoint.…"   3 hours ago   Up About a minute             0.0.0.0:53182->8081/tcp, [::]:53182->8081/tcp                                                  image-provider
d8e51497424a   ghcr.io/open-telemetry/demo:latest-payment                                                        "/nodejs/bin/node --…"   3 hours ago   Up About a minute             0.0.0.0:53179->50051/tcp, [::]:53179->50051/tcp                                                payment
ec36308a2cf8   ghcr.io/open-telemetry/demo:latest-cart                                                           "./cart"                 3 hours ago   Up About a minute             0.0.0.0:53177->7070/tcp, [::]:53177->7070/tcp                                                  cart
dac8ea60a25f   ghcr.io/open-telemetry/demo:latest-shipping                                                       "./shipping"             3 hours ago   Up About a minute             0.0.0.0:53178->50050/tcp, [::]:53178->50050/tcp                                                shipping
21e1487c2d6c   ghcr.io/open-telemetry/demo:latest-currency                                                       "sh -c './usr/local/…"   3 hours ago   Up About a minute             0.0.0.0:53185->7001/tcp, [::]:53185->7001/tcp                                                  currency
423d08d80e27   ghcr.io/open-telemetry/demo:latest-email                                                          "bundle exec ruby em…"   3 hours ago   Up About a minute             0.0.0.0:53180->6060/tcp, [::]:53180->6060/tcp                                                  email
6a84c62d9979   ghcr.io/open-telemetry/demo:latest-flagd-ui                                                       "sh -c 'ulimit -n 65…"   3 hours ago   Up About a minute             0.0.0.0:53181->4000/tcp, [::]:53181->4000/tcp                                                  flagd-ui
5bd49165b789   ghcr.io/open-telemetry/demo:latest-llm                                                            "/venv/bin/python ap…"   3 hours ago   Up About a minute             0.0.0.0:53176->8000/tcp, [::]:53176->8000/tcp                                                  llm
c635b4a16a80   ghcr.io/open-telemetry/demo:latest-telemetry-docs                                                 "/docker-entrypoint.…"   3 hours ago   Up About a minute             0.0.0.0:53171->8000/tcp, [::]:53171->8000/tcp                                                  telemetry-docs
f63326d940dc   ghcr.io/sacloud/sacloud-otel-collector:latest                                                     "/sacloud-otel-colle…"   3 hours ago   Up About a minute             4317-4318/tcp, 8888/tcp, 13133/tcp                                                             sacloud-otelcol
d01b9425ba98   postgres:17.8                                                                                     "docker-entrypoint.s…"   3 hours ago   Up About a minute             0.0.0.0:53175->5432/tcp, [::]:53175->5432/tcp                                                  astronomy-db
3d4228681676   ghcr.io/open-feature/flagd:v0.14.2                                                                "/flagd-build start …"   3 hours ago   Up About a minute             0.0.0.0:53169->8013/tcp, [::]:53169->8013/tcp, 0.0.0.0:53170->8016/tcp, [::]:53170->8016/tcp   flagd
7e1dbf11fdce   ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector-contrib:0.151.0   "/otelcol-contrib --…"   3 hours ago   Up About a minute             0.0.0.0:53173->4317/tcp, [::]:53173->4317/tcp, 0.0.0.0:53174->4318/tcp, [::]:53174->4318/tcp   otel-collector
8fe0e1b403b3   ghcr.io/valkey-io/valkey:9.0.2-alpine3.23                                                         "docker-entrypoint.s…"   3 hours ago   Up About a minute             0.0.0.0:53172->6379/tcp, [::]:53172->6379/tcp                                                  valkey-cart

Docker Desktopからも確認可能です。


デモアプリへのアクセス確認

ブラウザからhttp://localhost:8080にアクセスします。

ECサイトのデモアプリが表示されればOKです。
商品の閲覧・カート追加などの操作を通じてテレメトリデータが生成されます。


検証:モニタリングスイートの確認

モニタリングスイート一覧への正しい行き方が不明ですが、以下の流れで確認しました。

ログ

[ログストレージ] > [ユーザー領域のストレージ] の右端にあるプルダウンから、[詳細]をクリックします。
[情報]タブ> [内容を閲覧]をクリックします。

すると、モニタリングスイート一覧画面へ遷移できます。
以下を確認しました。

  • ERRORフィルタ

  • cart

  • payment

単なるテキストのログ転送にとどまらず、Node.js(payment)や.NET(cart)といったマルチ言語環境のメタデータ、OTel独自のtrace_id、さらにはエラー発生時のソースコードの行数(Python/Locust)まで、構造化データとしてパースされて届いています。

画面のように、左側のメニュー(ファセット)を使えば、特定のマイクロサービスやERRORログだけの絞り込みもスムーズに行うことができます。


メトリクス

[Metrics]を選択します。

PromQLでクエリを試します。

  • HTTPリクエスト数の合計
http_server_request_duration_seconds_count

デモアプリから収集されたhttp_server_request_duration_seconds_countをPromQLで検索し、負荷テストによってリクエスト数が右肩上がりに増えていく様子が、時系列グラフとして可視化されました。


トレース

[Traces]を選択します。

ユーザーの購入リクエスト(user_checkout_single)を起点とした詳細な分散トレースが描画されています。
フロントエンドから始まった処理が、checkout、cart、payment、そしてメール送信を行うemailへと、マイクロサービス間をまたいで次々と処理が伝播していく様子(呼び出し関係)が追跡できています。

全体の処理時間である7.91sのうち、どのコンポーネントがボトルネックになっているかを視覚的に特定できます。


アラート

[Alerts]を選択します。

アラートルールを以下のように追加してみました。

項目 設定値
メトリクスストレージ otel-demo-metrics
ルール名 http-request-rate-warning
Query rate(http_server_request_duration_seconds_count[1m])
Warning しきい値 >= 0.01、継続時間: 15秒

OTelデモアプリは、load-generatorが常にリクエストを送り続けているため、15秒後にWarningアラートが発火します。


ダッシュボード

ダッシュボードはメトリクスをグラフで可視化する機能です(Persesベース)。

ダッシュボードプロジェクトの作成

[ダッシュボード] > [追加]をクリックします。

任意の名前を入れて、[作成]をクリックします。

Persesにログイン

作成したダッシュボードの閲覧でPersesに遷移し、[Sign in with Sakura Cloud]でログインします。

ダッシュボード・パネルの作成

[ADD DASHBOARD] > [ダッシュボード名を入力] > [ADD]でパネルを追加します。

項目 設定値
Type Time Series Chart等
Prometheus Datasource otel-demo-metrics
PromQL Expression 例: rate(http_server_request_duration_seconds_count[1m])

さくらのコントロールパネルとシームレスに連携できました。


まとめ

モニタリングスイートは、ストレージを作成してアクセスキーを取得するだけというシンプルな設計が好印象でした。

OpenTelemetryなどの業界標準に準拠しているため、特定のベンダー仕様にロックインされることなく、手軽にオブザーバビリティの第一歩を踏み出せるサービスだと感じました。

今回は基本となるテレメトリの可視化を試しました。

次回はアラート運用の詳細な検証や、より実践的なワークロードでの活用など、引き続きユースケースを試していきたいと思います。


参考リンク

公式マニュアル・技術解説

モニタリングスイート | さくらのクラウド マニュアル

さくらのクラウドの「モニタリングスイート」で多様なシステムを統合監視しよう! | さくらのナレッジ

さくらのクラウド モニタリングスイート専用OpenTelemetry Collector exporterを作りました

Prometheusのクエリ機能とアラート機能 | さくらのナレッジ

OSS・リポジトリ

GitHub - sacloud/sacloud-otel-collector: OpenTelemetry collector for SAKURA Cloud. · GitHub

GitHub - open-telemetry/opentelemetry-demo: This repository contains the OpenTelemetry Astronomy Shop, a microservice-based distributed system intended to illustrate the implementation of OpenTelemetry in a near real-world environment. · GitHub


最後に

弊社はさくらインターネットとパートナー契約を締結しています。 www.ap-com.co.jp

また、一緒に働いていただける仲間も募集中です!
www.ap-com.co.jp

本記事の投稿者: s_tomi