GAミント至上主義

Web Monomaniacal Developer.

gitでテストpushをたくさんしたいときのワンライナー

リモートレポジトリのWebHookとGoogle Cloud Functionsを使って、slack通知を作るときに使ったもの。

今の日付(date)が入ったpush.testという名前のファイルを作って、コミットして、remote-nameのbranch-nameにプッシュして削除まで行う。
履歴はたくさん残る。

date > push.test && git add push.test && git commit -m "`cat push.test`" && git push remote-name branch-name && git rm push.test

gunicornの [CRITICAL] WORKER TIMEOUT で本当の原因がわからなくなる問題

GKE上で動かしているgunicornアプリケーションで、特に負荷が高いわけでもないのに、突然

 [CRITICAL] WORKER TIMEOUT (pid:667)

というログを出しまくって止まってしまうことが発生していた。

いつなるかわからないのでしばらく見守っていたけど、原因を調べることにした。

gunicornのタイムアウトはconfファイルで設定している。

gunicorn_conf.py

worker_class = "gevent"
proxy_protocol = True
x_forwarded_for_header = "X-Real-IP"
bind = ":80"
# reload = True
timeout = 5
graceful_timeout = 5
# loglevel="debug"

Dockefileでは下記のように実行

CMD ["gunicorn", "-c", "gunicorn_conf.py", "arms:app"]

エラーが発生したときには、ログには上記の [CRITICAL] WORKER TIMEOUT が連発するだけで、エラーの原因がわからないなーと思っていたけど考えれば当たり前で、アプリ内の処理は特に時間がかかっているだけなので、エラーとは認識できない。

そのため、これから下記の対策を行う。

  1. タイムアウトが発生しそうなところ(DBとかRedis等外部への接続する関数) にすべて短めのタイムアウトをつける
  2. gunicornのタイムアウトは1でエラーが発生できるようにちょっと長めにする

タイムアウトは以前記事にも書いたtimeout-decoratorを使う。

uyamazak.hatenablog.com

そして、本番公開を行ったけど、いつ起こるかわからないのでしばらく様子見。

現時点の仮説としてはおそらくRedisへの接続でたまに時間がかかってしまうのと予想している。

アクセスの負荷とはあまり関係ないので、GKEでRedisのpodが移動したりでネットワークがつながらなくなっている可能性も。

その際は待っても解決しないので、PODごと落として、再起動させる必要があるかも。

ビズオーシャンから添付ファイルを簡単、安全に送るTemply公開しました

社外に書類などを送るときに、ZIPでパスワードかけて添付して送る、というのがめんどくさいので出来たサービスです。

temply.bizocean.jp

プレスリリース
prtimes.jp


サービスについては本サイトに書いてあるので、開発系の話をします。

目的

  • 新卒入社3年目となるtakumi(仮)がメインとなって開発する経験をしてもらう。
  • 私がoceanus等で得たGCP, Docker周りの知見を社内に広める
  • 開発手法としてSPRINTの実践

SPRINTはこれ。邦題が良くないけどみんなで読みました。もちろん経費で購入。

SPRINT 最速仕事術――あらゆる仕事がうまくいく最も合理的な方法

SPRINT 最速仕事術――あらゆる仕事がうまくいく最も合理的な方法

まるまる1週間は難しく全体で2週間かかったり、インタビュー対象はほかの社員に協力してもらったり、本そのままはできませんでした。
それでもめちゃくちゃ疲れました。
また1回目のプロトタイプの反応がいまいちだったので、機能を削ったりして、公開までに2回やりました。

言語、フレームワーク

Python3.6
Django 1.11

開発環境

社内Linux開発サーバーでDocker
エディタはvim

バージョン管理

git
今回から初めてPull requestを使うため、すでに契約していたbacklogのgitレジストリを使いました。

本番環境

GCP

  • Google Kubernetes Engine (Django + gunicorn)
  • Cloud SQL (MySQL)
  • Cloud Storage (ファイル置き場)

その他Container RegistoryとかStackdriverで監視とかツール各種。
静的ファイルはCloud Storageから直接配信しているので、WEBサーバーはgunicornのみ。

開発について

初期公開までの開発期間は一時他の案件で中断があったものの賞味3か月程度。
これまでbizocean本体のPHPIDEを使ってましたが、今回は私の押し付けでvimでやってもらいましたが難なく使えている模様。

GCPをフル活用したため、ややこしい一部は除いて、ほぼメインのtakumi(仮)一人でプログラムから、サーバー、インフラ整備までできてしまいました。
シンプルなサービスなので、最初のプロジェクトとしてはちょうどよかったかも。

今後

今回初挑戦の複数人コードレビューでかなりゴミを消せて無駄なテーブルも減ってリソース節約にもなって、読みやすいコードにもなったので、どんどんやっていきたい。
まだmargeやpullではまることが多い。
現在開発できるメンバーは4人だけどそれぞれがメインで年1つずつぐらいは作っていけそう。