Blogaomu

WEBアプリケーション開発とその周辺のメモをゆるふわに書いていきます。

『Scala関数型デザイン&プログラミング』第6章のメモ

Scala関数型デザイン&プログラミング』(初版)の第6章を読んで初見ではいまいち理解できなかった部分について自分なりに理解を試みたメモです。第6章の中でも特に最後の自動販売機の問題(EXERCISE 6.11)については解答を見ても何をやっているか、どのような意図があるのか理解できませんでした。他にこんな考え方や解釈もあるというご意見があればコメントで教えていただきたいです。

State

第6章では State データ型が紹介されています。このデータ型は S => (A, S) という関数が本質で、ある状態(S)を元に何かを行いその結果(A)および新しい状態(S)を返すことを表現しています。書籍では乱数の例で説明されていますが、このような関数を連結したり値を変換したりして最終的な結果や状態を取得するような用途に向いていると理解しました。その際に状態を次の関数に引き渡すことが煩わしくなります。 State はこの煩わしさを閉じこめているので利用者にとって扱いやすいコードが書けるようになっています。

続きを読む

Kamon経由でDatadog APMと連携する際にスパンからエラー情報が抜けてしまう現象について

これは ZOZO Advent Calendar 2022 カレンダー Vol.2 の 17 日目の記事です。昨日の投稿は @YasuhiroKimesawa さんの「リファクタリングにおける「マクベス症候群」を予防する」でした。

今回はお仕事での話になりますが、私たちのチームではScalaで実装されたアプリケーションサーバーにて各処理や外部API呼び出しなどの実行時間・パフォーマンスを計測するために、Kamonというライブラリを使いDatadog APMでそれらを可視化し運用しています。このKamonとDatadog APMの連携で困ったことがあったのでメモ代わりに残しておこうと思います。

続きを読む

Agile Japan 2021 北陸サテライト参加ふりかえり

Twitterを見ていたらたまたまこんなイベントがあることを知って、wtnabeさんの話が久しぶりに聞けるしそういえばアジャイルってよく分からないから理解するきっかけになりそうだなということで参加してきました。

agile-hokuriku.connpass.com

イベント開催から1週間近く経ってしまいその時の温度感は残念ながら表現できませんが、私が得た気づきをカジュアルに書いていこうと思います。

続きを読む

Envoy の gRPC-JSON transcoder を利用する場合のアクセスログで元の HTTP method を出力したい

Envoy の gRPC-JSON transcoder を使っているときにアクセスログでハマったのでメモっておきます。

gRPC-JSON transcoder というのは、簡単にいうとRESTful な JSON API としてリクエストすると gRPC の形式に変換した上で upstream のサーバーにプロキシしてくれて、レスポンスについても gRPC の形式から JSON に戻してくれるという機能です。

www.envoyproxy.io

例えばこのような protobuf を定義して Envoy に取り込むと GET /shoes/{item_id} という JSON API のエンドポイントが有効になりリクエストを送れるようになります。

syntax = "proto3";

package shoes;

import "google/api/annotations.proto";

service Shoes {
  rpc GetShoeInfo(GetShoeInfoRequest) returns (ShoeInfo) {
    option (google.api.http) = {
      get : "/shoes/{item_id}"
    };
  }
}

message GetShoeInfoRequest { string item_id = 1; }

message ShoeInfo {
  string item_id = 1;
  string name = 2;
  string type = 3;
  repeated string size_labels = 4;
}

で、実際にリクエストを送ってみると以下のようなアクセスログが出力されました。パスが正しいので見落としていたのですがよく見ると GET でリクエストしたにも関わらず POST と出力されているのに気付き、調べてみることにしました。

$ curl -v http://localhost:8080/shoes/123456
> GET /shoes/123456 HTTP/1.1

---
[2021-02-20T06:56:41.536Z] "POST /shoes/123456 HTTP/1.1" 200 - 0 120 19 15 "-" "curl/7.64.1" "7f86f233-e658-400d-bb8f-999dea810924" "localhost:8080" "172.19.0.2:50051"
続きを読む

ALB で gRPC を利用する on EKS

先日、Application Load Balancer (ALB)が HTTP/2 および gRPC に対応するようになったという発表がありました。これをEKS上で稼働するアプリケーションにも適用できるかを試してみました。

ALB の HTTP/2 および gRPC 対応

EKS で ALB を利用するには?

続きを読む