Carpe Diem

備忘録

Prometheus でAPIサーバの監視【gRPC】

概要 前回はHTTPのAPIサーバの監視の仕方を説明しました。 christina04.hatenablog.com 今回はgRPCでのメトリクスの作り方を説明します。 環境 Prometheus 2.11.1 Golang 1.12.7 Grafana 6.2.5 prometheus/client_golang 1.0.0 go-grpc-prometheus 1.2.0 メ…

Prometheus でAPIサーバの監視【HTTP】

概要 前回は既存のexporterを利用せず、自分でメトリクスを生成する方法を説明しました。 christina04.hatenablog.com その方法を使って実際にAPIサーバ(HTTP)のメトリクスを生成し、可視化してみます。 環境 Ubuntu 18.04 Prometheus 2.11.1 Golang 1.12.7 …

Prometheus で独自メトリクスを用意する

概要 Metric types | Prometheus で定義されているようにPrometheusでは大きく4つのメトリクスタイプがあります。 Counter Gauge Summary Histogram 今回は各メトリクスを独自で用意する方法を説明します。 環境 Prometheus 2.11.1 Golang 1.12.7 expose ま…

Grafanaのパネルの作り方

概要 Prometheus + GrafanaではPromQLを使って柔軟なパネルが作成できる一方、作り方が複雑になりがちです。 今回は基本的なパネルの作り方を説明します。 環境 Grafana 6.2.5 Prometheus 2.11.1 パネル Grafanaのダッシュボードのパネルは大きく10あります…

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はいつエラーを返すのか

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

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

概要 Kubernetesを利用する上であったら便利なツールの紹介です。 stern kubectx kubens 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の実プロジェクトでのエラーハンドリングの悩みどころと解決案

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

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

Go

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

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) のようなエラーが出ます。この上限はデフォルト値なので変更することもできるのですが、ドキュ…

Circusを使ってgraceful restart

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