Carpe Diem

備忘録

2023-01-01から1年間の記事一覧

Backstage でGitHub認証を導入する

概要 Backstageに認証機能を導入します。 Backstageでは様々な認証方法を提供していますが、今回はGitHubを使った認証を実装します。 環境 backstage v1.21.1 認証 GitHub Authentication Provider | Backstage Software Catalog and Developer Platform に…

2023年買ってよかったものリスト

概要 年の瀬なので2023年に買ってよかったものを挙げてきます。 SESAMEタッチ & オープンセンサー 2021年買ってよかったものリスト - Carpe Diem でも紹介したスマートロックで 指紋認証 ICカード認証 に対応したデバイスがリリースされました。 【New】SESA…

Backstage をローカルで動かす

概要 前回紹介したBackstageをローカルで使うための説明です。 開発者ポータル Backstage とは - Carpe Diem 環境 backstage v1.21.1 yarn v1.22.19 Get Started とりあえず起動してみる アプリケーション作成 以下のコマンドでアプリケーションを作成できま…

VSZ, RSS(anonymous, file)の理解を深める

背景 KubernetesでPodがOOM Killされた際には以下のようなログが発生します。 Memory cgroup out of memory: Kill process 9130 (XXXX) score 1592 or sacrifice child Killed process 9130 (XXXX) total-vm:423008kB, anon-rss:122484kB, file-rss:33792kB,…

開発者ポータル Backstage とは

背景 開発チームが抱えるよくある課題として システムが変化する一方でドキュメントは更新されず腐る メンバーの流入出によって口伝でかろうじて継承された知見も失われる 検索性が良くないと過去のドキュメントが気づかれず、同じような内容のドキュメント…

二重サブミットを防ぐ方法

背景 支払い処理などで問題になりがちな二重サブミット問題(Double Posting Problem)ですが、主に以下のようなケースで発生します。 ボタンのダブルクリック ユーザが間違えて2回ボタンを触ってしまう(ときには遅さにイライラして何度もクリック) リク…

GraphQLのメリット

背景 GraphQLでよく挙がるメリットとして以下があります。 RESTful APIと違って都度UIに依存したAPI設計をする必要がない マルチデバイス対応サービスにおいて大きなメリット オーバーフェッチを避けることができる Switchなどデバイス制約が多いクライアン…

DockerでMySQLのクエリログを見れるようにする

背景 GraphQLでN+1になってないかを確認したいときに、スロークエリだけでなく全てのクエリログを見たくなったのでその設定方法を説明します。 Dockerコンテナの中に直接入って見る方法 Dockerログに吐き出す方法 の2通りで説明します。 環境 macOS 13.6 Do…

IngressとGCPロードバランサーの命名規則

背景 Kubernetes Ingressで作成されたGCPロードバランサー周りのコンポーネントは k8s2-um-xxx k8s2-rm-xxx k8s2-tp-xxx k8s-be-xxx など色々あり、どれが何を表しているのか分かりづらかったのでまとめます。 命名規則とコンポーネント 命名規則とコンポー…

BigQueryのパーティション分割テーブル、日付別テーブル

概要 BigQueryにおける分割テーブルは パーティション分割テーブル 大きな1つのテーブル 日付別テーブル(レガシー) 複数テーブル の大きく2種類あり、さらにパーティション分割テーブルは 取り込み時間による分割 時間単位カラムによる分割 整数範囲によ…

Node.jsでGraceful Shutdown

概要 christina04.hatenablog.com のNode.js版です。 環境 Node.js v18.18.0 TypeScript v5.2.2 Express v4.18.2 課題 次のようなアプリケーションコードがあった際に import type { Express, Request, Response } from "express"; import express from "exp…

IstioやEnvoyで発生するネットワーク系エラー

背景 マイクロサービス環境でIstio(Envoy sidecar)を使っていると、いくつかのエラーに遭遇します。 それぞれどういった状況で発生しているエラーなのかを区別できないと、適切な対応にならないため各種エラーをまとめます。 環境 Envoy 1.22.0 Go 1.21 構成…

ログで機密情報をマスキングする方法

