Carpe Diem

備忘録

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

Prometheus の基本的な使い方【Grafana】

概要 christina04.hatenablog.com の続きです。 今回はGrafanaを使ってメトリクスの可視化をします。 環境 Ubuntu 18.04 Prometheus 2.11.1 Grafana 6.2.5 構成 引き続きVMで行います。 VM名 IP Prometheus 192.168.33.10 Node 192.168.33.11 Grafana 192.16…

Prometheus の基本的な使い方【Node exporter】

概要 Pull型の監視サービスであるPrometheusの使い方を説明します。 環境 Prometheus 2.11.1 Node exporter 0.18.1 アーキテクチャ Prometheusのアーキテクチャはこの様になっています。 ref: Overview | Prometheus 大まかな特徴としては以下です。 Pull型(…

GPGでgitのcommitに署名する

概要 GitHubではMergeコミットなどで といったマークを見ます。これは署名されたcommitを示すものなのですが、 なぜ必要なのか どうやったら署名できるのか を今回説明します。 環境 macOS 10.14.5 Mojave gpg 2.2.10 なぜ署名が必要か? gitのコミットは co…

gRPC Unary Interceptorを複数設定した時の実行順序

概要 以前 christina04.hatenablog.com にてgRPCのUnary Interceptorの基本的な使い方を説明しました。 このInterceptorを複数設定したい時に使われるのがgo-grpc-middlewareの出している ChainUnaryServer ChainUnaryClient です。READMEにありますが、以下…

Go言語でプラグイン機構【RPC編】

概要 オブジェクト指向についてClean Architectureでは OOとは「ポリモーフィズムを使用することで、システムにあるすべてのソースコードの依存関係を絶対的に制御する能力」である。 これにより、アーキテクトは「プラグインアーキテクチャ」を作成できる。…

rand.Readerはいつエラーを返すのか

概要 Go言語のuuid生成で有名な satori/go.uuid はこちらのコミットでUUIDv4を生成する際にエラーを返すように変わりました。 理由は github.com このissueに対応するためなのですが、内部で使っているrand.Read()はそもそもどんな時にエラーが起きるのだろ…

Kubernetesを扱う上で便利なツール

概要 Kubernetesを利用する上であったら便利なツールの紹介です。 stern kubectx kubens kube-tmux stern podのログを簡単に取れるツールです。 github.com インストール $ brew install stern

Kubernetesのresource requests, limits

概要 Kubernetesには以下のフィールドでCPUやメモリを制限することが可能です。 spec.containers[].resources.limits.cpu spec.containers[].resources.limits.memory spec.containers[].resources.requests.cpu spec.containers[].resources.requests.memor…

Google Cloud Pub/SubでPush(Webhook)型のSubscriptionを設定するにはドメイン認証が必要

概要 タイトルの通りなのですが日本語記事がなかったのでまとめておきます。 経緯 developers.cyberagent.co.jp の対応でGooglePlayの定期購読ユーザの購読状態をリアルタイムに更新するため、Real-time developer notificationsを導入しました。 その際Pub/…

EmbulkでMongoDBのデータをBigQueryへ

概要 ユーザの行動ログで利用しているデータがDBにあるので、それをまるっとBigQueryへ書き込む方法をEmbulkを使って説明します。 BigQueryにマスタデータを保存する理由は? 単純に行動ログに保存される関連データがIDのみで保存されていると、詳細が知りた…

Embulkの基本的な使い方

Embulkとは fluentdのバッチ版のようなツールで、データを一括転送したい時に利用します。 ref: GitHub - embulk/embulk: Embulk: Pluggable Bulk Data Loader. メリット 自前で実装すると面倒な 並列実行でパフォーマンスの最適化 validation dry-run エラ…

Goの実プロジェクトでのエラーハンドリングの悩みどころと解決案

概要 Go言語に限らずではありますが レイヤ間のエラー伝搬 外部APIを叩いた時のエラーコードハンドリング HTTPやgRPCとしてレスポンスを返す時のエラーハンドリング で悩むことは多いと思います。 今回はそれの1つの方針を紹介します。 課題 レイヤ間のエラ…

singleflight でキャッシュのOriginへのリクエストを抑制

Go

概要 Goにはsingleflightという重複した関数呼び出しを抑制する仕組みがあります。 例えばキャッシュが切れた時にOriginへのアクセスが並行して走ってしまう(Cache Stampede)ケースでサーバやDBがスローダウンする問題がありますが、こういった時にsinglefli…

Datadog SyntheticsでSSL/TLS証明書の期限チェック

概要 少し前にリリースされたDatadog Syntheticsですが、いつの間にかTLS証明書の期限チェックもできるようになったので紹介です。 Datadog Syntheticsって? 外形監視ができるDatadogの機能です。 後ほど設定にでてきますが、世界7箇所からチェックが可能で…

ConsulのACLでハマった話2

概要 以前 christina04.hatenablog.com という記事を書きましたが、また別のケースでハマった話を書きます。 今回はACLを有効にしたConsulクラスタのサーバをアップグレードしようとしたら Error joining address 'xxx.xxx.xxx.xxx': Unexpected response co…

ECSとFargateでコンテナの起動順が制御できるようになりました

概要 先日AWSの発表で aws.amazon.com と、コンテナの依存関係が制御できると発表がありました。 何が嬉しいかというと、サイドカー系コンテナに依存している場合アプリケーション側でそのコンテナの起動を待つ処理が必要だったのが、不要になるという点です…

Clean Architecture で実装するときに知っておきたかったこと

概要 developers.cyberagent.co.jp こちらで 課金システムをマイクロサービス化した サービス自体の設計をDDDにした という対応をしました。 当時は試行錯誤の連続でしたが対応から1年程経ち、ある程度設計もfixされてきたので知見をまとめます。

MongoDBでJumboフラグのついたチャンクの分割

概要 シャード構成のMongoDBがチャンクの分割に失敗し、一定サイズを超えるとjumboというフラグが付きます。 普通の環境ではそうそう起きませんが、大量のドキュメントを扱っているとたまに発生します。 今回はそれの解消方法を紹介します。 環境 MongoDB 3.…

npm install する時のnpmのバージョンを固定する方法

概要 npmのバージョンを上げた(v6.x.x)ところ、以下のissueと同じケースに当たってCircleCIのキャッシュが効かない問題が起きました。 github.com 具体的には 開発ではMacを使用している 開発用MacとCircleCIのNode.js、npmバージョンは同一である CircleCI…

Angular のバンドルファイルのサイズを可視化

概要 Angular CLIはTree Shakingだったりbuild-optimizerなど、それだけである程度最適化する事が可能ですが、一方で外部ライブラリなどはどれくらいファイルがあるか見落としがちです。 今回はそういったものを可視化する方法を紹介します。 環境 Angular 7…

context.WithCancel, WithTimeout で知っておいた方が良いこと

Go

概要 christina04.hatenablog.com でも話したcontext.Contextはタイムアウト、キャンセルなどのハンドリングができて便利ですが、使う際に知っておいた方が良いことをいくつかまとめました。 環境 golang 1.12.0 Tips Q. 親・子の両方でWithTimeoutが設定さ…

gRPC の Unary Interceptor の基本的な使い方

概要 gRPCのInterceptorのClient側、Server側の基本的な使い方を紹介します。 環境 golang 1.12.0 grpc 1.18.0 Interceptorの種類 以下の4つがあります。今回はUnaryの方の使い方を説明します。 サーバサイド UnaryServerInterceptor StreamServerIntercept…

Multi Match Queryのtypeの違い

概要 以前Bool Query と Dis Max Query の違いについて書きました。 今回はその中で出てきたMulti Match Queryのtypeの違いについて書きます。 どれも複数のフィールドに対して実行するクエリですが、それぞれ用途が異なります。 環境 Elasticsearch 6.6.0 …

ALBのアクセスログをAthenaで分析

概要 AthenaでALBのアクセスログの分析が非常に簡単にできるので、設定方法とよく使うクエリを紹介します。 手順 ALBアクセスログをS3に保存 新規バケットを同時に作成する場合 バケットポリシーが自動で設定されるので楽なやり方です。 ELBの属性の編集でチ…

gRPCで大きなファイルのやり取りをする

概要 gRPCで4MB以上のデータ転送をしようとすると rpc error: code = ResourceExhausted desc = grpc: received message larger than max (xxxxxxx vs. 4194304) のようなエラーが出ます。この上限はデフォルト値なのでgrpc.MaxRecvMsgSize()やgrpc.MaxCallS…

Circusを使ってgraceful restart

概要 Nginx + GoのApp という構成をとっている時に、単純にデプロイでGoだけ更新するとNginxからは [error] 1413#1413: *1 connect() failed (111: Connection refused) [error] 1412#1412: *3 connect() failed (111: Connection refused) [error] 1412#141…

.proto ファイルの整形に clang-format を使う

概要 gRPCで通信しようとすると.protoファイルが沢山出てきます。 ただ人によってインデントが異なったりするのは良くないので、何かしらformatterが無いかなと探したら github.com こちらのissueで「Googleではclang-formatを使ってるよ」という回答があっ…

VPN接続するとどうして別ネットワークにアクセスできるのか

概要 VPNサーバをAWSに置くことで内部ネットワークに外部からアクセスする手法がありますが、どうしてそれができるのかを知りたくなって調べてみました。 環境 VPNサーバ Ubuntu v18.04 pritunl v1.29.1958.76 クライアント macOS Mojave 10.14.2 ネットワー…

CircleCI 2.1 でconfigの記述をシンプルにする

概要 christina04.hatenablog.com でCircleCIの使い方を説明しましたが、2.1からconfigの記述がよりシンプルになりましたので説明します。 環境 CircleCI 2.1 設定 CircleCI側 まずはAdvanced Settingsで2.1の機能が使えるようにします。 古いプロジェクトだ…

goroutineでのpanicのハンドリング その2

Go

概要 christina04.hatenablog.com で書いていなかったことの追加です。 環境 golang 1.11.4 recoverしたあとのエラーハンドリングをどうするか panicをrecoverしたものはいいものの、 func f() { defer func() { if r := recover(); r != nil { fmt.Println(…