ブログに戻る

フォロー&ご登録

Compute の Log Tailing 機能で可観測性の向上とデバッグの容易化を実現

Edward Muller

Data Team、Senior Manager

サーバーレスコンピューティングの魅力はもはや否定できないでしょう。アーキテクチャを分散化し、リソースの可用性を事前に計画する必要なくグローバルにデプロイできることに大きな価値があります。2025年までにグローバル企業の半数がサーバーレスコンピューティングを導入すると、Gartner が予測しているのも不思議ではありません (現在はわずか20 %)。

私たちは、独自の強力なサーバーレスコンピューティング環境 Compute を強化してきました。すでにライブで本番環境のトラフィックを配信している Compute では、使い慣れたプログラミング言語を使ってエッジのユースケースを解決したり、高度なアプリケーションやカスタムロジックをエンドユーザーの限りなく近くで構築することが容易になりました。本日、私たちは新たな機能をリリースし、理想のサーバーレスコンピューティングに向けて一歩前進しました。

今回リリースした Compute の Log Tailing 機能では、サードパーティのサービスを使用せずにほぼリアルタイムでログを読み取ることできるため、エッジアプリケーションの開発プロセスにおいて迅速なデバッグが可能になります。では、その仕組みを詳しく見てみましょう。

エッジでの可観測性

Compute は、リアルタイムのログと統計機能に加え、業界標準のツールを使用してトレースデータを取得し、サードパーティのシステムにエクスポートする機能を備え、優れた可観測性機能を提供しています。しかし、サーバーレスコンピューティングは多くの場合、組織で使用される複数の他のテクノロジーと並んで、組織のアプリケーション開発戦略全体の一部分に過ぎません (2019年コミュニティ調査)。異種混在、そして分散化が進むシステム全体のパフォーマンスをエンドツーエンドで把握することは簡単なことではありません。

今日まで、稼働中の Compute Wasm サービスからアプリケーションログやデバッグデータを確認するためには、サードパーティのログ管理ツールを設定し、サービスにログエンドポイントを追加する必要がありました。そのため、理想とするシンプルで高速なデバッグの実現は依然として難しい状況でした。それを変えるのが Log Tailing です。

サーバーレスコンピューティングソリューションの他のデバッグ機能とは異なり、Log Tailing では Fastly の Compute プラットフォーム上で動作するアプリケーションをテストしながら、Fastly のコマンドラインインターフェース (CLI) を使用して任意のターミナル内で独自のカスタムログメッセージを直接ストリーム出力することができます。これにより、開発者はエッジアプリケーションの stdout と stderr の出力をリアルタイムに可視化できるため、サードパーティのログ管理サービスを追加で設定したり、そのためにコストをかけたりせずに、効率的に問題を解決できます (ただし、長期的な保存や分析のためにログをアーカイブするには、サードパーティのログ管理サービスを設定する必要があります)。

Compute の CLI からほぼリアルタイムでログにアクセスできるため、「開発 - プッシュ - 検証」のループ中に素早くデバッグすることができます。その結果、開発とデバッグを同時に行うことができ、アプリケーションをより早く本番稼動させることが可能になります。間近の短いタイムフレームでサーバーレスの可観測性データを提供することで、より迅速な開発サイクルの実現を後押しします。

使用方法 

Log Tailing 機能の使用方法を理解するために、 Compute の Rust 用デフォルトスターターキットを見てみましょう。このキットでは、ルーティング、シンプルなシンセティックレスポンス、キャッシュルールのオーバーライドのデモが含まれます。このスターターキットに変更を加えて複数の print 文を追加し、stdout や stderr に出力するようにします。また、このチュートリアルでは Fastly CLI のバージョン 1.0.0 を使用しています。

