生涯未熟

生涯未熟

プログラミングをちょこちょこと。

ghでvimを使いたい

Githubからコマンドラインツールが登場しましたね。

www.publickey1.jp

READMEを読むと

For many years, hub was the unofficial GitHub CLI tool.

とあるように、既にあったhubは非公式ツールだったのね、など驚きがありつつ触ってみました。

今の所、ベータ版ではあるので出来ることはissue, prを作ったり眺めたり程度なのですが、ghのissueを覗くと「これ実装しなきゃね〜」みたいな話がチラホラあったりするので、気になる方はプロポーザルしてみたり覗いたりしてみるといいかも。

ということで、触ってみたところ gh pr create でprを作成出来るのですが本文を記述するエディタがデフォルトでnanoになっていました。

f:id:syossan:20200217085805p:plain

vimに慣れきった人間としてはvimで編集したい気持ちが一杯なので、エディタを変更してみることに。

github.com

↑ちょうど良くその手の話がされていたので、読んでみると以下のいずれかの環境変数を弄ることでデフォルトエディタを変更出来るという。

export GIT_EDITOR=vim
export VISUAL=vim
export EDITOR=vim

で、改めて実行してみると

f:id:syossan:20200217090152p:plain

おー、たしかに変わっとる。
というわけで困ってる方は参考にしてみてください〜。

勉強会の主催をやりません

Goに関連した勉強会をやっておりましたが、今後主催者として開催はしません。

理由として、勉強会でのいざこざにより心を病んでしまったことと、自分がやらなくてもGoに関する勉強会が増えたので必要無くなったかな?と思ったからです。

元々がもう少し多くの勉強会があった方が界隈が盛り上がるのかなという目論見からやり始めましたが、色々なところで勉強会開催されるようになりましたし、界隈としても十分盛り上がっているので存在意義が無くなりました。個人的にモチベーションも無くなりました。

精神が安定してきたので一応正式に今後の方針を述べさせて頂きました。 万が一開催を期待されている方がいたとしたら申し訳ありません。

Telegrafを用いたElastic Beanstalk環境のEC2インスタンスにあるDockerコンテナの監視

5ヶ月ぶりです。人生ですね。

Telegrafを使った監視をやってみたので、備忘録として残しておきます。

What is Telegraf

InfluxData社が作成したメトリクス集計、レポーティングツールになります。

github.com

構造として、

  1. インプット:メトリクスの集計先
  2. プロセッサー:集計したメトリクスの加工
  3. アグリゲーター: メトリクスから集計(最大、最小、平均 etc...)
  4. アウトプット:メトリクスの送信先

の4種類のプラグインで成り立っており、それぞれのプラグインの設定を記述して動かすことになります。
READMEに載っているプラグイン一覧を見ていただければ分かるのですが、凄い数のプラグインがあります。
無かったらGoで作ってPRを送りましょう。

概ね良いツールではあるのですが、如何せん設定周りの記述で分かりづらいところもあるので、以下のドキュメント集はさっくり見ておくことをオススメします。
(CONFIGRATION.mdだけでも読みましょう。筆者は読まなかったことでMetrics Filteringの存在に気付かず、痛く後悔をしました)

やりたい

こんな感じでメトリクスを集計・送信したいという願望図

f:id:syossan:20191219124249p:plain

やる

やっていきます。

まぁそんなにやることはなくて、手順としては

  • Telegrafのconfig fileを吟味する
  • .ebextensions でElastic Beanstalkに建てられるEC2インスタンス設定を弄る
    1. Telegrafをインストール
    2. Telegraf config fileを作成
    3. Telegrafを実行

てな流れになります。

Telegrafのconfig fileを吟味する

まずはTelegrafのデフォルトのconfig fileを見ていきましょう・・・ってのをやりたいのですが、6200行近くあるので必要なプラグインのみ記述されているconfig fileを出力しましょう。

$ telegraf --input-filter docker --output-filter cloudwatch config > ./telegraf.config

で、これでも600行近くあるので必要な部分をつまみ食いしたconfigを見てみましょう。

設定の意味合いとかを日本語で簡単に書きました。
特にこだわりなければデフォルトでもメトリクス吐いてくれますが、メトリクスを絞り込まなければかなりの量のカスタムメトリクスが生成されてしまうので注意しましょう。(カスタムメトリクスは即時削除できず、保有期間を過ぎるのを待たないといけない)
どのようなメトリクスが吐かれるのか知りたい場合は、 --test オプションを使って標準出力に吐いてみましょう。

また、各プラグインの詳細説明はREADMEにあるプラグイン一覧からリンクで飛べるため、使用する前に目を通しておくのをオススメします。
例えばDockerプラグインだと集計するメトリクスが書いてあったりするので、それを見ながらメトリクスフィルタリングすると良いでしょう。

