マイクロサービス(分散アプリケーション)の開発を容易にするランタイムであるDaprが先日 v1.0のリリースを迎えました。本ブログはSimplify Distributed Application Complexity with Daprの日本語抄訳を通して、Daprが実現するものと、Daprの持つオブザーバビリティ(可観測性)をNew Relic Oneですぐに利用する方法をご紹介します。

分散アプリケーションの構築を計画するとき、開発者はアプリケーションのビジネスロジックを超えて考えるべきことがたくさんあることに気づくでしょう。例えば、どのように複数のマイクロサービスが互いに通信するか、どのように外部システムと統合するか、さらにマイクロサービスがステートフルである場合には、発生しうる障害からの回復を実現するためにどのように状態を保存するか、といったことです。

もちろん、これらの問題に対応できる複数のパターンがあり、それらを実装するのに役立つオープンソースまたはクラウドプロバイダー固有の技術もあります。サービス間通信方式の例としては、HTTPやgRPCによるサービス間の呼び出しや、KafkaやRabbitMQなどのメッセージブローカーを使用したpub/subなどがあります。ステートストアとはアプリの状態を分離して保持するのに適した方法であり、一般的なものとしてはRedisなどのインメモリストアやMongoDBなどのデータベースなどがあります。HashiCorp Vaultのようなシークレットストアで接続文字列や証明書を保護することに加えて、Azure、AWS、GCPで似たようなソリューションが提供されているクラウドプロバイダーごとのサービスの仕様など、構築しようとしているものの具体的なロジックにたどり着くまでにも、やるべきことがたくさんあることは明らかです。

様々なSDKを選択し、ランプアップし、コードに統合することに加えて、アプリケーションを異なる環境(例えば、ローカルの開発ボックス、オンプレミス、マルチクラウド)にデプロイする必要があるかもしれないことを念頭に置いておく必要があります。デプロイ時には、ホスティングインフラに応じてこれらのソリューションの一部を置き換える必要があるかもしれません。

最後に、そして間違いなく最も重要なことは、あなたとあなたの開発チームは、これらの分散アプリケーションを安全に構築し(通信の暗号化、アクセス制御の実装など)、それらを観測可能にするべく軽装する必要があるということです。こうなってくると、特定のクラウドインフラストラクチャの詳細が複雑さを増しています。

Daprとは何ですか?

Distributed Application Runtime (Dapr) オープンソースプロジェクトは、分散アプリケーションの構築に伴う課題を解決するために開発者を支援することを目的としています。Daprは、サービス間メソッド呼び出し、状態管理、シークレットストア、パブ/サブメッセージングといった、特定の機能に対応する一連の構成ブロックを定義しています。これらの構成ブロックは、(コンポーネントと呼ばれる)特定の実装を抽象化したAPIを提供しており、そのおかげでコードにSDKやライブラリを追加したり、機能を実装しているテクノロジーの詳細を理解したりする必要がありません。Daprランタイムはsidecarパターンを使用し、別のプロセスとして実行されるため、言語に依存せず、アプリはHTTPまたはgRPC経由ですべてのAPIコールを行うことができます(とはいえ、特定の言語のSDKは利用可能です)。

Dapr v1.0のリリースにより、Daprは本番環境で利用可能になり、すでに大企業・中小企業問わずビジネスクリティカルなアプリケーションを構築するために使用している企業があります。この入門ガイドでDaprを自分で試すことができます。

[embed]https://www.youtube.com/watch?v=9o9iDAgYBA8[/embed]

分散アプリケーションでDaprを使用するメリットは以下のようなものがあります。

  • コードがシンプルになります。様々なSDKを統合したり、カスタムな方法(クライアントの作成や接続の管理など)でコンポーネントと直接やりとりする必要はありません。
  • 言語にとらわれません。Dapr APIはHTTP / gRPCを使用するため、どの言語で書かれたアプリケーションでも依存関係なく使用することができます。そして、Daprは.NET、Java、Go、Python、JavascriptなどのSDKを提供しています。
  • 高い移植性。コードにホスティング技術への依存はありません。クラウドプロバイダーを切り替えたり、異なるステートストア、シークレットストア、メッセージブローカー、バインディングを使用する環境に移動した場合でも、コードを変更する必要はなく、Daprを設定するコンポーネントファイルを変更することのみで十分です。
  • セキュリティ。DaprはmTLS認証を介したサイドカー間のセキュアな通信を提供し、シークレット、サービス呼び出し、pub/subのスクリプショントピックへのアクセス制御を可能にするネームスペースとスコープを含んでいます。
  • オブザーバビリティ(可観測性)。Daprサイドカーはトレースデータを送信するように設定できるため、Daprを使用するだけで、すでにアプリケーションを計装していることになります。

Daprのオブザーバビリティはどのように動くのですか?

多くのDaprユーザーは、Daprが提供するオブザーバビリティ機能が大きな変化をもたらしていることに気づいています。Dapr APIをすべてのサービス間コールとpub/sub メッセージングに使用することで、アプリケーションを意識した自動計装が実現できます。Daprのsidecarが設定ファイルに基づいてトレースを行うため、計装のための追加のコードは必要ありません。DaprはW3C trace contextOpenTelemetryのような標準に準拠しており、Zipkinプロトコルを使用してトレースを出力しているため、それをサポートするあらゆるツールと統合することができます。また、OpenTelemetry Collectorを使用して、他のモニタリングツールと統合することもできます。

W3C trace contextとの互換性があるため、Daprはtrace context管理に柔軟性を与えてくれます。これにより、アプリケーションの外部で生成されたtrace contextを受け入れたり、送信処理を追加することでtrace contextを外部に伝播したりすることができます。

トレースのためにDaprを設定する

Daprの設定ではYAML形式の設定ファイルにトレースのサンプルレート(Daprは確率的サンプリングを使用)とトレース収集のためのエンドポイントURLを設定します。

apiVersion: dapr.io/v1alpha1

kind: Configuration

metadata:

  name: myconfig

  namespace: default

spec:

  tracing:

     samplingRate: "1"

     zipkin:

     endpointAddress: "http://..."

Daprアプリケーションをデプロイすると、上記の設定が使用されます。例えばKubernetesのデプロイでは、Daprアノテーションのdapr.io/configがアプリケーションに関連付けられる設定を定義します(DaprアプリケーションのKubernetesへのデプロイについての詳細はこちらをご覧ください)。

DaprをNew Relic Oneで使う

New Relic OneはZipkinをサポートしているため、コードに何も追加することなく、Daprアプリケーションのトレース用エンドポイントとして使用することができます。これだけでNew Relic Oneをトレースのバックエンドとして非常に簡単に使用でき、トレースの可視化や洞察力などをフルに活用することができます。

必要なのは、設定ファイルのエンドポイントをNew Relic Tracing APIを指すように設定するだけです。

apiVersion: dapr.io/v1alpha1

kind: Configuration

metadata:

  name: appconfig

  namespace: default

spec:

  tracing:

     samplingRate: "1"

     zipkin:

     endpointAddress: "https://trace-api.newrelic.com/trace/v1?Api-Key=<NR-INSIGHTS-INSERT-API-KEY>&Data-Format=zipkin&Data-Format-Version=2"

ここにAPIキーを含める必要があることに注意してください。さらに、URLには(Daprが使用するプロトコルであるため)Zipkinへのデータフォーマットを定義する引数が含まれています。

次のステップ

New Relic Oneの無料ティアにサインアップして、Daprとどのように構成できるか試してみましょう。