タグ

golangに関するglass-_-onionのブックマーク (6)

  • Goでミドルウェアとインターセプターのテストをする方法

    はじめに この記事では HTTP のミドルウェアと gRPC のインターセプターのユニットテストの方法について紹介します。 HTTPミドルウェアのテスト gRPCインターセプターのテスト HTTP のミドルウェアや gRPC のインターセプターといえば Web サービスの共通処理の実装が集中する場所です。共通処理であるが故に開発初期に作り込んで後から手を入れることが少ないという特性があります。あまり手を入れることがないからといってユニットテストを省いてしまうと、あとから機能追加したり、バグを発見したりしたときに慌てることになります。共通処理が集まるコードはいざという時に備えてしっかりユニットテストをしてあげましょう。 HTTPミドルウェアのテスト まずは HTTP ミドルウェアのテスト方法を見てみます。 テスト対象のミドルウェア 以下の HTTP ミドルウェアのコードをテストします。コンテ

    Goでミドルウェアとインターセプターのテストをする方法
    glass-_-onion
    glass-_-onion 2021/01/16
    記事を書きました。
  • GoでHTTP/gRPCリクエストのレスポンスサイズを計測する方法

    はじめに この記事では HTTP のミドルウェアと gRPC のインターセプターでレスポンスサイズを取得する方法を紹介します。単にレスポンスサイズを取得するというよりは自前で計測する的な解決方法でしたのでこのような記事タイトルとなっています。 レスポンスサイズが必要になる場面はそんなに無いかもしれませんが、記事で紹介する http.ResponseWriter や grpc.ServerStream のラッパーからデータを取得する方法はいろんな場面で応用できると思います。ちなみに私は Go のロガーライブラリの実装で活用しています。 HTTPリクエストのレスポンスサイズを計測する HTTP リクエストの場合、リクエストのサイズはヘッダの Content-Length から簡単に取得できますがレスポンスサイズは Go 標準ライブラリの http.ResponseWriter にサイズを取得

    GoでHTTP/gRPCリクエストのレスポンスサイズを計測する方法
    glass-_-onion
    glass-_-onion 2021/01/06
    記事を書きました。
  • GCPで理想の構造化ログを出力する方法

    はじめに この記事では、GCP のマネージドサービス(Google App Engine[1]/Cloud Run/Cloud Functions/GKE)から Cloud Logging に良い感じの構造化ログ(理想の構造化ログ)を出力する方法について紹介します。 良い感じのログの例 前提条件 この記事で紹介する構造化ログの実装は基的に以下の仕様にそって実装しています。重要な仕様なので興味のある方は一度読んでみることをおすすめします。 構造化ペイロードの特殊フィールド 用語の解説 編に入る前に、この記事で使われるログ出力まわりの用語をまとめておきます。以下の用語については前置きなく使いますのでよろしくお願いします。 構造化ログ[2] プレインテキストではなく、JSON等のデータ形式で出力されたログのこと GCPのCloud Logging(旧Stackdriver Logging)で

    GCPで理想の構造化ログを出力する方法
    glass-_-onion
    glass-_-onion 2020/12/25
    記事を書きました。初zenn投稿です。
  • Swagger (OpenAPI 2.x) generates go-server codeの何が辛いのか

    注意 まだ書くべきことはたくさんある go-swaggerは駄目だ、と見切りをつけて数年が経つので、情報が古い可能性がある OpenAPI 3.x を否定するものではない(むしろそちらには若干の希望を感じている) 解決策は書いてない 結論 Swagger generates go-server codeを採用するには、相当な覚悟が必要 どうせやるならOpenAPI 3.xに賭けたほうがいい 背景 この記事を書こうと思った動機 とつぶやいたものの、そのデメリットについて明確な言語化したことがなく、 単なる言いがかりじゃない というところをきちんとしておくため。 Swaggerはつらいよ 実際にプロジェクトで採用してみた結果、一体何が辛かったのかについて、3つの点から解説する。 問題点1: Swaggerの表現力と戦わねばならない そもそも$refがキツイ 説明まで含めて完全に同一な定義なんて

    Swagger (OpenAPI 2.x) generates go-server codeの何が辛いのか
    glass-_-onion
    glass-_-onion 2020/10/21
    バックエンドはフルgRPCにしてgRPC-Gateway使ってRESTとgRPCの変換をプロキシで実施した方がスキーマ駆動の恩恵を受けれる気がする。GCPのCloud Endpoints使えばProtobufからAPIドキュメントを生成できる。
  • Time型をJSONに変換するとtime.Locationの情報が欠落する場合の対処法 - A Day In The Life

    Time 型のフィールドを含む構造体を JSON にエンコード、JSON からデコードすると特定条件下で Time 型オブジェクトの time.Location の情報が失われることがあります。 以下のプログラムを見てください。 package main import ( "fmt" "time" "encoding/json" ) type Hoge struct { Name string CreatedAt time.Time } func main() { time.Local = time.UTC // Hoge構造体を生成する h1 := Hoge{ Name: "aaa", CreatedAt: time.Unix(1593077427, 0), } // Jsonsに変換 j, _ := json.Marshal(h1) // Jsonから復元する h2 := Hoge{}

    Time型をJSONに変換するとtime.Locationの情報が欠落する場合の対処法 - A Day In The Life
    glass-_-onion
    glass-_-onion 2020/07/13
    ローカル時間をUTCにするとreflect.DeepEqualが常にfalse判定されちゃう時の対処法を書きました
  • Golangで関数をグローバル変数に代入してテスト時にスタブする - 小野マトペの納豆ペペロンチーノ日記

    こんにちは、小野マトペです。タイトル全部です。 昨日、現在時刻によって条件分岐するロジックを含むGoプログラムを書いていて、どうテストするか困ったのですが、うまい(と思う)やり方を思いついたのでここに書いておきます。 書いていたのはまあだいたいこういうソースコードです。 // main.go package main import ( "fmt" "time" ) func main() { fmt.Println(Greet("マトペ")) } func Greet(n string) string { t := time.Now() if 6 <= t.Hour() && t.Hour() <= 18 { return fmt.Sprintf("こんにちは%sさん。今は%d時ですよ!", n, t.Hour()) } else { return fmt.Sprintf("こんばんは%s

    Golangで関数をグローバル変数に代入してテスト時にスタブする - 小野マトペの納豆ペペロンチーノ日記
    glass-_-onion
    glass-_-onion 2019/02/08
    この発想はなかった。
  • 1