メトリクスフィルタリング?

メトリクスを必要な分だけ絞り込む際に使うやつです。
基本的にどのプラグインでも使える設定値で、詳しくは以下参照。

https://github.com/influxdata/telegraf/blob/master/docs/CONFIGURATION.md#metric-filtering

例えば、Dockerからメモリ使用量・使用率しか集計したくない!って場合は、 [[inputs.docker]] に以下のような設定を記述することで実現できます。

[[inputs.docker]]
  namepass = ["docker_container_mem"]
  fieldpass = ["usage_percent", "usage"]

特にCloudWatchのようなクラウド環境に送る際に、不要なメトリクスを送ってしまうと無駄なコストが掛かってしまうのでメトリクスフィルタリングを是非活用したいですね。


また、今回のようにElastic Beanstalk環境でやる際には、 container_name_excludeecs-agent を追加しておくのが良いでしょう。特に見る必要のないコンテナなので・・・

というわけで、脳死でやりたいならデフォルトでも良いですが、変なことにならないよう諸々設定しておきましょうという話でした。

.ebextensions でElastic Beanstalkに建てられるEC2インスタンス設定を弄る

Elastic Beanstalkには .ebextensions という、EC2インスタンスが生成される際に走る設定があります。
今回はここにtelegrafのインストール・設定ファイルの生成・telegrafの実行、という3つの設定を書いていきましょう。

.ebextensionsの注意

地味に引っかかりそうなところなんですが、 .ebextensions はファイル名のアルファベット順に実行されますので注意してください。
例えば、

.ebextensions
  - install-telegraf.config
  - exec-telegraf.config

といったファイルがあった場合、予想に反して exec-telegraf.config から実行されてFailしてしまうので、 00.install-telegraf.config などファイル名の先頭に数字を付けておくと安全です。

telegrafのインストール

こちらが設定例になります。
yumのrepoを生成し、インストールしている簡単なものになります。

注意点として、インスタンスAmazon Linuxを使っている場合には baseurl を公式のインストールマニュアルにあるように https://repos.influxdata.com/rhel/$releasever/$basearch/stable とすると404エラーが発生するので、上記のようにしておきましょう。

Telegraf config fileを作成

config fileを /etc/telegraf/telegraf.conf に生成しています。

ここは content の部分が各々変わってくるところかなと。

Telegrafを実行

最後にTelegrafを実行しましょう。

これでデプロイ時に上手くtelegrafが動いて、CloudWatchにメトリクスが集計されるようになります。

おわり

という感じで簡単にTelegrafの使用例を書いてみました。
日本語でのTelegrafに関する記事が少なかったので、増やす意味で書きましたが参考にされる方が一人でもいれば幸いです。

このようにプラグインの設定をザッと書くだけで監視環境が整うのは、とても楽で良いですね。
他にもこんなツールは良いよ!というのがあれば是非教えて下さい🙇

MD650LにKarabinerでアンダースコアを割り当てる

地味に困ったのでメモ代わりに書いておく。

MD650Lを日本語配列で使っているとアンダースコアが打てなくて困ることがありました。
Karabinerで上手いことキー割り当てたらええかーと思ったのですが、どのキーを割り当てたらいいのか分からず・・・

f:id:syossan:20190728000017p:plain
どれやねん

で、アレコレ試行錯誤した結果この「international1」ってのがアンダースコアに該当するキーのようで、右のAltに割り当てることで事なきを得ました。
いやー、これは分からん😇

f:id:syossan:20190728000241p:plain
わからん

Protocol Buffersにclang-formatをかけるとインデント崩れを起こすパターンがある

Protocol Buffersをシコシコ使ってるんですが、clang-formatをかけると具合の悪くなるパターンを発見したのでメモ。

ちなみに一応書いときますがclang-formatはProtocol Buffersをサポートしてます。

github.com

どういうパターン?

例えばこういうパターンです。

これに対してclang-formatをかけると・・・

🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔

なんでこうなるの?

調べたけどソースコード読むのダルくてわからん。
ただLLVMのbug reportはされているみたいなので、バグという認識をしている人はちゃんといるっぽい。

bugs.llvm.org

応急措置

このままじゃ困るので一旦の応急措置。

はい。微妙な違いなのですがoption内でセミコロンを使わないってことをしています。
こうするとclang-formatをかけても・・・

schema のところがちょっと変わっちゃいましたが、まぁ概ね問題無しですね。

まとめ

というわけで、clang-formatでインデント崩れ起こしちゃうパターンがあるよという話でした。
まぁバグっぽい挙動なので直るのを粛々と待つしかないですね・・・