gRPC の Synthetic Monitoring(外形監視)と相性のよい SaaS を調べてみた

結論

Datadog が一番相性が良さそうということが分かりました。

https://docs.datadoghq.com/ja/synthetics/api_tests/grpc_tests/?tab=unarycall

gRPC と外形監視

Synthetic Monitoring(以下、外形監視)はアプリケーションの死活監視を行ううえでのプラクティスの1つですが、バックエンドが gRPC サーバーである場合、RESTFul API とは少し勝手がことなります。まず、外形監視サービスが gRPC をサポートしているかどうかが分かれ目です。そして調べると、案外このケースは多くないことが分かりました。

幸い Awarefy は、Connect を利用しており、この副次的効果として gRPC サーバーでありながら HTTP POST のエンドポイントを提供する、ということが達成されています。

https://www.awarefy.dev/blog/better-grpc-connect-go/

またさらに話がややこしいのですが、Amazon Application Load Balancer (ALB) 越しに Connect サーバーに対して接続する場合、そのプロトコルは gRPC もしくは HTTP/2 である必要があります。

従ってここまでの話を総合すると、外形監視の機能が gRPC をサポートしていなくても、HTTP/2 に対応していさえすれば外形監視が行える可能性が残されます。

ということで各サービスを比較しました。

※ 検証はごくざっくり行ったものなので不正確な内容があればぜひご指摘ください
※ 他におすすめのサービスがあればぜひ教えてください

SaaS 比較

サービス名 / 機能 gRPC Server Reflection HTTP/2
Datadog
New Relic × -
Site24x7 -
Dynatrace × - ×
Postman (Monitors) × - ×

各サービスについての補足を記します。

New Relic

https://docs.newrelic.com/docs/synthetics/synthetic-monitoring/getting-started/get-started-synthetic-monitoring/

New Relic の外形監視は、Node のスクリプトを書くことでリクエストやレスポンス、検証するべき内容を定義できます。サンプルコードは HTTP/1.1 を対象にしたものだったのですが、Node ということで下記のようにコードを書き換えてみました。

var assert = require('assert');

const http2 = require('http2');
const client = http2.connect('https://example.com');

const req = client.request({
  ':method': 'POST',
  ':path': '/MyGrpcService',
  'Content-Type': 'application/json',
});

let data = {
  "foo": "bar"
};

req.setEncoding('utf8');

req.on('response', (headers, flags) => {
  const status = headers[':status'];
  assert.equal(status, 200, 'Expected a 200 OK response');  
});

req.write(JSON.stringify(data));
req.end();

これで、レスポンスの検証までは問題なく動作するようになったのですが、レスポンスタイムなどのモニタリング項目のメトリクスがダッシュボード上からは取得できないことが分かりました。おそらく HTTP/2 をサポートしていないからであると理解したのですが、この点間違っていれば是非教えてください。

New Relic は Kubernetes クラスターのモニタリングツールとして導入したこともあり安心感もあったのですが、この点が対応しておらずやむなく採用を見送りました。

Site24x7

https://www.site24x7.com/synthetic-monitoring.html

Site24x7 は gRPC への対応に加え HTTP クライアントが HTTP/2 をサポートしているようで、特に設定を行うことなく外形監視に成功しました。ただし、gRPC の Server Reflection には対応しておらず、.proto ファイルをアップロードすることでリクエストの定義を読み込む、という方式でした。

Dynatrace

https://www.dynatrace.com/monitoring/platform/synthetic-monitoring/

第三世代(?)のモニタリング SaaS ということで結構気になって見ていたのですが、比較表のとおり gRPC にも HTTP/2 にも対応がないようでした。いまでも気になっているので利用している方がいれば使用感などをぜひ聞きたいところです。

Postman (Monitors)

いまでは RESTFul API に関するスーパーアプリと化した(?)Postman ですが、Monitors という外形監視の機能も搭載されています。

https://learning.postman.com/docs/monitoring-your-api/intro-monitors/

個人的に Postman を使った開発体験はよいと感じているため利用できれば面白かったのですが、この機能は gRPC のコレクションは対象外であったのと、Postman の クライアントは HTTP/2 非対応であるため、要件に合致しませんでした。

Datadog

https://docs.datadoghq.com/ja/synthetics/api_tests/grpc_tests/?tab=unarycall

調べた限り、gRPC への対応が一番手厚いのは Datadog の外形監視でした。gRPC のサポートに加え、Server Reflection にも対応しています。

ちなみに、Server Reflection を用いて gRPC のサービスを呼び出したところ、メッセージのパースが上手くいかないようで疎通には失敗してしまいました。検証を続けていますが、Connect を利用している関係もあるかも知れません。

ということで結局 gRPC の疎通はできなかったのですが、HTTP/2 に対応しておりそちらは問題なかったのと(リクエストのプロトコルを HTTP/1.1 と HTTP/2 から明示的に選択できるのも良かった)、上述の gRPC におけるエラーは使い方の問題であることも考えられるため、冒頭で書いたように、今回の検証の範囲においては、gRPC の外形監視を行ううえで最も 相性のよいサービスは Datadog と結論付けました。

前提条件の変更や大きな続報があれば、追記という形でお知らせしたいと思います。

Awarefy 技術ブログ

Discussion