投稿

OpenTelemetry 互換の Observability 基盤比較検討

Cloud Monitoring に雑に Open Telemetry Metric を流したらコストが大爆発したので移行先を探し中. Observability 系の SaaS はどれもコストが大きいので、できれば OSS のものを使いたい. | 名前 | URL | GitHub | サポート | LICENSE | 備考 | 調査日 | | --- | --- | --- | --- | --- | --- | --- | | Cloud Operations Suite | https://cloud.google.com/products/operations | - | Trace,Metric,Log | プロプライエタリ | コスト高 | 2023/06/27 | | DataDog | https://www.datadoghq.com/ja/ | - | Trace,Metric,Log | プロプライエタリ | コスト高 | 2023/06/27 | | OpenObserve | https://openobserve.ai/ | https://github.com/openobserve/openobserve | Trace,Metric | Apache-2.0 license | 調査中 | 2023/06/27 | | Uptrace | https://uptrace.dev/ | https://github.com/uptrace/uptrace | Trace,Metric,Log | Business Source License 1.1,Apache-2.0 license | 調査中 | 2023/06/27 | | SigNoz | https://signoz.io/ | https://github.com/signoz/signoz | Trace,Metric,Log | MIT Expat,The SigNoz Enterprise license | 調査中 | 2023/06/27 |

zap で field 内容の書き換え (センシティブな値をマスクするなど)

自前で Encoder を実装ればいいっぽい. こちらを参照. ref. https://stackoverflow.com/questions/73469128/hide-sensitive-fields-in-uber-zap-go

AWS Lambda の出力するログを tail -f したい

基本形は `aws logs tail --follow` でそこから適当に変える. ```bash aws-vault exec $AWS_PROFILE -- aws logs tail --follow --since 1s /aws/lambda/$LAMBDA_FUNCTION_NAME ```

arm64 Mac で pod install 時の ffi の mach-o file, but is an incompatible architecture (have (arm64), need (x86_64))

## TL:DR arm64 Darwin で `flutter run` 時 (の `pod install` 時) に `mach-o file, but is an incompatible architecture (have (arm64), need (x86_64))` と言われたので、以下を実行したら解決した。 ```bash sudo arch -x86_64 gem install ffi ``` ## エラー全文 ``` $ flutter run Launching lib/main.dart on iPhone SE (3rd generation) in debug mode... Running pod install... 1,329ms CocoaPods' output: ↳ Preparing Analyzing dependencies Inspecting targets to integrate Using `ARCHS` setting to build architectures of target `Pods-Runner`: (``) Finding Podfile changes - Flutter - adjust_sdk - firebase_analytics - firebase_core - firebase_messaging - flutter_apns_only - flutter_facebook_auth - flutter_image_compress - flutter_inapp_purchase - flutter_inappwebview - google_sign_in - image_cropper - image_gallery_saver - image_picker - in_app_review - media_info

AWS アカウントを作成したらまず実行するスクリプト

## まえがき サインアップした直後の AWS アカウントに、毎アカウントでコンソールから同じセットアップをポチポチ繰り返すのが面倒くさすぎたので、備忘録を兼ねてスクリプトに書き起こしました。 ## [aws-tools.sh/setup.sh](https://github.com/ginokent/aws-tools.sh) サインアップした直後 (Terraform などを導入する以前) の素の AWS アカウントに、必要最低限の IAM ポリシーや Switch Role 用ロール、 Terraform Backend 用 S3 バケットなどを追加するためのスクリプト `setup.sh` を作成しました。 AWS Cloud Shell から実行すると Access Key のセットアップが不要で非常に簡単です。 **🚧 注意 🚧** 想定しているシナリオ上、 AWS アカウントの root ユーザーで実行することになるので、実行前に絶対に md5 で同一性の確認を行ってください。 以下のように実行されることを想定しています。 ```bash # download setup.sh curl --tlsv1.2 -LRSs https://raw.githubusercontent.com/ginokent/aws-tools.sh/HEAD/setup.sh -o ./setup.sh # (STRONGLY RECOMMEND) check md5 checksum md5 -q ./setup.sh curl --tlsv1.2 -LRSs https://raw.githubusercontent.com/ginokent/aws-tools.sh/HEAD/setup.sh.md5 # run setup.sh chmod +x ./setup.sh ./setup.sh ``` 2022-09-19 時点でのスクリプト本体は以下。 https://github.com/ginokent/aws-tools.sh/blob/673e5cba1c178636016c28295cbf327c46ad0506/setup.sh ```bash #!/usr/bin/env bash set -E

kubectl で言うこの操作を Fargate でしたいコマンド集

## まえがき Fargate を使っていて「 kubectl で言うところのこの操作をしたいな〜」と思ったときに見ると幸せになれるかもしれないページです。備忘録です。随時更新していきます。 ## kubectl exec のように Fargate のコンテナに ECS Exec でログインする `kubectl exec -it deployment.apps/myapp -- /bin/sh` に準ずることをしたい時に使うコマンドです。 [ECS Exec](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/ecs-exec.html) を用いてコンテナにログインします。 ```bash # 変数を定義 export AWS_REGION=ap-northeast-1 export ECS_CLUSTER=mycluster export ECS_CONTAINER=myapp aws --region ${AWS_REGION} ecs execute-command --cluster ${ECS_CLUSTER} --task $(aws --region ${AWS_REGION} ecs list-tasks --cluster ${ECS_CLUSTER} --desired-status RUNNING --query 'taskArns[0]' --output text) --container ${ECS_CONTAINER} --interactive --command /bin/sh ``` (長すぎ) ## kubectl set image のように Fargate Task Definition に特定イメージを設定する `kubectl set image deployment.apps/myapp myapp=ghcr.io/myorg/myapp:v1.0.0` に準ずることをしたい時に使うコマンドです。 ```bash # 変数を定義 export AWS_REGION=ap-northeast-1 export ECS_CLUSTER=mycluster export ECS_SERVIC

docker exec や kubectl exec して入ったコンテナに ps コマンドがインストールされていない時に使う代替コマンド

## まえがき docker exec や kubectl exec して入ったコンテナに ps コマンドがインストールされていないことってありますよね。 ```console $ ps -ef bash: ps: command not found ``` 僕はよくあります。 (そして大抵なんらかのトラブルに追われています) おもむろに `apt-get update -qqy && apt-get install -qqy procps` しても、 ```console $ apt-get update -qqy && apt-get install -qqy procps E: List directory /var/lib/apt/lists/partial is missing. - Acquire (13: Permission denied) ``` 無慈悲の `Permission denied` を食らいます。 [Best practices for writing Dockerfiles#USER](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user) を実践していて大変偉いですね。 こまった。 そんな時に使う代替コマンド (ワンライナー) をご紹介します。 # ps コマンドの代替ワンライナー ```sh ps_sh() { _piddirs=$(find /proc -maxdepth 1 -type d -name "[0-9]*"); printf "UID\tPID\tPPID\tCMD\n"; echo "$_piddirs" | sed s@/proc/@@ | while read -r PID; do if [ -d "/proc/$PID" ]; then printf "%s\t%d\t%d\t%s\n" "$(stat -c "%U" "/proc/$PID")" &qu

MySQL の general_log や slow_query_log を docker compose logs から見えるようにしたい

## TL;DR 1. general_log や slow_query_log を任意の docker volume 上のファイルに出力します。 2. volume を共有するコンテナを別途用意し、そのコンテナからログファイルを `tail -f` します。 3. `tail -f` コンテナを経由して、 general_log や slow_query_log の内容が docker compose logs に流れます。 4. おわり。 具体的な `docker-compose.yml` を以下に例示します。 ```yml version: '3.8' services: mysql: image: "mysql:8.0" ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: root volumes: - mysql_volume:/var/lib/mysql command: - --general-log=true # (1). ここで指定したログファイルを - --general-log-file=/var/lib/mysql/general.log - --slow-query-log=true - --slow-query-log-file=/var/lib/mysql/slow.log mysql_general_log: image: "debian" volumes: # (2). volume で共有して - mysql_volume:/var/lib/mysql command: | # (3). 別コンテナから tail -f する tail -f /var/lib/mysql/general.log mysql_slow_log: image: "debian" volumes: - mysql_volume:/var/

terraform / packer / kubectl などのコマンドラインツールのバージョンを環境変数から指定できるラッパーコマンド versenv を作った

## まえがき 複数のプロジェクトにまたがって DevOps していると、以下のような状況によく出くわします。 - プロジェクト A は Kubernetes 1.23 使ってるけど、プロジェクト B はまだ 1.19 使ってる - プロジェクト A は Terraform 1.2.5 使ってるけど、プロジェクト B はまだ 0.15.5 使ってる - A は eksctl 0.107.0 使ってるけど、 B はまだ 0.91.0 使ってる - Helm が… - Packer が… このような状況に苦労せず対処できるように、 versenv というツールを作りました。 ## versenv とは > https://github.com/versenv/versenv > versenv/versenv: versenv is a set of wrapper scripts to simplify the installation and versioning of executables such as kubectl, Terraform and Packer. [versenv](https://github.com/versenv/versenv) は、 terraform / packer / kubectl などのコマンドラインツールのバージョンを環境変数から指定できるラッパースクリプト集です。 例えば terraform 1.0.2 と 1.2.6 を切り替えたい場合、以下だけでそれが可能です。 ```console $ # terraform 用 versenv スクリプトをダウンロード $ curl --tlsv1.2 -#fLR https://raw.githubusercontent.com/versenv/versenv/HEAD/bin/terraform -o ./terraform && chmod +x ./terraform $ # terraform v1.0.2 を実行 $ TERRAFORM_VERSION=1.0.2 ./terraform version Terraform v1.0.2 on darwin_arm64 $ # terraform v1.

備忘録: M2 MacBook Air (arm64) に Flutter を入れる

## まえがき 単に自分用に情報をまとめたかった。備忘録です。 ## Flutter をインストール 今回は asdf でインストールします。 ```console $ # asdf で Flutter プラグインをインストール $ asdf plugin add flutter $ # インストール可能なバージョンを列挙 $ asdf list all flutter $ # 最新の安定版をインストール $ asdf install flutter latest $ # インストールされた Flutter を確認 $ flutter --version Flutter 3.0.5 • channel stable • https://github.com/flutter/flutter.git Framework • revision f1875d570e (4 weeks ago) • 2022-07-13 11:24:16 -0700 Engine • revision e85ea0e79c Tools • Dart 2.17.6 • DevTools 2.12.2 ``` この時点で `flutter doctor --android-licenses` すると以下みたいなこと言われる気がするので Android Studio をインストールします。 ```console $ flutter doctor --android-licenses Android sdkmanager not found. Update to the latest Android SDK and ensure that the cmdline-tools are installed to resolve this. ``` (もうちょっと別のエラー文言だった気がするけどログを失ってしまいました) ## Android Studio のインストール 今回は JetBrains Toolbox 経由でインストールします。 ```console $ # JetBrains Toolbox をインストール $ brew install --cask jetbrains-toolbox ``` JetBrains Toolbox を起動し、

Blogger の記事を Markdown で書けるようにテーマを改修

## 経緯 前記事で以下のようなことを言いました。 > [Hello, World! - ginokent (tech)? blog](https://ginokent.blogspot.com/2022/08/20220806-01-hello-world.html) > > 頑張って Markdown エディタとか使うより気合で HTML マークアップした方が楽そう 全くもってそんなことはなかった。 素の HTML はつらい。なめてました。 2 記事目にしてマークダウンで書きたくなってしまったので、書けるように改造しました。 ## テンプレートテーマを改造 Blogger Template テーマの HTML の body の閉じタグの直前に以下を記載します。 `<markdownContent>` タグの中身をマークダウンとして parse して、そのコンテンツを追加しています。 ```html <!-- NOTE: </body> の直前に書く --> <script src="//cdnjs.cloudflare.com/ajax/libs/marked/4.0.18/marked.min.js"></script> <script> document.querySelectorAll('markdownContent').forEach(e => { e.insertAdjacentHTML('afterend', marked.parse(e.textContent)); e.remove(); }); </script> ``` あとは、 Blogger の HTML エディタから以下のようにマークダウンを記述するだけです。 ```html <markdownContent> # ここにマークダウンを記述 </markdownContent> ``` 簡単! ## マークダウン render 結果例 (注) HTML タグを Markdown 文中に書きたい場合はエスケープする必要あり。例: <kbd

Hello, World!

経緯 色々書きたくなったのでブログを開設することにしました。 なんとなく日々のハマリどころとかを書き連ねていけたらいいな〜くらいに考えています。 以下は Blogger の書き心地に慣れたり、 Blogger のテーマ?テンプレート?を見比べたりするためのサンドボックスです。何の意味もありません。 h タグのサンプル これは h1 タグのサンプルです どう考えてもデカすぎる。普段遣いするには向いていない これは h2 タグのサンプルです これもかなり大きい…タイトルと同じくらいの大きさ。このあたりを小見出しに使うべきか。 これは h3 タグのサンプルです フォントサイズと margin がだいたい同じ大きさのため、なんだか変に見える。 小見出しの中で更に分けたい時に使うのが良さそう…? これは p タグ [1/2] 中の文章です。極めて平易な文章が記載されていますが、これは日本人であれば誰でも読むことができる極めて平易な文章と言って差し支えないでしょう。 これは p タグ [2/2] 中の文章です。一切何についても言及されていない無意味な文章が記載されているため、これを読む必要は誰にとっても無いことは明らかでしょう。 コードブロックのサンプル こんな感じになるらしい。 package main import "fmt" func main() { fmt.Println("Hello, World!") } よさそう。 結論 最低限の使い勝手は担保できそう。 なんか頑張って Markdown エディタとか使うより気合で HTML マークアップした方が楽そう。