Carpe Diem

備忘録

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…

ShellCheckでシェルスクリプトをLint

背景 普段プログラミングでは特定の言語を使っていますが、シェルスクリプトはビルドスクリプトをいじる時くらいしか使わず都度検索して調べ直す事が多いです。 また使い方が間違っていてもテストする文化が浸透していないため、期待しない挙動になっていて…

yttでテンプレートの変数に外部ファイルから値を注入する

背景 前回はyttに基本的な使い方を説明しました。 christina04.hatenablog.com 今回は少し実践的に、変数を外部ファイルとして扱ってサービス毎だったりdev/prdといった環境毎にYAMLを生成できるようにします。 環境 ytt 0.44.3 イメージ図 前回はテンプレー…

yttでテンプレートからYAMLを生成【基本編】

背景 似たようなYAMLを毎回コピペするのは運用が辛い ConfigMapのYAMLをdev, stg, prdで出し分けたい CircleCIのpath filteringでparameterを自動的に増やしたい といったようなケースでは、似たようなYAMLをパラメータだけ変更して自動生成したくなります。…

Bitwardenでsshキーを管理する

背景 仕事だと定期的にPCを交換しますが、そのたびにsshキーを全て最初から登録し直すのは非常に大変です。 かといって.sshをdotfilesとしてGitHubに管理したり、手動でコピーするのも転送経路をどうするかとか前PCから消し忘れたりとセキュリティ的に心配に…

MongoDB AtlasでContinuous Cloud Backupを有効化してRPOを小さくする

概要 MongoDB AtlasではContinuous Cloud Backupという機能を用いることでRPO(Recovery Point Objective)を1分にすることが可能です。 Dedicated Cluster Backups — MongoDB Atlas その他のストレージやデータベースではPoint in Time Recover/Restoreとい…

IstioのDestination RuleでCircuit Breakerを適用する

概要 christina04.hatenablog.com ではEnvoyでのCircuit Breakerの設定や挙動について説明しました。 IstioではDataPlaneにEnvoyを使っているので同じ様にCircuit Breakerを使えますが、設定するコンポーネントとしてはDestination Ruleになります。 Istio /…

KubernetesのPodを安全に終了する(istio-proxy編)

概要 前回KubernetesのPodの安全な終了方法について図を交えて解説しました。 christina04.hatenablog.com 今回はistio-proxy(envoy sidecar)がある場合の安全な終了方法について説明します。 環境 Kubernetes v1.21.14 Istio 1.16.0 Envoy 1.24.1

Prometheusのrateを理解する

背景 Prometheusでメトリクスを可視化する際にPromQLを使います。その中で最もよく使うのがrate()関数ですが、 window, interval, resolutionの違い irate()関数との違い など疑問に思ったので一度きちんと整理してみます。 環境 Prometheus v2.40.5 range v…

Kubernetesの初学者がlabelについて気になること

概要 ラベルという名前ゆえか若干軽視されがちですが、Kubernetesにおいてlabelはリソースを識別する上で非常に重要な要素です。 そのlabelについてKubernetesの初学者が気になる(自身も気になった)ことを挙げて行きます。 気になること Deploymentにあるl…

KubernetesのPodを安全に終了する

概要 KubernetesのPodを安全に終了する際に気をつけるべき事前知識と設定方法について説明します。 あらかじめまとめると 新規リクエストのルーティングがなくなるまでpreStopでPodのアプリケーションコンテナの終了開始を待たせる 既存リクエストが全て処理…

Envoyで重み付き負荷分散を試してみる

概要 christina04.hatenablog.com の中でconfig.route.v3.RouteActionに重み付き負荷分散(weighted load balancing)の設定がありました。 これを利用することで カナリアリリース リクエストのサンプリング 一部だけ詳細なログやstatsを出す Mountebankのよ…

EnvoyのVirtual hostを読み解く

概要 EnvoyのルーティングはListener > Network filter chain > HCM(HTTP connection manager)のVirtual Hostで適用されます。 設定の一部は配列で複数設定することができますが、ものによっては 一致率が高いものから順に適用する(完全一致→部分一致→ワイ…

RedisのLua Scriptを使う

概要 前回PipelineやMultiでは読み出したデータを意思決定に使えないという課題があり、代わりにWatchで楽観ロックを用いるという旨を説明しました。 christina04.hatenablog.com Lua Scriptを使えば楽観ロックを用いずとも上記の課題を解決することができま…

RedisのPipeline, Multi, Watchの区別

概要 RedisのPipeline, Multi, Watchの区別をする上であまりシーケンス図を用いた説明がなかったので図示してみました。 解説 Pipeline 課題 通常複数の処理を実行しようとすると以下のような流れになります。 シンプルではありますが都度サーバ通信が入ると…

スクリーンショットをYoinkに直接送る

背景 以前以下の対応を行いましたが、 christina04.hatenablog.com 最後に書いてあるようにある程度ファイルは小さくなったもののクリップボード経由だとまだまだ大きく、結局スクリーンショットを保存したディレクトリから貼り付ける習慣になってしまいまし…

CloudFrontのキャッシュのTTLをフローチャートにした

背景 CloudFrontにはキャッシュのTTLの設定値が3つあり、 Minimum TTL Default TTL Maximum TTL かつオリジンのヘッダーによって挙動が変わります。 docs.aws.amazon.com 久々に触ると忘れてしまうのでフローチャートにしてすぐ理解できるようにします。

ファイルディスクリプタ数の上限を変更

概要 Too many open files のエラーが出た際の対策として、ファイルディスクリプタの上限を変更することがあります。 方法として以下の4つがあります。 ulimitで変更する /etc/security/limits.confで設定する systemdのサービスの設定でLimitNOFILEを設定…

kubectl run --generator run-pod/v1 が使えなくなっていた

背景 Kubernetes上でサクッと動作検証でPodを立てたい時に kubectl run \ --generator run-pod/v1 \ --namespace $NAMESPACE \ --image google/cloud-sdk:alpine \ --rm -it gcloud-test とやりますが、今実行すると以下のようにエラーになります。 error: u…

重み付き乱択を行う

概要 重み付き乱択アルゴリズムは結果に偏りのある抽選で ソシャゲのガチャのようにレアリティによって出現確率を変えたい リクエストを重み付けして分散したり、A/Bテストで99:1のように振り分けたい といった用途で使えます。 今回はその説明と実装方法の…

FastAPIのメトリクスをマルチプロセスモードで収集する

背景 PythonはGILがあるためマルチコアの恩恵を受けづらいです。そのためGunicornのようなプロセスマネージャを利用してマルチプロセスで稼働させ、パフォーマンスを上げるといった手法があります。 しかしマルチプロセスにした場合、Prometheusのメトリクス…

DataflowのAvro to BigtableテンプレートでQuotaエラーが発生した場合の対応

概要 Bigtableのデータを他プロジェクトに移したい場合、公式のDataflowテンプレートを用いて以下の図のようにExport & Importできます。 しかしBigtableのデータが多すぎるとImportする際に、 Error message from worker: java.lang.IllegalArgumentExcepti…