SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

「OpenTelemetry」で始めるオブザーバビリティ入門

OpenTelemetry入門【実践編】~OpenTelemetry Collectorでテレメトリーデータを扱う~


  • X ポスト
  • このエントリーをはてなブックマークに追加

実際にテレメトリーデータを送信してみる

 例として、とあるAWS EC2上のアプリサーバーにOTel Collectorをインストールし各種テレメトリーデータを送信したいとします。

 Receiver:以下を取得します。

  • トレース:OTel SDKからOTLPで送信されるトレースの受信
  • メトリクス:OSのCPU、メモリなどの収集
  • ログ:アプリログの収集

そのうえで、

  • Extension:zPageによりOTel Collectorの処理統計も入手できるようにします
  • Processor:メモリリミッターとバッチ化およびEC2情報の付与
  • Exporter:
    • トレース:Zipkinと別のバックエンド(現在Zipkinを使用しており、別のオブザーバビリティツールを検証したいようなシナリオです)
    • メトリクス:バックエンド
    • ログ:Splunk

というシナリオで、OTel Collectorの設定をしてみます。

receivers:
  otlp:
    protocols:
      grpc:
      http:
  hostmetrics:
    collection_interval: 10s
    scrapers:
      cpu:
      disk:
      filesystem:
      memory:
      network:
      load:
      paging:
      processes:
      process:
  filelog/app_log:
    include: [ /var/log/myservice/*.json ]
    operators:
      - type: json_parser
        timestamp:
          parse_from: attributes.time
          layout: '%Y-%m-%d %H:%M:%S'

processors:
  batch:
  memory_limiter:
    check_interval: 1s
    limit_mib: 4000
    spike_limit_mib: 800
  resourcedetection:
    detectors: ["ec2"]

exporters:
  zipkin:
    endpoint: "https://some.url:9411/api/v2/spans"
  otlphttp:
    endpoint: https://example.com:4318
  splunk_hec:
    token: "00000000-0000-0000-0000-0000000000000"
    endpoint: "https://splunk:8088/services/collector"

extensions:
  zpages:

service:
  extensions: 
  - zpages
  pipelines:
    traces:
      receivers: 
      - otlp
      processors: 
      - memory_limiter
      - batch
      - resourcedetection
      exporters:
      - zipkin
      - otlphttp
    metrics:
      receivers: 
      - hostmetrics
      processors: 
      - memory_limiter
      - batch
      - resourcedetection
      exporters: 
      - otlphttp
    logs:
      receivers: 
      - filelog/app_log
      processors:
      - memory_limiter
      - batch
      - resourcedetection
      exporters: 
      - splunk_hec

 このように構成としてはシンプルです。

 `receivers`、`processors`、`exporters`で各種コンポーネントの個別の定義を行っておきます。

 多くはデフォルト値を持っており、Batch Processorのように、名前を定義するだけで済むものもあります。どのようなオプションが使用できるかは各コンポーネントのページを参照してください。

 また、「filelog/app_log」のように/の後に任意の名前を付けることができます。

 そして`service.pipelines`で`traces`、`metrics`、`logs`のパイプラインを定義し、その中で定義済みのコンポーネントを呼び出しています。

 パイプラインで`receivers`、`processors`、`exporters`は配列で定義している通り任意の数を取ることができます。`processors`は任意、`receivers`と`exporters`は必須です。

 Extentionは`service.extensions`で呼び出します。

パイプラインの可視化

 定義情報が増えてくるとパイプラインの状況であったり、設定不備が追いづらくなります。

 その時にOTelBinというサイトが便利です。

 例えば上記の設定を可視化してみるとこうなります。

 最終的なパイプラインの状況が図示されました。

最終的なパイプラインの状況
最終的なパイプラインの状況

 もし設定に問題があればそれも警告してくれます。

警告
警告

各コンポーネントのステータスについて

 `service.pipelines`の`traces`、`metrics`、`logs`で呼び出せるreceiverは何かと疑問に思うかもしれません。

 ここでgithub上で見ることができる各コンポーネントのステータス情報についてお話ししたいと思います。

 Filelog Receiverを例にとりましょう。

https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/filelogreceiver
https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/filelogreceiver

 特に重要な情報は`Stability`と`Distributions`です。

 `Stability`:`beta: logs`という文言があり、これはlogsパイプラインで使用でき、Stabilityとしてはbetaであることを示しています。

 Stabilityにはいくつかのレベルが定義されています

 Alphaは下位互換性の保証がないため本番環境での使用は推奨されません。

 Betaになると互換性を守る必要があるためある程度は本番環境で使用でき、StableになるといわゆるGeneral Availability(一般公開)となります。

`Distributions`:これについては、これからお話ししましょう。

OpenTelemetry Collectorの二種類のレポジトリ

 OTel CollectorにはCoreとDistribという二種類のレポジトリがあります。

Core

 Coreはその名の通り、OTel Collectorのコアとなる機能が提供されています

 Receiverで言えばOTLP、Processorはメモリリミッターやバッチ、ExporterはOTLPやDebugです。

 機能は安定している一方、機能数は限定されています。

Contrib

 ContribはCoreを全て含み、その他の追加機能を含みます。実質的にはこちらを利用します。

カスタム

 Contribは試してみるには良いですが、不要コンポーネントが多くフルパッケージではリソースの無駄遣いになります。またセキュリティ面でもアタックサーフェスを増やすことにもなります。

 そこでOpenTelemetry Collector builder (OCB) というカスタムのパッケージを作成する機能が提供されており、本番環境にデプロイする際はこれを使用し必要なコンポーネントのみに絞ることが推奨されています

 または既存のコンポーネントに必要とするものがない場合、自身でGo言語で開発することもできます

各ベンダーのDistribution

 各バックエンドのベンダーがカスタマイズしたOTel Collectorを提供している場合があります。

 例えばAWSはAWS Distro for OpenTelemetry、SplunkはSplunk Distribution of the OpenTelemetry Collectorを提供しています。

 これらはCore、Contribをベースとし、以下の特徴があります。

  • コンポーネントが精査されている
  • 追加機能が付与されている場合がある
  • 設定が標準設定されている

 特に設定について、各ベンダーによる「ベストプラクティス」が最初から定義されていることが多いです。

 上記でコンポーネントを見てきましたが、特にProcessorについて何を設定すれば良いか、一から調査し考えることは難しいかと思います。その場合にベストプラクティスを使用できるのは大きなポイントかと思います。

 ベンダーからDistributionが提供されている場合、特に理由がない限りはそれを使用するのが良いでしょう。

OpenTelemetry Collectorのインストール方法

 最後に具体的なインストール方法を見たいと思います。

対応OS・アーキテクチャ

 Docker、Linux、Windows、Mac、Kubernetesがサポートされています。

 対応OSやCPUアーキテクチャと、各インストール方法の詳細を見てみましょう。

 注意点としてContribを使用する場合は「contrib」を含むファイルを取得してください。

 リリースページは以下です。

 Contribパッケージのインストールおよび設定例を以下に示します。

Docker例(/var/log/syslog)
docker pull otel/opentelemetry-collector-contrib:<バージョン>
docker run -v $(pwd)/config.yaml:/etc/otelcol-contrib/config.yaml otel/opentelemetry-collector-contrib:<バージョン>
Linux例(Debインストールの場合)(/var/log/syslog)
sudo yum update
sudo yum -y install wget systemctl
wget https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/<バージョン>/otelcol-contrib_<バージョン>_linux_.rpm
sudo rpm -ivh otelcol-contrib_<バージョン>_linux_.rpm

 設定ファイルは

 `/etc/otelcol/otelcol-contrib.conf`

 設定変更後、再読み込みしステータスを確認。

sudo systemctl restart otelcol-contrib
sudo systemctl status otelcol-contrib

 ホスト数が多い場合はAnsibleやPuppetなどによるデプロイ自動化を是非検討しましょう。

Kubernetesへのデプロイ

 KubernetesへはHelm Chartでデプロイすることができます。

 各Node、Pod、Containerのテレメトリーデータを取得するためのDaemonsetとClusterのデータを取得するためのDeploymentの二種類が含まれます。

 KubernetesのAttribute(NodeやPod名など)を取得するためのProcessorなどが存在しています。

 上記ページに記載の通りPresetをenabledにすることをおすすめします。

 または最近はOperatorが開発されています。

 こちらを使用することの最大のメリットとしては、Container上のアプリへの自動計装が非常に簡単に可能になるという点です(計装については次回解説します)。

 例えば、自動計装対象のPodのAnnotationに「instrumentation.opentelemetry.io/inject-java: "true"」のように指定するだけで自動計装が完了します。

 一方、Operatorを使用せずに自動計装を行う場合はDockerfileでの定義が必要になります。

まとめ

 今回はOpenTelemetryフレームワークの内、OpenTelemetry Collectorについて解説しました。

 これでシステム全体でテレメトリーデータの取り扱いを統一しつつも任意のバックエンドに送信することができるようになりました。

 本記事では一通り基礎的な知識をお伝えしましたが、紹介しきれない機能も多くありますので、是非公式ページも参照してください。

 次回はついにアプリからトレースを取得するための計装方法について解説します。

 お楽しみに!

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
「OpenTelemetry」で始めるオブザーバビリティ入門連載記事一覧

もっと読む

この記事の著者

山村 悟史(Splunk Services Japan合同会社)(ヤマムラ サトシ)

 Splunk Services Japan合同会社でオブザーバビリティソリューションを担当するエンジニア。 アプリ、サーバー、ネットワーク、セキュリティ運用の経験をバックグランドにオブザーバビリティの布教やツール導入のコンサルティング活動を行う。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/20081 2024/09/30 12:50

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング