コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

サーバサイド開発におけるリリース後の重点監視に関してざっと書く

あんまり明文化されないけどみんなやってるよね系シリーズ

サーバサイド開発におけるリリース作業とリリース後重点監視

開発を重ねてきた機能をリリースを迎えるとき、リリース前までにある程度のテスト工程を行ってくるものの、本番で実際にやってみたときに何かが起きることというのはままある。そういうときに異変にすぐに気づく、対処するための方法としてリリース後重点監視がある。

リリース後重点監視とは

今回取り上げるリリース後重点監視とは、主に以下のような事柄をすることで異常検知の精度をあげるための振る舞いのことを指す。

  • アプリケーションのログで異常な値や、異常を知らせるログが出力されていないか
  • nginxやApacheのログで、20x系ではない50x系のログが出力されていないか
  • Nagiosやサーバーリソースの監視ツールが異常な値を出していないか

重点監視をすると嬉しいこと

主に嬉しいポイントは以下のようなこと

  • 本番の状態(データや周りの連携サービス)と組み合わせたときに発生するバグを検知することができる
  • 本番のアクセスに乗ることでパフォーマンス劣化などをした場合に、その劣化にいち早く気づくことができる
  • リリース後すぐに検知ができれば、プロダクトとして大きな損失をする前に切り戻しをするかなどの判断ができるため、対処の選択肢を可能な限り最大化できる

関連リンク

nginxを通して1MB以上のファイルをPOSTしたい場合はちゃんと最大サイズをclient_max_body_sizeに設定する

そんなデフォルト値あるんかいなという

環境

$ nginx -v
nginx version: nginx/1.15.12

記述例

serverのところに追加したいサイズを記述する、以下は100MBまで許可したい場合。

server {
  client_max_body_size 100m;
}

デフォルト値などの情報

ドキュメントにデフォルト値が示されており

Syntax: client_max_body_size size; Default: client_max_body_size 1m; Context: http, server, location

上記のとおり未指定だと client_max_body_size 1m; が記述されているのと同等になり、1MBまでしか許容されておらず、それをオーバーすると怒られる。

参考リンク

BOM付きのCSVをRubyのCSVクラスでreadする

header:true しようとしたらできなかったのでそのメモ

環境

$ ruby -v
ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-darwin18]

どういうことか

BOM付きのファイルを CSV クラスで読み込むと、先頭行にBOMの情報がついてしまう。そのため、headerのオプションを指定しても、そのheader名で値が取れなくなってしまう。

このBOMはExcelのデータをcsv形式で保存すると起きる。

例えば以下の内容をもつ profile.csv があるとする

id,name,age
1,Taro,10
2,Ziro,11
3,Saburo,12

BOM付きの場合、headerの前に余計な文字列情報がつく

CSV.read('profile.csv',headers: true).headers
# => ["<feff>id", "name", "age"]

やり方

エンコーディングにBOMをつけることで回避することができる。

CSV.read('profile.csv', encoding: 'BOM|UTF-8'  ,headers: true).headers
# => ["id", "name", "age"]

参考リンク

MySQLのコマンドライン実行( -e , --execute)はファイルに出力するとタブ区切りのTSV形式になる

原理を知らんかったんで調べてみたメモ

環境

$ mysql --version
mysql  Ver 14.14 Distrib 5.7.24, for osx10.14 (x86_64) using  EditLine wrapper

やり方

--execute もしくは -e を使うとコマンドラインMYSQLのクエリを実行できる。

その結果をパイプして出力するとtab区切りで出てくる

$mysql --execute "何かクエリ;" > 出力したいファイル

$ mysql -uroot -Dsample_app_development -e "SELECT id, name FROM users ORDER BY id DESC LIMIT 3;"

とすると以下のように出力される

$ mysql -uroot -Dsample_app_development -e "SELECT id, name FROM users ORDER BY id DESC LIMIT 3;"
+----+------+
| id | name |
+----+------+
| 15 | Goto |
| 14 | Sato |
| 13 | Ziro |
+----+------+
$

これをファイルに出力すると以下のように出力される

$mysql -uroot -Dsample_app_development -e "SELECT id, name FROM users ORDER BY id DESC LIMIT 3;" > sample.tsv
id    name
15  Goto
14  Sato
13  Ziro

原理

MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.5.1.1 mysql のオプション 曰く

--execute=statement, -e statement

ステートメントを実行して、終了します。デフォルトの出力形式は、--batch で生成されるものと同様です。

とあり、batchをみると

--batch, -B

カラム区切り文字としてタブを使用し、各行を新しい行に出力します。このオプションでは、mysql は履歴ファイルを使用しません。

ということで、batchのデフォルトがタブ区切りだからこの形式になる。

関連リンク

GitHubのコードレビューにてファイルをもう見たことをチェックできる機能が実装された

「大きいプルリクエストと戦うあなたへ…」みたいな機能

出典

どんな機能か

詳しいビジュアルは上のブログに書いてあるので割愛するが、要約すると…

  • ファイルに見たことを示す「Viwed」のチェックボックスが付き、チェックをつけると折り畳まれる
  • リロードしても状態を維持してくれる
  • チェックつけたファイル数を 1/10 のように示してくれる
  • ファイルが変わったらちゃんと知らせてくれる

というような感じ。

関連リンク

Railsでいずれかの値が入っていたらその値を代入する、などの処理をするときはpresenceが便利

先日の代入記事の発展編

環境

rails (5.2.2)
  activesupport (= 5.2.2)

presenceとは

presenceメソッドは、present?がtrueの場合は自身のレシーバを返し、falseの場合はnilを返します。 - Active Support コア拡張機能 - Rails ガイド - presence

使い方

value1 value2 value3 があり、1から順に入っていれば値を result に代入したい場合

result = value1.presence || value2.presence || value3.presence

||nil の場合右式の評価値を使うので左から順に評価されていく。

注意点

presencepresent? が trueであれば値を返すため ""[] 、 {} は false扱いになるので、空文字などの空の値を評価したい場合などは注意が必要。

参考リンク

Rubyの positive? や negative? は0を含めない

以上ではなく、それより上。そりゃ文字通りなんだけどさネタ。

環境

$ ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin18]

挙動

positive?とnegative? は以下の感じ。

1.positive?
#=> true
-1.positive?
#=> false
0.positive?
#=> false

1.negative?
#=> false
-1.negative?
#=> true
0.negative?
#=> false

Float型も対応しているので、下記のような記述も可能

0.0001.positive?
#=> true
-0.0001.positive?
#=> false
0.000.positive?
#=> false

(あたりまえだが)文字列は未対応

"0".positive?
Traceback (most recent call last):
        2: from /Users/hogehoge/.anyenv/envs/rbenv/versions/2.5.0/bin/irb:11:in `<main>'
        1: from (irb):12
NoMethodError (undefined method `positive?' for "0":String)

参考リンク