go-redis・Upstash・OpenTelemetryで実現する分散トレーシング入門
このチュートリアルでは、go-redisクライアントを使ってUpstash Redisデータベースに接続する方法と、分散トレーシングを活用してアプリケーションのパフォーマンスを監視する方法を解説します。
go-redisとは?
go-redisは、Golang向けの人気の高いRedisクライアントです。標準でRedis Server、Sentinel、Clusterの3つの構成に対応しており、すぐに使い始められます。
Upstash Redisデータベースに接続するには、以下のコードを使用します。
package main
import (
"context"
"fmt"
"github.com/go-redis/redis/v8"
)
func main() {
ctx := context.Background()
opt, _ := redis.ParseURL("<connection-string-from-Upstash>")
client := redis.NewClient(opt)
if err := client.Set(ctx, "foo", "bar", 0); err != nil {
panic(err)
}
fmt.Println(client.Get(ctx, "foo").Result())
}
また、任意のコマンドを実行したい場合は、次のような代替APIも利用できます。
val, err := rdb.Do(ctx, "get", "key").Result()
if err != nil {
if err == redis.Nil {
fmt.Println("key does not exists")
return
}
panic(err)
}
go-redisは、データのキャッシュやAPIへのリクエストのレート制限など、さまざまな用途に活用できます。クライアントの詳細については、公式のRedis Golangドキュメントをご覧ください。
分散トレーシングとは?
分散トレーシング(Distributed Tracing)とは、マイクロサービスアーキテクチャで構築されたシステムをはじめとする分散システムにおいて、リクエストが各コンポーネント間を伝播していく様子を観察するための手法です。
トレーシングを導入すると、リクエストがシステム内を移動する経路を追跡できるようになります。その結果、「何が変化したのか」「どこが壊れているのか」「どのログやエラーが関連しているのか」を、全体のコンテキストとして把握できるようになります。

OpenTelemetryとは?
OpenTelemetryは、トレース・ログ・メトリクスを収集・エクスポートするためのベンダーニュートラルな標準規格です。
OpenTelemetry(略称:Otel)を利用すると、開発者は特定のベンダーに依存しない形でテレメトリーデータを収集・エクスポートできます。アプリケーションへの計装(Instrumentation)は一度行うだけでよく、計装コードを変更することなくバックエンドのベンダーを追加・切り替え可能です。例えば、OpenTelemetryに対応した人気のDataDog代替ツールの一覧も公開されています。
さらに、OpenTelemetryはほとんどのプログラミング言語で利用でき、異なる言語や環境間でも相互運用性が保証されています。
go-redisとトレーシングの連携
go-redisには「redisotel」というOpenTelemetry計装パッケージが付属しており、独立したモジュールとして配布されています。以下のコマンドでインストールできます。
go get github.com/go-redis/redis/extra/redisotel/v8
Redisクライアントを計装するには、redisotelが提供するフック(Hook)を追加します。
import (
"github.com/go-redis/redis/v8"
"github.com/go-redis/redis/extra/redisotel/v8"
)
rdb := redis.NewClient(&redis.Options{...})
rdb.AddHook(redisotel.NewTracingHook())
トレーシングを正しく機能させるには、アクティブなトレースコンテキストをgo-redisのコマンドに渡す必要があります。例えば、HTTPリクエストから取得したコンテキストをそのまま渡します。
ctx := req.Context()
val, err := rdb.Get(ctx, "key").Result()
redisotelの詳細については、「Monitoring Go Redis Performance and Errors」の記事をご参照ください。
Uptraceでトレースを可視化する
Uptraceは、直感的なクエリビルダー、充実したダッシュボード、自動アラート、主要な言語・フレームワーク向けの豊富な統合機能を備えたオープンソースのDataDog競合製品です。
Uptraceは、DEB/RPMパッケージまたはプリコンパイル済みバイナリをダウンロードして簡単にインストールできます。
ご想像のとおり、redisotelは処理されたRedisコマンドごとにスパンを作成し、発生したエラーを自動的に記録します。収集された情報がUptrace上でどのように表示されるかは、以下のスクリーンショットをご覧ください。

実際に動作するサンプルコードはGitHubで公開されています。
次のステップ
ここまでの内容を踏まえ、さらにOpenTelemetry計装を追加することで、アプリケーションの他の側面も監視できるようになります。例えば、WebフレームワークのGinや、Go gRPC向けの計装などが利用可能です。
また、OpenTelemetryのTracing APIやMetrics APIを学べば、自分のアプリケーションに合わせた独自の計装を作成することもできます。ぜひ試してみてください。
-
Flutter、Serverless Framework、Upstash(Redis)で構築するフルスタックサーバーレスアプリ 第2部
チュートリアルシリーズ第2部へようこそ。第1部では、UpstashとServerless Framework、Redisを使ってREST APIを構築する方法を解説しました。 この第2部では、そのREST APIのエンドポイントを利用するモバイルアプリケーションをFlutterで構築していきます。 それでは始めましょう 🙃 事前準備 まず、お使いのコンピュータにFlutterがインストールされ、正常に動作している必要があります。 Flutter IDEで新しいFlutterプロジェクトを作成し、任意の名前を付けてください。 依存パッケージの追加 プロジェクトのルートディレクトリにあるpu
-
Flutter、サーバーレスフレームワーク、Upstash(REDIS)を備えたフルスタックサーバーレスアプリ-パート1
この投稿では、データを保存するためのFlutter、Serverless Framework、Upstash、Redisを使用してサーバーレスモバイルアプリケーションを構築します。 Upstashとは? Upstashは、Redis用のサーバーレスデータベースです。 Upstashを使用すると、リクエストごとに支払います。これは、データベースが使用されていないときに課金されないことを意味します。 Upstashはデータベースを構成および管理します。これは、DynamoDBやFaunaなどの他のデータベースの強力な代替手段であり、などの利点があります。 低レイテンシ REDISAPIと同