OpenTelemetryとElasticでベンダーロックインのないオブザーバビリティを実現

illustration-scalability-gear-1680x980_(1).jpg

より高速で、スケーラブルなサービスに対する需要が高まっています。私たちの日常生活にはアプリが欠かせなくなっており、好きな料理を配達してもらうためのフードデリバリーアプリから、口座を管理するためのバンキングアプリ、病院の予約を取るためのアプリまで、さまざまな場面でアプリに頼っています。そのようなアプリは、機能面だけでなく、サービスを提供できるユーザー数の観点でも成長を必要としています。全世界にリーチするためのスケールと必要性から、このような需要の高いクラウドアプリケーションは複雑性が高まっています。

需要の増加に合わせて成長するために、そのようなオンラインアプリとサービス(モバイルアプリ、Webページ、SaaSなど)のほとんどは、分散型マイクロサービスベースのアーキテクチャーとKubernetesに移行が進んでいます。では、アプリをクラウドに移行した後は、サービスの運用、スケール、可用性をどのように管理および監視するのでしょうか。そこで、Kubernetesアプリケーションのインストルメンテーションとテレメトリーデータの収集を行う手段として急速にデファクトスタンダードとなったのが、OpenTelemetryです。

OpenTelemetry(OTel)は、各種ツール、API、SDKを提供するオープンソースプロジェクトです。OpenTelemetryを使うと、ソフトウェアのパフォーマンスと動作の理解に役立つテレメトリーデータ(メトリック、ログ、トレース)を生成、収集、エクスポートできます。OpenTelemetryは最近、CNCFのIncubatingプロジェクトになり、成長を続けるコミュニティとベンダーから非常に大きなサポートを受けています。

OTelは、標準的なテレメトリー形式でアプリケーションをインストルメントするための標準仕様を提供していますが、バックエンドコンポーネントや分析コンポーネントは提供していません。そのため、OTelライブラリをアプリケーション、インフラストラクチャー、ユーザーエクスペリエンスの監視で使用する場合は、最適なオブザーバビリティツールを柔軟に選択できます。したがって、アプリケーションパフォーマンス監視(APM)でベンダーロックインが発生することはもうありません。

Elasticオブザーバビリティは、トレース、メトリック、ログを取り込むために、OpenTelemetryとOpenTelemetryプロトコル(OTLP)をネイティブでサポートしています。ElasticオブザーバビリティのすべてのAPM機能で、OTelデータを使用できます。OTelデータを利用できる機能の例を以下に示します。

  • サービスマップ
  • サービスの詳細(レイテンシ、スループット、失敗したトランザクション)
  • サービス間の依存関係
  • トランザクション(トレース)
  • ML相関関係(特にレイテンシ)
  • サービスログ

ElasticのAPMと、テレメトリーデータの統合ビューに加え、Elasticの強力な機械学習機能を使って分析の手間を減らしたり、MTTRを短縮するのに役立つアラートを使用したりもできます。

OpenTelemetryのオープンソースの取り組みを受けて、Elasticも他のCNCFベースのプロジェクトをサポートしています(Prometheus、Fluentd、Fluent Bit、Istio、Kubernetes(K8S)など)。

このブログでは、以下の内容を取り上げます。

  • OTelでインストルメントした人気のデモアプリ(HipsterShop)を構成して、Elastic Cloudにテレメトリーを取り込む方法(構成は、わずかな手順で簡単です)
  • OTelデータに関連するいくつかのElastic APM機能の説明と、データをElasticに取り込んだ後にできることの紹介

今後のフォローアップブログで、Elasticの機械学習機能でOTelテレメトリーデータを処理する方法、OTelアプリケーションメトリックを特定の言語用にインストルメントする方法、OTel Collectorを通じてPrometheusインジェストをサポートする方法などについて詳しく説明する予定です。お楽しみに。

前提条件と構成

このブログの内容を実際に試してみたい方のために、構成のセットアップに使用したコンポーネントと詳細設定を以下に挙げます。

  • Elastic Cloudにアカウントがあり、デプロイしたスタックがあること(手順はこちら)。
  • 非常に人気なHipsterShopデモアプリケーションのバリアントを使用しました。このアプリケーションは元々、Kubernetesを紹介するためにGoogleが作成したもので、OpenTelemetry Demoアプリをはじめとする多数のバリアントが存在します。このアプリを使用するには、こちらにアクセスして、指示に従ってデプロイします。
  • さらに、手動でOTelでインストルメントしたバージョンのアプリケーションも使用しています。このブログの構成では、OTelの自動インストルメンテーションは使用していません。
  • クラスターの場所。Google Kubernetes Engine(GKE)を使用しましたが、任意のKubernetesプラットフォームを使用して試すことができます。 
  • ElasticはOTelでインストルメントしたサービスからテレメトリーを直接取り込むことができますが、このブログではOpenTelemetry Collectorを使用する従来のデプロイに焦点を当てます。
  • PrometheusとFluentD/Fluent Bitは(従来すべてのKubernetesデータのプルに使われていますが)ここでは使わず、代わりにKubernetes Agentを使います。詳しくは、フォローアップブログで説明します。

