Carpe Diem

備忘録

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

概要

Pull型の監視サービスであるPrometheusの使い方を説明します。

環境

  • Prometheus 2.11.1
  • Node exporter 0.18.1

アーキテクチャ

Prometheusのアーキテクチャはこの様になっています。

f:id:quoll00:20190715082527p:plain

ref: Overview | Prometheus

大まかな特徴としては以下です。

  • Pull型(over HTTP)の監視サービス
  • 独自のデータストアを持つ
  • PromQLという独自の柔軟なクエリを持つ
  • 監視対象ではexporter(マシンやコンテナのステータスを返す口)を用意して、PrometheusServerがPullする
  • アラートはAlertmanagerという別コンポーネントで対応
  • 可視化はGrafanaを使う
続きを読む

GPGでgitのcommitに署名する

概要

GitHubではMergeコミットなどで

f:id:quoll00:20190714123803p:plain

といったマークを見ます。これは署名されたcommitを示すものなのですが、

  • なぜ必要なのか
  • どうやったら署名できるのか

を今回説明します。

環境

  • macOS 10.14.5 Mojave
  • gpg 2.2.10

なぜ署名が必要か?

gitのコミットは

commit 91e8e61ee6601576e358201315b6624181529879 (HEAD -> refactor-chain, origin/refactor-chain)
Author: Junpei Tsuji <junpei.tsuji.ams@gmail.com>
Date:   Sun Jul 14 11:42:29 2019 +0900

    Fixed a bug

のようにAuther名やEmailが付きますが、これらは自分で設定可能です。
ということは他人の名前やEmailを設定してcommitすることもできるため、なりすましが可能です。

GitHub上ではcommitにそういったなりすましではないことを保証するための仕組みとして署名をしたらVerifiedマークが付くようになってます。

Signing commits - GitHub Help

続きを読む

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

概要

以前

christina04.hatenablog.com

にてgRPCのUnary Interceptorの基本的な使い方を説明しました。
このInterceptorを複数設定したい時に使われるのがgo-grpc-middlewareの出している

です。READMEにありますが、以下のように複数のInteceptorをセットできます。

import "github.com/grpc-ecosystem/go-grpc-middleware"

myServer := grpc.NewServer(
    grpc.StreamInterceptor(grpc_middleware.ChainStreamServer(
        grpc_ctxtags.StreamServerInterceptor(),
        grpc_opentracing.StreamServerInterceptor(),
        grpc_prometheus.StreamServerInterceptor,
        grpc_zap.StreamServerInterceptor(zapLogger),
        grpc_auth.StreamServerInterceptor(myAuthFunction),
        grpc_recovery.StreamServerInterceptor(),
    )),
    grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(
        grpc_ctxtags.UnaryServerInterceptor(),
        grpc_opentracing.UnaryServerInterceptor(),
        grpc_prometheus.UnaryServerInterceptor,
        grpc_zap.UnaryServerInterceptor(zapLogger),
        grpc_auth.UnaryServerInterceptor(myAuthFunction),
        grpc_recovery.UnaryServerInterceptor(),
    )),
)

ここで実行順序について疑問に思ったので確認してみました。

続きを読む

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

概要

オブジェクト指向についてClean Architectureでは

OOとは「ポリモーフィズムを使用することで、システムにあるすべてのソースコードの依存関係を絶対的に制御する能力」である。

これにより、アーキテクトは「プラグインアーキテクチャ」を作成できる。これは、上位レベルの方針を含んだモジュールを下位レベルの詳細を含んだモジュールから独立させることである

と説明されています。

このようにソフトウェアの拡張性を持たせるためにプラグイン機構を用意することは非常に大切です。

今回はhashicorpのgo-pluginを使って実現してみます。

プラグインの利用箇所

プラグイン機構にすることでメリットがありそうなケースってなんだろう?と思って簡単にいくつか挙げてみます。

こんなところでしょうか?
fluentdのようなETLツールはプラグイン開発が非常に活発ですね。
プラグイン機構にすることで自分は本体の堅牢さ・パフォーマンスに注力し、プラグイン開発は他の開発者に作ってもらってスピード開発といった両立が可能になります。

続きを読む

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

概要

Go言語のuuid生成で有名な satori/go.uuidこちらのコミットでUUIDv4を生成する際にエラーを返すように変わりました。
理由は

github.com

このissueに対応するためなのですが、内部で使っているrand.Read()はそもそもどんな時にエラーが起きるのだろう?と気になって調べてみました。

環境

続きを読む

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

概要

Kubernetesを利用する上であったら便利なツールの紹介です。

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.memory

ref: Resource Management for Pods and Containers | Kubernetes

cpu: 1cpu:2といった整数値はイメージが湧きやすいですが、

  • cpu: 100mといった時にどういう動きをするのか?
  • マルチコアのノード環境で↑の時、アプリケーションコードでマルチコア前提のものはきちんと動くのだろうか?

という疑問があったので調べてみました。

環境

続きを読む