Blogaomu

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

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 を利用するには?

続きを読む

ExternalDNS の policy を軽く調べたメモ

AWS の EKS 上で ExternalDNS を利用する際に policy という概念が分からなかったので、動かしながら簡単に調べてみたメモです。

policyって?

https://github.com/kubernetes-sigs/external-dns/blob/master/pkg/apis/externaldns/types.go#L410

Modify how DNS records are synchronized between sources and providers

  • マニフェストファイルで定義されるものとDNSプロバイダー間でDNSレコードがどのように同期が取られるかというのを設定する
  • sync, upsert-only, create-only の3種類のうちどれか
    • 鋭い方ならこの時点である程度想像付くかと思う
続きを読む