このブログでセットアップする構成は、以下のとおりです。

このブログで使用するOpenTelemetryデータを取り込むための構成

セットアップ手順

以下の方法を順を追って説明します。

  • Elastic Cloudのアカウントを取得する
  • GKEクラスターを用意する
  • アプリケーションを用意する
  • Kubernetes OTel Collectorのconfigmapを構成してElastic Cloudを指定する
  • ElasticオブザーバビリティAPMとOTelデータを一緒に使用して可視性を高める

手順0:Elastic Cloudのアカウントを作成する

指示に従ってElastic Cloudの使用を始めます

手順1:K8Sクラスターを用意する

説明ではGoogle Kubernetes Engine(GKE)を使用していますが、任意のKubernetesプラットフォームを使用してかまいません。

ElasticでKubernetesクラスターからOpenTelemetryデータを収集するための特別な要件はありません。通常のKubernetesクラスターをGKE、EKS、AKSで使用しても、Kubernetesと互換性のあるクラスター(セルフデプロイ・セルフマネージド)を使用しても問題ありません。

手順2:HipsterShopアプリケーションをクラスターに読み込む

任意のクラウドサービスまたはローカルKubernetesプラットフォーム上のKubernetesクラスターにアプリケーションをデプロイします。ここで使用しているアプリケーションは、こちらから入手できます。

アプリケーションがKubernetes上で稼働したら、defaultネームスペースで次のPod(または何らかのバリアント)を実行します。

kubectl get pods -n default

出力は以下のようなものになります。

NAME                                     READY   STATUS    RESTARTS   AGE
adservice-f9bf94d56-5kt89                1/1     Running   0          41h
cartservice-54d5955c59-7lrk9             1/1     Running   0          41h
checkoutservice-57b95c78bb-qqcqv         1/1     Running   0          41h
currencyservice-6869479db8-7tsnj         1/1     Running   0          43h
emailservice-7c95b8766b-mp5vn            1/1     Running   0          41h
frontend-5f54bcb7cf-kxwmf                1/1     Running   0          41h
loadgenerator-bfb5944b6-2qhnw            1/1     Running   0          43h
paymentservice-5bc8f549c8-hkxks          1/1     Running   0          40h
productcatalogservice-665f6879d6-kv29f   1/1     Running   0          43h
recommendationservice-89bf4bfc5-ztcrr    1/1     Running   0          41h
redis-cart-5b569cd47-6wt59               1/1     Running   0          43h
shippingservice-768b94fb8d-8hf9c         1/1     Running   0          41h

このバージョンでは、すべてのserviceloadgeneratorだけを起動しました。OpenTelemetry Collectorはまだ起動していません(次の手順参照)。
個々のサービスのyamlを見ると、ポート4317のOpenTelemetry Collectorが指定されていることがわかります。

        - name: OTEL_EXPORTER_OTLP_ENDPOINT
          value: "http://otelcollector:4317"

ポート4317は、サービスのテレメトリーを取得するためにOpenTelemetryがリッスンするデフォルトのポートです。 そのため、すべてのサービスでこのOTel Collectorを指定している必要があります。

手順3:Elasticにデータを送信するOpenTelemetry Collectorを用意する

otelcollector.yamlファイルの/deploy-with-collector-k8sにあるconfigmapセクションで2つの特定の変数を設定する必要があります。

    exporters:
      otlphttp/elastic:
        endpoint: OTEL_EXPORTER_OTLP_ENDPOINT
        headers:
          Authorization: OTEL_EXPORTER_OTLP_HEADERS

OTEL_EXPORTER_OTLP_ENDPOINTはElasticのAPM Serverです。

OTEL_EXPORTER_OTLP_ENDPOINTは、認可を行います。

これらの変数についての詳細は、OTel Collectorの構成に関するElasticのドキュメントを参照してください。

これらの値は、どこから入手するのでしょうか。 

ElasticオブザーバビリティのUIで、[APM]の下にある[+add data](+データを追加)をクリックすると、以下の画面が表示されます。 

OpenTelemetry]に移動します。

変数OTEL_EXPORTER_OTLP_ENDPOINT(ElasticのAPM Serverエンドポイント)とOTEL_EXPORTER_OTLP_HEADERSからの認可を確認できます。

OTel CollectorにElasticのAPM Serverエンドポイントを設定する際には、gRPChttpの2つのオプションがあります。

otelcollector.yamlこちら)では、exportershttpを使って構成しました。 

gRPCポートを使ってAPM Serverに送信する必要がある場合は、exportersを以下のように変更します。

    exporters:
      otlp/elastic:
        endpoint: OTEL_EXPORTER_OTLP_ENDPOINT
        headers:
          Authorization: OTEL_EXPORTER_OTLP_HEADERS