背景 DBのconfigのように一部機密情報が含まれるものを環境変数(k8s Secret等)で注入することは多いです。 そしてその環境変数がちゃんと設定されているか起動時にログを吐きたいということもよくあります。 一方で type Config struct { Addr string Port i…

DeepLのChrome拡張機能を使ってるとGitHubのページ内検索で表示崩れが起きる

背景 最近GitHubでページ内検索を使ってると、たまに次のような表示崩れが発生します。 スクロールしても前のコードがずっとそこに残っています。 このときのコンソールログとしては決まって次のエラーで、 content.js:1 Uncaught DOMException: Failed to e…

KubernetesでPodを複数のZoneに分散させる

概要 Podの冗長化をする上でマルチゾーン構成にしたい場合 Pod Topology Spread Constraints | Kubernetes 上記のPod Topology Spread Constraintsを使うと実現できます。 環境 Kubernetes v1.24 Pod Topology Spread Constraints Pod Topology Spread Const…

http.ResponseWriterに書き込んだstatus codeを取得したい

Go

背景 5xx系エラーをbugsnagのようなエラー検知サービスに送信したい middleware層で網羅的に対応したい といった際に、 http.ResponseWriterに書き込まれたstatus codeは直接アクセスできない という問題があります。 今回はこの問題を解決する方法を紹介し…

go-redisのtimeoutで気をつけること

概要 Go言語でRedisを使う際に選択肢に挙がるのがgo-redisです。 今回はgo-redisでTimeoutを設定する際に注意すべきことをまとめました。 手前味噌ですがBlast Radius of Failureを最小にするためにTimeoutを短くすることを1つのテクニックとしても紹介して…

macOSでiptablesのように特定の通信をブロックする

概要 iptablesで特定のポートへのパケットをドロップしたい場合は次のようなコマンドを実行します。 $ sudo iptables -A INPUT -p tcp -d 127.0.0.1 --dport 8080 -j DROP しかしmacOSではiptablesは無いためこれができません。 なのでiptablesではなくpfを…

Go + Alpine でtzdataはapk addしなくていい

背景 Alpine Linuxはデフォルトではtzdataが含まれていないため、以下のような package main import ( "log" "time" ) func main() { loc, err := time.LoadLocation("Asia/Tokyo") if err != nil { log.Fatal("%w", err) } log.Printf("%v", loc) } time.Lo…

GoでYAMLファイルを読み込んだ時にデフォルト値を設定したい

背景 christina04.hatenablog.com のように設定ファイルをYAMLで管理するパターンは良くありますが、設定項目が増えるほど運用つらくなるので、あまり弄らない項目に対してはデフォルトを用意し、値がなければそれを設定したいケースがあります。 イメージと…

OpenTelemetry Collectorでデータを一元的に管理する

概要 OpenTelemetryでは直接ExportせずにCollectorと呼ばれるProxyを挟むことで以下のことが可能になります。 アプリケーションコードでExport先を意識しなくて済み、ベンダーロックインを避けることができる データを一元的に管理できる アプリケーションや…

ObsidianのデータをMac, iPad, Androidで同期する

概要 Obsidianというメモアプリを使っていますが、 基本はMacBook Proでメモする たまにiPadで見たりメモすることもある という使い方に加え、 パッと思いついたアイデアはスマホ(Android)で書く といった使い方もしたくなりました。 しかし iCloudでデー…

BigQueryからBigtableへアクセスしてデータ分析

概要 Bigtableは数十億行、数千列規模に拡張可能な分散型NoSQLですが、 特定のカラムファミリのみ持つ行を全て抽出する といった時にcbt(CLIツール)やSDKではiterateしてデータをハンドリングするため、大規模データ分析の用途では使いづらさがあります。 そ…

基数木を使った効率的なパスルーティング

背景 次のようなwildcardを含んだpathをフレームワークに頼らず、自前で実装する場合にどうパターンマッチさせるか考えてみます。 /users/:id /articles/:id/comments 単純に考えると正規表現で次のようなパターンを使ってforループで回す、といったものがあ…

gRPCで一時的なネットワーク断でのtransportエラーを回避する

背景 gRPCを利用していると、デプロイを含む一時的なネットワーク断で以下のようなエラーが発生することがあります。 rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing: dial tcp xxx: connect: connection …

Goでバンディットアルゴリズムを実装する

概要 複数の案を試す際にA/Bテストがありますが、検証期間中はずっと同じ割合で試行しなければいけないため、もし悪い案であった場合に全体としてその期間損失を生むことになります。 そのような損失を少なくしつつ、良いと思われる案を優先的に試行するアル…

OpenTelemetryでのSampling

概要 トレーシングで重要なのがSamplingです。 単純に全データを計測するとコストが増えたりパフォーマンスに影響が出たりします。 OpenTelemetryではSamplingに対する仕様が決まっているので、それに基づいて具体的な実装を紹介します。 OpenTelemetry Spec…

Bridgeを使ってOpenCensusのSpanをOpenTelemetryに取り込む

概要 OpenTelemetryはOpenCensusやOpenTracingをまとめた形で生まれたので、既にOpenCensusやOpenTracingの形で実装されたライブラリは移行するのが大変です。 例えばGCPの各SDKは基本的にOpenCensusで実装されています。 そのようなライブラリを使用する際…

OpenTelemetryで分散トレーシング

概要 マイクロサービス構成など分散システムにおいて分散トレーシングを行いたい場合は、サービス間でのContextの伝播が必要になります。 OpenTelemetryでサービス間での伝播をしたい場合の実装方法を説明します。 環境 Go v1.20.2 go.opentelemetry.io/otel…

OpenTelemetryのTraceをGoで試してみる

概要 OpenTelemetryはObservabilityの三本柱であるLogs、Metrics、Tracesをベンダーに依存せず実装するための仕様&実装です。 今回はそのうちのTracesをGoで試してみます。 環境 Go v1.20.2 go.opentelemetry.io/otel/trace v1.14.0 前提知識 登場人物 Open…