生産におけるデバッグ‐物事を中断することなく高速に動く方法


どのように我々はバックエンドサーバーをデバッグし、展開を破ることなく高速更新を提供する方法を学びます.

話題へジャンプ

  • Disaster Strikes
  • Enter Lightrun
  • Bugs in Production...
  • Installing Lightrun
  • TL;DR
  • マークZuckerbergは、フェイスブックが「速く動くことと壊すこと」モットーの下で働くと有名に言いました.私たちは世界ですべての単体テストを書くことができます.それはちょうど彼が祝うために選んだ人生の事実です.
    私たちのように信じられないほど複雑なシステムを扱うときCodename One これはアップデートのリリースと何もしないことの違いです.

    あなたが視覚学習者であるならば、以下のビデオをチェックしてください:


    災害スト


    このアプローチの問題は生産にバグがあるときに明らかになります.通常、ステージング、QAとテストを通過するバグはあまりにも恐ろしいです.しかし、それが生産のみのバグであるので、あなたはしばしば2つのオプションに直面します:
  • を返します.
  • - FIX /を実装します。


    私が「ローカルにそれを再現する」ということに注意してください.これはしばしば“現実世界”の条件で別のDB上で動作する生産バグのオプションではありません.我々のケースでは、ローカルデバッグは非常に困難です.
    第2のオプションは通常最高です、しかし、それは巨大な危険を含みます:フィックスが失敗するならば、どうですか?
    生産展開はしばしばQAサイクルを必要とする遅いプロセスであるので、これは問題を化合する.あなたはそれを間違って得たことを見つけるために時間を待つ必要が修正を行います.これは私たちだった.

    入力する


    だから数年前、私はこの問題を解決する方法についてのアイデアを持った2つの若い創始者に会った.本質的に、それは通常のデバッガとは全く異なるデバッガの新しい種類です.
    これの要点は、あなたのアプリは常に生産デバッグモードで実行され、オーバーヘッドはかろうじて顕著です.安全なエージェントは雲にアプリを接続し、特別な方法でデバッグすることができます.
    ブレークポイントの代わりに、あなたはスナップショットを持っています.彼らは「ブレーク」しない.スレッドのトレーストレースと、指定した時刻の変数状態を提供します.また、ログ文を注入したり、実行をカウントしたり、コードのメソッドやブロックの単純なプロファイリングを行うこともできます.
    私はこのアイディアにとても感銘を受け、チームに加わり、現在2つの仕事をCodename One - 1 .Lightrun ). 涼しいことは、私の仕事であるCodename One 現在、CountはChiに感謝していますLightrun .

    生産のバグ.


    私の仕事の90 %はCodename One 火は火を消している.加入者は、ビルドやプッシュサーバなどの不具合について苦情を申し立てます.我々は、膨大なログと推測を読んで時間を過ごす
    その後、追加のログを展開し、新しいビルドを送信し、次にログを再読み込みして、地獄がどうなったかを把握します.推測のいくつかは、常にそこにlightrun全体のプロセスは実質的にインスタントです.
    LightRunでは、条件付きのスナップショットを設定できます.

    失敗のデバッグ
    上記の場合、特定のユーザーがプッシュを送信するときにスナップショットを取得できます.これは条件付きブレークポイントであり、ローカルでデバッグするときに便利なツールです.これは、生産のデバッグ時に不可欠なツールです.我々は、特定のユーザーに関連する情報を見たいだけでなく、すべてのユーザーが….
    スナップショットがヒットしたとき、私たちは、この1つに似たスタックトレース(画像の中の私的な秘密情報)を終了します.

    スナップショットスタック
    スナップショットは通常のブレークポイントのように見えます.それはスレッドが不足しているとステップを踏むことはできません.しかし、アプリケーションを実行しているときに、スタックを歩くことができ、フィールド/変数などの値を検査することができます.かなりダーク便利!
    代わりに、複数のスナップショットを追加することができますだけでなく、特定の行を押すと情報を印刷するログを注入することを踏んだ.などの単純な式を含むThe value is {obj.getValue()} .
    私の直接的な考えは“これは高価ではないでしょうか?”
    我々は非常に複雑な/高価な式を秒単位で印刷したり、問題(例えば再帰的な)ロジックを使用している場合、LightRunは自分自身を制限するのに十分なスマートですので、式はあまりCPUを取ることはありません.それはあなたの足で自分を撮影から保護します.
    その結果、顕著なパフォーマンスオーバーヘッドがなく、心配せずに動作することができます.しかし、私は消化し、上記のプッシュサーバーの例に戻ることができます.

    予想外のバグ


    私がこのポストを始めたとき、私はユーザー問題のためにデバッグセッションを再現したかったです、しかし、私がセッションのためにスクリーンショットをつかんでいたので、私はスタックで何か変なものに気がつきました.値subscriptionLevel - 1 .それは大きすぎた.
    我々はプッシュメッセージを送信するときに、ユーザーサブスクリプションレベルを読み取るのバグがあったことが判明.つまり、クォータとレート制限は、我々のプッシュサーバーでは全く適用されなかったことを意味!
    私はこのバグのために収入が失われたことを確信しています.そのサブスクリプションはまだ問題なしでボリュームでプッシュメッセージを送信することができます.ええ!
    これはLightRunのクールな利点の一つです、それはあなたが明らかに実行中のシステムに表示し、あなたの期待を確認することができます.

    期待ユーザー問題


    私がデバッグした本当の問題は上記の線に関連しています.ユーザーはIOSのプッシュメッセージを取得停止しました.私はちょうどスナップショット(別名ブレークポイント)彼のトークンを配置し、プッシュサーバーに送信された値を検査した.
    それから、私はプッシュ証明書のURLを見ることができて、即座にそれが期限切れになると確認することができました.これはローカルでデバッグするより簡単でした!

    より深いパイプライン


    ユーザーの問題は非常に重要ですが、誰も気づいていない問題は、おそらくさらに重要です.

    例外監視
    LightRunも例外を検出する方法を提供します.スタックトレースを定期的に確認し、検出しなかったエラーがあるかどうかを確認できます.
    これはLightTrunにユニークな機能ではありませんが、簡単にスタックのトレースで見た問題をトレースすることができます完全に収まる.

    計量


    LightRunはまた、カウンタ、tictocsとメソッドの期間の測定などのメトリクスが含まれています.
    これは生産におけるマイクロベンチマークにとって非常に便利ですが、私たちはコードネーム1であまり必要ではありません.我々のバックエンドは比較的簡単です、そして、これらは決して現れませんでした.

    インストール


    だから、ダウンサイドの権利がありますか?
    IDEにプラグインをインストールしてサインアップするのはとても簡単です.しかし、エージェントのセットアップはまだ困難です.私はすべてのサーバーで動作するように多くの時間を費やした.
    確かに、コードネーム1つのアーキテクチャはかなり複雑で、多くのレガシーとプリ・ドッキング展開の選択肢で満たされています.少し仕事をしなさい.それは些細なことかもしれませんが、Webチャットサポートチャンネルからのいくつかの助けを必要とする可能性があります(それはスーパー応答です).

    アプリのサインアップページ.ライトトラン.コム
    したら、あなたはhttps://app.lightrun.com/ あなたが正しくステップを実行したことを検証するウィザードを手に入れます.

    プラグインのインストール
    最初のステップを渡すには、intellijプラグインをmarketplace .
    次に、IDEを再起動し、右側のLightRunツールウィンドウを開き、ログインボタンを押します.
    ログインすると、ウィザードの次のボタンが有効になり、エージェントのインストールステップに移動できます.これは難しい部分です.

    エージェントのインストール手順について
    エージェントは通常、ローカルマシンではなく、サーバーにインストールされます.それで、私がこのページに達したとき、「MAC」は選ばれました.Linuxのページを明示的に選択し、エージェントをLinuxマシンにインストールするスクリプトをコピーしなければなりませんでした.
    次のステップは、マシンにsshを実行し、スクリプトを実行します.エージェントをバインドするときに使用する「エージェント」ディレクトリを作成します.
    これの要点は、私たちが-agentpath JVMへの引数.あなたの展開が何らかの点で「Java」コマンド呼び出しを持っているが、あなたがサービスとして走っている、または、コンテナの中でとても単純でないかもしれないならば、それは非常に単純です.
    したら、“次の”オプションが有効になりますし、LightRunを使用することができます.
    しかし、より複雑なケースがあります、私はリストhere .
    つの例はpushに使用される古いTomcatサーバーです.私は編集しなければならなかったcatalina.sh これを追加します.
    ="$JAVA_OPTS -agentpath:/home/username/agent/lightrun_agent.so= --lightrun_extra_class_path=/home/username/apache-tomcat/webapps/myapp.war"
    
    コピー
    注意してください.--lightrun_extra_class_path (2マイナス記号).物事が正しく自動検出されない場合は、必要があります.これはエージェントを実行させるが、私はスタックトレースに変数を得なかった.完全なデバッグオプションを使用してコードを再コンパイルしなければなりませんでした-g . これは、Mavenで少しの挑戦でした.解決策はこれらのプロパティを追加することでした.
    <properties><maven.compiler.debug></maven.compiler.debug><debug></debug><debugLevel></debugLevel><maven.compiler.debuglevel></maven.compiler.debuglevel></properties>
    
    コピー
    あなたはテストすることができます-g このようにコードを使っていない.
    -Project//-.ClassName|LocalVariableTable
    
    コピー
    これが何も印刷しないならば、クラスはデバッグ情報を含みません.
    再び、これは関与するプロセスです.私は強くそれを通過中に魅力的なサポートを提案する.

    TLドクター


    我々が生産に急いでいない理由は、生産問題を固定するのは退屈で遅いプロセスです.しかし、これは複雑なマルチブランチのサポート構造を作成します.
    我々がすぐに生産においてデバッグすることができて、すぐに固定することができるならば、低いオーバーヘッドを保っている間、我々の全体的な安定性は増加します.
    デバッグツールなしで今日サーバーを展開しているIMOは、IDEなしでコーディングに似ています.あなたはそれを行うことができますが、私たちの分野で近代的な進歩に欠落している.
    At Codename One, our user support tasks are resolved much faster and more effectively thanks to Lightrun.