otlphttpからotlpへの変更に注目してください。前述の必要な変更を終えたら、otelcollectorを作成します。

kubectl create -f otelcollector.yaml

これが適切に稼働していることを確認します。

mycomputer% kubectl get pods | grep otelcollector
otelcollector-5b87f4f484-4wbwn          1/1     Running   0            18d

手順4:Kibanaを開き、APMのサービスマップを使用してOTelでインストルメントしたサービスを確認する

ElasticオブザーバビリティのUIの[APM]の下にある[Service Map](サービスマップ)を選択して、サービスを表示します。

以下のメッセージが表示されれば、OpenTelemetry CollectorからElasticにデータが送信されています。

Congratulations, you've instrumented the HipsterShop demo application services for tracing using OpenTelemetry and successfully ingested the telemetry data into the Elastic!(おめでとうございます。HipsterShopデモアプリケーションサービスをインストルメントし、OpenTelemetryを使ってトレースできるようになりました。テレメトリーデータはElasticに正常に取り込まれています)

特定の環境の構成方法

Elastic APMを使用すると、複数の環境を取り込み、Environmentに基づいてフィルタリングできます。dev team 1dev team 2があり、両方ともUIを使用している場合は、environment変数を適切に設定する必要があります。 

このアプリケーション用に環境変数を設定するには、サービスのyamlに含まれるdeployment.environment変数を設定します。

変更したい場合は、それぞれのサービスのyamlに含まれるOTEL_RESOURCE_ATTRIBUTESを変更します。yamlファイルは、このブログで取り上げているアプリケーションのgitにあります。

変更前:

       - name: OTEL_RESOURCE_ATTRIBUTES
          Value: "service.name=recommendationservice,service.version=1.0.0,deployment.environment=MY-DEMO"

変更後:

       - name: OTEL_RESOURCE_ATTRIBUTES
          Value: "service.name=recommendationservice,service.version=1.0.0,deployment.environment=XXX"

すべてのサービスにこの変更を行うには、以下のコマンドを実行します。

sed -i `s/MY-DEMO/XXX/g` *.yaml

手順5:Elasticで確認できるデータ

OpenTelemetryデータがElasticに取り込まれるようになりました。これで、何ができるのでしょうか。

1つ目は、APMサービスマップ(前の手順で説明)の確認です。APMサービスマップからは、すべてのサービスと、サービス間のトランザクションフローの全容がわかります。

2つ目は、個々のサービスと、収集されたトランザクションの調査です。

ご覧のように、フロントエンドの詳細が一覧表示されます。具体的に挙げましょう。 

  • 平均サービスレイテンシ
  • スループット
  • メイントランザクション
  • 失敗したトランザクションの割合
  • エラー
  • 依存性

次はトレースを見てみましょう。[Transactions](トランザクション)タブを開くと、フロントエンドサービスに関連するすべての種類のトランザクションを確認できます。

/cart/checkoutトランザクションを選択すると、全期間にわたるトレースすべてを表示できます。

このトランザクションの平均レイテンシ、スループット、失敗に加え、トレースも表示される

/chart/checkoutのトレースを確認できるだけでなく、通常よりもレイテンシが大きい原因を分析することもできます。

Elasticでは、機械学習を使用して、トレースから全サービスの潜在的なレイテンシの問題を特定する支援をしています。やり方は簡単で、[Latency Correlations](レイテンシの相関付け)タブを選択して相関付けを実行するだけです。

この画像は、クライアント10.8.0.16からのトランザクションに異常なレイテンシが発生している可能性があることを示しています。

トレースビューから直接ログをドリルダウンして、このトレースに関連するログを確認すると、潜在的な問題を識別して突き止めるのに役立ちます。

Elasticの機械学習(ML)でデータを分析する

OpenTelemetryメトリックをElasticに取り込んだらElasticのML機能を使ってデータ分析を始めましょう。

この機能については、こちらに詳しいレビューがあります。APMテレメトリーを相関付けしてトランザクションの問題の根本原因を特定する方法に関するブログ記事

Elasticのブログには、他にも多くの動画や記事があります。

OpenTelemetryデータをElasticの機械学習機能で処理する方法について、今後フォローアップ記事を公開する予定です。

まとめ

ElasticオブザーバビリティでOpenTelemetryデータをElasticに取り込んで、APM機能で分析する方法について、理解を深めていただけましたら幸いです。

以下に、この記事で学習した内容を簡単にまとめます。

  • OTelでインストルメントした人気のデモアプリ(HipsterShop)を構成して、Elastic Cloudにテレメトリーを取り込む方法(構成は、わずかな手順で簡単です)
  • OTelデータに関連するElasticのいくつかのAPM機能の説明と、データをElasticに取り込んだ後にできることの紹介

導入の準備は万端ですか?Elastic Cloudに登録して、上記で説明した機能を試し、OpenTelemetryデータの価値と可視性を最大限引き出してください。