// Pattern match on the request method and path.
    match (req.method(), req.uri().path()) {
        // If request is a `GET` to the `/` path, send a default response.
        (&Method::GET, "/") => {
            println!("Hello from the root path!");
            Ok(Response::builder()
               .status(StatusCode::OK)
               .body(Body::from("Welcome to Fastly Compute@Edge!"))?)
        }

        // If request is a `GET` to the `/backend` path, send to a named backend.
        (&Method::GET, "/backend") => {
            println!("Hello from the /backend path!");
            // Request handling logic could go here...
            // E.g., send the request to an origin backend and then cache the
            // response for one minute.
            *req.cache_override_mut() = CacheOverride::ttl(60);
            Ok(req.send(BACKEND_NAME)?)
        }

        // If request is a `GET` to a path starting with `/other/`.
        (&Method::GET, path) if path.starts_with("/other/") => {
            println!("Hello from the {} path", path);
            // Send request to a different backend and don't cache response.
            *req.cache_override_mut() = CacheOverride::Pass;
            Ok(req.send(OTHER_BACKEND_NAME)?)
        }

        // Catch all other requests and return a 404.
        _ => {
            let client_ip = downstream_client_ip_addr().ok_or(anyhow!("could not get client ip"))?;
            let geo = geo_lookup(client_ip).ok_or(anyhow!("no geographic data available"))?;
            eprintln!("Bad request to path {} from someone in {}, {}", req.uri().path(), geo.city(), geo.country_code3());
            Ok(Response::builder()
               .status(StatusCode::NOT_FOUND)
               .body(Body::from("The page you requested could not be found"))?)
        }
    }

これは非常にシンプルな例で、Wasm アプリケーションをデバッグして、どのパスがヒットしているかを確認できます。このアプリケーションのデプロイ後、独自のログエンドポイントを設定しなくても、curl を使って Log Tailing の出力を見ながらパスロジックをテストすることができます。

次の例では、アプリケーションを以下にデプロイしています。

https://logtail-demo.edgecompute.app/

現在 Compute にアクセスできるお客様は、アカウントチームに連絡してセットアップを依頼することで Log Tailing サービスを使用できます。

$ fastly log-tail --service-id=<redacted>
SUCCESS: Managed logging enabled on service <redacted>

別のターミナルでアプリケーションに対して curl を実行します。

$ curl https://logtail-demo.edgecompute.app/
$ curl https://logtail-demo.edgecompute.app/backend
$ curl https://logtail-demo.edgecompute.app/other/path
$ curl https://logtail-demo.edgecompute.app/notfound

Log Tailing の出力には、ストリーム (println の場合は stdout、eprintln の場合は stderr)、固有のリクエスト ID、メッセージが表示されます。

$ fastly log-tail --service-id=<redacted>

SUCCESS: Managed logging enabled on service <redacted>
| stdout | 4718faa4 | Hello from the root path! |
| stdout | 28dae28d | Hello from the /backend path! |
| stdout | 8b90d6a6 | Hello from the /other/path path |
| stderr | 9515856c | Bad request to path /notfound from someone in ft collins, USA |

1つのリクエストに対して複数の printlneprintln の呼び出しがあった場合、順番付けられ、グループ化されて出力されます。「/」ハンドラを変更してこれを確認できます。

(&Method::GET, "/") => {
     println!("Hello from the root path!");
     println!("2nd println in this request");
     println!("3rd println in this request");
     println!("4th println in this request");
     println!("5th println in this request");
     Ok(Response::builder()
         .status(StatusCode::OK)
         .body(Body::from("Welcome to Fastly Compute@Edge!"))?)
}

https://logtail-demo.edgecompute.app/ に対して curl コマンドを2つ同時に実行すると、一意の ID でグループ化された出力を確認できます。

| stdout | 57bc24b2 | Hello from the root path! |
| stdout | 57bc24b2 | 2nd println in this request |
| stdout | 57bc24b2 | 3rd println in this request |
| stdout | 57bc24b2 | 4th println in this request |
| stdout | 57bc24b2 | 5th println in this request |
| stdout | 6e40d49a | Hello from the root path! |
| stdout | 6e40d49a | 2nd println in this request |
| stdout | 6e40d49a | 3rd println in this request |
| stdout | 6e40d49a | 4th println in this request |
| stdout | 6e40d49a | 5th println in this request |

今後について

私たちはエッジで構築することのメリットについて頻繁に説明していますが、使い慣れたツールや必要なツールを使用してエッジで構築するまったく新しい方法を Compute を通じて提案し続けます。今回の機能リリースに続き、今後も数多くの機能強化を予定しています。Compute に関する最新情報をご希望の方は、こちらからご登録ください。